Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/user Add new keyword gid_range to usermgmt.conf whi...



details:   https://anonhg.NetBSD.org/src/rev/820f806b76c7
branches:  trunk
changeset: 750442:820f806b76c7
user:      mlelstv <mlelstv%NetBSD.org@localhost>
date:      Thu Dec 31 19:59:31 2009 +0000

description:
Add new keyword gid_range to usermgmt.conf which specifies a default
GID range for groupadd(8).

diffstat:

 usr.sbin/user/user.c          |  316 ++++++++++++++++++++++++-----------------
 usr.sbin/user/usermgmt.conf.5 |   10 +-
 2 files changed, 195 insertions(+), 131 deletions(-)

diffs (truncated from 688 to 300 lines):

diff -r cddff4f79378 -r 820f806b76c7 usr.sbin/user/user.c
--- a/usr.sbin/user/user.c      Thu Dec 31 19:38:16 2009 +0000
+++ b/usr.sbin/user/user.c      Thu Dec 31 19:59:31 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: user.c,v 1.124 2009/10/15 23:03:02 hubertf Exp $ */
+/* $NetBSD: user.c,v 1.125 2009/12/31 19:59:31 mlelstv Exp $ */
 
 /*
  * Copyright (c) 1999 Alistair G. Crooks.  All rights reserved.
@@ -33,7 +33,7 @@
 #ifndef lint
 __COPYRIGHT("@(#) Copyright (c) 1999\
  The NetBSD Foundation, Inc.  All rights reserved.");
-__RCSID("$NetBSD: user.c,v 1.124 2009/10/15 23:03:02 hubertf Exp $");
+__RCSID("$NetBSD: user.c,v 1.125 2009/12/31 19:59:31 mlelstv Exp $");
 #endif
 
 #include <sys/types.h>
@@ -71,7 +71,14 @@
        int     r_to;           /* high uid */
 } range_t;
 
-/* this struct encapsulates the user information */
+typedef struct rangelist_t {
+       unsigned        rl_rsize;               /* size of range array */
+       unsigned        rl_rc;                  /* # of ranges */
+       range_t        *rl_rv;                  /* the ranges */
+       unsigned        rl_defrc;               /* # of ranges in defaults */
+} rangelist_t;
+
+/* this struct encapsulates the user and group information */
 typedef struct user_t {
        int             u_flags;                /* see below */
        int             u_uid;                  /* uid of user */
@@ -88,14 +95,30 @@
        char           *u_inactive;             /* when account will expire */
        char           *u_skeldir;              /* directory for startup files */
        char           *u_class;                /* login class */
-       unsigned        u_rsize;                /* size of range array */
-       unsigned        u_rc;                   /* # of ranges */
-       range_t        *u_rv;                   /* the ranges */
+       rangelist_t     u_r;                    /* list of ranges */
        unsigned        u_defrc;                /* # of ranges in defaults */
        int             u_preserve;             /* preserve uids on deletion */
        int             u_allow_samba;          /* allow trailing '$' for samba login names */
        int             u_locked;               /* user account lock */
 } user_t;
+#define u_rsize u_r.rl_rsize
+#define u_rc    u_r.rl_rc
+#define u_rv    u_r.rl_rv
+#define u_defrc u_r.rl_defrc
+
+/* this struct encapsulates the user and group information */
+typedef struct group_t {
+       rangelist_t     g_r;                    /* list of ranges */
+} group_t;
+#define g_rsize g_r.rl_rsize
+#define g_rc    g_r.rl_rc
+#define g_rv    g_r.rl_rv
+#define g_defrc g_r.rl_defrc
+
+typedef struct def_t {
+       user_t user;
+       group_t group;
+} def_t;
 
 /* flags for which fields of the user_t replace the passwd entry */
 enum {
@@ -182,9 +205,6 @@
        PasswordLength = 2048,
 
        DES_Len = 13,
-
-       LowGid = DEF_LOWUID,
-       HighGid = DEF_HIGHUID
 };
 
 /* Full paths of programs used here */
@@ -682,30 +702,30 @@
 #ifdef EXTENSIONS
 /* save a range of uids */
 static int
