From 3f75e402535843b4e34c09b03fb5181758506d96 Mon Sep 17 00:00:00 2001 From: Russ Allbery Date: Tue, 1 Aug 2006 22:39:56 +0000 Subject: [PATCH] death-to-login-20060801 Get rid of the AFS integrated login, which we no longer care about. --- Makefile.in | 14 +- configure.in | 1 - src/login/.cvsignore | 4 - src/login/Makefile.in | 87 -- src/login/getenv.c | 66 -- src/login/login.c | 2317 -------------------------------------- src/login/setenv.c | 101 -- src/login/util_login.c | 63 -- src/login/util_logout.c | 69 -- src/login/util_logwtmp.c | 63 -- 10 files changed, 2 insertions(+), 2783 deletions(-) delete mode 100644 src/login/.cvsignore delete mode 100644 src/login/Makefile.in delete mode 100644 src/login/getenv.c delete mode 100644 src/login/login.c delete mode 100644 src/login/setenv.c delete mode 100644 src/login/util_login.c delete mode 100644 src/login/util_logout.c delete mode 100644 src/login/util_logwtmp.c diff --git a/Makefile.in b/Makefile.in index 1633b97a8..3f873f80c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -347,14 +347,6 @@ aklog: comerr ptserver platform: ${COMPILE_PART1} platform ${COMPILE_PART2} -login: cmd comerr kauth rxkad pam sia tsm41 sgistuff aklog - set -x; \ - if test "@BUILD_LOGIN@" = "yes"; then \ - ${COMPILE_PART1} login ${COMPILE_PART2} ; \ - else \ - echo Skipping login for ${SYS_NAME} ; \ - fi - man-pages: if test -d "doc/man-pages" ; then \ cd doc/man-pages ${COMPILE_PART2} ; \ @@ -582,14 +574,14 @@ jafsadm: libjafsadm finale: project cmd comerr afsd butc tbutc @ENABLE_KERNEL_MODULE@ libuafs audit kauth log package \ ptserver scout bu_utils ubik uss bozo vfsck volser tvolser tsalvaged \ venus update xstat afsmonitor rxdebug libafsrpc \ - libafsauthent shlibafsrpc shlibafsauthent libadmin login man-pages \ + libafsauthent shlibafsrpc shlibafsauthent libadmin man-pages \ platform ${COMPILE_PART1} finale ${COMPILE_PART2} finale_nolibafs: project cmd comerr afsd butc tbutc libuafs audit kauth log package \ ptserver scout bu_utils ubik uss bozo vfsck volser tvolser tsalvaged \ venus update xstat afsmonitor rxdebug libafsrpc \ - libafsauthent shlibafsrpc shlibafsauthent libadmin login man-pages \ + libafsauthent shlibafsrpc shlibafsauthent libadmin man-pages \ platform ${COMPILE_PART1} finale ${COMPILE_PART2} @@ -659,7 +651,6 @@ clean2: -${COMPILE_PART1} tsm41 ${COMPILE_CLEAN} -${COMPILE_PART1} sia ${COMPILE_CLEAN} -${COMPILE_PART1} aklog ${COMPILE_CLEAN} - -${COMPILE_PART1} login ${COMPILE_CLEAN} -${COMPILE_PART1} pam ${COMPILE_CLEAN} -${COMPILE_PART1} afsweb ${COMPILE_CLEAN} -${COMPILE_PART1} update ${COMPILE_CLEAN} @@ -767,7 +758,6 @@ distclean: clean src/libuafs/MakefileProto.${MKAFS_OSTYPE} \ src/log/test/Makefile \ src/log/Makefile \ - src/login/Makefile \ src/lwp/test/Makefile \ src/lwp/Makefile \ src/mpp/Makefile \ diff --git a/configure.in b/configure.in index c12251a0a..ff6a1ce04 100644 --- a/configure.in +++ b/configure.in @@ -71,7 +71,6 @@ src/libuafs/Makefile.common \ src/libuafs/MakefileProto.${MKAFS_OSTYPE} \ src/log/Makefile \ src/log/test/Makefile \ -src/login/Makefile \ src/lwp/Makefile \ src/lwp/test/Makefile \ src/mpp/Makefile \ diff --git a/src/login/.cvsignore b/src/login/.cvsignore deleted file mode 100644 index 428015691..000000000 --- a/src/login/.cvsignore +++ /dev/null @@ -1,4 +0,0 @@ -Makefile -login.krb -login -AFS_component_version_number.c diff --git a/src/login/Makefile.in b/src/login/Makefile.in deleted file mode 100644 index 0e300b560..000000000 --- a/src/login/Makefile.in +++ /dev/null @@ -1,87 +0,0 @@ -# -# Copyright (c) 1988 Regents of the University of California. -# All rights reserved. -# -# Redistribution and use in source and binary forms are permitted -# provided that the above copyright notice and this paragraph are -# duplicated in all such forms and that any documentation, advertising -# materials, and other materials related to such redistribution and -# use acknowledge that the software was developed by the University -# of California, Berkeley. The name of the University may not be -# used to endorse or promote products derived from this software -# without specific prior written permission. THIS SOFTWARE IS PROVIDED -# ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -# WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND -# FITNESS FOR A PARTICULAR PURPOSE. -# -# @(#)Makefile 5.1 (Berkeley) 10/18/88 -# - -srcdir=@srcdir@ -include @TOP_OBJDIR@/src/config/Makefile.config - -AFSLIBS = ${TOP_LIBDIR}/libkauth.a ${TOP_LIBDIR}/libprot.a \ - ${TOP_LIBDIR}/libubik.a ${TOP_LIBDIR}/libauth.a \ - ${TOP_LIBDIR}/librxkad.a ${TOP_LIBDIR}/libsys.a \ - ${TOP_LIBDIR}/libdes.a ${TOP_LIBDIR}/librx.a \ - ${TOP_LIBDIR}/liblwp.a ${TOP_LIBDIR}/libcmd.a \ - ${TOP_LIBDIR}/libcom_err.a ${TOP_LIBDIR}/util.a - -KAFSLIBS = ${TOP_LIBDIR}/libkauth.krb.a ${TOP_LIBDIR}/libprot.a \ - ${TOP_LIBDIR}/libubik.a ${TOP_LIBDIR}/libauth.krb.a \ - ${TOP_LIBDIR}/librxkad.a ${TOP_LIBDIR}/libsys.a \ - ${TOP_LIBDIR}/libdes.a ${TOP_LIBDIR}/librx.a \ - ${TOP_LIBDIR}/liblwp.a ${TOP_LIBDIR}/libcmd.a \ - ${TOP_LIBDIR}/libcom_err.a ${TOP_LIBDIR}/util.a - -SRCS= login.c -OBJS= login.o setenv.o getenv.o libutil.a -KOBJS= login.krb.o setenv.o getenv.o libutil.a -UTILOBJS = util_login.o util_logout.o util_logwtmp.o - -all: login login.krb - -login: ${OBJS} ${AFSLIBS} - case ${SYS_NAME} in \ - sun4x_5? | sunx86_5? ) ${CC} -g -o $@ ${CFLAGS} ${OBJS} -lc ${LIBS} ${XLIBS} -lcmd;;\ - *) ${CC} -g -o $@ ${CFLAGS} ${OBJS} ${LIBS} ${XLIBS} ;;\ - esac - -login.krb: ${KOBJS} ${KAFSLIBS} - case ${SYS_NAME} in \ - sun4x_5? | sunx86_5? ) ${CC} -g -o $@ ${CFLAGS} ${KOBJS} -lc ${KLIBS} ${XLIBS} -lcmd;;\ - *) ${CC} -g -o $@ ${CFLAGS} ${KOBJS} ${KLIBS} ${XLIBS} ;;\ - esac - -libutil.a : ${UTILOBJS} - $(RM) -f $@ - $(AR) crv $@ ${UTILOBJS} - $(RANLIB) $@ - -login.o: login.c AFS_component_version_number.c - ${CC} ${CFLAGS} -c ${srcdir}/login.c - -login.krb.o: login.c - ${CC} ${CFLAGS} -DAFS_KERBEROS_ENV -c ${srcdir}/login.c - mv login.o login.krb.o - -# -# Installation targets -# -install: login login.krb - ${INSTALL} -d ${DESTDIR}${bindir} - ${INSTALL_PROGRAM} login ${DESTDIR}${bindir}/login - ${INSTALL_PROGRAM} login.krb ${DESTDIR}${bindir}/login.krb - -dest: login login.krb - ${INSTALL} -d ${DEST}/bin - ${INSTALL_PROGRAM} login ${DEST}/bin/login - ${INSTALL_PROGRAM} login.krb ${DEST}/bin/login.krb - -# -# Misc. targets -# -clean: - $(RM) -f *.o ${OBJS} core login AFS_component_version_number.c - -include ../config/Makefile.version diff --git a/src/login/getenv.c b/src/login/getenv.c deleted file mode 100644 index 7c49bca7a..000000000 --- a/src/login/getenv.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 1987 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include - -RCSID - ("$Header$"); - -#include - -/* - * getenv -- - * Returns ptr to value associated with name, if any, else NULL. - */ -char * -getenv(name) - char *name; -{ - int offset; - char *_findenv(); - - return (_findenv(name, &offset)); -} - -/* - * _findenv -- - * Returns pointer to value associated with name, if any, else NULL. - * Sets offset to be the offset of the name/value combination in the - * environmental array, for use by setenv(3) and unsetenv(3). - * Explicitly removes '=' in argument name. - * - * This routine *should* be a static; don't use it. - */ -char * -_findenv(name, offset) - register char *name; - int *offset; -{ - extern char **environ; - register int len; - register char **P, *C; - - for (C = name, len = 0; *C && *C != '='; ++C, ++len); - for (P = environ; *P; ++P) - if (!strncmp(*P, name, len)) - if (*(C = *P + len) == '=') { - *offset = P - environ; - return (++C); - } - return (NULL); -} diff --git a/src/login/login.c b/src/login/login.c deleted file mode 100644 index cbf9b8ab3..000000000 --- a/src/login/login.c +++ /dev/null @@ -1,2317 +0,0 @@ -/* - * Notes: - * - * This is an AFS-aware login. - * - * Machine/os specific code is surrounded by #ifdef - * - * The Q_SETUID and Q_DOWARN #ifdefs are for IBM's AOS which doesn't - * define them if NFS is configured. Like that matters anymore - */ - -/* - * Copyright (c) 1980, 1987, 1988 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * login [ name ] - * login -h hostname (for telnetd, etc.) - * login -f name (for pre-authenticated login: datakit, xterm, etc.) - */ - -#if !defined(UT_NAMESIZE) -#define UT_NAMESIZE 8 -#endif - -#include -#include - -RCSID - ("$Header$"); - -#include -#include -#include -#include -#ifdef AFS_SUN5_ENV -#include -#else -#if !defined(AFS_HPUX_ENV) && !defined(AFS_AIX_ENV) -#if defined(AFS_SUN_ENV) || (defined(AFS_ATHENA_STDENV) && !defined(AFS_DEC_ENV)) || defined(AFS_OSF_ENV) -#include -#elif defined(AFS_FBSD_ENV) -#include -#else -#include -#endif -#endif /* AIX */ -#endif /* SUN5 */ -#include -#include -#include -#include -#ifdef AFS_SUN5_ENV -#include -#include -/* hack to get it to build */ -#define CBRK 0377 -#include -#include -#include -#endif -#ifdef AFS_FBSD_ENV -#define USE_OLD_TTY 1 -#include -#endif -#include - -#include -#ifdef AFS_SUN5_ENV -#include -#include -#endif -#include -#if !defined(AIX) && !defined(AFS_HPUX_ENV) && !defined(AFS_AIX32_ENV) && !defined(AFS_FBSD_ENV) -#include -#endif -#include -#if defined(AIX) -#include -#undef B300 -#undef B1200 -#undef B9600 -#include -#include -#include -#else -#if !defined(AFS_HPUX_ENV) && !defined(AFS_SUN5_ENV) -#include -#endif -#if defined(AFS_HPUX_ENV) -#include -#include -#endif -#include -#endif -#include -#include -#include -#include -#include -#include - -#define TTYGRPNAME "tty" /* name of group to own ttys */ - -#define MOTDFILE "/etc/motd" - -#if defined(AFS_SUN5_ENV) || defined(AFS_HPUX100_ENV) -#ifndef NO_MAIL -#ifdef V4FS -#define MAILDIR "/var/mail/" -#else -#define MAILDIR "/usr/mail/" -#endif /* V4FS */ -static char mail[30]; -#endif /* NO_MAIL */ -#else /* AFS_SUN5_ENV || AFS_HPUX100_ENV */ -#define MAILDIR "/usr/spool/mail" -#endif /* AFS_SUN5_ENV || AFS_HPUX100_ENV */ - -#define NOLOGIN "/etc/nologin" -#define HUSHLOGIN ".hushlogin" -#define LASTLOG "/usr/adm/lastlog" -#define BSHELL "/bin/sh" -#define SECURETTY_FILE "/etc/securetty" - -/* - * This bounds the time given to login. Not a define so it can - * be patched on machines where it's too small. - */ -int timeout = 300; - -struct passwd *pwd, *getpwnam(); -int failures; -char term[64], *hostname, *username, *tty; -#ifdef AFS_OSF_ENV -char ousername[256]; -#endif -struct sgttyb sgttyb; - -#ifdef AFS_SUN5_ENV -#include -extern char *defread(), *strdup(); -static void defaults(); -static char *Pndefault = "/etc/default/login"; -static char *Altshell = NULL; -static char *Console = NULL; -static int Idleweeks = -1; -static char *Passreq = NULL; -#define DEFUMASK 022 -static mode_t Umask = DEFUMASK; -static char *Def_tz = NULL; -static char *tmp_tz = NULL; -static char *Def_hertz = NULL; -#define SET_FSIZ 2 /* ulimit() command arg */ -static long Def_ulimit = 0; -#define MAX_TIMEOUT (15 * 60) -#define DEF_TIMEOUT 5*60 -static unsigned Def_timeout = DEF_TIMEOUT; -static char *Def_path = NULL; -static char *Def_supath = NULL; -#define DEF_PATH "/usr/bin:" /* same as PATH */ -#define DEF_SUPATH "/usr/sbin:/usr/bin" /* same as ROOTPATH */ -/* - * Intervals to sleep after failed login - */ -#ifndef SLEEPTIME -# define SLEEPTIME 4 /* sleeptime before login incorrect msg */ -#endif -static int Sleeptime = SLEEPTIME; - -#include -/* This is for Solaris's shadow pass struc */ -static struct spwd *spwd; -char *ttypmt = NULL; -char *d_tz = NULL; -char *d_dev = NULL; -static int authenticated_remote_user = 0; -static char rhost[64], rusername[10], lusername[10]; -#endif -#ifdef AFS_SUN_ENV -int usererr = -1; -#endif - -/* For setting of TZ environment on HPUX */ -#ifdef AFS_HPUX_ENV -#define MAX_TZ_LEN 256 -static char TZ[MAX_TZ_LEN]; -#endif /* AFS_HPUX_ENV */ - -#ifdef AFS_KERBEROS_ENV -extern char *ktc_tkt_string(); -#endif - -#if !defined(AIX) && !defined(AFS_HPUX_ENV) -struct tchars tc = { -/* CINTR, CQUIT, CSTART, CSTOP, 000, 000 */ - CINTR, CQUIT, CSTART, CSTOP, CEOT, CBRK -}; - -struct ltchars ltc = { - CSUSP, CDSUSP, CRPRNT, CFLUSH, CWERASE, CLNEXT -}; -#endif - -#ifdef AFS_OSF_ENV -#include -#include -SIAENTITY *entity = NULL; - -#ifdef AFS_OSF20_ENV -#include -#endif -#include -#endif - -#ifndef NOPAG -#define NOPAG 0xffffffff -#endif - -/* For avoiding making an osi_audit call when non-root */ -osi_audit() -{ - return 0; -} - -static void -timedout(x) -{ - fprintf(stderr, "Login timed out after %d seconds\n", timeout); - exit(0); -} - -char * -cv2string(ttp, aval) - register char *ttp; - register unsigned long aval; -{ - register char *tp = ttp; - register int i; - int any = 0; - - *(--tp) = 0; - while (aval != 0) { - i = aval % 10; - *(--tp) = '0' + i; - aval /= 10; - any = 1; - } - if (!any) - *(--tp) = '0'; - return tp; -} - -#include "AFS_component_version_number.c" - - -#ifdef AFS_SUN5_ENV -struct utmpx utmp; -#else -struct utmp utmp; -#endif - -#if defined(AFS_SUN5_ENV) || defined(AFS_HPUX_ENV) -/* the following utmp field is used for user counting: */ -#define how_to_count ut_exit.e_exit -char *ttyntail; -#define SUBLOGIN "" -int sublogin; -main(argc, argv, renvp) - char **renvp; -#else -main(argc, argv) -#endif - int argc; - char **argv; -{ - extern int errno, optind; - extern char *optarg, **environ; - struct group *gr, *getgrnam(); - register int ch; - register char *p; - int ask, fflag, hflag, rflag, pflag, cnt, locl, zero = 0, dflag = - 0, rlog = 0; - int quietlog, passwd_req, ioctlval; - char *domain, *salt, *envinit[2], *ttyn = 0, *pp; - char tbuf[MAXPATHLEN + 2]; - char *ttyname(), *stypeof(), *crypt(), *getpass(); - extern off_t lseek(); - int local, code = 0; - char *lcell; /* local cellname */ - char realm[MAXKTCREALMLEN]; - char buf1[256], **envp; - afs_int32 j, pagval = NOPAG, ngroups, groups[NGROUPS_MAX]; - long password_expires = -1; - extern char *AFSVersion; /* generated version */ - int afsLoginFail = 0; - char *reason; - -#if defined(AFS_SUN5_ENV) || defined(AFS_HPUX_ENV) - char retry_chdir = 0; -#endif /* AFS_SUN5_ENV || AFS_HPUX_ENV */ - -#ifdef AFS_OSF_ENV - char tname[sizeof(_PATH_TTY) + 10], *loginname = NULL; - int oargc = argc; - char **oargv = argv; - -#else -#ifdef AFS_SUN5_ENV - - defaults(); /* Set up Defaults and flags */ - if (Umask < 0 || ((mode_t) 0777) < Umask) /* Set up default umask */ - Umask = DEFUMASK; - (void)umask(Umask); - - if (Def_timeout > MAX_TIMEOUT) /* Set up default timeouts and delays */ - Def_timeout = MAX_TIMEOUT; - if (Sleeptime < 0 || Sleeptime > 5) - Sleeptime = SLEEPTIME; - (void)alarm(Def_timeout); -#else - (void)alarm((u_int) timeout); -#endif - (void)signal(SIGALRM, timedout); -#endif - (void)signal(SIGQUIT, SIG_IGN); - (void)signal(SIGINT, SIG_IGN); -#if !defined(AIX) && !defined(AFS_HPUX_ENV) - (void)setpriority(PRIO_PROCESS, 0, 0); -#endif -#ifdef Q_SETUID - (void)quota(Q_SETUID, 0, 0, 0); -#endif /* Q_SETUID */ - - /* - * -p is used by getty to tell login not to destroy the environment - * -f is used to skip a second login authentication - * -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(tbuf, sizeof(tbuf)); - domain = strchr(tbuf, '.'); - -#ifdef AFS_HPUX_ENV - /* - * Set flag to disable the pid check if you find that you are - * a subsystem login. - */ - sublogin = 0; - if (*renvp && strcmp(*renvp, SUBLOGIN) == 0) - sublogin = 1; -#endif - fflag = hflag = pflag = rflag = 0; - memset(&utmp, '\0', sizeof(utmp)); - passwd_req = 1; -#ifdef AFS_SUN_ENV -#ifdef AFS_SUN5_ENV - while ((ch = getopt(argc, argv, "fh:prd")) != -1) { -#else - while ((ch = getopt(argc, argv, "fh:pr")) != -1) { -#endif -#else - while ((ch = getopt(argc, argv, "fh:p")) != EOF) { -#endif -/*printf("ch='%c'\n", ch);*/ - switch (ch) { - case 'f': - fflag = 1; - break; - case 'h': -#ifdef AFS_SUN_ENV - if (hflag || rflag) { - fprintf(stderr, "Only one of -r and -h allowed\n"); - exit(1); - } -#endif - if (getuid()) { - fprintf(stderr, "login: -h for super-user only.\n"); - - exit(1); - } - rlog = 1; - hflag = 1; - if (domain && (p = strchr(optarg, '.')) - && strcasecmp(p, domain) == 0) - *p = 0; - hostname = optarg; - break; -#ifdef AFS_SUN_ENV - case 'r': - if (hflag || rflag) { - fprintf(stderr, "Only one of -r and -h allowed\n"); - exit(1); - } - if (argv[2] == 0) - exit(1); -#ifndef AFS_SUN5_ENV -/* fflag = 1;*/ -#endif - rflag = 1; -#ifndef AFS_SUN5_ENV - usererr = doremotelogin(argv[2]); - strncpy(utmp.ut_host, argv[2], sizeof(utmp.ut_host)); - argc -= 2; - argv += 2; -#endif - continue; - - break; -#ifdef AFS_SUN5_ENV - case 'd': /* Ignode the '-d device' option for now!!! */ - dflag = 0; /* XXX */ - d_dev = *++argv; - argc--; - break; -#endif -#endif - case 'p': - pflag = 1; - break; - case '?': - default: - fprintf(stderr, "usage: login [-fp] [username]\n"); - exit(1); - } - } - argc -= optind; - argv += optind; -#ifdef AFS_SUN5_ENV - if (rflag) - strcpy(rhost, *argv++); - if (hflag) { - if (argv[0] && (*argv[0] != '-')) { - if ((!strncmp(*argv, "TERM=", strlen("TERM=")))) { - strncpy(term, &((*argv)[strlen("TERM=")]), sizeof(term)); - } - } - ask = 1; - } else -#endif -#if defined(AFS_SUN_ENV) && !defined(AFS_SUN5_ENV) - if (!rflag && *argv) { -#else - if (*argv) { -#endif -#ifdef AFS_OSF_ENV - memset(ousername, '\0', sizeof(ousername)); - strcpy(ousername, *argv); - loginname = ousername; -#else - username = *argv; -#endif - ask = 0; - } else { -#ifdef AFS_SUN5_ENV - ttypmt = getenv("TTYPROMPT"); - if (ttypmt && (*ttypmt != '\0')) { - extern char **getargs(); - /* - * if ttyprompt is set, there should be data on the stream already. - */ - if ((envp = getargs(buf1)) != (char **)NULL) { - username = *envp; - } - } - ask = 0; -#else -#ifdef AFS_SUN_ENV - if (rflag) - ask = 0; - else -#endif - ask = 1; -#endif - } - ioctlval = 0; -#if !defined(AIX) && !defined(AFS_HPUX_ENV) && !defined(AFS_OSF_ENV) - (void)ioctl(0, TIOCLSET, &ioctlval); - - (void)ioctl(0, TIOCNXCL, 0); - - (void)fcntl(0, F_SETFL, ioctlval); - (void)ioctl(0, TIOCGETP, &sgttyb); -#ifdef AFS_SUN_ENV - (void)ioctl(0, FIONBIO, &zero); - (void)ioctl(0, FIOASYNC, &zero); - (void)ioctl(0, TIOCLGET, &locl); - /* - * If talking to an rlogin process, - * propagate the terminal type and - * baud rate across the network. - */ -#ifdef AFS_SUN5_ENV - if (rflag) { - doremotelogin(); -#else - if (rflag || rlog) { - doremoteterm(term, &sgttyb); -#endif - } - locl &= LPASS8; - locl |= LCRTBS | LCTLECH | LDECCTQ; - if (sgttyb.sg_ospeed >= B1200) - locl |= LCRTERA | LCRTKIL; - (void)ioctl(0, TIOCLSET, &locl); -#endif - sgttyb.sg_erase = CERASE; - sgttyb.sg_kill = CKILL; - (void)ioctl(0, TIOCSLTC, <c); - (void)ioctl(0, TIOCSETC, &tc); -#ifdef AFS_SUN5_ENV - if (!rflag) -#endif - (void)ioctl(0, TIOCSETP, &sgttyb); -#endif /* AIX */ - for (cnt = getdtablesize(); cnt > 2; cnt--) - close(cnt); -#ifdef AFS_SUN52_ENV - if (dflag) { - ttyn = d_dev; - } else -#endif - if (ttyn == NULL) { - ttyn = ttyname(0); - if (ttyn == NULL || *ttyn == '\0') { -#ifdef AFS_OSF_ENV - (void)sprintf(tname, "%s??", _PATH_TTY); - ttyn = tname; -#else - ttyn = "/dev/tty??"; -#endif - - } - } -#ifdef AFS_HPUX_ENV - ttyntail = ttyn + sizeof("/dev/") - 1; -#endif - if (tty = strrchr(ttyn, '/')) - ++tty; - else - tty = ttyn; - - openlog("login", LOG_ODELAY, LOG_AUTH); - -#ifdef AFS_OSF_ENV -#define _PATH_HUSHLOGIN ".hushlogin" -#define _PATH_MAILDIR "/var/spool/mail" -#ifndef _PATH_DEFPATH -#define _PATH_DEFPATH "/usr/bin:." -#endif - { - int cnt; - int authret = 0, doafs = 0; - char shell[PATH_MAX + 1] = _PATH_BSHELL, *pass, user[40], ouser[40]; - int (*sia_collect) () = sia_collect_trm; - int getloginp(), uid; - struct passwd *pwd; - -/*printf("loginname=%s, ttyn=%s, fflag=%d\n", loginname, ttyn, fflag);*/ - quietlog = 0; - if ((sia_ses_init - (&entity, oargc, oargv, hostname, loginname, ttyn, 1, - NULL)) == SIASUCCESS) { - static int useGetPass = 0; - int cnt1 = 0, first = 0; - char *prompt, *reason, pword[BUFSIZ]; - /***** SIA SESSION AUTHENTICATION *****/ - if (!fflag) { - for (cnt = 5; cnt; cnt--) { - doafs = 0; - if (first++ || !entity->name) { - clean_entity_pwd(entity); - if (getloginp(entity) < 0) { - printf("Illegal login name\n"); - doafs = -1; - break; - } - } - strcpy(user, entity->name); - prompt = "Password:"; - if ((pwd = getpwnam(user))) { - if (!strcmp(pwd->pw_passwd, "X")) { - doafs = 1; - } - } - if (useGetPass) { - pass = getpass(prompt); - } else { - code = - ka_UserReadPassword(prompt, pword, sizeof(pword), - &reason); - pass = pword; - if (code) { - if (code != KANULLPASSWORD) { - if (++cnt1 > 3) - useGetPass = 1; - } - fprintf(stderr, - "Unable to read password because %s\n", - reason); - continue; - } - } - - if (!pwd) { - printf("Login incorrect\n"); - fflush(stdout); - continue; - } - - if (doafs - || - ((authret = - sia_ses_authent(sia_collect, pass, - entity)) == SIASUCCESS)) { - if (doafs) { - uid = pwd->pw_uid; - sia_make_entity_pwd(pwd, entity); - } else { - uid = entity->pwd->pw_uid; - pwd = entity->pwd; - } - doafs: - authret = do_afs_auth(pwd, pass, doafs); - if (!authret) { - strcpy(ouser, user); - printf("Login incorrect\n"); - fflush(stdout); - continue; - } - - printf("AFS (R) %s Login\n", AFSVersion); - - if (uid) { - groups[0] = groups[1] = 0; - ngroups = getgroups(NGROUPS, groups); - pagval = - get_pag_from_groups(groups[0], groups[1]); - } - break; - } else if (authret & SIASTOP) { - break; - } else if (authret == SIAFAIL) { - /* why did it fail ? */ - struct ttyent *ptr; - setttyent(); - /* - ** if the "ptys" command does not exist in the - ** /etc/securettys file, then root login's are - ** allowed only from the console - */ - if (!pwd->pw_uid) /* for root */ - if (((ptr = getttynam("ptys")) == NULL) - || !(ptr->ty_status & TTY_SECURE)) { - printf - ("root login refused on this terminal\n"); - continue; - } - } - if (doafs || (authret != SIASUCCESS)) { - uid = pwd->pw_uid; - sia_make_entity_pwd(pwd, entity); - goto doafs; - } - printf("login incorrect\n"); - } - if (cnt <= 0 || (doafs == -1)) { - sia_ses_release(&entity); - exit(1); - } - } - /***** SIA SESSION ESTABLISHMENT *****/ - if (sia_ses_estab(sia_collect, entity) == SIASUCCESS) { - /* - * Display and update lastlog file entry. -DAL003 - */ - quietlog = access(_PATH_HUSHLOGIN, F_OK) == 0; - if (!quietlog) - quietlog = !*entity->pwd->pw_passwd - && !usershell(entity->pwd->pw_shell); - if (!entity->tty) - dolastlog(quietlog); - /* END DAL003 */ -#ifdef AFS_KERBEROS_ENV - (void)chown(ktc_tkt_string(), pwd->pw_uid, pwd->pw_gid); -#endif /* AFS_KERBEROS_ENV */ - /***** SIA LAUNCHING SESSION *****/ - if (sia_ses_launch(sia_collect, entity) == SIASUCCESS) { - ngroups = getgroups(NGROUPS, groups); - if ((pagval != NOPAG) - && (afs_get_pag_from_groups(groups[0], groups[1])) == - NOPAG) { - /* we will have to shift grouplist to make room for pag */ - if (ngroups + 2 > NGROUPS) { - perror("Too many groups"); /* XXX */ - exit(3); - } - for (j = ngroups - 1; j >= 0; j--) { - groups[j + 2] = groups[j]; - } - ngroups += 2; - get_groups_from_pag(pagval, &groups[0], &groups[1]); - seteuid(0); /* Since the seteuid was set the user already */ - if (setgroups(ngroups, groups) == -1) { - perror("setgroups"); - exit(3); - } - seteuid(entity->pwd->pw_uid); /* Set euid back */ - } - /****** Nothing left to fail *******/ - if (setreuid(geteuid(), geteuid()) < 0) { - perror("setreuid()"); - exit(3); - } - /****** set up environment *******/ - /* destroy environment unless user has requested preservation */ - envinit[0] = envinit[1] = 0; - if (environ) - for (cnt = 0; environ[cnt] != NULL; cnt++) - if (!strncmp(environ[cnt], "TERM=", 5)) { - envinit[0] = environ[cnt]; - break; - } - if (!pflag) - environ = envinit; - (void)setenv("HOME", entity->pwd->pw_dir, 1); - if (entity->pwd->pw_shell && *entity->pwd->pw_shell) - strncpy(shell, entity->pwd->pw_shell, sizeof shell); - (void)setenv("SHELL", shell, 1); - if (term[0] == '\0') - (void)strncpy(term, stypeof(tty), sizeof(term)); - (void)setenv("TERM", term, 0); - (void)setenv("USER", entity->pwd->pw_name, 1); - (void)setenv("LOGNAME", entity->pwd->pw_name, 1); - (void)setenv("PATH", _PATH_DEFPATH, 0); -#ifdef AFS_KERBEROS_ENV - (void)setenv("KRBTKFILE", ktc_tkt_string(), 0); -#endif /* AFS_KERBEROS_ENV */ - if (!quietlog) { - struct stat st; - - motd(); - (void)sprintf(tbuf, "%s/%s", _PATH_MAILDIR, - entity->pwd->pw_name); - if (stat(tbuf, &st) == 0 && st.st_size != 0) - (void)printf("You have %smail.\n", - (st.st_mtime > - st.st_atime) ? "new " : ""); - } - /******* Setup default signals **********/ - (void)signal(SIGALRM, SIG_DFL); - (void)signal(SIGQUIT, SIG_DFL); - (void)signal(SIGINT, SIG_DFL); - (void)signal(SIGTSTP, SIG_IGN); - - tbuf[0] = '-'; - (void)strcpy(tbuf + 1, - (p = strrchr(shell, '/')) ? p + 1 : shell); - sia_ses_release(&entity); - execlp(shell, tbuf, 0); - (void)printf("login: no shell: %s.\n", strerror(errno)); - exit(0); - } - /***** SIA session launch failure *****/ - } - /***** SIA session establishment failure *****/ - } - if (entity != NULL) { - sia_ses_release(&entity); - } - syslog(LOG_ERR, " LOGIN FAILURE "); - exit(1); - } -#else /* AFS_OSF_ENV */ -#ifdef AFS_HPUX_ENV - { /* This block sets TZ environment on HPUX */ - /* First set TZ environment here, so that - * LOGIN FAILURE will get correct time stamp. - * For logins from console, -p flag is not set, - * the TZ environment set here will be cleared later. - * We're gonna set it once again later after it's cleared. - */ - FILE *fp; - char buf[MAX_TZ_LEN]; - char *env_p = NULL; - int tz_incorrect = 0; - - /* set TZ only if tz_incorrect - * (*env_p==0 or env_p==0 ) and there is a correct /etc/TIMEZONE - * otherwise, just let it be default (US eastern on HP) - */ - env_p = getenv("TZ"); - if (!env_p) - tz_incorrect = 1; - else if (!(*env_p)) - tz_incorrect = 1; - - if (tz_incorrect) { - /* HP UX 10.0 or later has different file format */ -#ifdef AFS_HPUX100_ENV - /* /etc/TIMEZONE file example (HP-UX 10 or later) - * TZ=EST5EDT - * export TZ - */ - fp = fopen("/etc/TIMEZONE", "r"); - if (fp) { - if ((fgets(buf, sizeof(buf), fp)) != NULL) { - buf[strlen(buf) - 1] = 0; - if (!strncmp(buf, "TZ=", 3)) { - strncpy(TZ, buf, MAX_TZ_LEN); - putenv(TZ); - } - } - fclose(fp); - } -#else /* AFS_HPUX100_ENV */ - /* /etc/src.sh file example (HP-UX 9 or earlier) - * SYSTEM_NAME=myname; export SYSTEM_NAME - * TZ=EST5EDT; export TZ - */ - fp = fopen("/etc/src.sh", "r"); - if (fp) { - while ((fgets(buf, sizeof(buf), fp)) != NULL) { - buf[strlen(buf) - 1] = 0; - if (!strncmp(buf, "TZ=", 3)) { - char *p = strchr(buf, ';'); - if (p) - *p = 0; - strncpy(TZ, buf, MAX_TZ_LEN); - putenv(TZ); - } - } - fclose(fp); - } -#endif /* AFS_HPUX100_ENV */ - } else { - *TZ = 0; - } - } -#endif /* AFS_HPUX_ENV */ - for (cnt = 0;; ask = 1) { - ioctlval = 0; -#if !defined(AIX) && !defined(AFS_HPUX_ENV) - (void)ioctl(0, TIOCSETD, &ioctlval); -#endif /* !AIX and !hpux */ - - if (ask | !username) { - fflag = 0; - getloginname(1); - } - /* - * Note if trying multiple user names; - * log failures for previous user name, - * but don't bother logging one failure - * for nonexistent name (mistyped username). - */ - if (failures && strcmp(tbuf, username)) { - if (failures > (pwd ? 0 : 1)) - badlogin(tbuf); - failures = 0; - } - (void)strcpy(tbuf, username); - salt = "xx"; -#ifdef AFS_SUN5_ENV - if ((pwd = getpwnam(username)) && (spwd = getspnam(username))) { - initgroups(username, pwd->pw_gid); /* XXX */ - salt = spwd->sp_pwdp; - } -#else /* if !SUN5 */ - if (pwd = getpwnam(username)) - salt = pwd->pw_passwd; -#endif /* else !SUN5 */ - - /* if user not super-user, check for disabled logins */ - if (pwd == NULL || pwd->pw_uid) { - checknologin(); - } - - /* - * Disallow automatic login to root; if not invoked by - * root, disallow if the uid's differ. - */ - if (fflag && pwd) { - uid_t uid = getuid(); - - /* - * allow f flag only if user running login is - * same as target user or superuser - */ - fflag = (uid == 0) || (uid == pwd->pw_uid); - if (fflag) - passwd_req = 0; -/* passwd_req = pwd->pw_uid == 0 || (uid && uid != pwd->pw_uid);*/ - } - - /* - * If no pre-authentication and a password exists - * for this user, prompt for one and verify it. - */ - if (!passwd_req || (pwd && !*pwd->pw_passwd)) { - break; - } -#if defined(AFS_SUN_ENV) && !defined(AFS_SUN5_ENV) - if (!usererr) - break; -#endif -#if !defined(AIX) && !defined(AFS_HPUX_ENV) - setpriority(PRIO_PROCESS, 0, -4); -#endif - - /* - * The basic model for logging in now, is that *if* there - * is a kerberos record for this individual user we will - * trust kerberos (provided the user really has an account - * locally.) If there is no kerberos record (or the password - * were typed incorrectly.) we would attempt to authenticate - * against the local password file entry. Naturally, if - * both fail we use existing failure code. - */ - if (pwd) { - char pword[BUFSIZ]; - int cnt1 = 0; - static int useGetPass = 0; - - if (useGetPass) { - pp = getpass("Password:"); - memcpy(pword, pp, 8); - } else { - code = - ka_UserReadPassword("Password:", pword, sizeof(pword), - &reason); - - if (code) { - if (code != KANULLPASSWORD) { - if (++cnt1 > 5) - useGetPass = 1; - } - fprintf(stderr, "Unable to read password because %s\n", - reason); - goto loginfailed; - } - } - pp = pword; - if (ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION + KA_USERAUTH_DOSETPAG, pwd->pw_name, /* kerberos name */ - NULL, /* instance */ - NULL, /* realm */ - pp, /* password */ - 0, /* default lifetime */ - &password_expires, 0, /* spare 2 */ - &reason /* error string */ - )) { - - afsLoginFail = 1; - pword[8] = '\0'; - } else { - if (strcmp(pwd->pw_passwd, "*")) - break; /* out of for loop */ -#if !defined(AIX) && !defined(AFS_HPUX_ENV) - (void)ioctl(0, TIOCHPCL, (struct sgttyb *)NULL); -#endif /* AIX */ - goto loginfailed; - } - } else { - pp = getpass("Password:"); - } - - p = crypt(pp, salt); - (void)memset(pp, '\0', strlen(pp)); -#ifdef AFS_SUN5_ENV - if (spwd && !strcmp(p, spwd->sp_pwdp)) -#else - if (pwd && !strcmp(p, pwd->pw_passwd)) -#endif - { - /* Only print this if local authentication is successful */ - if (afsLoginFail) { - printf("Unable to authenticate to AFS because %s\n", reason); - printf("proceeding with local authentication...\n"); - } - afsLoginFail = 0; - break; - } - afsLoginFail = 0; - - loginfailed: - printf("Login incorrect\n"); - failures++; - /* we allow 10 tries, but after 3 we start backing off */ - if (++cnt > 3) { - if (cnt >= 6) { - badlogin(username); -#if !defined(AIX) && !defined(AFS_HPUX_ENV) - (void)ioctl(0, TIOCHPCL, (struct sgttyb *)NULL); -#endif /* AIX */ - (void)close(0); - (void)close(1); - (void)close(2); - sleep(10); - exit(1); - } - sleep((u_int) ((cnt - 3) * 5)); - } - } -#if !defined(AIX) && !defined(AFS_HPUX_ENV) - setpriority(PRIO_PROCESS, 0, 0); -#endif /* AIX */ -#ifdef AFS_SUN5_ENV - /* Exits if root login not on system console. */ - if (pwd->pw_uid == 0) { - if ((Console != NULL) && (strcmp(ttyn, Console) != 0)) { - (void)printf("Not on system console\n"); - exit(10); - } - if (Def_supath != NULL) - Def_path = Def_supath; - else - Def_path = DEF_SUPATH; - } -#endif /* AFS_SUN5_ENV */ - - printf("AFS (R) %s Login\n", AFSVersion); /* generated version */ - - /* committed to login -- turn off timeout */ - (void)alarm((u_int) 0); - - /* - * If valid so far and root is logging in, see if root logins on - * this terminal are permitted. - */ -#if !defined(AIX) && !defined(AFS_SUN5_ENV) -#ifdef AFS_HPUX_ENV - /* This is the /etc/securetty feature. We wanted to 1st prompt for a - * password even if we know that this is not a securetty because - * we don't want to give any clue if the potential intruder guesses - * the correct password. - */ - if ((pwd->pw_uid == 0) && !rootterm(ttyn + sizeof("/dev/") - 1)) { -#else - if (pwd->pw_uid == 0 && !rootterm(tty)) { -#endif - if (hostname) - syslog(LOG_NOTICE, "ROOT LOGIN REFUSED FROM %s", hostname); - else - syslog(LOG_NOTICE, "ROOT LOGIN REFUSED ON %s", tty); - printf("Login incorrect\n"); - - /* - * Reset tty line. - */ - - (void)chmod(ttyn, 0666); - - sleepexit(1); - } -#endif /* !AIX & !SUN5 */ -#ifdef Q_SETUID - if (quota(Q_SETUID, pwd->pw_uid, 0, 0) < 0 && errno != EINVAL) { - switch (errno) { - case EUSERS: - fprintf(stderr, - "Too many users logged on already.\nTry again later.\n"); - break; - case EPROCLIM: - fprintf(stderr, "You have too many processes running.\n"); - break; - default: - perror("quota (Q_SETUID)"); - } - - /* - * Reset tty line. - */ - - (void)chmod(ttyn, 0666); - - sleepexit(0); - } -#endif /* Q_SETUID */ - - /* For Solaris and HP, we might want to chdir later for remotely - * mounted home directory because home direcotry may be - * protected now - */ - if (chdir(pwd->pw_dir) < 0) { -#if !defined(AFS_SUN5_ENV) && !defined(AFS_HPUX_ENV) - printf("No directory %s!\n", pwd->pw_dir); -#endif /* !defined(AFS_SUN5_ENV) && !defined(AFS_HPUX_ENV) */ - if (chdir("/")) { - - /* - * Reset tty line. - */ - - (void)chmod(ttyn, 0666); - - exit(0); - } -#if !defined(AFS_SUN5_ENV) && !defined(AFS_HPUX_ENV) - pwd->pw_dir = "/"; - printf("Logging in with home = \"/\".\n"); -#else /* !defined(AFS_SUN5_ENV) && !defined(AFS_HPUX_ENV) */ - retry_chdir = 1; -#endif /* !defined(AFS_SUN5_ENV) && !defined(AFS_HPUX_ENV) */ - } - - /* nothing else left to fail -- really log in */ - { -#ifdef AFS_SUN5_ENV - long tlen; - struct utmpx *utx, *getutxent(), *pututxline(); -#endif -#if defined(AFS_HPUX_ENV) - register struct utmp *u = NULL; - extern pid_t getpid(); -#endif - -#ifdef AFS_SUN5_ENV - (void)time(&utmp.ut_tv.tv_sec); -#else - (void)time(&utmp.ut_time); -#endif - strncpy(utmp.ut_name, username, sizeof(utmp.ut_name)); -#if !defined(AIX) /*&& !defined(AFS_SUN5_ENV) */ - if (hostname) - strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host)); -#endif - strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line)); -#if defined(AFS_HPUX_ENV) || defined(AFS_SUN5_ENV) - utmp.ut_type = USER_PROCESS; - if (!strncmp(ttyn, "/dev/", strlen("/dev/"))) { - strncpy(utmp.ut_line, &(ttyn[strlen("/dev/")]), - sizeof(utmp.ut_line)); - } - - utmp.ut_pid = getpid(); - if ((!strncmp(tty, "tty", strlen("tty"))) - || (!strncmp(tty, "pty", strlen("pty")))) { - strncpy(utmp.ut_id, &(tty[strlen("tty")]), sizeof(utmp.ut_id)); - } -#endif /* AFS_HPUX_ENV */ -#ifdef AFS_HPUX_ENV - /* - * Find the entry for this pid (or line if we are a sublogin) - * in the utmp file. - */ - while ((u = getutent()) != NULL) { - if ((u->ut_type == INIT_PROCESS || u->ut_type == LOGIN_PROCESS - || u->ut_type == USER_PROCESS) - && - ((sublogin - && strncmp(u->ut_line, ttyntail, sizeof(u->ut_line)) == 0) - || u->ut_pid == utmp.ut_pid)) { - - /* - * Copy in the name of the tty minus the - * "/dev/", the id, and set the type of entry - * to USER_PROCESS. - */ - (void)strncpy(utmp.ut_line, ttyntail, sizeof(utmp.ut_line)); - utmp.ut_id[0] = u->ut_id[0]; - utmp.ut_id[1] = u->ut_id[1]; - utmp.ut_id[2] = u->ut_id[2]; - utmp.ut_id[3] = u->ut_id[3]; - utmp.ut_type = USER_PROCESS; - utmp.how_to_count = add_count(); - - /* - * Copy remote host information - */ - strncpy(utmp.ut_host, u->ut_host, sizeof(utmp.ut_host)); - utmp.ut_addr = u->ut_addr; - - /* Return the new updated utmp file entry. */ - pututline(&utmp); - break; - } - } - endutent(); /* Close utmp file */ -#endif -#ifdef AFS_SUN5_ENV - utmp.ut_syslen = (tlen = - strlen(utmp.ut_host)) ? min(tlen + 1, - sizeof(utmp. - ut_host)) : 0; - strncpy(utmp.ut_user, username, sizeof(utmp.ut_user)); - while ((utx = getutxent()) != NULL) { - if ((utx->ut_type == INIT_PROCESS || utx->ut_type == LOGIN_PROCESS - || utx->ut_type == USER_PROCESS) - && (utx->ut_pid == utmp.ut_pid)) { - strncpy(utmp.ut_line, (ttyn + sizeof("/dev/") - 1), - sizeof(utmp.ut_line)); - utmp.ut_id[0] = utx->ut_id[0]; - utmp.ut_id[1] = utx->ut_id[1]; - utmp.ut_id[2] = utx->ut_id[2]; - utmp.ut_id[3] = utx->ut_id[3]; - utmp.ut_type = USER_PROCESS; - pututxline(&utmp); - break; - } - } - endutxent(); /* Close utmp file */ - if (!utx) { - printf - ("No utmpx entry. You must exec 'login' from the lowest level 'sh'\n"); - exit(1); - } else - updwtmpx(WTMPX_FILE, &utmp); -#else - login(&utmp); -#endif - } - - quietlog = access(HUSHLOGIN, F_OK) == 0; - dolastlog(quietlog); - -#if !defined(AIX) && !defined(AFS_HPUX_ENV) -#ifdef AFS_SUN_ENV - if (!hflag && !rflag) { /* XXX */ -#else - if (!hflag) { /* XXX */ -#endif - static struct winsize win = { 0, 0, 0, 0 }; - - (void)ioctl(0, TIOCSWINSZ, &win); - } -#endif /* !AIX and !hpux */ - -#ifdef AFS_SUN5_ENV - /* - * Set the user's ulimit - */ - if (Def_ulimit > 0L && ulimit(SET_FSIZ, Def_ulimit) < 0L) - (void)printf("Could not set ULIMIT to %ld\n", Def_ulimit); - -#endif -#if defined(AFS_SUN_ENV) - /* - * Set owner/group/permissions of framebuffer devices - */ - (void)set_fb_attrs(ttyn, pwd->pw_uid, pwd->pw_gid); -#endif - - (void)chown(ttyn, pwd->pw_uid, - (gr = getgrnam(TTYGRPNAME)) ? gr->gr_gid : pwd->pw_gid); - - - (void)chmod(ttyn, 0620); - (void)setgid(pwd->pw_gid); - -#ifdef AFS_HPUX_ENV - if ((pwd->pw_gid < 0) || (pwd->pw_gid > MAXUID)) { - printf("Bad group id.\n"); - exit(1); - } - if ((pwd->pw_uid < 0) || (pwd->pw_uid > MAXUID)) { - printf("Bad user id.\n"); - exit(1); - } -#endif - -#ifdef AFS_KERBEROS_ENV - (void)chown(ktc_tkt_string(), pwd->pw_uid, pwd->pw_gid); - -#endif - - groups[0] = groups[1] = 0; - ngroups = getgroups(NGROUPS_MAX, groups); - pagval = get_pag_from_groups(groups[0], groups[1]); - initgroups(username, pwd->pw_gid); - ngroups = getgroups(NGROUPS_MAX, groups); - if ((pagval != NOPAG) - && (afs_get_pag_from_groups(groups[0], groups[1])) == NOPAG) { - /* we will have to shift grouplist to make room for pag */ - if (ngroups + 2 > NGROUPS_MAX) - return E2BIG; /* XXX */ - for (j = ngroups - 1; j >= 0; j--) { - groups[j + 2] = groups[j]; - } - ngroups += 2; - get_groups_from_pag(pagval, &groups[0], &groups[1]); - if (setgroups(ngroups, groups) == -1) { - perror("setgroups"); - return -1; - } - } -#ifdef Q_DOWARN - quota(Q_DOWARN, pwd->pw_uid, (dev_t) - 1, 0); -#endif /* Q_DOWARN */ - - /* destroy environment unless user has requested preservation */ - if (!pflag) { - envinit[0] = NULL; - envinit[1] = NULL; - environ = envinit; - } - (void)setuid(pwd->pw_uid); - -#if defined(AFS_SUN5_ENV) || defined(AFS_HPUX_ENV) - /* This is the time to retry chdir for Solaris and HP - */ - if (retry_chdir && chdir(pwd->pw_dir) < 0) { - printf("No directory %s!\n", pwd->pw_dir); - if (chdir("/") < 0) { - /* reset tty line and exit */ - (void)chmod(ttyn, 0666); - exit(0); - } - pwd->pw_dir = "/"; - printf("Logging with home = \"/\".\n"); - } -#endif /* AFS_SUN5_ENV || AFS_HPUX_ENV */ - - if (*pwd->pw_shell == '\0') - pwd->pw_shell = BSHELL; -#if !defined(AIX) && !defined(AFS_HPUX_ENV) - /* turn on new line discipline for the csh */ - else if (!strcmp(pwd->pw_shell, "/bin/csh")) { - ioctlval = NTTYDISC; - (void)ioctl(0, TIOCSETD, &ioctlval); - } -#endif /* AIX */ -#ifdef AFS_SUN5_ENV - else { - if (Altshell != NULL && strcmp(Altshell, "YES") == 0) { - (void)setenv("SHELL", pwd->pw_shell, 1); - } - } - if (Def_tz != NULL) { - tmp_tz = Def_tz; - } - Def_tz = getenv("TZ"); - if (Def_tz) { - setenv("TZ", Def_tz, 1); - } else { - if (tmp_tz) { - Def_tz = tmp_tz; - setenv("TZ", Def_tz, 1); - } - } - if (Def_hertz == NULL) - (void)setenv("HZ", HZ, 1); - else - (void)setenv("HZ", Def_hertz, 1); - -#endif - -#ifdef AFS_HPUX_ENV - /* if pflag is not set - * the TZ environment was cleared moments ago */ - if (*TZ && !pflag) { - setenv("TZ", &TZ[3], 1); - } -#endif /* AFS_HPUX_ENV */ - - (void)setenv("HOME", pwd->pw_dir, 1); - (void)setenv("SHELL", pwd->pw_shell, 1); - if (term[0] == '\0') - strncpy(term, stypeof(tty), sizeof(term)); - (void)setenv("TERM", term, 0); - (void)setenv("USER", pwd->pw_name, 1); - (void)setenv("LOGNAME", pwd->pw_name, 1); -#ifdef AFS_SUN5_ENV - if (Def_path == NULL) - (void)setenv("PATH", DEF_PATH, 0); - else - (void)setenv("PATH", Def_path, 0); -#else - (void)setenv("PATH", "/usr/ucb:/bin:/usr/bin:", 0); -#endif - -#if defined(AFS_SUN5_ENV) || defined(AFS_HPUX100_ENV) -#ifndef NO_MAIL - /* Sol, HP: set MAIL only if NO_MAIL is not set */ - sprintf(mail, "%s%s", MAILDIR, pwd->pw_name); - (void)setenv("MAIL", mail, 0); -#endif /* NO_MAIL */ -#endif /* AFS_SUN5_ENV || AFS_HPUX100_ENV */ - -#ifdef AFS_KERBEROS_ENV - (void)setenv("KRBTKFILE", ktc_tkt_string(), 0); -#endif - - if (password_expires >= 0) { - char sbuffer[100]; - (void)setenv("PASSWORD_EXPIRES", - cv2string(&sbuffer[100], password_expires), 1); - } - - if (tty[sizeof("tty") - 1] == 'd') - syslog(LOG_INFO, "DIALUP %s, %s", tty, pwd->pw_name); - if (pwd->pw_uid == 0) - if (hostname) - syslog(LOG_NOTICE, "ROOT LOGIN ON %s FROM %s", tty, hostname); - else - syslog(LOG_NOTICE, "ROOT LOGIN ON %s", tty); - - if (!quietlog) { - struct stat st; - -#if ! defined(AFS_SUN5_ENV) && (! defined(AFS_HPUX_ENV)) - /* In Solaris the shell displays motd */ - /* On hp700s /etc/profile also does it so it's redundant here too */ - motd(); - /* Don't check email either, should be done in shell */ - (void)sprintf(tbuf, "%s/%s", MAILDIR, pwd->pw_name); - if (stat(tbuf, &st) == 0 && st.st_size != 0) - printf("You have %smail.\n", - (st.st_mtime > st.st_atime) ? "new " : ""); -#endif - } - - (void)signal(SIGALRM, SIG_DFL); - (void)signal(SIGQUIT, SIG_DFL); - (void)signal(SIGINT, SIG_DFL); -#if !defined(AIX) && !defined(AFS_HPUX_ENV) - (void)signal(SIGTSTP, SIG_IGN); -#endif /* AIX */ - - tbuf[0] = '-'; - strcpy(tbuf + 1, - (p = strrchr(pwd->pw_shell, '/')) ? p + 1 : pwd->pw_shell); - execlp(pwd->pw_shell, tbuf, 0); - fprintf(stderr, "login: no shell: "); - perror(pwd->pw_shell); - exit(0); -#endif /* else AFS_OSF_ENV */ -} - -getloginname(prompt) - int prompt; -{ - register int ch; - register char *p; - static char nbuf[UT_NAMESIZE + 1]; - - for (;;) { - if (prompt) { - printf("login: "); - prompt = 0; - } - for (p = nbuf; (ch = getchar()) != '\n';) { - if (ch == EOF) { - badlogin(username); - exit(0); - } - if (p < nbuf + UT_NAMESIZE) - *p++ = (char)ch; - } - if (p > nbuf) { - if (nbuf[0] == '-') - fprintf(stderr, "login names may not start with '-'.\n"); - else { - *p = '\0'; - username = nbuf; - break; - } - } else - prompt = 1; - } -} - - -#ifdef AFS_HPUX_ENV -rootterm(tty) - char *tty; -{ - register FILE *fd; - char buf[100]; - - /* - * check to see if /etc/securetty exists, if it does then scan - * file to see if passwd tty is in the file. Return 1 if it is, 0 if not. - */ - if ((fd = fopen(SECURETTY_FILE, "r")) == NULL) - return (1); - while (fgets(buf, sizeof buf, fd) != NULL) { - buf[strlen(buf) - 1] = '\0'; - if (strcmp(tty, buf) == 0) { - fclose(fd); - return (1); - } - } - fclose(fd); - return (0); -} -#endif -#if !defined(AIX) && !defined(AFS_HPUX_ENV) && !defined(AFS_SUN5_ENV) -rootterm(ttyn) - char *ttyn; -{ - struct ttyent *t; - - return ((t = getttynam(ttyn)) && t->ty_status & TTY_SECURE); -} -#endif - -jmp_buf motdinterrupt; - -motd() -{ - register int fd, nchars; - void (*oldint) (); - void sigint(); - char tbuf[8192]; - - if ((fd = open(MOTDFILE, O_RDONLY, 0)) < 0) - return; - oldint = signal(SIGINT, sigint); - if (setjmp(motdinterrupt) == 0) - while ((nchars = read(fd, tbuf, sizeof(tbuf))) > 0) - (void)write(fileno(stdout), tbuf, nchars); - (void)signal(SIGINT, oldint); - (void)close(fd); -} - -void -sigint() -{ - longjmp(motdinterrupt, 1); -} - -checknologin() -{ - register int fd, nchars; - char tbuf[8192]; - - if ((fd = open(NOLOGIN, O_RDONLY, 0)) >= 0) { - while ((nchars = read(fd, tbuf, sizeof(tbuf))) > 0) - (void)write(fileno(stdout), tbuf, nchars); - sleepexit(0); - } -} - -#if defined(AIX) || defined(AFS_HPUX_ENV) || defined(AFS_AIX32_ENV) -dolastlog(quiet) - int quiet; -{ - return 0; -} -#else -#ifdef AFS_OSF_ENV -dolastlog(quiet) - int quiet; -{ -#define _PATH_LASTLOG "/var/adm/lastlog" - struct lastlog ll; - int fd; - struct passwd *pwd; - - pwd = entity->pwd; - if ((fd = open(_PATH_LASTLOG, (O_RDWR | O_CREAT), 0666)) < 0) - fprintf(stderr, "Can't open %s", _PATH_LASTLOG); - else { - (void)lseek(fd, (off_t) pwd->pw_uid * sizeof(ll), L_SET); - if (!quiet) { - if (read(fd, (char *)&ll, sizeof(ll)) == sizeof(ll) - && ll.ll_time != 0) { - (void)printf("Last login: %.*s ", 24 - 5, - (char *)ctime(&ll.ll_time)); - if (*ll.ll_host != '\0') - (void)printf("from %.*s\n", sizeof(ll.ll_host), - ll.ll_host); - else - (void)printf("on %.*s\n", sizeof(ll.ll_line), ll.ll_line); - } - } - (void)close(fd); - } -} -#else -dolastlog(quiet) - int quiet; -{ - struct lastlog ll; - int fd; - - if ((fd = open(LASTLOG, O_RDWR, 0)) >= 0) { - (void)lseek(fd, (off_t) pwd->pw_uid * sizeof(ll), L_SET); - if (!quiet) { - if (read(fd, (char *)&ll, sizeof(ll)) == sizeof(ll) - && ll.ll_time != 0) { - printf("Last login: %.*s ", 24 - 5, - (char *)ctime(&ll.ll_time)); - if (*ll.ll_host != '\0') - printf("from %.*s\n", sizeof(ll.ll_host), ll.ll_host); - else - printf("on %.*s\n", sizeof(ll.ll_line), ll.ll_line); - } - (void)lseek(fd, (off_t) pwd->pw_uid * sizeof(ll), L_SET); - } - memset(&ll, '\0', sizeof(ll)); - (void)time(&ll.ll_time); - strncpy(ll.ll_line, tty, sizeof(ll.ll_line)); - if (hostname) - strncpy(ll.ll_host, hostname, sizeof(ll.ll_host)); - (void)write(fd, (char *)&ll, sizeof(ll)); - (void)close(fd); - } -} -#endif -#endif /* AIX */ - -badlogin(name) - char *name; -{ - if (failures == 0) - return; - if (hostname) - syslog(LOG_NOTICE, "%d LOGIN FAILURE%s FROM %s, %s", failures, - failures > 1 ? "S" : "", hostname, name); - else - syslog(LOG_NOTICE, "%d LOGIN FAILURE%s ON %s, %s", failures, - failures > 1 ? "S" : "", tty, name); -} - -#undef UNKNOWN -#ifdef AFS_SUN5_ENV -#define UNKNOWN "sun" -#else -#define UNKNOWN "su" -#endif - -#if defined(AIX) || defined(AFS_HPUX_ENV) || defined(AFS_SUN5_ENV) -char * -stypeof(ttyid) - char *ttyid; -{ - return (UNKNOWN); -} -#else -char * -stypeof(ttyid) - char *ttyid; -{ - struct ttyent *t; - - return (ttyid && (t = getttynam(ttyid)) ? t->ty_type : UNKNOWN); -} -#endif - -getstr(buf, cnt, err) - char *buf, *err; - int cnt; -{ - char ch; - - do { - if (read(0, &ch, sizeof(ch)) != sizeof(ch)) - exit(1); - if (--cnt < 0) { - fprintf(stderr, "%s too long\r\n", err); - sleepexit(1); - } - *buf++ = ch; - } while (ch); -} - -sleepexit(eval) - int eval; -{ - sleep((u_int) 5); - exit(eval); -} - - -int -get_pag_from_groups(g0, g1) - afs_uint32 g0, g1; -{ - afs_uint32 h, l, result; - - g0 -= 0x3f00; - g1 -= 0x3f00; - if (g0 < 0xc000 && g1 < 0xc000) { - l = ((g0 & 0x3fff) << 14) | (g1 & 0x3fff); - h = (g0 >> 14); - h = (g1 >> 14) + h + h + h; - result = ((h << 28) | l); - /* Additional testing */ - if (((result >> 24) & 0xff) == 'A') - return result; - else - return NOPAG; - } - return NOPAG; -} - - -get_groups_from_pag(pag, g0p, g1p) - afs_uint32 pag; - afs_uint32 *g0p, *g1p; -{ - unsigned short g0, g1; - - pag &= 0x7fffffff; - g0 = 0x3fff & (pag >> 14); - g1 = 0x3fff & pag; - g0 |= ((pag >> 28) / 3) << 14; - g1 |= ((pag >> 28) % 3) << 14; - *g0p = g0 + 0x3f00; - *g1p = g1 + 0x3f00; -} - - -#if defined(AFS_SUN_ENV) -/* - * set_fb_attrs -- change owner/group/permissions of framebuffers - * listed in /etc/fbtab. - * - * Note: - * Exiting from set_fb_attrs upon error is not advisable - * since it would disable logins on console devices. - * - * File format: - * console mode device_name[:device_name ...] - * # begins a comment and may appear anywhere on a line. - * - * Example: - * /dev/console 0660 /dev/fb:/dev/cgtwo0:/dev/bwtwo0 - * /dev/console 0660 /dev/gpone0a:/dev/gpone0b - * - * Description: - * The example above sets the owner/group/permissions of the listed - * devices to uid/gid/0660 if ttyn is /dev/console - */ - -#define FIELD_DELIMS " \t\n" -#define COLON ":" -#define COLON_C ':' -#define WILDCARD "/*" -#define WILDCARD_LEN 2 -#define MAX_LINELEN 256 -#ifdef AFS_SUN5_ENV -#define FBTAB "/etc/logindevperm" -#else -#define FBTAB "/etc/fbtab" -#endif - - -set_fb_attrs(ttyn, uid, gid) - char *ttyn; - int uid; - int gid; -{ - char line[MAX_LINELEN]; - char *console; - char *mode_str; - char *dev_list; - char *device; - char *ptr; - int mode; - long strtol(); - FILE *fp; - - if ((fp = fopen(FBTAB, "r")) == NULL) - return; - while (fgets(line, MAX_LINELEN, fp)) { - if (ptr = strchr(line, '#')) - *ptr = '\0'; /* handle comments */ - if ((console = strtok(line, FIELD_DELIMS)) == NULL) - continue; /* ignore blank lines */ - if (strcmp(console, ttyn) != 0) - continue; /* ignore non-consoles */ - mode_str = strtok((char *)NULL, FIELD_DELIMS); - if (mode_str == NULL) { - (void)fprintf(stderr, "%s: invalid entry -- %s\n", FBTAB, line); - continue; - } - /* convert string to octal value */ - mode = (int)strtol(mode_str, (char **)NULL, 8); - if (mode < 0 || mode > 0777) { - (void)fprintf(stderr, "%s: invalid mode -- %s\n", FBTAB, - mode_str); - continue; - } - dev_list = strtok((char *)NULL, FIELD_DELIMS); - if (dev_list == NULL) { - (void)fprintf(stderr, "%s: %s -- empty device list\n", FBTAB, - console); - continue; - } -#ifdef AFS_SUN5_ENV - device = strtok(dev_list, COLON); - while (device) { - ptr = strstr(device, WILDCARD); - if (ptr && (strlen(device) - (ptr - &device[0])) == WILDCARD_LEN) { - /* The device was a (legally-specified) directory. */ - DIR *dev_dir; - struct dirent *dir_e; - char dev_file[MAXPATHLEN]; - - *ptr = '\0'; /* Remove the wildcard from the dir name. */ - if ((dev_dir = opendir(device)) == (DIR *) NULL) { - syslog(LOG_ERR, "bad device %s%s in %s, ignored", device, - WILDCARD, FBTAB); - continue; - } - - /* Directory is open; alter its files. */ - /* Must link with /usr/lib/libc.a before - * /usr/ucblib/libucb.a or the d_name structs - * miss the first two characters of the filename */ - while (dir_e = readdir(dev_dir)) { - if (strcmp(dir_e->d_name, "..") - && strcmp(dir_e->d_name, ".")) { - strcpy(dev_file, device); - strcat(dev_file, "/"); - strcat(dev_file, dir_e->d_name); - (void)chown(dev_file, uid, gid); - (void)chmod(dev_file, mode); - } - } - (void)closedir(dev_dir); - } else { - /* 'device' was not a directory, so we can just do it. */ - (void)chown(device, uid, gid); - (void)chmod(device, mode); - } - device = strtok((char *)NULL, COLON); /* Move thru list. */ -#else - device = strtok(dev_list, COLON); - while (device) { - (void)chown(device, uid, gid); - (void)chmod(device, mode); - device = strtok((char *)NULL, COLON); -#endif - } - } - (void)fclose(fp); -} -#endif - - -#ifdef AFS_SUN5_ENV -static int -quotec() -{ - register int c, i, num; - - switch (c = getc(stdin)) { - case 'n': - c = '\n'; - break; - case 'r': - c = '\r'; - break; - case 'v': - c = '\013'; - break; - case 'b': - c = '\b'; - break; - case 't': - c = '\t'; - break; - case 'f': - c = '\f'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - for (num = 0, i = 0; i < 3; i++) { - num = num * 8 + (c - '0'); - if ((c = getc(stdin)) < '0' || c > '7') - break; - } - ungetc(c, stdin); - c = num & 0377; - break; - default: - break; - } - return (c); -} - -static char ** -getargs(inline) - char *inline; -{ - static char envbuf[256]; - static char *args[63]; - register char *ptr, **answer; - register int c; - int state; - extern int quotec(); - - for (ptr = envbuf; ptr < &envbuf[sizeof(envbuf)];) - *ptr++ = '\0'; - for (answer = args; answer < &args[63];) - *answer++ = (char *)NULL; - for (ptr = envbuf, answer = &args[0], state = 0; - (c = getc(stdin)) != EOF;) { - *(inline++) = c; - switch (c) { - case '\n': - if (ptr == &envbuf[0]) - return ((char **)NULL); - else - return (&args[0]); - case ' ': - case '\t': - if (state == 1) { - *ptr++ = '\0'; - state = 0; - } - break; - case '\\': - c = quotec(); - default: - if (state == 0) { - *answer++ = ptr; - state = 1; - } - *ptr++ = c; - } - if (ptr == &envbuf[sizeof(envbuf) - 1]) { - ungetc('\n', stdin); - putc('\n', stdout); - } - } - exit(0); -} -#endif - -#ifdef AFS_SUN_ENV -#ifdef AFS_SUN5_ENV -doremotelogin() -{ - static struct passwd nouser = { "", "no:password", ~0 }; - - getstr(rusername, sizeof(rusername), "remuser"); - getstr(lusername, sizeof(lusername), "locuser"); - if (!username) - username = lusername; - getstr(term, sizeof(term), "Terminal type"); - if (getuid()) { - pwd = &nouser; - goto out; - - } - pwd = getpwnam(lusername); - if (pwd == NULL) { - pwd = &nouser; - goto out; - } - out: - doremoteterm(term); - return; -} -#else -doremotelogin(host) - char *host; -{ - int code; - static char rusername[100], lusername[100]; - static struct passwd nouser = { "", "no:password", ~0 }; - - getstr(rusername, sizeof(rusername), "remuser"); - getstr(lusername, sizeof(lusername), "locuser"); - if (!username) - username = lusername; - getstr(term, sizeof(term), "Terminal type"); - if (getuid()) { - pwd = &nouser; - return -1; - } - pwd = getpwnam(lusername); - if (pwd == NULL) { - pwd = &nouser; - return -1; - } - code = ruserok(host, (pwd->pw_uid == 0), rusername, lusername); -/*printf("DOREM=%d, host=%s, uid=%d, ruser=%s, luser=%s\n", code, host, pwd->pw_uid, rusername, lusername);*/ - return code; -} -#endif - -char *speeds[] = { "0", "50", "75", "110", "134", "150", "200", "300", - "600", "1200", "1800", "2400", "4800", "9600", "19200", "38400" -}; - -#define NSPEEDS (sizeof (speeds) / sizeof (speeds[0])) - -#ifdef AFS_SUN5_ENV -doremoteterm(terminal) -#else -doremoteterm(terminal, tp) - struct sgttyb *tp; -#endif - char *terminal; -{ -#ifdef AFS_SUN5_ENV - struct termios tp; -#endif - register char *cp = strchr(terminal, '/'), **cpp; - char *speed; - -#ifdef AFS_SUN5_ENV - (void)ioctl(0, TCGETS, &tp); -#endif - if (cp) { - *cp++ = '\0'; - speed = cp; - cp = strchr(speed, '/'); - if (cp) - *cp++ = '\0'; - for (cpp = speeds; cpp < &speeds[NSPEEDS]; cpp++) - if (strcmp(*cpp, speed) == 0) { -#ifdef AFS_SUN5_ENV - tp.c_cflag = - ((tp.c_cflag & ~CBAUD) | ((cpp - speeds) & CBAUD)); -#else - tp->sg_ispeed = tp->sg_ospeed = cpp - speeds; -#endif - break; - } - } -#ifdef AFS_SUN5_ENV - tp.c_lflag = ECHO | ICANON | IGNPAR | ICRNL; - (void)ioctl(0, TCSETS, &tp); -#else - tp->sg_flags = ECHO | CRMOD | ANYP | XTABS; -#endif -} -#endif - -#ifdef AFS_OSF_ENV -/* - * Check if the specified program is really a shell (e.g. "sh" or "csh"). - */ -usershell(shell) - char *shell; -{ - register char *p; - char *getusershell(); - - setusershell(); - while ((p = getusershell()) != NULL) - if (strcmp(p, shell) == 0) - break; - endusershell(); - return (!!p); -} - -static char * -getlinep(const char *string, int size, FILE * stream) -{ - extern int errno; - int c; - char *cp; - - errno = 0; - if (!fgets(string, size, stream) || ferror(stream) || errno == EINTR) - return NULL; - else if (cp = strchr(string, '\n')) - *cp = '\0'; - else - while ((c = getc(stdin)) != '\n' && c != EOF && errno != EINTR); - return string; -} - -clean_entity_pwd(SIAENTITY * entity) -{ - if (entity->acctname != NULL) { - free(entity->acctname); - entity->acctname = NULL; - } - if (entity->pwd != NULL) { - if (entity->pwd->pw_name) { - memset(entity->pwd->pw_name, '\0', strlen(entity->pwd->pw_name)); - free(entity->pwd->pw_name); - entity->pwd->pw_name = NULL; - } - if (entity->pwd->pw_passwd) { - memset(entity->pwd->pw_passwd, '\0', - strlen(entity->pwd->pw_passwd)); - free(entity->pwd->pw_passwd); - entity->pwd->pw_passwd = NULL; - } - if (entity->pwd->pw_comment) { - memset(entity->pwd->pw_comment, '\0', - strlen(entity->pwd->pw_comment)); - free(entity->pwd->pw_comment); - entity->pwd->pw_comment = NULL; - } - if (entity->pwd->pw_gecos) { - memset(entity->pwd->pw_gecos, '\0', - strlen(entity->pwd->pw_gecos)); - free(entity->pwd->pw_gecos); - entity->pwd->pw_gecos = NULL; - } - if (entity->pwd->pw_dir) { - memset(entity->pwd->pw_dir, '\0', strlen(entity->pwd->pw_dir)); - free(entity->pwd->pw_dir); - entity->pwd->pw_dir = NULL; - } - if (entity->pwd->pw_shell) { - memset(entity->pwd->pw_shell, '\0', - strlen(entity->pwd->pw_shell)); - free(entity->pwd->pw_shell); - entity->pwd->pw_shell = NULL; - } - free(entity->pwd); - entity->pwd = NULL; - } -} - -int -getloginp(entity) - SIAENTITY *entity; -{ - char result[100]; - - fputs("login: ", stdout); - if (getlinep(result, sizeof result, stdin) == (char *)NULL) { - return (-1); - } - entity->name = (char *)malloc(SIANAMEMIN + 1); - if (entity->name == NULL) - return (-1); - strcpy((unsigned char *)entity->name, result); - return (1); -} - -#ifdef AFS_KERBEROS_ENV -extern char *ktc_tkt_string(); -#endif - -int -do_afs_auth(pwd, pass, doafs) - struct passwd *pwd; - char *pass; - int doafs; -{ - char *namep; - int code, afsLoginFail = 0; - char *lcell, realm[MAXKTCREALMLEN], *pword, prompt[256]; - char *shell, *reason; - - loop: - if (pass) { - pword = pass; - } else { - sprintf(prompt, "Enter AFS password: "); - pword = getpass(prompt); - if (strlen(pword) == 0) { - printf - ("Unable to read password because zero length password is illegal\n"); - printf("Login incorrect\n"); - fflush(stdout); - goto loop; - } - } - - if (ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION + KA_USERAUTH_DOSETPAG, pwd->pw_name, /* kerberos name */ - NULL, /* instance */ - NULL, /* realm */ - pword, /* password */ - 0, /* default lifetime */ - 0, /* spare 1 */ - 0, /* spare 2 */ - &reason /* error string */ )) { - afsLoginFail = 1; - if (doafs) - return 0; - } else { - if (pwd->pw_passwd && strcmp(pwd->pw_passwd, "*")) - return 1; /* Success */ - } - - if (!pwd->pw_passwd) - return 0; - namep = crypt(pword, pwd->pw_passwd); - code = strcmp(namep, pwd->pw_passwd) == 0 ? 1 : 0; - if ((code == 1) && afsLoginFail) { - /* Only print this if local authentication is successful */ - printf("Unable to authenticate to AFS because %s\n", reason); - printf("proceeding with local authentication...\n"); - } - return code; -} - - -#endif - -#ifdef AFS_SUN5_ENV -static void -defaults() -{ - extern int defopen(), defcntl(); - register int flags; - register char *ptr; - - if (defopen(Pndefault) == 0) { - /* - * ignore case - */ - flags = defcntl(DC_GETFLAGS, 0); - TURNOFF(flags, DC_CASE); - defcntl(DC_SETFLAGS, flags); - - if ((Console = defread("CONSOLE=")) != NULL) - Console = strdup(Console); - if ((Altshell = defread("ALTSHELL=")) != NULL) - Altshell = strdup(Altshell); - if ((Passreq = defread("PASSREQ=")) != NULL) - Passreq = strdup(Passreq); - if ((Def_tz = defread("TIMEZONE=")) != NULL) - Def_tz = strdup(Def_tz); - if ((Def_hertz = defread("HZ=")) != NULL) - Def_hertz = strdup(Def_hertz); - if ((Def_path = defread("PATH=")) != NULL) - Def_path = strdup(Def_path); - if ((Def_supath = defread("SUPATH=")) != NULL) - Def_supath = strdup(Def_supath); - if ((ptr = defread("ULIMIT=")) != NULL) - Def_ulimit = atol(ptr); - if ((ptr = defread("TIMEOUT=")) != NULL) - Def_timeout = (unsigned)atoi(ptr); - if ((ptr = defread("UMASK=")) != NULL) - if (sscanf(ptr, "%lo", &Umask) != 1) - Umask = DEFUMASK; - if ((ptr = defread("IDLEWEEKS=")) != NULL) - Idleweeks = atoi(ptr); - if ((ptr = defread("SLEEPTIME=")) != NULL) - Sleeptime = atoi(ptr); - (void)defopen(NULL); - } - return; -} -#endif - -#ifdef AFS_HPUX_ENV -/* - * returns 1 if user should be counted as 1 user; - * returns 3 if user should be counted as a pty - * may return other stuff in the future - */ -int -add_count() -{ - if (isapty()) { - if (is_nlio()) - return (1); - else - return (3); - } else - return (1); -} - -/* - * returns 1 if user is a pty, 0 otherwise - */ -#define SSTRPTYMAJOR 157 /* major number for Streams slave pty's */ -#define SPTYMAJOR 17 /* major number for slave pty's */ -#define PTYSC 0x00 /* select code for pty's */ -#define select_code(x) (((x) & 0xff0000) >> 16) -isapty() -{ - struct stat sbuf; - static int firsttime = 1; - static int retval; - - if (firsttime) { - firsttime = 0; - if (fstat(0, &sbuf) != 0 || /* can't stat */ - (sbuf.st_mode & S_IFMT) != S_IFCHR || /* not char special */ - major(sbuf.st_rdev) != SPTYMAJOR || /* not pty major num */ - select_code(sbuf.st_rdev) != PTYSC) { /* not pty minor num */ - /* Check to see if it is a Streams PTY */ - if (major(sbuf.st_rdev) == SSTRPTYMAJOR) { - retval = 1; - } else - retval = 0; /* neither a BSD nor a Streams PTY */ - } else { - retval = 1; -#ifdef TRUX - if (ISB1 && !remote_login) - retval = 0; /* local pty for td tty simulation */ -#endif /* TRUX */ - } - } - return (retval); -} - -#define NLIOUCOUNT _IO('K',28) /* _IO(K, 28) */ -#define NLIOSERV 0x4b33 /* (('K' << 8) + 51 */ - -/* - * returns 1 if user is an NL server, else returns 0 - */ -is_nlio() -{ - if (ioctl(0, NLIOUCOUNT) == NLIOSERV) - return (1); - else - return (0); -} -#endif diff --git a/src/login/setenv.c b/src/login/setenv.c deleted file mode 100644 index 9b9831c43..000000000 --- a/src/login/setenv.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 1987 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include - -RCSID - ("$Header$"); - -#include -#include - -char *_findenv(); - -/* - * setenv -- - * Set the value of the environmental variable "name" to be - * "value". If rewrite is set, replace any current value. - */ -setenv(name, value, rewrite) - register char *name, *value; - int rewrite; -{ - extern char **environ; - static int alloced; /* if allocated space before */ - register char *C; - int l_value, offset; - char *malloc(), *realloc(); - - if (*value == '=') /* no `=' in value */ - ++value; - l_value = strlen(value); - if ((C = _findenv(name, &offset))) { /* find if already exists */ - if (!rewrite) - return (0); - if (strlen(C) >= l_value) { /* old larger; copy over */ - while (*C++ = *value++); - return (0); - } - } else { /* create new slot */ - register int cnt; - register char **P; - - for (P = environ, cnt = 0; *P; ++P, ++cnt); - if (alloced) { /* just increase size */ - environ = - (char **)realloc((char *)environ, - (u_int) (sizeof(char *) * (cnt + 2))); - if (!environ) - return (-1); - } else { /* get new space */ - alloced = 1; /* copy old entries into it */ - P = (char **)malloc((u_int) (sizeof(char *) * (cnt + 2))); - if (!P) - return (-1); - memcpy(P, environ, cnt * sizeof(char *)); - environ = P; - } - environ[cnt + 1] = NULL; - offset = cnt; - } - for (C = name; *C && *C != '='; ++C); /* no `=' in name */ - if (!(environ[offset] = /* name + `=' + value */ - malloc((u_int) ((int)(C - name) + l_value + 2)))) - return (-1); - for (C = environ[offset]; (*C = *name++) && *C != '='; ++C); - for (*C++ = '='; *C++ = *value++;); - return (0); -} - -/* - * unsetenv(name) -- - * Delete environmental variable "name". - */ -void -unsetenv(name) - char *name; -{ - extern char **environ; - register char **P; - int offset; - - while (_findenv(name, &offset)) /* if set multiple times */ - for (P = &environ[offset];; ++P) - if (!(*P = *(P + 1))) - break; -} diff --git a/src/login/util_login.c b/src/login/util_login.c deleted file mode 100644 index ae718613a..000000000 --- a/src/login/util_login.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 1988 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include - -RCSID - ("$Header$"); - -#include -#include -#include -#include -#ifdef AIX -#include -#include -#define L_SET SEEK_SET -#endif - -#ifdef AFS_SUN5_ENV -#include -#endif - -#define UTMPFILE "/etc/utmp" -#ifdef AFS_HPUX_ENV -#define WTMPFILE "/etc/wtmp" -#else -#define WTMPFILE "/usr/adm/wtmp" -#endif - -void -login(ut) - struct utmp *ut; -{ - register int fd; - int tty; - off_t lseek(); - - tty = ttyslot(); - if (tty > 0 && (fd = open(UTMPFILE, O_WRONLY, 0)) >= 0) { - (void)lseek(fd, (long)(tty * sizeof(struct utmp)), L_SET); - (void)write(fd, (char *)ut, sizeof(struct utmp)); - (void)close(fd); - } - if ((fd = open(WTMPFILE, O_WRONLY | O_APPEND, 0)) >= 0) { - (void)write(fd, (char *)ut, sizeof(struct utmp)); - (void)close(fd); - } -} diff --git a/src/login/util_logout.c b/src/login/util_logout.c deleted file mode 100644 index c23e2112c..000000000 --- a/src/login/util_logout.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 1988 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include - -RCSID - ("$Header$"); - -#include -#include -#ifdef AFS_SUN5_ENV -#include -#define L_INCR SEEK_CUR -#endif -#include -#include -#include -#include -#ifdef AIX -#include -#include -#define L_INCR SEEK_CUR -#endif - -#define UTMPFILE "/etc/utmp" - -/* 0 on failure, 1 on success */ - -logout(line) - register char *line; -{ - register FILE *fp; - struct utmp ut; - int rval; - - if (!(fp = fopen(UTMPFILE, "r+"))) - return (0); - rval = 0; - while (fread((char *)&ut, sizeof(struct utmp), 1, fp) == 1) { - if (!ut.ut_name[0] || strncmp(ut.ut_line, line, sizeof(ut.ut_line))) - continue; - memset(ut.ut_name, 0, sizeof(ut.ut_name)); -#if !defined(AIX) && !defined(AFS_SUN5_ENV) - memset(ut.ut_host, 0, sizeof(ut.ut_host)); -#endif /* AIX */ - (void)time(&ut.ut_time); - (void)fseek(fp, (long)-sizeof(struct utmp), L_INCR); - (void)fwrite((char *)&ut, sizeof(struct utmp), 1, fp); - (void)fseek(fp, (long)0, L_INCR); - rval = 1; - } - (void)fclose(fp); - return (rval); -} diff --git a/src/login/util_logwtmp.c b/src/login/util_logwtmp.c deleted file mode 100644 index 314bd764d..000000000 --- a/src/login/util_logwtmp.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 1988 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include - -RCSID - ("$Header$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef AFS_HPUX_ENV -#define WTMPFILE "/etc/wtmp" -#else -#define WTMPFILE "/usr/adm/wtmp" -#endif - - -void -logwtmp(line, name, host) - char *line, *name, *host; -{ - struct utmp ut; - struct stat buf; - int fd; - - if ((fd = open(WTMPFILE, O_WRONLY | O_APPEND, 0)) < 0) - return; - if (!fstat(fd, &buf)) { - (void)strncpy(ut.ut_line, line, sizeof(ut.ut_line)); - (void)strncpy(ut.ut_name, name, sizeof(ut.ut_name)); -#if !defined(AIX) && !defined(AFS_SUN5_ENV) - (void)strncpy(ut.ut_host, host, sizeof(ut.ut_host)); -#endif - (void)time(&ut.ut_time); - if (write(fd, (char *)&ut, sizeof(struct utmp)) != - sizeof(struct utmp)) - (void)ftruncate(fd, buf.st_size); - } - (void)close(fd); -} -- 2.39.5