]> git.cameronkatri.com Git - pw-darwin.git/commitdiff
Make a separate groupdel/userdel from the main function
authorBaptiste Daroussin <bapt@FreeBSD.org>
Sat, 11 Jul 2015 19:07:47 +0000 (19:07 +0000)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Sat, 11 Jul 2015 19:07:47 +0000 (19:07 +0000)
pw/pw.c
pw/pw_group.c
pw/pw_user.c
pw/pwupd.h

diff --git a/pw/pw.c b/pw/pw.c
index 56e4103294712495a509670b92f2fc859c82b368..112b1f02717756fbc234d0bcf3106f6e1dafc452 100644 (file)
--- a/pw/pw.c
+++ b/pw/pw.c
@@ -323,6 +323,9 @@ main(int argc, char *argv[])
                case 'q':
                        conf.quiet = true;
                        break;
+               case 'r':
+                       conf.deletehome = true;
+                       break;
                default:
                        addarg(&arglist, ch, optarg);
                        break;
index d87c8cc6408ea477345246e350773f5853ea7692..a3fa595c90df7e9c890b79abe1410acc35a12a5e 100644 (file)
@@ -134,6 +134,29 @@ pw_groupshow(const char *name, long id, struct group *fakegroup)
        return (print_group(grp));
 }
 