-save_range(user_t *up, char *cp)
+save_range(rangelist_t *rlp, char *cp)
 {
        int     from;
        int     to;
        int     i;
 
-       if (up->u_rsize == 0) {
-               up->u_rsize = 32;
-               NEWARRAY(range_t, up->u_rv, up->u_rsize, return(0));
-       } else if (up->u_rc == up->u_rsize) {
-               up->u_rsize *= 2;
-               RENEW(range_t, up->u_rv, up->u_rsize, return(0));
+       if (rlp->rl_rsize == 0) {
+               rlp->rl_rsize = 32;
+               NEWARRAY(range_t, rlp->rl_rv, rlp->rl_rsize, return(0));
+       } else if (rlp->rl_rc == rlp->rl_rsize) {
+               rlp->rl_rsize *= 2;
+               RENEW(range_t, rlp->rl_rv, rlp->rl_rsize, return(0));
        }
-       if (up->u_rv && sscanf(cp, "%d..%d", &from, &to) == 2) {
-               for (i = up->u_defrc ; i < up->u_rc ; i++) {
-                       if (up->u_rv[i].r_from == from &&
-                           up->u_rv[i].r_to == to) {
+       if (rlp->rl_rv && sscanf(cp, "%d..%d", &from, &to) == 2) {
+               for (i = rlp->rl_defrc ; i < rlp->rl_rc ; i++) {
+                       if (rlp->rl_rv[i].r_from == from &&
+                           rlp->rl_rv[i].r_to == to) {
                                break;
                        }
                }
-               if (i == up->u_rc) {
-                       up->u_rv[up->u_rc].r_from = from;
-                       up->u_rv[up->u_rc].r_to = to;
-                       up->u_rc += 1;
+               if (i == rlp->rl_rc) {
+                       rlp->rl_rv[rlp->rl_rc].r_from = from;
+                       rlp->rl_rv[rlp->rl_rc].r_to = to;
+                       rlp->rl_rc += 1;
                }
        } else {
                warnx("Bad range `%s'", cp);
@@ -778,7 +798,7 @@
 
 /* read the defaults file */
 static void
-read_defaults(user_t *up)
+read_defaults(def_t *dp)
 {
        struct stat     st;
        size_t          lineno;
@@ -786,6 +806,10 @@
        FILE            *fp;
        char            *cp;
        char            *s;
+       user_t          *up = &dp->user;
+       group_t         *gp = &dp->group;
+
+       (void)memset(dp, 0, sizeof(*dp));
 
        memsave(&up->u_primgrp, DEF_GROUP, strlen(DEF_GROUP));
        memsave(&up->u_basedir, DEF_BASEDIR, strlen(DEF_BASEDIR));
@@ -800,6 +824,9 @@
        NEWARRAY(range_t, up->u_rv, up->u_rsize, exit(1));
        up->u_inactive = DEF_INACTIVE;
        up->u_expire = DEF_EXPIRE;
+       gp->g_rsize = 16;
+       gp->g_defrc = 0;
+       NEWARRAY(range_t, gp->g_rv, gp->g_rsize, exit(1));
        if ((fp = fopen(_PATH_USERMGMT_CONF, "r")) == NULL) {
                if (stat(_PATH_USERMGMT_CONF, &st) < 0 && !setdefaults(up)) {
                        warn("Can't create `%s' defaults file",
@@ -846,7 +873,7 @@
 #ifdef EXTENSIONS
                        } else if (strncmp(s, "range", 5) == 0) {
                                cp = skipspace(s + 5);
-                               (void)save_range(up, cp);
+                               (void)save_range(&up->u_r, cp);
 #endif
 #ifdef EXTENSIONS
                        } else if (strncmp(s, "preserve", 8) == 0) {
@@ -865,6 +892,11 @@
                                } else {
                                        memsave(&up->u_expire, cp, strlen(cp));
                                }
+#ifdef EXTENSIONS
+                       } else if (strncmp(s, "gid_range", 9) == 0) {
+                               cp = skipspace(s + 9);
+                               (void)save_range(&gp->g_r, cp);
+#endif
                        }
                        (void)free(s);
                }
@@ -1808,7 +1840,8 @@
 int
 useradd(int argc, char **argv)
 {
-       user_t  u;
+       def_t   def;
+       user_t  *up = &def.user;
        int     defaultfield;
        int     bigD;
        int     c;
@@ -1816,9 +1849,8 @@
        int     i;
 #endif
 
-       (void)memset(&u, 0, sizeof(u));
-       read_defaults(&u);
-       u.u_uid = -1;
+       read_defaults(&def);
+       up->u_uid = -1;
        defaultfield = bigD = 0;
        while ((c = getopt(argc, argv, "DFG:b:c:d:e:f:g:k:mou:s:"
            ADD_OPT_EXTENSIONS)) != -1) {
@@ -1833,13 +1865,13 @@
                         * next log in - passwd(5).
                         */
                        defaultfield = 1;
-                       memsave(&u.u_inactive, "-1", strlen("-1"));
+                       memsave(&up->u_inactive, "-1", strlen("-1"));
                        break;
                case 'G':
-                       while (u.u_groupc < NGROUPS_MAX  &&
-                              (u.u_groupv[u.u_groupc] = strsep(&optarg, ",")) != NULL) {
-                               if (u.u_groupv[u.u_groupc][0] != 0) {
-                                       u.u_groupc++;
+                       while (up->u_groupc < NGROUPS_MAX  &&
+                              (up->u_groupv[up->u_groupc] = strsep(&optarg, ",")) != NULL) {
+                               if (up->u_groupv[up->u_groupc][0] != 0) {
+                                       up->u_groupc++;
                                }
                        }
                        if (optarg != NULL) {
@@ -1849,72 +1881,72 @@
                        break;
 #ifdef EXTENSIONS
                case 'S':
-                       u.u_allow_samba = 1;
+                       up->u_allow_samba = 1;
                        break;
 #endif
                case 'b':
                        defaultfield = 1;
-                       memsave(&u.u_basedir, optarg, strlen(optarg));
+                       memsave(&up->u_basedir, optarg, strlen(optarg));
                        break;
                case 'c':
-                       memsave(&u.u_comment, optarg, strlen(optarg));
+                       memsave(&up->u_comment, optarg, strlen(optarg));
                        break;
                case 'd':
-                       memsave(&u.u_home, optarg, strlen(optarg));
-                       u.u_flags |= F_HOMEDIR;
+                       memsave(&up->u_home, optarg, strlen(optarg));
+                       up->u_flags |= F_HOMEDIR;
                        break;
                case 'e':
                        defaultfield = 1;
-                       memsave(&u.u_expire, optarg, strlen(optarg));
+                       memsave(&up->u_expire, optarg, strlen(optarg));
                        break;
                case 'f':
                        defaultfield = 1;
-                       memsave(&u.u_inactive, optarg, strlen(optarg));
+                       memsave(&up->u_inactive, optarg, strlen(optarg));
                        break;
                case 'g':
                        defaultfield = 1;
-                       memsave(&u.u_primgrp, optarg, strlen(optarg));
+                       memsave(&up->u_primgrp, optarg, strlen(optarg));
                        break;
                case 'k':
                        defaultfield = 1;
-                       memsave(&u.u_skeldir, optarg, strlen(optarg));
+                       memsave(&up->u_skeldir, optarg, strlen(optarg));
                        break;
 #ifdef EXTENSIONS
                case 'L':
                        defaultfield = 1;
-                       memsave(&u.u_class, optarg, strlen(optarg));
+                       memsave(&up->u_class, optarg, strlen(optarg));
                        break;
 #endif
                case 'm':
-                       u.u_flags |= F_MKDIR;
+                       up->u_flags |= F_MKDIR;
                        break;
 #ifdef EXTENSIONS
                case 'M':
                        defaultfield = 1;
-                       u.u_homeperm = strtoul(optarg, NULL, 8);
+                       up->u_homeperm = strtoul(optarg, NULL, 8);
                        break;
 #endif
                case 'o':
-                       u.u_flags |= F_DUPUID;
+                       up->u_flags |= F_DUPUID;
                        break;
 #ifdef EXTENSIONS
                case 'p':
-                       memsave(&u.u_password, optarg, strlen(optarg));
+                       memsave(&up->u_password, optarg, strlen(optarg));
                        break;
 #endif
 #ifdef EXTENSIONS
                case 'r':
                        defaultfield = 1;
-                       (void)save_range(&u, optarg);
+                       (void)save_range(&up->u_r, optarg);
                        break;
 #endif
                case 's':
-                       u.u_flags |= F_SHELL;
+                       up->u_flags |= F_SHELL;
                        defaultfield = 1;
-                       memsave(&u.u_shell, optarg, strlen(optarg));
+                       memsave(&up->u_shell, optarg, strlen(optarg));



Home | Main Index | Thread Index | Old Index