]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - chpass/field.c
Change /home symbolic link, so it will point to usr/home instead of /usr/home.
[pw-darwin.git] / chpass / field.c
index 0e2770b169d9da09f8358ce42a1df950e9d7cf6d..eac5561a8dc2ec5ebb6f4b2c29ad96e146de770f 100644 (file)
@@ -1,6 +1,13 @@
 /*
  * Copyright (c) 1988, 1993, 1994
  *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 2002 Networks Associates Technology, Inc.
+ * All rights reserved.
+ *
+ * Portions of this software were developed for the FreeBSD Project by
+ * ThinkSec AS and NAI Labs, the Security Research Division of Network
+ * Associates, Inc.  under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -47,14 +54,12 @@ __FBSDID("$FreeBSD$");
 #include <err.h>
 #include <errno.h>
 #include <grp.h>
+#include <paths.h>
 #include <pwd.h>
-#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 
 #include "chpass.h"
-#include "pathnames.h"
 
 /* ARGSUSED */
 int
@@ -62,15 +67,15 @@ p_login(char *p, struct passwd *pw, ENTRY *ep __unused)
 {
        if (!*p) {
                warnx("empty login field");
-               return (1);
+               return (-1);
        }
        if (*p == '-') {
                warnx("login names may not begin with a hyphen");
-               return (1);
+               return (-1);
        }
        if (!(pw->pw_name = strdup(p))) {
                warnx("can't save entry");
-               return (1);
+               return (-1);
        }
        if (strchr(p, '.'))
                warnx("\'.\' is dangerous in a login name");
@@ -88,7 +93,7 @@ p_passwd(char *p, struct passwd *pw, ENTRY *ep __unused)
 {
        if (!(pw->pw_passwd = strdup(p))) {
                warnx("can't save password entry");
-               return (1);
+               return (-1);
        }
 
        return (0);
@@ -103,17 +108,17 @@ p_uid(char *p, struct passwd *pw, ENTRY *ep __unused)
 
        if (!*p) {
                warnx("empty uid field");
-               return (1);
+               return (-1);
        }
        if (!isdigit(*p)) {
                warnx("illegal uid");
-               return (1);
+               return (-1);
        }
        errno = 0;
        id = strtoul(p, &np, 10);
-       if (*np || (id == ULONG_MAX && errno == ERANGE)) {
+       if (*np || (id == (uid_t)ULONG_MAX && errno == ERANGE)) {
                warnx("illegal uid");
-               return (1);
+               return (-1);
        }
        pw->pw_uid = id;
        return (0);
@@ -129,21 +134,21 @@ p_gid(char *p, struct passwd *pw, ENTRY *ep __unused)
 
        if (!*p) {
                warnx("empty gid field");
-               return (1);
+               return (-1);
        }
        if (!isdigit(*p)) {
                if (!(gr = getgrnam(p))) {
                        warnx("unknown group %s", p);
-                       return (1);
+                       return (-1);
                }
                pw->pw_gid = gr->gr_gid;
                return (0);
        }
        errno = 0;
        id = strtoul(p, &np, 10);
-       if (*np || (id == ULONG_MAX && errno == ERANGE)) {
+       if (*np || (id == (uid_t)ULONG_MAX && errno == ERANGE)) {
                warnx("illegal gid");
-               return (1);
+               return (-1);
        }
        pw->pw_gid = id;
        return (0);
@@ -155,7 +160,7 @@ p_class(char *p, struct passwd *pw, ENTRY *ep __unused)
 {
        if (!(pw->pw_class = strdup(p))) {
                warnx("can't save entry");
-               return (1);
+               return (-1);
        }
 
        return (0);
@@ -168,7 +173,7 @@ p_change(char *p, struct passwd *pw, ENTRY *ep __unused)
        if (!atot(p, &pw->pw_change))
                return (0);
        warnx("illegal date for change field");
-       return (1);
+       return (-1);
 }
 
 /* ARGSUSED */
@@ -178,16 +183,16 @@ p_expire(char *p, struct passwd *pw, ENTRY *ep __unused)
        if (!atot(p, &pw->pw_expire))
                return (0);
        warnx("illegal date for expire field");
-       return (1);
+       return (-1);
 }
 
 /* ARGSUSED */
 int
-p_gecos(char *p, struct passwd *pw __unused, ENTRY *ep __unused)
+p_gecos(char *p, struct passwd *pw __unused, ENTRY *ep)
 {
        if (!(ep->save = strdup(p))) {
                warnx("can't save entry");
-               return (1);
+               return (-1);
        }
        return (0);
 }
@@ -198,11 +203,11 @@ p_hdir(char *p, struct passwd *pw, ENTRY *ep __unused)
 {
        if (!*p) {
                warnx("empty home directory field");
-               return (1);
+               return (-1);
        }
        if (!(pw->pw_dir = strdup(p))) {
                warnx("can't save entry");
-               return (1);
+               return (-1);
        }
        return (0);
 }
@@ -211,7 +216,6 @@ p_hdir(char *p, struct passwd *pw, ENTRY *ep __unused)
 int
 p_shell(char *p, struct passwd *pw, ENTRY *ep __unused)
 {
-       char *t;
        struct stat sbuf;
 
        if (!*p) {
@@ -219,21 +223,22 @@ p_shell(char *p, struct passwd *pw, ENTRY *ep __unused)
                return (0);
        }
        /* only admin can change from or to "restricted" shells */
-       if (uid && pw->pw_shell && !ok_shell(pw->pw_shell)) {
+       if (!master_mode && pw->pw_shell && !ok_shell(pw->pw_shell)) {
                warnx("%s: current shell non-standard", pw->pw_shell);
-               return (1);
+               return (-1);
        }
-       if (!(t = ok_shell(p))) {
-               if (uid) {
+       if (!ok_shell(p)) {
+               if (!master_mode) {
                        warnx("%s: non-standard shell", p);
-                       return (1);
+                       return (-1);
                }
+               pw->pw_shell = strdup(p);
        }
        else
-               p = t;
-       if (!(pw->pw_shell = strdup(p))) {
+               pw->pw_shell = dup_shell(p);
+       if (!pw->pw_shell) {
                warnx("can't save entry");
-               return (1);
+               return (-1);
        }
        if (stat(pw->pw_shell, &sbuf) < 0) {
                if (errno == ENOENT)
@@ -244,7 +249,7 @@ p_shell(char *p, struct passwd *pw, ENTRY *ep __unused)
                return (0);
        }
        if (!S_ISREG(sbuf.st_mode)) {
-               warnx("WARNING: shell '%s' is not a regular file", 
+               warnx("WARNING: shell '%s' is not a regular file",
                        pw->pw_shell);
                return (0);
        }