|
1 #include <sys/types.h> |
|
2 #include <pwd.h> |
|
3 #include <grp.h> |
|
4 #include "readwrite.h" |
|
5 #include "exit.h" |
|
6 #include "scan.h" |
|
7 #include "fmt.h" |
|
8 #include "strerr.h" |
|
9 #include "open.h" |
|
10 #include "seek.h" |
|
11 #include "fork.h" |
|
12 |
|
13 #define FATAL "idedit: fatal: " |
|
14 #define WARNING "idedit: warning: " |
|
15 |
|
16 int fd; |
|
17 |
|
18 void byte(pos,value) |
|
19 char *pos; |
|
20 unsigned int value; |
|
21 { |
|
22 unsigned long u; |
|
23 unsigned char ch; |
|
24 |
|
25 if (pos[scan_ulong(pos,&u)]) return; |
|
26 |
|
27 if (seek_set(fd,(seek_pos) u) == -1) |
|
28 strerr_die2sys(111,FATAL,"unable to seek: "); |
|
29 |
|
30 ch = value; |
|
31 if (write(fd,&ch,1) != 1) |
|
32 strerr_die2sys(111,FATAL,"unable to write: "); |
|
33 } |
|
34 |
|
35 char *args[10]; |
|
36 |
|
37 void run() |
|
38 { |
|
39 int pid; |
|
40 int wstat; |
|
41 |
|
42 pid = fork(); |
|
43 if (pid == -1) |
|
44 strerr_die2sys(111,FATAL,"unable to fork: "); |
|
45 |
|
46 if (pid == 0) { |
|
47 execv(*args,args); |
|
48 strerr_die4sys(111,WARNING,"unable to run ",*args,": "); |
|
49 } |
|
50 |
|
51 if (wait_pid(&wstat,pid) != pid) |
|
52 strerr_die2sys(111,FATAL,"waitpid surprise"); |
|
53 } |
|
54 |
|
55 void u(account,group,home,pos0,pos1,pos2,pos3) |
|
56 char *account; |
|
57 char *group; |
|
58 char *home; |
|
59 char *pos0; |
|
60 char *pos1; |
|
61 char *pos2; |
|
62 char *pos3; |
|
63 { |
|
64 struct passwd *pw; |
|
65 unsigned int value; |
|
66 |
|
67 pw = getpwnam(account); |
|
68 |
|
69 if (!pw && group) { |
|
70 args[0] = "add-account"; |
|
71 args[1] = account; |
|
72 args[2] = group; |
|
73 args[3] = home; |
|
74 args[4] = 0; |
|
75 run(); |
|
76 pw = getpwnam(account); |
|
77 } |
|
78 |
|
79 if (!pw) |
|
80 strerr_die3x(111,FATAL,"unable to find uid for ",account); |
|
81 |
|
82 value = pw->pw_uid; |
|
83 byte(pos0,value); value >>= 8; |
|
84 byte(pos1,value); value >>= 8; |
|
85 byte(pos2,value); value >>= 8; |
|
86 byte(pos3,value); value >>= 8; |
|
87 if (value) |
|
88 strerr_die3x(111,FATAL,"excessively large uid for ",account); |
|
89 } |
|
90 |
|
91 void g(group,pos0,pos1,pos2,pos3) |
|
92 char *group; |
|
93 char *pos0; |
|
94 char *pos1; |
|
95 char *pos2; |
|
96 char *pos3; |
|
97 { |
|
98 struct group *gr; |
|
99 unsigned int value; |
|
100 |
|
101 gr = getgrnam(group); |
|
102 |
|
103 if (!gr) { |
|
104 args[0] = "add-group"; |
|
105 args[1] = group; |
|
106 args[2] = 0; |
|
107 run(); |
|
108 gr = getgrnam(group); |
|
109 } |
|
110 |
|
111 if (!gr) |
|
112 strerr_die3x(111,FATAL,"unable to find gid for ",group); |
|
113 |
|
114 value = gr->gr_gid; |
|
115 byte(pos0,value); value >>= 8; |
|
116 byte(pos1,value); value >>= 8; |
|
117 byte(pos2,value); value >>= 8; |
|
118 byte(pos3,value); value >>= 8; |
|
119 if (value) |
|
120 strerr_die3x(111,FATAL,"excessively large gid for ",group); |
|
121 } |
|
122 |
|
123 void main(argc,argv) |
|
124 int argc; |
|
125 char **argv; |
|
126 { |
|
127 if (argc < 42) _exit(100); |
|
128 |
|
129 fd = open_write(argv[1]); |
|
130 if (fd == -1) strerr_die4sys(111,FATAL,"unable to open ",argv[1],": "); |
|
131 |
|
132 g("qmail",argv[34],argv[35],argv[36],argv[37]); |
|
133 g("nofiles",argv[38],argv[39],argv[40],argv[41]); |
|
134 |
|
135 u("root",(char *) 0,"/",argv[14],argv[15],argv[16],argv[17]); |
|
136 |
|
137 u("qmaild","nofiles","/var/qmail",argv[6],argv[7],argv[8],argv[9]); |
|
138 u("qmaill","nofiles","/var/qmail",argv[10],argv[11],argv[12],argv[13]); |
|
139 u("qmailp","nofiles","/var/qmail",argv[18],argv[19],argv[20],argv[21]); |
|
140 u("alias","nofiles","/var/qmail/alias",argv[2],argv[3],argv[4],argv[5]); |
|
141 |
|
142 u("qmailq","qmail","/var/qmail",argv[22],argv[23],argv[24],argv[25]); |
|
143 u("qmailr","qmail","/var/qmail",argv[26],argv[27],argv[28],argv[29]); |
|
144 u("qmails","qmail","/var/qmail",argv[30],argv[31],argv[32],argv[33]); |
|
145 |
|
146 _exit(0); |
|
147 } |