Research V7 development
authorKen Thompson <ken@research.uucp>
Sat, 5 May 1979 07:02:54 +0000 (02:02 -0500)
committerKen Thompson <ken@research.uucp>
Sat, 5 May 1979 07:02:54 +0000 (02:02 -0500)
Work on file usr/src/cmd/login.c

Co-Authored-By: Dennis Ritchie <dmr@research.uucp>
Synthesized-from: v7

usr/src/cmd/login.c [new file with mode: 0644]

diff --git a/usr/src/cmd/login.c b/usr/src/cmd/login.c
new file mode 100644 (file)
index 0000000..b09a404
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * login [ name ]
+ */
+
+#include <sys/types.h>
+#include <sgtty.h>
+#include <utmp.h>
+#include <signal.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#define SCPYN(a, b)    strncpy(a, b, sizeof(a))
+
+char   maildir[30] =   "/usr/spool/mail/";
+struct passwd nouser = {"", "nope"};
+struct sgttyb ttyb;
+struct utmp utmp;
+char   minusnam[16] = "-";
+char   homedir[64] = "HOME=";
+char   *envinit[] = {homedir, "PATH=:/bin:/usr/bin", 0};
+struct passwd *pwd;
+
+struct passwd *getpwnam();
+char   *strcat();
+int    setpwent();
+char   *ttyname();
+char   *crypt();
+char   *getpass();
+char   *rindex(), *index();
+extern char **environ;
+
+main(argc, argv)
+char **argv;
+{
+       register char *namep;
+       int t, f, c;
+       char *ttyn;
+
+       alarm(60);
+       signal(SIGQUIT, SIG_IGN);
+       signal(SIGINT, SIG_IGN);
+       nice(-100);
+       nice(20);
+       nice(0);
+       gtty(0, &ttyb);
+       ttyb.sg_erase = '#';
+       ttyb.sg_kill = '@';
+       stty(0, &ttyb);
+       for (t=3; t<20; t++)
+               close(t);
+       ttyn = ttyname(0);
+       if (ttyn==0)
+               ttyn = "/dev/tty??";
+
+    loop:
+       SCPYN(utmp.ut_name, "");
+       if (argc>1) {
+               SCPYN(utmp.ut_name, argv[1]);
+               argc = 0;
+       }
+       while (utmp.ut_name[0] == '\0') {
+               namep = utmp.ut_name;
+               printf("login: ");
+               while ((c = getchar()) != '\n') {
+                       if(c == ' ')
+                               c = '_';
+                       if (c == EOF)
+                               exit(0);
+                       if (namep < utmp.ut_name+8)
+                               *namep++ = c;
+               }
+       }
+       setpwent();
+       if ((pwd = getpwnam(utmp.ut_name)) == NULL)
+               pwd = &nouser;
+       endpwent();
+       if (*pwd->pw_passwd != '\0') {
+               namep = crypt(getpass("Password:"),pwd->pw_passwd);
+               if (strcmp(namep, pwd->pw_passwd)) {
+                       printf("Login incorrect\n");
+                       goto loop;
+               }
+       }
+       if(chdir(pwd->pw_dir) < 0) {
+               printf("No directory\n");
+               goto loop;
+       }
+       time(&utmp.ut_time);
+       t = ttyslot();
+       if (t>0 && (f = open("/etc/utmp", 1)) >= 0) {
+               lseek(f, (long)(t*sizeof(utmp)), 0);
+               SCPYN(utmp.ut_line, index(ttyn+1, '/')+1);
+               write(f, (char *)&utmp, sizeof(utmp));
+               close(f);
+       }
+       if (t>0 && (f = open("/usr/adm/wtmp", 1)) >= 0) {
+               lseek(f, 0L, 2);
+               write(f, (char *)&utmp, sizeof(utmp));
+               close(f);
+       }
+       chown(ttyn, pwd->pw_uid, pwd->pw_gid);
+       setgid(pwd->pw_gid);
+       setuid(pwd->pw_uid);
+       if (*pwd->pw_shell == '\0')
+               pwd->pw_shell = "/bin/sh";
+       environ = envinit;
+       strncat(homedir, pwd->pw_dir, sizeof(homedir)-6);
+       if ((namep = rindex(pwd->pw_shell, '/')) == NULL)
+               namep = pwd->pw_shell;
+       else
+               namep++;
+       strcat(minusnam, namep);
+       alarm(0);
+       umask(02);
+       showmotd();
+       strcat(maildir, pwd->pw_name);
+       if(access(maildir,4)==0) {
+               struct stat statb;
+               stat(maildir, &statb);
+               if (statb.st_size)
+                       printf("You have mail.\n");
+       }
+       signal(SIGQUIT, SIG_DFL);
+       signal(SIGINT, SIG_DFL);
+       execlp(pwd->pw_shell, minusnam, 0);
+       printf("No shell\n");
+       exit(0);
+}
+
+int    stopmotd;
+catch()
+{
+       signal(SIGINT, SIG_IGN);
+       stopmotd++;
+}
+
+showmotd()
+{
+       FILE *mf;
+       register c;
+
+       signal(SIGINT, catch);
+       if((mf = fopen("/etc/motd","r")) != NULL) {
+               while((c = getc(mf)) != EOF && stopmotd == 0)
+                       putchar(c);
+               fclose(mf);
+       }
+       signal(SIGINT, SIG_IGN);
+}