s/qmail 4.4.12
Next generation secure email transport
Loading...
Searching...
No Matches
install.c
Go to the documentation of this file.
1#include <unistd.h>
2#include <sys/stat.h>
3#include "buffer.h"
4#include "logmsg.h"
5#include "open.h"
6#include "exit.h"
7#include "str.h"
8#include "fifo.h"
9
10extern void hier();
11extern void qmq_hier();
12extern void ldap_hier();
13
14#define WHO "install"
15
16int fdsourcedir = -1;
17
18void h(char *home,char *queue,int uid,int gid,int mode)
19{
20 if (mkdir(home,0700) == -1)
21 if (errno != EEXIST)
22 logmsg(WHO,111,FATAL,B("unable to mkdir: ",home));
23 if (chown(home,uid,gid) == -1)
24 logmsg(WHO,111,FATAL,B("unable to chown: ",home));
25 if (chmod(home,mode) == -1)
26 logmsg(WHO,111,FATAL,B("unable to chmod: ",home));
27
28 if (mkdir(queue,0700) == -1) {
29 if (errno != EEXIST)
30 logmsg(WHO,111,FATAL,B("unable to mkdir: ",queue));
31 } else {
32 if (chown(queue,uid,gid) == -1)
33 logmsg(WHO,111,FATAL,B("unable to chown: ",queue));
34 if (chmod(queue,mode) == -1)
35 logmsg(WHO,111,FATAL,B("unable to chmod: ",queue));
36 }
37}
38
39void d(char *home,char *subdir,int uid,int gid,int mode)
40{
41 if (chdir(home) == -1)
42 logmsg(WHO,110,FATAL,B("unable to switch to: ",home));
43 if (mkdir(subdir,0700) == -1)
44 if (errno != EEXIST)
45 logmsg(WHO,111,FATAL,B("unable to mkdir: ",home,"/",subdir));
46 if (chown(subdir,uid,gid) == -1)
47 logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",subdir));
48 if (chmod(subdir,mode) == -1)
49 logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",subdir));
50}
51
52void p(char *queue,char *fifo,int uid,int gid,int mode)
53{
54 if (chdir(queue) == -1)
55 logmsg(WHO,110,FATAL,B("unable to switch to: ",queue,"/queue"));
56 if (fifo_make(fifo,0700) == -1)
57 if (errno != EEXIST)
58 logmsg(WHO,111,FATAL,B("unable to mkfifo: ",queue,"/queue/",fifo));
59 if (chown(fifo,uid,gid) == -1)
60 logmsg(WHO,111,FATAL,B("unable to chown: ",queue,"/queue/",fifo));
61 if (chmod(fifo,mode) == -1)
62 logmsg(WHO,111,FATAL,B("unable to chmod: ",queue,"/queue/",fifo));
63}
64
65char inbuf[BUFFER_INSIZE];
66buffer bi;
67char outbuf[BUFFER_OUTSIZE];
68buffer bo;
69
70void c(char *home,char *subdir,char *file,int uid,int gid,int mode)
71{
72 int fdin;
73 int fdout;
74
75 if (fchdir(fdsourcedir) == -1)
76 logmsg(WHO,110,FATAL,"unable to switch back to source directory: ");
77
78 fdin = open_read(file);
79 if (fdin == -1)
80 logmsg(WHO,111,FATAL,B("unable to read: ",file));
81 buffer_init(&bi,buffer_unixread,fdin,inbuf,sizeof(inbuf));
82
83 if (chdir(home) == -1)
84 logmsg(WHO,110,FATAL,B("unable to switch to: ",home));
85 if (chdir(subdir) == -1)
86 logmsg(WHO,110,FATAL,B("unable to switch to: ",home,"/",subdir));
87
88 fdout = open_trunc(file);
89 if (fdout == -1)
90 logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
91 buffer_init(&bo,buffer_unixwrite,fdout,outbuf,sizeof(outbuf));
92
93 switch (buffer_copy(&bo,&bi)) {
94 case -2:
95 logmsg(WHO,111,FATAL,B("unable to read: ",file));
96 case -3:
97 logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
98 }
99
100 close(fdin);
101 if (buffer_flush(&bo) == -1)
102 logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
103 if (fsync(fdout) == -1)
104 logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
105 if (close(fdout) == -1) /* NFS silliness */
106 logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
107
108 if (chown(file,uid,gid) == -1)
109 logmsg(WHO,111,FATAL,B("unable to chown .../",subdir,"/",file));
110 if (chmod(file,mode) == -1)
111 logmsg(WHO,111,FATAL,B("unable to chmod .../",subdir,"/",file));
112}
113
114void z(char *home,char *file,int len,int uid,int gid,int mode)
115{
116 int fdout;
117
118 if (chdir(home) == -1)
119 logmsg(WHO,110,FATAL,B("unable to switch to: ",home));
120
121 fdout = open_trunc(file);
122 if (fdout == -1)
123 logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
124 buffer_init(&bo,buffer_unixwrite,fdout,outbuf,sizeof(outbuf));
125
126 while (len-- > 0)
127 if (buffer_put(&bo,"",1) == -1)
128 logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
129
130 if (buffer_flush(&bo) == -1)
131 logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
132 if (fsync(fdout) == -1)
133 logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
134 if (close(fdout) == -1) /* NFS silliness */
135 logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
136
137 if (chown(file,uid,gid) == -1)
138 logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",file));
139 if (chmod(file,mode) == -1)
140 logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",file));
141}
142
143int main(int argc,char * const argv[])
144{
145 fdsourcedir = open_read(".");
146 if (fdsourcedir == -1)
147 logmsg(WHO,110,FATAL,"unable to open current directory: ");
148
149 umask(077);
150 if (argc == 2 && !str_diffn(argv[1],"qmq",3)) qmq_hier();
151 if (argc == 2 && !str_diffn(argv[1],"ldap",4)) ldap_hier();
152 else hier();
153 _exit(0);
154}
int main()
Definition: chkshsgr.c:6
stralloc file
Definition: columnt.c:19
void _exit(int)
int fifo_make(char *fn, int mode)
Definition: fifo.c:8
void c(char *, char *, char *, int, int, int)
Definition: install.c:70
void qmq_hier()
Definition: hier.c:178
void ldap_hier()
Definition: hier.c:234
void hier()
Definition: hier.c:31
char inbuf[BUFFER_INSIZE]
Definition: install.c:65
void p(char *queue, char *fifo, int uid, int gid, int mode)
Definition: install.c:52
buffer bi
Definition: install.c:66
void z(char *home, char *file, int len, int uid, int gid, int mode)
Definition: install.c:114
char outbuf[BUFFER_OUTSIZE]
Definition: install.c:67
buffer bo
Definition: install.c:68
#define WHO
Definition: install.c:14
int fdsourcedir
Definition: install.c:16
void h(char *home, char *queue, int uid, int gid, int mode)
Definition: install.c:18
ulongalloc uid
Definition: matchup.c:59
stralloc home
Definition: qmail-pw2u.c:99
struct del * d[CHANNELS]
Definition: qmail-send.c:726
int fdin
Definition: qmail-todo.c:152
int fdout
Definition: qmail-todo.c:151