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