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