/* ARGSUSED */ int p_shell(char *p, struct passwd *pw, ENTRY *ep) { char *t; if (!*p) { pw->pw_shell = _PATH_BSHELL; return (0); } /* only admin can change from or to "restricted" shells */ if (uid && pw->pw_shell && !ok_shell(pw->pw_shell, NULL)) { warnx("%s: current shell non-standard", pw->pw_shell); return (1); } if (!ok_shell(p, &t)) { if (uid) { warnx("%s: non-standard shell", p); return (1); } else t = strdup(p); } if (!(pw->pw_shell = t)) { warnx("can't save entry"); return (1); } return (0); }
/* * display -- * print out the file for the user to edit; strange side-effect: * set conditional flag if the user gets to edit the shell. */ void display(char *tempname, int fd, struct passwd *pw) { FILE *fp; char *bp, *p; char chgstr[256], expstr[256]; if (!(fp = fdopen(fd, "w"))) (*Pw_error)(tempname, 1, 1); (void)fprintf(fp, "#Changing user %sdatabase information for %s.\n", use_yp ? "YP " : "", pw->pw_name); if (!uid) { (void)fprintf(fp, "Login: %s\n", pw->pw_name); (void)fprintf(fp, "Password: %s\n", pw->pw_passwd); (void)fprintf(fp, "Uid [#]: %d\n", pw->pw_uid); (void)fprintf(fp, "Gid [# or name]: %d\n", pw->pw_gid); (void)fprintf(fp, "Change [month day year]: %s\n", ttoa(chgstr, sizeof chgstr, pw->pw_change)); (void)fprintf(fp, "Expire [month day year]: %s\n", ttoa(expstr, sizeof expstr, pw->pw_expire)); (void)fprintf(fp, "Class: %s\n", pw->pw_class); (void)fprintf(fp, "Home directory: %s\n", pw->pw_dir); (void)fprintf(fp, "Shell: %s\n", *pw->pw_shell ? pw->pw_shell : _PATH_BSHELL); } /* Only admin can change "restricted" shells. */ else if (ok_shell(pw->pw_shell)) /* * Make shell a restricted field. Ugly with a * necklace, but there's not much else to do. */ (void)fprintf(fp, "Shell: %s\n", *pw->pw_shell ? pw->pw_shell : _PATH_BSHELL); else list[E_SHELL].restricted = 1; bp = strdup(pw->pw_gecos); if (!bp) { err(1, "strdup"); /*NOTREACHED*/ } p = strsep(&bp, ","); (void)fprintf(fp, "Full Name: %s\n", p ? p : ""); p = strsep(&bp, ","); (void)fprintf(fp, "Location: %s\n", p ? p : ""); p = strsep(&bp, ","); (void)fprintf(fp, "Office Phone: %s\n", p ? p : ""); p = strsep(&bp, ","); (void)fprintf(fp, "Home Phone: %s\n", p ? p : ""); (void)fchown(fd, getuid(), getgid()); (void)fclose(fp); free(bp); }
/* * display -- * print out the file for the user to edit; strange side-effect: * set conditional flag if the user gets to edit the shell. */ static int display(const char *tfn, struct passwd *pw) { FILE *fp; char *bp, *gecos, *p; if ((fp = fopen(tfn, "w")) == NULL) { warn("%s", tfn); return (-1); } fprintf(fp, "#Changing user information for %s.\n", pw->pw_name); if (master_mode) { fprintf(fp, "Login: %s\n", pw->pw_name); fprintf(fp, "Password: %s\n", pw->pw_passwd); fprintf(fp, "Uid [#]: %lu\n", (unsigned long)pw->pw_uid); fprintf(fp, "Gid [# or name]: %lu\n", (unsigned long)pw->pw_gid); fprintf(fp, "Change [month day year]: %s\n", ttoa(pw->pw_change)); fprintf(fp, "Expire [month day year]: %s\n", ttoa(pw->pw_expire)); fprintf(fp, "Class: %s\n", pw->pw_class); fprintf(fp, "Home directory: %s\n", pw->pw_dir); fprintf(fp, "Shell: %s\n", *pw->pw_shell ? pw->pw_shell : _PATH_BSHELL); } /* Only admin can change "restricted" shells. */ #if 0 else if (ok_shell(pw->pw_shell)) /* * Make shell a restricted field. Ugly with a * necklace, but there's not much else to do. */ #else else if ((!list[E_SHELL].restricted && ok_shell(pw->pw_shell)) || master_mode) /* * If change not restrict (table.c) and standard shell * OR if root, then allow editing of shell. */ #endif fprintf(fp, "Shell: %s\n", *pw->pw_shell ? pw->pw_shell : _PATH_BSHELL); else list[E_SHELL].restricted = 1; if ((bp = gecos = strdup(pw->pw_gecos)) == NULL) { warn(NULL); fclose(fp); return (-1); } p = strsep(&bp, ","); p = strdup(p ? p : ""); list[E_NAME].save = p; if (!list[E_NAME].restricted || master_mode) fprintf(fp, "Full Name: %s\n", p); p = strsep(&bp, ","); p = strdup(p ? p : ""); list[E_LOCATE].save = p; if (!list[E_LOCATE].restricted || master_mode) fprintf(fp, "Office Location: %s\n", p); p = strsep(&bp, ","); p = strdup(p ? p : ""); list[E_BPHONE].save = p; if (!list[E_BPHONE].restricted || master_mode) fprintf(fp, "Office Phone: %s\n", p); p = strsep(&bp, ","); p = strdup(p ? p : ""); list[E_HPHONE].save = p; if (!list[E_HPHONE].restricted || master_mode) fprintf(fp, "Home Phone: %s\n", p); bp = strdup(bp ? bp : ""); list[E_OTHER].save = bp; if (!list[E_OTHER].restricted || master_mode) fprintf(fp, "Other information: %s\n", bp); free(gecos); fchown(fileno(fp), getuid(), getgid()); fclose(fp); return (0); }