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