]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/pw_group.c
Make separate functions to show users and groups
[pw-darwin.git] / pw / pw_group.c
index b9cce0dcafbc6a81a3fafa5b63823d6df0c73e6a..d87c8cc6408ea477345246e350773f5853ea7692 100644 (file)
@@ -47,6 +47,93 @@ static void  delete_members(char ***members, int *grmembers, int *i,
 static int     print_group(struct group * grp);
 static gid_t    gr_gidpolicy(struct userconf * cnf, long id);
 
+static void
+set_passwd(struct group *grp, bool update)
+{
+       int              b;
+       int              istty;
+       struct termios   t, n;
+       char            *p, line[256];
+
+       if (conf.fd == '-') {
+               grp->gr_passwd = "*";   /* No access */
+               return;
+       }
+       
+       if ((istty = isatty(conf.fd))) {
+               n = t;
+               /* Disable echo */
+               n.c_lflag &= ~(ECHO);
+               tcsetattr(conf.fd, TCSANOW, &n);
+               printf("%sassword for group %s:", update ? "New p" : "P",
+                   grp->gr_name);
+               fflush(stdout);
+       }
+       b = read(conf.fd, line, sizeof(line) - 1);
+       if (istty) {    /* Restore state */
+               tcsetattr(conf.fd, TCSANOW, &t);
+               fputc('\n', stdout);
+               fflush(stdout);
+       }
+       if (b < 0)
+               err(EX_OSERR, "-h file descriptor");
+       line[b] = '\0';
+       if ((p = strpbrk(line, " \t\r\n")) != NULL)
+               *p = '\0';
+       if (!*line)
+               errx(EX_DATAERR, "empty password read on file descriptor %d",
+                   conf.fd);
+       if (conf.precrypted) {
+               if (strchr(line, ':') != 0)
+                       errx(EX_DATAERR, "wrong encrypted passwrd");
+               grp->gr_passwd = line;
+       } else
+               grp->gr_passwd = pw_pwcrypt(line);
+}
+
+int
+pw_groupnext(struct userconf *cnf, bool quiet)
+{
+       gid_t next = gr_gidpolicy(cnf, -1);
+
+       if (quiet)
+               return (next);
+       printf("%u\n", next);
+
+       return (EXIT_SUCCESS);
+}
+
+static int
+pw_groupshow(const char *name, long id, struct group *fakegroup)
+{
+       struct group *grp = NULL;
+
+       if (id < 0 && name == NULL && !conf.all)
+               errx(EX_DATAERR, "groupname or id or '-a' required");
+
+       if (conf.all) {
+               SETGRENT();
+               while ((grp = GETGRENT()) != NULL)
+                       print_group(grp);
+               ENDGRENT();
+
+               return (EXIT_SUCCESS);
+       }
+
+       grp = (name != NULL) ? GETGRNAM(name) : GETGRGID(id);
+       if (grp == NULL) {
+               if (conf.force) {
+                       grp = fakegroup;
+               } else {
+                       if (name == NULL)
+                               errx(EX_DATAERR, "unknown gid `%ld'", id);
+                       errx(EX_DATAERR, "unknown group `%s'", name);
+               }
+       }
+
+       return (print_group(grp));
+}
+
 int
 pw_group(int mode, char *name, long id, struct cargs * args)
 {
@@ -65,46 +152,25 @@ pw_group(int mode, char *name, long id, struct cargs * args)
                NULL
        };
 
+       if (mode == M_NEXT)
+               return (pw_groupnext(cnf, conf.quiet));
+
+       if (mode == M_PRINT)
+               return (pw_groupshow(name, id, &fakegroup));
+
        if (mode == M_LOCK || mode == M_UNLOCK)
                errx(EX_USAGE, "'lock' command is not available for groups");
 
-       /*
-        * With M_NEXT, we only need to return the
-        * next gid to stdout
-        */
-       if (mode == M_NEXT) {
-               gid_t next = gr_gidpolicy(cnf, id);
-               if (getarg(args, 'q'))
-                       return next;
-               printf("%u\n", next);
-               return EXIT_SUCCESS;
-       }
-
-       if (mode == M_PRINT && getarg(args, 'a')) {
-               SETGRENT();
-               while ((grp = GETGRENT()) != NULL)
-                       print_group(grp);
-               ENDGRENT();
-               return EXIT_SUCCESS;
-       }
        if (id < 0 && name == NULL)
                errx(EX_DATAERR, "group name or id required");
 
        grp = (name != NULL) ? GETGRNAM(name) : GETGRGID(id);
 
-       if (mode == M_UPDATE || mode == M_DELETE || mode == M_PRINT) {
+       if (mode == M_UPDATE || mode == M_DELETE) {
                if (name == NULL && grp == NULL)        /* Try harder */
                        grp = GETGRGID(id);
 
                if (grp == NULL) {
-                       if (mode == M_PRINT && getarg(args, 'F')) {
-                               char    *fmems[1];
-                               fmems[0] = NULL;
-                               fakegroup.gr_name = name ? name : "nogroup";
-                               fakegroup.gr_gid = (gid_t) id;
-                               fakegroup.gr_mem = fmems;
-                               return print_group(&fakegroup);
-                       }
                        if (name == NULL)
                                errx(EX_DATAERR, "unknown group `%s'", name);
                        else
@@ -156,52 +222,8 @@ pw_group(int mode, char *name, long id, struct cargs * args)
         * software.
         */
 
-       if ((arg = getarg(args, 'h')) != NULL ||
-           (arg = getarg(args, 'H')) != NULL) {
-               if (strcmp(arg->val, "-") == 0)
-                       grp->gr_passwd = "*";   /* No access */
-               else {
-                       int             fd = atoi(arg->val);
-                       int             precrypt = (arg->ch == 'H');
-                       int             b;
-                       int             istty = isatty(fd);
-                       struct termios  t;
-                       char           *p, line[256];
-
-                       if (istty) {
-                               if (tcgetattr(fd, &t) == -1)
-                                       istty = 0;
-                               else {
-                                       struct termios  n = t;
-
-                                       /* Disable echo */
-                                       n.c_lflag &= ~(ECHO);
-                                       tcsetattr(fd, TCSANOW, &n);
-                                       printf("%sassword for group %s:", (mode == M_UPDATE) ? "New p" : "P", grp->gr_name);
-                                       fflush(stdout);
-                               }
-                       }
-                       b = read(fd, line, sizeof(line) - 1);
-                       if (istty) {    /* Restore state */
-                               tcsetattr(fd, TCSANOW, &t);
-                               fputc('\n', stdout);
-                               fflush(stdout);
-                       }
-                       if (b < 0)
-                               err(EX_OSERR, "-h file descriptor");
-                       line[b] = '\0';
-                       if ((p = strpbrk(line, " \t\r\n")) != NULL)
-                               *p = '\0';
-                       if (!*line)
-                               errx(EX_DATAERR, "empty password read on file descriptor %d", fd);
-                       if (precrypt) {
-                               if (strchr(line, ':') != NULL)
-                                       return EX_DATAERR;
-                               grp->gr_passwd = line;
-                       } else
-                               grp->gr_passwd = pw_pwcrypt(line);
-               }
-       }
+       if (conf.which == W_GROUP && conf.fd != -1)
+               set_passwd(grp, mode == M_UPDATE);
 
        if (((arg = getarg(args, 'M')) != NULL ||
            (arg = getarg(args, 'd')) != NULL ||