+static int
+pw_groupdel(const char *name, long id)
+{
+       struct group *grp = NULL;
+       int rc;
+
+       grp = (name != NULL) ? GETGRNAM(name) : GETGRGID(id);
+       if (grp == NULL) {
+               if (name == NULL)
+                       errx(EX_DATAERR, "unknown gid `%ld'", id);
+               errx(EX_DATAERR, "unknown group `%s'", name);
+       }
+
+       rc = delgrent(grp);
+       if (rc == -1)
+               err(EX_IOERR, "group '%s' not available (NIS?)", name);
+       else if (rc != 0)
+               err(EX_IOERR, "group update");
+       pw_log(conf.userconf, M_DELETE, W_GROUP, "%s(%ld) removed", name, id);
+
+       return (EXIT_SUCCESS);
+}
+
 int
 pw_group(int mode, char *name, long id, struct cargs * args)
 {
@@ -158,6 +181,9 @@ pw_group(int mode, char *name, long id, struct cargs * args)
        if (mode == M_PRINT)
                return (pw_groupshow(name, id, &fakegroup));
 
+       if (mode == M_DELETE)
+               return (pw_groupdel(name, id));
+
        if (mode == M_LOCK || mode == M_UNLOCK)
                errx(EX_USAGE, "'lock' command is not available for groups");
 
@@ -166,7 +192,7 @@ pw_group(int mode, char *name, long id, struct cargs * args)
 
        grp = (name != NULL) ? GETGRNAM(name) : GETGRGID(id);
 
-       if (mode == M_UPDATE || mode == M_DELETE) {
+       if (mode == M_UPDATE) {
                if (name == NULL && grp == NULL)        /* Try harder */
                        grp = GETGRGID(id);
 
@@ -179,22 +205,6 @@ pw_group(int mode, char *name, long id, struct cargs * args)
                if (name == NULL)       /* Needed later */
                        name = grp->gr_name;
 
-               /*
-                * Handle deletions now
-                */
-               if (mode == M_DELETE) {
-                       rc = delgrent(grp);
-                       if (rc == -1)
-                               err(EX_IOERR, "group '%s' not available (NIS?)",
-                                   name);
-                       else if (rc != 0) {
-                               err(EX_IOERR, "group update");
-                       }
-                       pw_log(cnf, mode, W_GROUP, "%s(%ld) removed", name, id);
-                       return EXIT_SUCCESS;
-               } else if (mode == M_PRINT)
-                       return print_group(grp);
-
                if (id > 0)
                        grp->gr_gid = (gid_t) id;
 
index 153bc43baba53b9015ea1b149dcadefd82372da1..1c01d6a3eb7abbf38be88151c3b212622aacafc6 100644 (file)
@@ -51,8 +51,7 @@ static const char rcsid[] =
 
 static         char locked_str[] = "*LOCKED*";
 
-static int     delete_user(struct userconf *cnf, struct passwd *pwd,
-                   char *name, int delete, int mode);
+static int     pw_userdel(char *name, long id);
 static int     print_user(struct passwd * pwd);
 static uid_t    pw_uidpolicy(struct userconf * cnf, long id);
 static uid_t    pw_gidpolicy(struct cargs * args, char *nam, gid_t prefer);
@@ -266,6 +265,9 @@ pw_user(int mode, char *name, long id, struct cargs * args)
        if (mode == M_PRINT)
                return (pw_usershow(name, id, &fakeuser));
 
+       if (mode == M_DELETE)
+               return (pw_userdel(name, id));
+
        /*
         * We can do all of the common legwork here
         */
@@ -417,10 +419,9 @@ pw_user(int mode, char *name, long id, struct cargs * args)
                errx(EX_DATAERR, "user name or id required");
 
        /*
-        * Update, delete & print require that the user exists
+        * Update require that the user exists
         */
-       if (mode == M_UPDATE || mode == M_DELETE ||
-           mode == M_LOCK   || mode == M_UNLOCK) {
+       if (mode == M_UPDATE || mode == M_LOCK   || mode == M_UNLOCK) {
 
                if (name == NULL && pwd == NULL)        /* Try harder */
                        pwd = GETPWUID(id);
@@ -457,9 +458,7 @@ pw_user(int mode, char *name, long id, struct cargs * args)
                                errx(EX_DATAERR, "user '%s' is not locked", pwd->pw_name);
                        pwd->pw_passwd += sizeof(locked_str)-1;
                        edited = 1;
-               } else if (mode == M_DELETE)
-                       return (delete_user(cnf, pwd, name,
-                                   getarg(args, 'r') != NULL, mode));
+               }
 
                /*
                 * The rest is edit code
@@ -1045,17 +1044,30 @@ pw_password(struct userconf * cnf, struct cargs * args, char const * user)
 }
 
 static int
-delete_user(struct userconf *cnf, struct passwd *pwd, char *name,
-    int delete, int mode)
+pw_userdel(char *name, long id)
 {
+       struct passwd *pwd = NULL;
        char             file[MAXPATHLEN];
        char             home[MAXPATHLEN];
-       uid_t            uid = pwd->pw_uid;
+       uid_t            uid;
        struct group    *gr, *grp;
        char             grname[LOGNAMESIZE];
        int              rc;
        struct stat      st;
 
+       if (id < 0 && name == NULL)
+               errx(EX_DATAERR, "username or id required");
+
+       pwd = (name != NULL) ? GETPWNAM(pw_checkname(name, 0)) : GETPWUID(id);
+       if (pwd == NULL) {
+               if (name == NULL)
+                       errx(EX_NOUSER, "no such uid `%ld'", id);
+               errx(EX_NOUSER, "no such user `%s'", name);
+       }
+       uid = pwd->pw_uid;
+       if (name == NULL)
+               name = pwd->pw_name;
+
        if (strcmp(pwd->pw_name, "root") == 0)
                errx(EX_DATAERR, "cannot remove user 'root'");
 
@@ -1093,10 +1105,11 @@ delete_user(struct userconf *cnf, struct passwd *pwd, char *name,
        else if (rc != 0)
                err(EX_IOERR, "passwd update");
 
-       if (cnf->nispasswd && *cnf->nispasswd=='/') {
-               rc = delnispwent(cnf->nispasswd, name);
+       if (conf.userconf->nispasswd && *conf.userconf->nispasswd=='/') {
+               rc = delnispwent(conf.userconf->nispasswd, name);
                if (rc == -1)
-                       warnx("WARNING: user '%s' does not exist in NIS passwd", pwd->pw_name);
+                       warnx("WARNING: user '%s' does not exist in NIS passwd",
+                           pwd->pw_name);
                else if (rc != 0)
                        warn("WARNING: NIS passwd update");
                /* non-fatal */
@@ -1126,7 +1139,8 @@ delete_user(struct userconf *cnf, struct passwd *pwd, char *name,
        }
        ENDGRENT();
 
-       pw_log(cnf, mode, W_USER, "%s(%u) account removed", name, uid);
+       pw_log(conf.userconf, M_DELETE, W_USER, "%s(%u) account removed", name,
+           uid);
 
        if (!PWALTDIR()) {
                /*
@@ -1143,10 +1157,10 @@ delete_user(struct userconf *cnf, struct passwd *pwd, char *name,
                /*
                 * Remove home directory and contents
                 */
-               if (delete && *home == '/' && getpwuid(uid) == NULL &&
+               if (conf.deletehome && *home == '/' && getpwuid(uid) == NULL &&
                    stat(home, &st) != -1) {
                        rm_r(home, uid);
-                       pw_log(cnf, mode, W_USER, "%s(%u) home '%s' %sremoved",
+                       pw_log(conf.userconf, M_DELETE, W_USER, "%s(%u) home '%s' %sremoved",
                               name, uid, home,
                               stat(home, &st) == -1 ? "" : "not completely ");
                }
index 97e18f5b88785357c4ae79815ceaa73f211b802e..669cbb10e4988b862a8edfc239c53e869a3e5468 100644 (file)
@@ -94,6 +94,7 @@ struct pwconf {
        bool             pretty;
        bool             v7;
        bool             checkduplicate;
+       bool             deletehome;
        bool             precrypted;
        struct userconf *userconf;
 };