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} |