-check(tfp)
- FILE *tfp;
-{
- register long id;
- register int lcnt, root;
- register char *p, *sh;
- long atol();
- char buf[1024], *bp, *getusershell();
-
- for (lcnt = 1; fgets(buf, sizeof(buf), tfp); ++lcnt) {
- /* skip lines that are too big */
- if (!(p = index(buf, '\n'))) {
- (void)fprintf(stderr, "vipw: line too long");
- goto bad;
- }
- *p = '\0';
- bp = buf;
- if (!(p = strsep(&bp, ":"))) /* login */
- goto general;
- root = !strcmp(p, "root");
- (void)strsep(&bp, ":"); /* passwd */
- if (!(p = strsep(&bp, ":"))) /* uid */
- goto general;
- id = atol(p);
- if (root && id) {
- (void)fprintf(stderr, "vipw: root uid should be 0");
- goto bad;
- }
- if (id > USHRT_MAX) {
- (void)fprintf(stderr, "vipw: %s > max uid value (%d)",
- p, USHRT_MAX);
- goto bad;
- }
- if (!(p = strsep(&bp, ":"))) /* gid */
- goto general;
- id = atol(p);
- if (id > USHRT_MAX) {
- (void)fprintf(stderr, "vipw: %s > max gid value (%d)",
- p, USHRT_MAX);
- goto bad;
- }
- (void)strsep(&bp, ":"); /* class */
- (void)strsep(&bp, ":"); /* change */
- (void)strsep(&bp, ":"); /* expire */
- (void)strsep(&bp, ":"); /* gecos */
- (void)strsep(&bp, ":"); /* directory */
- if (!(p = strsep(&bp, ":"))) /* shell */
- goto general;
- if (root && *p) /* empty == /bin/sh */
- for (setusershell();;)
- if (!(sh = getusershell())) {
- (void)fprintf(stderr,
- "vipw: warning, unknown root shell.\n");
- break;
- }
- else if (!strcmp(p, sh))
- break;
- if (p = strsep(&bp, ":")) { /* too many */
-(void)fprintf(stderr, "got {%s}\n", p);
-general: (void)fprintf(stderr, "vipw: corrupted entry");
-bad: (void)fprintf(stderr, "; line #%d.\n", lcnt);
- (void)fflush(stderr);
- return(1);
- }
- }
- return(0);
-}
-
-makedb(file)
- char *file;
-{
- int status, pid, w;
-
- if (!(pid = vfork())) {
- execl(_PATH_MKPASSWD, "mkpasswd", "-p", file, NULL);
- _exit(127);
- }
- while ((w = wait(&status)) != pid && w != -1);
- return(w == -1 || status);
-}
-
-edit()
-{
- extern int errno;
- int status, pid, w;
- char *p, *editor, *getenv(), *strerror();
-
- if (editor = getenv("EDITOR")) {
- if (p = rindex(editor, '/'))
- ++p;
- else
- p = editor;
- }
- else
- p = editor = "vi";
- if (!(pid = vfork())) {
- execlp(editor, p, temp, NULL);
- (void)fprintf(stderr, "vipw: %s: %s\n", editor,
- strerror(errno));
- _exit(127);
- }
- while ((w = wait(&status)) != pid && w != -1);
- return(w == -1 || status);
-}
-
-prompt()
-{
- register int c;
-
- for (;;) {
- (void)printf("re-edit the password file? [y]: ");
- (void)fflush(stdout);
- c = getchar();
- if (c != EOF && c != (int)'\n')
- while (getchar() != (int)'\n');
- return(c == (int)'n');
- }
- /* NOTREACHED */
-}
-
-stop(val)
- int val;