X-Git-Url: https://git.cameronkatri.com/pw-darwin.git/blobdiff_plain/30955b898350ac476a47d83662e9679de21eb4e0..908a8140bcf46c17b5136443b301f75adfd1c4b6:/chpass/chpass.c?ds=inline diff --git a/chpass/chpass.c b/chpass/chpass.c index ea4a558..982548f 100644 --- a/chpass/chpass.c +++ b/chpass/chpass.c @@ -40,7 +40,7 @@ static char copyright[] = #ifndef lint static char sccsid[] = "From: @(#)chpass.c 8.4 (Berkeley) 4/2/94"; static char rcsid[] = - "$Id: chpass.c,v 1.4 1995/08/13 16:12:24 wpaul Exp $"; + "$Id: chpass.c,v 1.13 1997/02/22 19:54:25 peter Exp $"; #endif /* not lint */ #include @@ -63,13 +63,14 @@ static char rcsid[] = #include #include "pw_copy.h" #ifdef YP +#include +int yp_errno = YP_TRUE; #include "pw_yp.h" #endif #include "chpass.h" #include "pathnames.h" -char *progname = "chpass"; char *tempname; uid_t uid; @@ -81,8 +82,9 @@ main(argc, argv) int argc; char **argv; { - enum { NEWSH, LOADENTRY, EDITENTRY, NEWPW } op; + enum { NEWSH, LOADENTRY, EDITENTRY, NEWPW, NEWEXP } op; struct passwd *pw, lpw; + char *username = NULL; int ch, pfd, tfd; char *arg; #ifdef YP @@ -92,9 +94,9 @@ main(argc, argv) op = EDITENTRY; #ifdef YP - while ((ch = getopt(argc, argv, "a:p:s:ly")) != EOF) + while ((ch = getopt(argc, argv, "a:p:s:e:d:h:oly")) != -1) #else - while ((ch = getopt(argc, argv, "a:p:s:")) != EOF) + while ((ch = getopt(argc, argv, "a:p:s:e:")) != -1) #endif switch(ch) { case 'a': @@ -109,12 +111,44 @@ main(argc, argv) op = NEWPW; arg = optarg; break; + case 'e': + op = NEWEXP; + arg = optarg; + break; #ifdef YP + case 'h': +#ifdef PARANOID + if (getuid()) { + warnx("Only the superuser can use the -h flag"); + } else { +#endif + yp_server = optarg; +#ifdef PARANOID + } +#endif + break; + case 'd': +#ifdef PARANOID + if (getuid()) { + warnx("Only the superuser can use the -d flag"); + } else { +#endif + yp_domain = optarg; + if (yp_server == NULL) + yp_server = "localhost"; +#ifdef PARANOID + } +#endif + break; case 'l': + _use_yp = 0; force_local = 1; break; case 'y': - force_yp = 1; + _use_yp = force_yp = 1; + break; + case 'o': + force_old++; break; #endif case '?': @@ -126,8 +160,17 @@ main(argc, argv) uid = getuid(); - if (op == EDITENTRY || op == NEWSH || op == NEWPW) + if (op == EDITENTRY || op == NEWSH || op == NEWPW || op == NEWEXP) switch(argc) { +#ifdef YP + case 0: + GETPWUID(uid) + get_yp_master(1); /* XXX just to set the suser flag */ + break; + case 1: + GETPWNAM(*argv) + get_yp_master(1); /* XXX just to set the suser flag */ +#else case 0: if (!(pw = getpwuid(uid))) errx(1, "unknown user: uid %u", uid); @@ -135,6 +178,7 @@ main(argc, argv) case 1: if (!(pw = getpwnam(*argv))) errx(1, "unknown user: %s", *argv); +#endif if (uid && uid != pw->pw_uid) baduser(); break; @@ -149,6 +193,13 @@ main(argc, argv) pw_error((char *)NULL, 0, 1); } + if (op == NEWEXP) { + if (uid) /* only root can change expire */ + baduser(); + if (p_expire(arg, pw, (ENTRY *)NULL)) + pw_error((char *)NULL, 0, 1); + } + if (op == LOADENTRY) { if (uid) baduser(); @@ -156,6 +207,7 @@ main(argc, argv) if (!pw_scan(arg, pw)) exit(1); } + username = pw->pw_name; if (op == NEWPW) { if (uid) @@ -167,32 +219,6 @@ main(argc, argv) pw->pw_passwd = arg; } -#ifdef YP - pw->pw_name = strdup(pw->pw_name); - _use_yp = use_yp(pw->pw_name); - if (_use_yp == USER_YP_ONLY) { - if (!force_local) { - _use_yp = 1; - pw = (struct passwd *)&yp_password; - } else - errx(1, "unknown local user: %s.", pw->pw_name); - } else if (_use_yp == USER_LOCAL_ONLY) { - if (!force_yp) { - _use_yp = 0; - pw = (struct passwd *)&local_password; - } else - errx(1, "unknown NIS user: %s.", pw->pw_name); - } else if (_use_yp == USER_YP_AND_LOCAL) { - if (!force_local) { - _use_yp = 1; - pw = (struct passwd *)&yp_password; - } else { - _use_yp = 0; - pw = (struct passwd *)&local_password; - } - } -#endif /* YP */ - /* * The temporary file/file descriptor usage is a little tricky here. * 1: We start off with two fd's, one for the master password @@ -237,7 +263,7 @@ main(argc, argv) #endif /* YP */ pw_copy(pfd, tfd, pw); - if (!pw_mkdb()) + if (!pw_mkdb(username)) pw_error((char *)NULL, 0, 1); #ifdef YP } @@ -257,9 +283,9 @@ usage() (void)fprintf(stderr, #ifdef YP - "usage: chpass [-l] [-y] [-a list] [-p encpass] [-s shell] [user]\n"); + "usage: chpass [-l] [-y] [-d domain [-h host]] [-a list] [-p encpass] [-s shell] [-e mmm dd yy] [user]\n"); #else - "usage: chpass [-a list] [-p encpass] [-s shell] [user]\n"); + "usage: chpass [-a list] [-p encpass] [-s shell] [-e mmm dd yy] [user]\n"); #endif exit(1); }