Commit | Line | Data |
---|---|---|
212b6f5d MW |
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 | } |