commit e17d7bf

Emilia Smólska  ·  2026-07-27 19:53:10 +0000 UTC
parent 2229e46
style
2 files changed,  +53, -65
M arg.h
M arg.h
+7, -9
 1@@ -1,21 +1,19 @@
 2-#define nil	((void *)0)
 3-
 4 extern char	*argv0;
 5 
 6-#define ARGBEGIN	for((argv0 || (argv0 = argv[0])), argc--, argv++;\
 7+#define ARGBEGIN	for ((argv0 || (argv0 = argv[0])), argc--, argv++;\
 8 			    argv[0] && argv[0][0] == '-' && argv[0][1];\
 9-			    argc--, argv++){\
10+			    argc--, argv++) {\
11 				char *_args;\
12 				char *_argt;\
13 				char _argc;\
14 				_args = &argv[0][1];\
15-				if(_args[0] == '-' && _args[1] == '\0'){\
16+				if (_args[0] == '-' && _args[1] == '\0') {\
17 					argc--, argv++;\
18 					break;\
19 				}\
20 				_argc = '\0';\
21-				while(_args[0] && (_argc = *_args++))\
22-					switch(_argc)
23+				while (_args[0] && (_argc = *_args++))\
24+					switch (_argc)
25 
26 #define ARGEND			(void)_args, _argt, _argc;\
27 			}\
28@@ -23,11 +21,11 @@ extern char	*argv0;
29 
30 #define ARGF()		(_argt = _args, _args = "",\
31 			     (_argt[0] ? _argt :\
32-			     argv[1] ? (argc--, *++argv) : nil))
33+			     argv[1] ? (argc--, *++argv) : (char *)0))
34 
35 #define EARGF(x)	(_argt = _args, _args = "",\
36 			     (_argt[0] ? _argt :\
37 			     argv[1] ? (argc--, *++argv) :\
38-			     ((x), abort(), nil)))
39+			     ((x), abort(), (char *)0)))
40 
41 #define ARGC()		_argc
+46, -56
  1@@ -4,6 +4,7 @@
  2 #include <pwd.h>
  3 #include <stdarg.h>
  4 #include <stdbool.h>
  5+#include <stddef.h>
  6 #include <stdnoreturn.h>
  7 #include <stdio.h>
  8 #include <stdlib.h>
  9@@ -17,7 +18,9 @@
 10 #include <login_cap.h>
 11 #endif
 12 
 13-#define nelem(x)	(long)(sizeof(x) / sizeof((x)[0]))
 14+typedef ptrdiff_t	isz;
 15+
 16+#define countof(x)	(isz)(sizeof(x) / sizeof((x)[0]))
 17 
 18 #define STRINGIFY1(x)	#x
 19 #define STRINGIFY(x)	STRINGIFY1(x)
 20@@ -34,71 +37,60 @@ static void		dosetuid(uid_t, struct passwd *);
 21 int
 22 main(int argc, char **argv)
 23 {
 24-	gid_t groups[NGROUPS_MAX];
 25-	char *shcmd[3] = {nil, "-i", nil};
 26-	char **cmd;
 27-	char *arg;
 28-	struct group *wheel;
 29-	int ngroups;
 30-	bool iswheel;
 31-
 32 	argv0 = argv[0];
 33 
 34 #if !defined(WITH_CHROOT) && defined(HAVE_PLEDGE)
 35-	if(pledge("stdio rpath getpw exec id", nil) < 0)
 36+	if (pledge("stdio rpath getpw exec id", 0) < 0)
 37 		die("pledge: %s", strerror(errno));
 38 #endif
 39 
 40-	wheel = getgrnam(CHECKGRPSTR);
 41-	if(!wheel)
 42+	struct group *wheel = getgrnam(CHECKGRPSTR);
 43+	if (!wheel)
 44 		die(CHECKGRPSTR ": No such group");
 45-	ngroups = getgroups(nelem(groups), groups);
 46-	if(ngroups < 0)
 47+	gid_t groups[NGROUPS_MAX];
 48+	int ngroups = getgroups(countof(groups), groups);
 49+	if (ngroups < 0)
 50 		die("getgroups: %s", strerror(errno));
 51-	iswheel = false;
 52-	for(int i = 0; i < nelem(groups); i++)
 53-		if(groups[i] == wheel->gr_gid){
 54+	bool iswheel = false;
 55+	for (int i = 0; i < countof(groups); i++)
 56+		if (groups[i] == wheel->gr_gid) {
 57 			iswheel = true;
 58 			break;
 59 		}
 60-	if(!iswheel)
 61+	if (!iswheel)
 62 		die("Not in the " CHECKGRPSTR " group");
 63 
 64-	if(access(CHECKFILESTR, W_OK) < 0)
 65+	if (access(CHECKFILESTR, W_OK) < 0)
 66 		die(CHECKFILESTR ": %s", strerror(errno));
 67 
 68-	if(argc <= 1 || argv[1][0] != '-')
 69-		dosetuid(0, nil);
 70+	if (argc <= 1 || argv[1][0] != '-')
 71+		dosetuid(0, 0);
 72 
 73-	ARGBEGIN{
 74+	ARGBEGIN {
 75 #ifdef HAVE_LOGIN_CAP 
 76 	case 'c': {
 77-		arg = EARGF(usage());
 78-		if(setclasscontext(arg, LOGIN_SETALL) < 0)
 79+		char *arg = EARGF(usage());
 80+		if (setclasscontext(arg, LOGIN_SETALL) < 0)
 81 			die("setclasscontext %s: %s", arg, strerror(errno));
 82 		break;
 83 	}
 84 #endif
 85 	case 'G': {
 86+		char *arg = EARGF(usage());
 87 		char *end;
 88-		gid_t gid;
 89-
 90-		arg = EARGF(usage());
 91-		gid = strtol(arg, &end, 10);
 92-		if(arg[0] == '\0' || end[0] != '\0')
 93+		gid_t gid = strtol(arg, &end, 10);
 94+		if (arg[0] == '\0' || end[0] != '\0')
 95 			usage();
 96-		if(setgid(gid) < 0)
 97+		if (setgid(gid) < 0)
 98 			die("setgid %u: %s", gid, strerror(errno));
 99 		break;
100 	}
101 	case 'g': {
102-		struct group *group;
103-
104-		arg = EARGF(usage());
105-		group = getgrnam(arg);
106-		if(!group)
107+		char *arg = EARGF(usage());
108+		struct group *group = getgrnam(arg);
109+		if (!group)
110 			die("%s: No such group", arg);
111-		if(setgid(group->gr_gid) < 0)
112+		if (setgid(group->gr_gid) < 0)
113 			die("setgid %u: %s", group->gr_gid, strerror(errno));
114 		break;
115 	}
116@@ -106,31 +98,27 @@ main(int argc, char **argv)
117 		exit(0);
118 #ifdef WITH_CHROOT
119 	case 'r': {
120-		arg = EARGF(usage());
121-		if(chroot(arg) < 0)
122+		char *arg = EARGF(usage());
123+		if (chroot(arg) < 0)
124 			die("chroot %s: %s", arg, strerror(errno));
125-		if(chdir("/") < 0)
126+		if (chdir("/") < 0)
127 			die("chdir /: %s", strerror(errno));
128 		break;
129 	}
130 #endif
131 	case 'U': {
132+		char *arg = EARGF(usage());
133 		char *end;
134-		uid_t uid;
135-
136-		arg = EARGF(usage());
137-		uid = strtol(arg, &end, 10);
138-		if(arg[0] == '\0' || end[0] != '\0')
139+		uid_t uid = strtol(arg, &end, 10);
140+		if (arg[0] == '\0' || end[0] != '\0')
141 			usage();
142-		dosetuid(uid, nil);
143+		dosetuid(uid, 0);
144 		break;
145 	}
146 	case 'u': {
147-		struct passwd *passwd;
148-
149-		arg = EARGF(usage());
150-		passwd = getpwnam(arg);
151-		if(!passwd)
152+		char *arg = EARGF(usage());
153+		struct passwd *passwd = getpwnam(arg);
154+		if (!passwd)
155 			die("%s: No such user", arg);
156 		dosetuid(passwd->pw_uid, passwd);
157 		break;
158@@ -139,12 +127,14 @@ main(int argc, char **argv)
159 		usage();
160 	}ARGEND
161 
162-	if(argc == 0){
163+	char **cmd;
164+	char *shcmd[3] = {NULL, "-i", NULL};
165+	if (argc == 0) {
166 		shcmd[0] = getenv("SHELL");
167-		if(!shcmd[0])
168+		if (!shcmd[0])
169 			die("$SHELL not set");
170 		cmd = shcmd;
171-	}else
172+	} else
173 		cmd = argv;
174 
175 	(void)execvp(cmd[0], cmd);
176@@ -187,11 +177,11 @@ static void
177 dosetuid(uid_t uid, struct passwd *passwd)
178 {
179 #ifdef HAVE_LOGIN_CAP
180-	if(!passwd)
181+	if (!passwd)
182 		passwd = getpwuid(uid);
183-	if(!passwd)
184+	if (!passwd)
185 		die("%u: No such user id", uid);
186-	if(setusercontext(nil, passwd, uid, LOGIN_SETALL) < 0)
187+	if (setusercontext(0, passwd, uid, LOGIN_SETALL) < 0)
188 		die("setusercontext: %s", strerror(errno));
189 #else
190 	(void)passwd;