annotate toys/pending/groupadd.c @ 1396:e0c9c5424864 draft

Isaac Dunham spotted that dhcp was also reimplementing daemon().
author Rob Landley <rob@landley.net>
date Sun, 20 Jul 2014 21:34:49 -0500
parents 0752b2d58909
children ed28d4d9558d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1091
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* groupadd.c - create a new group
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2013 Ashwini Kumar <ak.ashwini@gmail.com>
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com>
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 *
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/groupadd.html
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
7
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 USE_GROUPADD(NEWTOY(groupadd, "<1>2g#<0S", TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 USE_GROUPADD(OLDTOY(addgroup, groupadd, OPTSTR_groupadd, TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
10
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 config GROUPADD
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 bool "groupadd"
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 default n
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 help
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 usage: groupadd [-S] [-g GID] [USER] GROUP
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
16
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 Add a group or add a user to a group
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
18
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -g GID Group id
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 -S Create a system group
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 */
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
22
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 #define FOR_groupadd
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 #include "toys.h"
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
25
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 #define GROUP_PATH "/etc/group"
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 #define SECURE_GROUP_PATH "/etc/gshadow"
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
28
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 GLOBALS(
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 long gid;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 )
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
32
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 /* Add a new group to the system, if GID is given then that is validated
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 * to be free, else a free GID is choosen by self.
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 * SYSTEM IDs are considered in the range 100 ... 999
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 * update_group(), updates the entries in /etc/group, /etc/gshadow files
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 */
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 static void new_group()
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 char *entry = NULL;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 int max = INT_MAX;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
42
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 if (toys.optflags & FLAG_g) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 if (TT.gid > INT_MAX) error_exit("gid should be less than '%d' ", INT_MAX);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 if (getgrgid(TT.gid)) error_exit("group '%ld' is in use", TT.gid);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 } else {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 if (toys.optflags & FLAG_S) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 TT.gid = SYS_FIRST_ID;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 max = SYS_LAST_ID;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 } else {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 TT.gid = SYS_LAST_ID + 1; //i.e. starting from 1000
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 max = 60000; // as per config file on Linux desktop
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 //find unused gid
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 while (TT.gid <= max) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 if (!getgrgid(TT.gid)) break;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 if (TT.gid == max) error_exit("no more free gids left");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 TT.gid++;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
61
1183
0752b2d58909 Rename xmsprintf() to just xmprintf().
Rob Landley <rob@landley.net>
parents: 1130
diff changeset
62 entry = xmprintf("%s:%s:%d:", *toys.optargs, "x", TT.gid);
1091
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
63 update_password(GROUP_PATH, *toys.optargs, entry);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 free(entry);
1183
0752b2d58909 Rename xmsprintf() to just xmprintf().
Rob Landley <rob@landley.net>
parents: 1130
diff changeset
65 entry = xmprintf("%s:%s::", *toys.optargs, "!");
1091
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 update_password(SECURE_GROUP_PATH, *toys.optargs, entry);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 free(entry);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
69
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 void groupadd_main(void)
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 struct group *grp = NULL;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 char *entry = NULL;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
74
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 if (toys.optflags && toys.optc == 2) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 toys.exithelp = 1;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 error_exit("options, user and group can't be together");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
79
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 if (toys.optc == 2) { //add user to group
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 //toys.optargs[0]- user, toys.optargs[1] - group
1130
6df194c6de88 Add xgetpwnam() to lib/xwrap.c.
Rob Landley <rob@landley.net>
parents: 1091
diff changeset
82 xgetpwnam(*toys.optargs);
1091
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 if (!(grp = getgrnam(toys.optargs[1])))
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 error_exit("group '%s' does not exist", toys.optargs[1]);
1183
0752b2d58909 Rename xmsprintf() to just xmprintf().
Rob Landley <rob@landley.net>
parents: 1130
diff changeset
85 if (!grp->gr_mem) entry = xmprintf("%s", *toys.optargs);
1091
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 else {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 int i;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
88
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 for (i = 0; grp->gr_mem[i]; i++)
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 if (!strcmp(grp->gr_mem[i], *toys.optargs)) return;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
91
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 entry = xstrdup("");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 for (i=0; grp->gr_mem[i]; i++) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 entry = xrealloc(entry, strlen(entry) + strlen(grp->gr_mem[i]) + 2);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 strcat(entry, grp->gr_mem[i]);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 strcat(entry, ",");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 entry = xrealloc(entry, strlen(entry) + strlen(*toys.optargs) + 1);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 strcat(entry, *toys.optargs);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 update_password(GROUP_PATH, grp->gr_name, entry);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 update_password(SECURE_GROUP_PATH, grp->gr_name, entry);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
103 free(entry);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
104 } else { //new group to be created
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
105 /* investigate the group to be created */
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
106 if ((grp = getgrnam(*toys.optargs)))
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
107 error_exit("group '%s' is in use", *toys.optargs);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
108 setlocale(LC_ALL, "C");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
109 is_valid_username(*toys.optargs);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
110 new_group();
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
111 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
112 }