Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 1 | /* vi: set sw=4 ts=4: */ |
| 2 | /* |
| 3 | * addgroup - add users to /etc/passwd and /etc/shadow |
| 4 | * |
| 5 | * Copyright (C) 1999 by Lineo, inc. and John Beppu |
| 6 | * Copyright (C) 1999,2000,2001 by John Beppu <beppu@codepoet.org> |
| 7 | * |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 8 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 9 | * |
| 10 | */ |
| 11 | |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 12 | #include "busybox.h" |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 13 | |
| 14 | /* make sure gr_name isn't taken, make sure gid is kosher |
| 15 | * return 1 on failure */ |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 16 | static int group_study(struct group *g) |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 17 | { |
| 18 | FILE *etc_group; |
| 19 | gid_t desired; |
| 20 | |
| 21 | struct group *grp; |
| 22 | const int max = 65000; |
| 23 | |
Rob Landley | d921b2e | 2006-08-03 15:41:12 +0000 | [diff] [blame] | 24 | etc_group = xfopen(bb_path_group_file, "r"); |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 25 | |
| 26 | /* make sure gr_name isn't taken, make sure gid is kosher */ |
| 27 | desired = g->gr_gid; |
| 28 | while ((grp = fgetgrent(etc_group))) { |
| 29 | if ((strcmp(grp->gr_name, g->gr_name)) == 0) { |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 30 | bb_error_msg_and_die("%s: group already in use", g->gr_name); |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 31 | } |
| 32 | if ((desired) && grp->gr_gid == desired) { |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 33 | bb_error_msg_and_die("%d: gid already in use", |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 34 | desired); |
| 35 | } |
| 36 | if ((grp->gr_gid > g->gr_gid) && (grp->gr_gid < max)) { |
| 37 | g->gr_gid = grp->gr_gid; |
| 38 | } |
| 39 | } |
| 40 | fclose(etc_group); |
| 41 | |
| 42 | /* gid */ |
| 43 | if (desired) { |
| 44 | g->gr_gid = desired; |
| 45 | } else { |
| 46 | g->gr_gid++; |
| 47 | } |
| 48 | /* return 1; */ |
| 49 | return 0; |
| 50 | } |
| 51 | |
| 52 | /* append a new user to the passwd file */ |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 53 | static int addgroup(char *group, gid_t gid, const char *user) |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 54 | { |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 55 | FILE *file; |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 56 | struct group gr; |
| 57 | |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 58 | /* make sure gid and group haven't already been allocated */ |
| 59 | gr.gr_gid = gid; |
| 60 | gr.gr_name = group; |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 61 | if (group_study(&gr)) |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 62 | return 1; |
| 63 | |
| 64 | /* add entry to group */ |
Rob Landley | d921b2e | 2006-08-03 15:41:12 +0000 | [diff] [blame] | 65 | file = xfopen(bb_path_group_file, "a"); |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 66 | /* group:passwd:gid:userlist */ |
| 67 | fprintf(file, "%s:%s:%d:%s\n", group, "x", gr.gr_gid, user); |
| 68 | fclose(file); |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 69 | |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 70 | #if ENABLE_FEATURE_SHADOWPASSWDS |
Rob Landley | d921b2e | 2006-08-03 15:41:12 +0000 | [diff] [blame] | 71 | file = xfopen(bb_path_gshadow_file, "a"); |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 72 | fprintf(file, "%s:!::\n", group); |
| 73 | fclose(file); |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 74 | #endif |
| 75 | |
| 76 | /* return 1; */ |
| 77 | return 0; |
| 78 | } |
| 79 | |
| 80 | /* |
| 81 | * addgroup will take a login_name as its first parameter. |
| 82 | * |
Eric Andersen | c7bda1c | 2004-03-15 08:29:22 +0000 | [diff] [blame] | 83 | * gid |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 84 | * |
| 85 | * can be customized via command-line parameters. |
| 86 | * ________________________________________________________________________ */ |
| 87 | int addgroup_main(int argc, char **argv) |
| 88 | { |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 89 | char *group; |
| 90 | gid_t gid = 0; |
Denis Vlasenko | 9213a9e | 2006-09-17 16:28:10 +0000 | [diff] [blame] | 91 | |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 92 | /* check for min, max and missing args and exit on error */ |
Denis Vlasenko | 67b23e6 | 2006-10-03 21:00:06 +0000 | [diff] [blame^] | 93 | opt_complementary = "-1:?2:?"; |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 94 | |
Denis Vlasenko | 67b23e6 | 2006-10-03 21:00:06 +0000 | [diff] [blame^] | 95 | if (getopt32(argc, argv, "g:", &group)) { |
Glenn L McGrath | d2bd7d8 | 2004-09-14 16:08:02 +0000 | [diff] [blame] | 96 | gid = bb_xgetlarg(group, 10, 0, LONG_MAX); |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 97 | } |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 98 | /* move past the commandline options */ |
| 99 | argv += optind; |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 100 | |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 101 | /* need to be root */ |
| 102 | if(geteuid()) { |
| 103 | bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); |
Eric Andersen | 09eb000 | 2002-11-14 11:10:14 +0000 | [diff] [blame] | 104 | } |
Eric Andersen | c7bda1c | 2004-03-15 08:29:22 +0000 | [diff] [blame] | 105 | |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 106 | /* werk */ |
Rob Landley | 9a2dd51 | 2006-04-04 19:19:53 +0000 | [diff] [blame] | 107 | return addgroup(argv[0], gid, (argv[1]) ? argv[1] : ""); |
Robert Griebl | 1fca558 | 2002-06-04 20:45:46 +0000 | [diff] [blame] | 108 | } |