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