1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include "hasdevtcp.h"
4 #ifdef HASDEVTCP
5 #include <sys/mkdev.h>
6 #endif
7 #include <pwd.h>
8 #include "strerr.h"
9 #include "substdio.h"
10 #include "open.h"
11 #include "readwrite.h"
12 #include "exit.h"
13 #include "auto_home.h"
14 
15 #define FATAL "configure: fatal: "
16 
usage(void)17 void usage(void)
18 {
19   strerr_die1x(100,"configure: usage: configure acct logacct /public hostname hostip ...");
20 }
21 
22 char *dir;
23 char *fn;
24 char buf[1024];
25 int fd;
26 substdio ss;
27 
fail(void)28 void fail(void)
29 {
30   strerr_die6sys(111,FATAL,"unable to create ",dir,"/",fn,": ");
31 }
32 
makedir(char * s)33 void makedir(char *s)
34 {
35   fn = s;
36   if (mkdir(fn,0700) == -1) fail();
37 }
38 
start(char * s)39 void start(char *s)
40 {
41   fn = s;
42   fd = open_trunc(fn);
43   if (fd == -1) fail();
44   substdio_fdbuf(&ss,write,fd,buf,sizeof buf);
45 }
46 
outs(char * s)47 void outs(char *s)
48 {
49   if (substdio_puts(&ss,s) == -1) fail();
50 }
51 
finish(void)52 void finish(void)
53 {
54   if (substdio_flush(&ss) == -1) fail();
55   if (fsync(fd) == -1) fail();
56   close(fd);
57 }
58 
perm(int mode)59 void perm(int mode)
60 {
61   if (chmod(fn,mode) == -1) fail();
62 }
63 
64 char *user;
65 char *loguser;
66 struct passwd *pw;
67 
main(int argc,char ** argv)68 main(int argc,char **argv)
69 {
70   umask(022);
71 
72   user = argv[1];
73   if (!user) usage();
74   loguser = argv[2];
75   if (!loguser) usage();
76   dir = argv[3];
77   if (!dir) usage();
78   if (dir[0] != '/') usage();
79 
80   pw = getpwnam(loguser);
81   if (!pw)
82     strerr_die3x(111,FATAL,"unknown account ",loguser);
83 
84   if (mkdir(dir,0700) == -1)
85     strerr_die4sys(111,FATAL,"unable to create ",dir,": ");
86   if (chmod(dir,02755) == -1)
87     strerr_die4sys(111,FATAL,"unable to set mode of ",dir,": ");
88   if (chdir(dir) == -1)
89     strerr_die4sys(111,FATAL,"unable to switch to ",dir,": ");
90 
91   makedir("httpd");
92   perm(03700);
93   makedir("httpd/log");
94   perm(02755);
95   makedir("httpd/log/main");
96   if (chown("httpd/log/main",pw->pw_uid,pw->pw_gid) == -1)
97     strerr_die4sys(111,FATAL,"unable to set owner of ",dir,"/httpd/log/main: ");
98   perm(02755);
99   start("httpd/log/status");
100   finish();
101   if (chown("httpd/log/status",pw->pw_uid,pw->pw_gid) == -1)
102     strerr_die4sys(111,FATAL,"unable to set owner of ",dir,"/httpd/log/status: ");
103   perm(0644);
104 
105   start("httpd/run");
106   outs("#!/bin/sh\nexec 2>&1\nexec");
107   outs(" envuidgid "); outs(user);
108   outs(" softlimit -o20 -d50000");
109   outs(" tcpserver -vDRHl0 -b50 -c100 0 80 ");
110   outs(auto_home); outs("/bin/httpd "); outs(dir); outs("/file\n");
111   finish();
112   perm(0755);
113 
114   start("httpd/log/run");
115   outs("#!/bin/sh\nexec");
116   outs(" setuidgid "); outs(loguser);
117   outs(" multilog t ./main '-*' '+* * status: *' =status\n");
118   finish();
119   perm(0755);
120 
121   makedir("ftpd");
122   perm(03700);
123   makedir("ftpd/log");
124   perm(02755);
125   makedir("ftpd/log/main");
126   if (chown("ftpd/log/main",pw->pw_uid,pw->pw_gid) == -1)
127     strerr_die4sys(111,FATAL,"unable to set owner of ",dir,"/ftpd/log/main: ");
128   perm(02755);
129   start("ftpd/log/status");
130   finish();
131   if (chown("ftpd/log/status",pw->pw_uid,pw->pw_gid) == -1)
132     strerr_die4sys(111,FATAL,"unable to set owner of ",dir,"/ftpd/log/status: ");
133   perm(0644);
134 
135   start("ftpd/run");
136   outs("#!/bin/sh\nexec 2>&1\nexec");
137   outs(" envuidgid "); outs(user);
138   outs(" softlimit -o20 -d50000");
139   outs(" tcpserver -vDRHl0 -b20 -c40 -B'220 Features: a p .\r\n' 0 21 ");
140   outs(auto_home); outs("/bin/ftpd "); outs(dir); outs("/file\n");
141   finish();
142   perm(0755);
143 
144   start("ftpd/log/run");
145   outs("#!/bin/sh\nexec");
146   outs(" setuidgid "); outs(loguser);
147   outs(" multilog t ./main '-*' '+* * status: *' =status\n");
148   finish();
149   perm(0755);
150 
151   makedir("file");
152   perm(02755);
153   makedir("file/0");
154   perm(02755);
155 
156 #ifdef HASDEVTCP
157   makedir("file/etc");
158   perm(02755);
159   makedir("file/dev");
160   perm(02755);
161   start("file/etc/netconfig");
162   outs("tcp tpi_cots_ord v inet tcp /dev/tcp -\n");
163   finish();
164   perm(0645);
165   umask(000);
166   if (mknod("file/dev/tcp",S_IFCHR | 0667,makedev(11,42)) == -1)
167     strerr_die4sys(111,FATAL,"unable to create device ",dir,"/file/dev/tcp: ");
168   umask(022);
169 #endif
170 
171   if (chdir("file") == -1)
172     strerr_die4sys(111,FATAL,"unable to switch to ",dir,"/file: ");
173   for (argv += 4;*argv;++argv)
174     if (symlink("0",*argv) == -1)
175       strerr_die6sys(111,FATAL,"unable to create ",dir,"/file/",*argv,": ");
176 
177   _exit(0);
178 }
179