Deleted Added
full compact
pw_group.c (20253) pw_group.c (20267)
1/*-
2 * Copyright (c) 1996 by David L. Nugent <davidn@blaze.net.au>.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 46 unchanged lines hidden (view full) ---

55 static struct group fakegroup =
56 {
57 "nogroup",
58 "*",
59 -1,
60 NULL
61 };
62
1/*-
2 * Copyright (c) 1996 by David L. Nugent <davidn@blaze.net.au>.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 46 unchanged lines hidden (view full) ---

55 static struct group fakegroup =
56 {
57 "nogroup",
58 "*",
59 -1,
60 NULL
61 };
62
63 /*
64 * With M_NEXT, we only need to return the
65 * next gid to stdout
66 */
67 if (mode == M_NEXT)
68 {
69 gid_t next = gr_gidpolicy(cnf, args);
70 if (getarg(args, 'q'))
71 return next;
72 printf("%ld\n", (long)next);
73 return EXIT_SUCCESS;
74 }
75
63 if (mode == M_PRINT && getarg(args, 'a')) {
76 if (mode == M_PRINT && getarg(args, 'a')) {
64 int pretty = getarg(args, 'p') != NULL;
77 int pretty = getarg(args, 'P') != NULL;
65
66 setgrent();
67 while ((grp = getgrent()) != NULL)
68 print_group(grp, pretty);
69 endgrent();
78
79 setgrent();
80 while ((grp = getgrent()) != NULL)
81 print_group(grp, pretty);
82 endgrent();
70 return X_ALLOK;
83 return EXIT_SUCCESS;
71 }
72 if (a_gid == NULL) {
73 if (a_name == NULL)
84 }
85 if (a_gid == NULL) {
86 if (a_name == NULL)
74 cmderr(X_CMDERR, "group name or id required\n");
87 cmderr(EX_DATAERR, "group name or id required\n");
75
76 if (mode != M_ADD && grp == NULL && isdigit(*a_name->val)) {
77 (a_gid = a_name)->ch = 'g';
78 a_name = NULL;
79 }
80 }
81 grp = (a_name != NULL) ? getgrnam(a_name->val) : getgrgid((gid_t) atoi(a_gid->val));
82
83 if (mode == M_UPDATE || mode == M_DELETE || mode == M_PRINT) {
84 if (a_name == NULL && grp == NULL) /* Try harder */
85 grp = getgrgid(atoi(a_gid->val));
86
87 if (grp == NULL) {
88 if (mode == M_PRINT && getarg(args, 'F')) {
89 fakegroup.gr_name = a_name ? a_name->val : "nogroup";
90 fakegroup.gr_gid = a_gid ? (gid_t) atol(a_gid->val) : -1;
88
89 if (mode != M_ADD && grp == NULL && isdigit(*a_name->val)) {
90 (a_gid = a_name)->ch = 'g';
91 a_name = NULL;
92 }
93 }
94 grp = (a_name != NULL) ? getgrnam(a_name->val) : getgrgid((gid_t) atoi(a_gid->val));
95
96 if (mode == M_UPDATE || mode == M_DELETE || mode == M_PRINT) {
97 if (a_name == NULL && grp == NULL) /* Try harder */
98 grp = getgrgid(atoi(a_gid->val));
99
100 if (grp == NULL) {
101 if (mode == M_PRINT && getarg(args, 'F')) {
102 fakegroup.gr_name = a_name ? a_name->val : "nogroup";
103 fakegroup.gr_gid = a_gid ? (gid_t) atol(a_gid->val) : -1;
91 return print_group(&fakegroup, getarg(args, 'p') != NULL);
104 return print_group(&fakegroup, getarg(args, 'P') != NULL);
92 }
105 }
93 cmderr(X_CMDERR, "unknown group `%s'\n", a_name ? a_name->val : a_gid->val);
106 cmderr(EX_DATAERR, "unknown group `%s'\n", a_name ? a_name->val : a_gid->val);
94 }
95 if (a_name == NULL) /* Needed later */
96 a_name = addarg(args, 'n', grp->gr_name);
97
98 /*
99 * Handle deletions now
100 */
101 if (mode == M_DELETE) {
102 gid_t gid = grp->gr_gid;
103
104 if (delgrent(grp) == -1)
107 }
108 if (a_name == NULL) /* Needed later */
109 a_name = addarg(args, 'n', grp->gr_name);
110
111 /*
112 * Handle deletions now
113 */
114 if (mode == M_DELETE) {
115 gid_t gid = grp->gr_gid;
116
117 if (delgrent(grp) == -1)
105 cmderr(X_NOUPDATE, "Error updating group file: %s\n", strerror(errno));
118 cmderr(EX_IOERR, "Error updating group file: %s\n", strerror(errno));
106 pw_log(cnf, mode, W_GROUP, "%s(%ld) removed", a_name->val, (long) gid);
119 pw_log(cnf, mode, W_GROUP, "%s(%ld) removed", a_name->val, (long) gid);
107 return X_ALLOK;
120 return EXIT_SUCCESS;
108 } else if (mode == M_PRINT)
121 } else if (mode == M_PRINT)
109 return print_group(grp, getarg(args, 'p') != NULL);
122 return print_group(grp, getarg(args, 'P') != NULL);
110
111 if (a_gid)
112 grp->gr_gid = (gid_t) atoi(a_gid->val);
113
114 if ((arg = getarg(args, 'l')) != NULL)
115 grp->gr_name = arg->val;
116 } else {
117 if (a_name == NULL) /* Required */
123
124 if (a_gid)
125 grp->gr_gid = (gid_t) atoi(a_gid->val);
126
127 if ((arg = getarg(args, 'l')) != NULL)
128 grp->gr_name = arg->val;
129 } else {
130 if (a_name == NULL) /* Required */
118 cmderr(X_CMDERR, "group name required\n");
131 cmderr(EX_DATAERR, "group name required\n");
119 else if (grp != NULL) /* Exists */
132 else if (grp != NULL) /* Exists */
120 cmderr(X_EXISTS, "group name `%s' already exists\n", a_name->val);
133 cmderr(EX_DATAERR, "group name `%s' already exists\n", a_name->val);
121
122 memset(members, 0, sizeof members);
123 grp = &fakegroup;
124 grp->gr_name = a_name->val;
125 grp->gr_passwd = "*";
126 grp->gr_gid = gr_gidpolicy(cnf, args);
127 grp->gr_mem = members;
128 }

--- 31 unchanged lines hidden (view full) ---

160 b = read(fd, line, sizeof(line) - 1);
161 if (istty) { /* Restore state */
162 tcsetattr(fd, TCSANOW, &t);
163 fputc('\n', stdout);
164 fflush(stdout);
165 }
166 if (b < 0) {
167 perror("-h file descriptor");
134
135 memset(members, 0, sizeof members);
136 grp = &fakegroup;
137 grp->gr_name = a_name->val;
138 grp->gr_passwd = "*";
139 grp->gr_gid = gr_gidpolicy(cnf, args);
140 grp->gr_mem = members;
141 }

--- 31 unchanged lines hidden (view full) ---

173 b = read(fd, line, sizeof(line) - 1);
174 if (istty) { /* Restore state */
175 tcsetattr(fd, TCSANOW, &t);
176 fputc('\n', stdout);
177 fflush(stdout);
178 }
179 if (b < 0) {
180 perror("-h file descriptor");
168 return X_CMDERR;
181 return EX_OSERR;
169 }
170 line[b] = '\0';
171 if ((p = strpbrk(line, " \t\r\n")) != NULL)
172 *p = '\0';
173 if (!*line)
182 }
183 line[b] = '\0';
184 if ((p = strpbrk(line, " \t\r\n")) != NULL)
185 *p = '\0';
186 if (!*line)
174 cmderr(X_CMDERR, "empty password read on file descriptor %d\n", fd);
187 cmderr(EX_DATAERR, "empty password read on file descriptor %d\n", fd);
175 grp->gr_passwd = pw_pwcrypt(line);
176 }
177 }
188 grp->gr_passwd = pw_pwcrypt(line);
189 }
190 }
191
192 if (((arg = getarg(args, 'M')) != NULL || (arg = getarg(args, 'm')) != NULL) && arg->val) {
193 int i = 0;
194 char *p;
195 struct passwd *pwd;
196
197 if (arg->ch == 'm') {
198 while (i < _UC_MAXGROUPS && grp->gr_mem[i] != NULL) {
199 members[i] = grp->gr_mem[i];
200 i++;
201 }
202 }
203 for (p = strtok(arg->val, ", \t"); i < _UC_MAXGROUPS && p != NULL; p = strtok(NULL, ", \t")) {
204 int j;
205 if ((pwd = getpwnam(p)) == NULL) {
206 if (!isdigit(*p) || (pwd = getpwuid((uid_t) atoi(p))) == NULL)
207 cmderr(EX_NOUSER, "user `%s' does not exist\n", p);
208 }
209 /*
210 * Check for duplicates
211 */
212 for (j = 0; j < i && strcmp(members[j], pwd->pw_name)!=0; j++)
213 ;
214 if (j == i)
215 members[i++] = newstr(pwd->pw_name);
216 }
217 while (i < _UC_MAXGROUPS)
218 members[i++] = NULL;
219 grp->gr_mem = members;
220 }
221
222 if (getarg(args, 'N') != NULL)
223 return print_group(grp, getarg(args, 'P') != NULL);
224
178 if ((mode == M_ADD && !addgrent(grp)) || (mode == M_UPDATE && !chggrent(a_name->val, grp))) {
179 perror("group update");
225 if ((mode == M_ADD && !addgrent(grp)) || (mode == M_UPDATE && !chggrent(a_name->val, grp))) {
226 perror("group update");
180 return X_NOUPDATE;
227 return EX_IOERR;
181 }
182 /* grp may have been invalidated */
183 if ((grp = getgrnam(a_name->val)) == NULL)
228 }
229 /* grp may have been invalidated */
230 if ((grp = getgrnam(a_name->val)) == NULL)
184 cmderr(X_NOTFOUND, "group disappeared during update\n");
231 cmderr(EX_SOFTWARE, "group disappeared during update\n");
185
186 pw_log(cnf, mode, W_GROUP, "%s(%ld)", grp->gr_name, (long) grp->gr_gid);
187
232
233 pw_log(cnf, mode, W_GROUP, "%s(%ld)", grp->gr_name, (long) grp->gr_gid);
234
188 return X_ALLOK;
235 return EXIT_SUCCESS;
189}
190
191
192static gid_t
193gr_gidpolicy(struct userconf * cnf, struct cargs * args)
194{
195 struct group *grp;
196 gid_t gid = (gid_t) - 1;
197 struct carg *a_gid = getarg(args, 'g');
198
199 /*
200 * Check the given gid, if any
201 */
202 if (a_gid != NULL) {
203 gid = (gid_t) atol(a_gid->val);
204
205 if ((grp = getgrgid(gid)) != NULL && getarg(args, 'o') == NULL)
236}
237
238
239static gid_t
240gr_gidpolicy(struct userconf * cnf, struct cargs * args)
241{
242 struct group *grp;
243 gid_t gid = (gid_t) - 1;
244 struct carg *a_gid = getarg(args, 'g');
245
246 /*
247 * Check the given gid, if any
248 */
249 if (a_gid != NULL) {
250 gid = (gid_t) atol(a_gid->val);
251
252 if ((grp = getgrgid(gid)) != NULL && getarg(args, 'o') == NULL)
206 cmderr(X_EXISTS, "gid `%ld' has already been allocated\n", (long) grp->gr_gid);
253 cmderr(EX_DATAERR, "gid `%ld' has already been allocated\n", (long) grp->gr_gid);
207 } else {
208 struct bitmap bm;
209
210 /*
211 * We need to allocate the next available gid under one of
212 * two policies a) Grab the first unused gid b) Grab the
213 * highest possible unused gid
214 */

--- 24 unchanged lines hidden (view full) ---

239 else
240 gid = (gid_t) (bm_firstunset(&bm) + cnf->min_gid);
241 }
242
243 /*
244 * Another sanity check
245 */
246 if (gid < cnf->min_gid || gid > cnf->max_gid)
254 } else {
255 struct bitmap bm;
256
257 /*
258 * We need to allocate the next available gid under one of
259 * two policies a) Grab the first unused gid b) Grab the
260 * highest possible unused gid
261 */

--- 24 unchanged lines hidden (view full) ---

286 else
287 gid = (gid_t) (bm_firstunset(&bm) + cnf->min_gid);
288 }
289
290 /*
291 * Another sanity check
292 */
293 if (gid < cnf->min_gid || gid > cnf->max_gid)
247 cmderr(X_EXISTS, "unable to allocate a new gid - range fully used\n");
294 cmderr(EX_SOFTWARE, "unable to allocate a new gid - range fully used\n");
248 bm_dealloc(&bm);
249 }
250 return gid;
251}
252
253
254static int
255print_group(struct group * grp, int pretty)

--- 8 unchanged lines hidden (view full) ---

264
265 printf("Group Name : %-10s #%lu\n"
266 " Members : ",
267 grp->gr_name, (long) grp->gr_gid);
268 for (i = 0; i < _UC_MAXGROUPS && grp->gr_mem[i]; i++)
269 printf("%s%s", i ? "," : "", grp->gr_mem[i]);
270 fputs("\n\n", stdout);
271 }
295 bm_dealloc(&bm);
296 }
297 return gid;
298}
299
300
301static int
302print_group(struct group * grp, int pretty)

--- 8 unchanged lines hidden (view full) ---

311
312 printf("Group Name : %-10s #%lu\n"
313 " Members : ",
314 grp->gr_name, (long) grp->gr_gid);
315 for (i = 0; i < _UC_MAXGROUPS && grp->gr_mem[i]; i++)
316 printf("%s%s", i ? "," : "", grp->gr_mem[i]);
317 fputs("\n\n", stdout);
318 }
272 return X_ALLOK;
319 return EXIT_SUCCESS;
273}
320}