release
[hcoop/zz_old/debian/djbdns.git] / dnscache-conf.c
CommitLineData
dc0d77d7
CE
1#include <unistd.h>
2#include <sys/types.h>
3#include <sys/stat.h>
4#include "hasdevtcp.h"
5#ifdef HASDEVTCP
6#include <sys/mkdev.h>
7#endif
8#include <pwd.h>
9#include "strerr.h"
10#include "buffer.h"
11#include "uint32.h"
12#include "taia.h"
13#include "str.h"
14#include "open.h"
15#include "error.h"
16#include "exit.h"
17#include "auto_home.h"
18#include "generic-conf.h"
19
20#define FATAL "dnscache-conf: fatal: "
21
22void usage(void)
23{
24 strerr_die1x(100,"dnscache-conf: usage: dnscache-conf acct logacct /dnscache [ myip ]");
25}
26
27int fdrootservers;
28char rootserversbuf[64];
29buffer ssrootservers;
30
31char *dir;
32char *user;
33char *loguser;
34struct passwd *pw;
35const char *myip;
36
37uint32 seed[32];
38int seedpos = 0;
39
40void seed_adduint32(uint32 u)
41{
42 int i;
43
44 seed[seedpos] += u;
45 if (++seedpos == 32) {
46 for (i = 0;i < 32;++i) {
47 u = ((u ^ seed[i]) + 0x9e3779b9) ^ (u << 7) ^ (u >> 25);
48 seed[i] = u;
49 }
50 seedpos = 0;
51 }
52}
53
54void seed_addtime(void)
55{
56 struct taia t;
57 char tpack[TAIA_PACK];
58 int i;
59
60 taia_now(&t);
61 taia_pack(tpack,&t);
62 for (i = 0;i < TAIA_PACK;++i)
63 seed_adduint32(tpack[i]);
64}
65
66int main(int argc,char **argv)
67{
68 seed_addtime();
69 seed_adduint32(getpid());
70 seed_adduint32(getppid());
71 seed_adduint32(getuid());
72 seed_adduint32(getgid());
73
74 user = argv[1];
75 if (!user) usage();
76 loguser = argv[2];
77 if (!loguser) usage();
78 dir = argv[3];
79 if (!dir) usage();
80 if (dir[0] != '/') usage();
81 myip = argv[4];
82 if (!myip) myip = "127.0.0.1";
83
84 pw = getpwnam(loguser);
85 seed_addtime();
86 if (!pw)
87 strerr_die3x(111,FATAL,"unknown account ",loguser);
88
89 if (chdir(auto_home) == -1)
90 strerr_die4sys(111,FATAL,"unable to switch to ",auto_home,": ");
91
92 fdrootservers = open_read("/etc/dnsroots.local");
93 if (fdrootservers == -1) {
94 if (errno != error_noent)
95 strerr_die2sys(111,FATAL,"unable to open /etc/dnsroots.local: ");
96 fdrootservers = open_read("/etc/dnsroots.global");
97 if (fdrootservers == -1)
98 strerr_die2sys(111,FATAL,"unable to open /etc/dnsroots.global: ");
99 }
100
101 init(dir,FATAL);
102
103 seed_addtime(); makedir("log");
104 seed_addtime(); perm(02755);
105 seed_addtime(); makedir("log/main");
106 seed_addtime(); owner(pw->pw_uid,pw->pw_gid);
107 seed_addtime(); perm(02755);
108 seed_addtime(); start("log/status"); finish();
109 seed_addtime(); owner(pw->pw_uid,pw->pw_gid);
110 seed_addtime(); perm(0644);
111 seed_addtime(); makedir("env");
112 seed_addtime(); perm(02755);
113 seed_addtime(); start("env/ROOT"); outs(dir); outs("/root\n"); finish();
114 seed_addtime(); perm(0644);
115 seed_addtime(); start("env/IP"); outs(myip); outs("\n"); finish();
116 seed_addtime(); perm(0644);
117 seed_addtime(); start("env/IPSEND"); outs("0.0.0.0\n"); finish();
118 seed_addtime(); perm(0644);
119 seed_addtime(); start("env/CACHESIZE"); outs("1000000\n"); finish();
120 seed_addtime(); perm(0644);
121 seed_addtime(); start("env/DATALIMIT"); outs("3000000\n"); finish();
122 seed_addtime(); perm(0644);
123 seed_addtime(); start("run");
124 outs("#!/bin/sh\nexec 2>&1\nexec <seed\nexec envdir ./env sh -c '\n exec envuidgid "); outs(user);
125 outs(" softlimit -o250 -d \"$DATALIMIT\" ");
126 outs(auto_home); outs("/bin/dnscache\n'\n"); finish();
127 seed_addtime(); perm(0755);
128 seed_addtime(); start("log/run");
129 outs("#!/bin/sh\nexec setuidgid "); outs(loguser);
130 outs(" multilog t ./main\n"); finish();
131 seed_addtime(); perm(0755);
132 seed_addtime(); makedir("root");
133 seed_addtime(); perm(02755);
134 seed_addtime(); makedir("root/ip");
135 seed_addtime(); perm(02755);
136 seed_addtime(); start("root/ip/127.0.0.1"); finish();
137 seed_addtime(); perm(0600);
138 seed_addtime(); makedir("root/servers");
139 seed_addtime(); perm(02755);
140 seed_addtime(); start("root/servers/@");
141 buffer_init(&ssrootservers,buffer_unixread,fdrootservers,rootserversbuf,sizeof rootserversbuf);
142 copyfrom(&ssrootservers);
143 finish();
144 seed_addtime(); perm(0644);
145 seed_addtime();
146
147 start("seed"); out((char *) seed,128); finish();
148 perm(0600);
149
150#ifdef HASDEVTCP
151 makedir("root/etc");
152 perm(02755);
153 makedir("root/dev");
154 perm(02755);
155 start("root/etc/netconfig");
156 outs("tcp tpi_cots_ord v inet tcp /dev/tcp -\n");
157 outs("udp tpi_clts v inet udp /dev/udp -\n");
158 finish();
159 perm(0645);
160 umask(000);
161 if (mknod("root/dev/tcp",S_IFCHR | 0667,makedev(11,42)) == -1)
162 strerr_die4sys(111,FATAL,"unable to create device ",dir,"/root/dev/tcp: ");
163 if (mknod("root/dev/udp",S_IFCHR | 0667,makedev(11,41)) == -1)
164 strerr_die4sys(111,FATAL,"unable to create device ",dir,"/root/dev/udp: ");
165 umask(022);
166#endif
167
168 _exit(0);
169}