X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/5576108a21257150f5f9c7f73eac83008f7d29a6..a9b031fe9f0cdf9f4461a010d0dde262e77fc99f:/usr/src/usr.bin/login/login.c.1 diff --git a/usr/src/usr.bin/login/login.c.1 b/usr/src/usr.bin/login/login.c.1 index 2f2ff6edac..4c19ed1d17 100644 --- a/usr/src/usr.bin/login/login.c.1 +++ b/usr/src/usr.bin/login/login.c.1 @@ -11,7 +11,7 @@ char copyright[] = #endif not lint #ifndef lint -static char sccsid[] = "@(#)login.c.1 5.14 (Berkeley) %G%"; +static char sccsid[] = "@(#)login.c.1 5.18 (Berkeley) %G%"; #endif not lint /* @@ -38,8 +38,8 @@ static char sccsid[] = "@(#)login.c.1 5.14 (Berkeley) %G%"; #include #include -#define WRITENAME "write" /* name of group to own ttys */ -#define WRITEGID(gid) write_gid(gid) /* gid that owns all ttys */ +#define TTYGRPNAME "tty" /* name of group to own ttys */ +#define TTYGID(gid) tty_gid(gid) /* gid that owns all ttys */ #define SCMPN(a, b) strncmp(a, b, sizeof(a)) #define SCPYN(a, b) strncpy(a, b, sizeof(a)) @@ -58,23 +58,22 @@ struct passwd nouser = {"", "nope", -1, -1, -1, "", "", "", "" }; struct sgttyb ttyb; struct utmp utmp; char minusnam[16] = "-"; -char *envinit[] = { 0 }; /* now set by setenv calls */ +char *envinit[1]; /* now set by setenv calls */ /* * This bounds the time given to login. We initialize it here * so it can be patched on machines where it's too small. */ -int timeout = 60; +int timeout = 300; char term[64]; struct passwd *pwd; -char *strcat(), *rindex(), *index(), *malloc(), *realloc(); +char *strcat(), *rindex(), *index(); int timedout(); char *ttyname(); char *crypt(); char *getpass(); char *stypeof(); -extern char **environ; extern int errno; struct tchars tc = { @@ -91,18 +90,20 @@ int usererr = -1; char rusername[NMAX+1], lusername[NMAX+1]; char rpassword[NMAX+1]; char name[NMAX+1]; +char me[MAXHOSTNAMELEN]; char *rhost; main(argc, argv) char *argv[]; { + extern char **environ; register char *namep; int pflag = 0, hflag = 0, t, f, c; int invalid, quietlog; FILE *nlfd; char *ttyn, *tty; int ldisc = 0, zero = 0, i; - char **envnew; + char *p, *domain, *index(); signal(SIGALRM, timedout); alarm(timeout); @@ -116,6 +117,8 @@ main(argc, argv) * -h is used by other servers to pass the name of the * remote host to login so that it may be placed in utmp and wtmp */ + (void) gethostname(me, sizeof(me)); + domain = index(me, '.'); while (argc > 1) { if (strcmp(argv[1], "-r") == 0) { if (rflag || hflag) { @@ -124,6 +127,8 @@ main(argc, argv) } rflag = 1; usererr = doremotelogin(argv[2]); + if ((p = index(argv[2], '.')) && strcmp(p, domain) == 0) + *p = 0; SCPYN(utmp.ut_host, argv[2]); argc -= 2; argv += 2; @@ -135,6 +140,8 @@ main(argc, argv) exit(1); } hflag = 1; + if ((p = index(argv[2], '.')) && strcmp(p, domain) == 0) + *p = 0; SCPYN(utmp.ut_host, argv[2]); argc -= 2; argv += 2; @@ -328,7 +335,7 @@ main(argc, argv) write(f, (char *) &ll, sizeof ll); close(f); } - chown(ttyn, pwd->pw_uid, WRITEGID(pwd->pw_gid)); + chown(ttyn, pwd->pw_uid, TTYGID(pwd->pw_gid)); if (!hflag && !rflag) /* XXX */ ioctl(0, TIOCSWINSZ, &win); chmod(ttyn, 0620); @@ -338,27 +345,17 @@ main(argc, argv) initgroups(name, pwd->pw_gid); quota(Q_DOWARN, pwd->pw_uid, (dev_t)-1, 0); setuid(pwd->pw_uid); + /* destroy environment unless user has asked to preserve it */ if (!pflag) environ = envinit; - - /* set up environment, this time without destruction */ - /* copy the environment before setenving */ - i = 0; - while (environ[i] != NULL) - i++; - envnew = (char **) malloc(sizeof (char *) * (i + 1)); - for (; i >= 0; i--) - envnew[i] = environ[i]; - environ = envnew; - - setenv("HOME=", pwd->pw_dir, 1); - setenv("SHELL=", pwd->pw_shell, 1); + setenv("HOME", pwd->pw_dir, 1); + setenv("SHELL", pwd->pw_shell, 1); if (term[0] == '\0') strncpy(term, stypeof(tty), sizeof(term)); - setenv("TERM=", term, 0); - setenv("USER=", pwd->pw_name, 1); - setenv("PATH=", ":/usr/ucb:/bin:/usr/bin", 0); + setenv("TERM", term, 0); + setenv("USER", pwd->pw_name, 1); + setenv("PATH", ":/usr/ucb:/bin:/usr/bin", 0); if ((namep = rindex(pwd->pw_shell, '/')) == NULL) namep = pwd->pw_shell; @@ -534,50 +531,13 @@ doremoteterm(term, tp) tp->sg_flags = ECHO|CRMOD|ANYP|XTABS; } -/* - * Set the value of var to be arg in the Unix 4.2 BSD environment env. - * Var should end with '='. - * (bindings are of the form "var=value") - * This procedure assumes the memory for the first level of environ - * was allocated using malloc. - */ -setenv(var, value, clobber) - char *var, *value; -{ - extern char **environ; - int index = 0; - int varlen = strlen(var); - int vallen = strlen(value); - - for (index = 0; environ[index] != NULL; index++) { - if (strncmp(environ[index], var, varlen) == 0) { - /* found it */ - if (!clobber) - return; - environ[index] = malloc(varlen + vallen + 1); - strcpy(environ[index], var); - strcat(environ[index], value); - return; - } - } - environ = (char **) realloc(environ, sizeof (char *) * (index + 2)); - if (environ == NULL) { - fprintf(stderr, "login: malloc out of memory\n"); - exit(1); - } - environ[index] = malloc(varlen + vallen + 1); - strcpy(environ[index], var); - strcat(environ[index], value); - environ[++index] = NULL; -} - -write_gid(default_gid) +tty_gid(default_gid) int default_gid; { struct group *getgrnam(), *gr; int gid = default_gid; - gr = getgrnam(WRITENAME); + gr = getgrnam(TTYGRPNAME); if (gr != (struct group *) 0) gid = gr->gr_gid;