changes from erik quanstrom
This commit is contained in:
parent
05f5d46b63
commit
19256e0dd9
8 changed files with 77 additions and 52 deletions
|
|
@ -91,12 +91,15 @@ freearea(Area **l)
|
||||||
* this entails running a command 'zonerefreshprogram'. This could
|
* this entails running a command 'zonerefreshprogram'. This could
|
||||||
* copy over databases from elsewhere or just do a zone transfer.
|
* copy over databases from elsewhere or just do a zone transfer.
|
||||||
*/
|
*/
|
||||||
/* XXX WRONG - can't use fork and exec */
|
|
||||||
void
|
void
|
||||||
refresh_areas(Area *s)
|
refresh_areas(Area *s)
|
||||||
{
|
{
|
||||||
int pid;
|
|
||||||
Waitmsg *w;
|
Waitmsg *w;
|
||||||
|
char *argv[3];
|
||||||
|
|
||||||
|
argv[0] = zonerefreshprogram;
|
||||||
|
argv[1] = "XXX";
|
||||||
|
argv[2] = nil;
|
||||||
|
|
||||||
for(; s != nil; s = s->next){
|
for(; s != nil; s = s->next){
|
||||||
if(!s->needrefresh)
|
if(!s->needrefresh)
|
||||||
|
|
@ -107,26 +110,9 @@ refresh_areas(Area *s)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(pid = fork()){
|
argv[1] = s->soarr->owner->name;
|
||||||
case -1:
|
w = runproc(argv[0], argv, 0);
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
execl(zonerefreshprogram, "zonerefresh", s->soarr->owner->name, 0);
|
|
||||||
threadexitsall(0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
for(;;){
|
|
||||||
w = wait();
|
|
||||||
if(w == nil)
|
|
||||||
break;
|
|
||||||
if(w->pid == pid){
|
|
||||||
if(w->msg == nil || *w->msg == 0)
|
|
||||||
s->needrefresh = 0;
|
|
||||||
free(w);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
free(w);
|
free(w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,6 @@ struct {
|
||||||
Mfile *inuse; /* active mfile's */
|
Mfile *inuse; /* active mfile's */
|
||||||
} mfalloc;
|
} mfalloc;
|
||||||
|
|
||||||
int haveip;
|
|
||||||
int mfd[2];
|
int mfd[2];
|
||||||
int debug;
|
int debug;
|
||||||
int traceactivity;
|
int traceactivity;
|
||||||
|
|
@ -106,7 +105,7 @@ char *LOG;
|
||||||
void
|
void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
fprint(2, "usage: %s [-dnrstT] [-a maxage] [-f ndb-file] [-p port] [-x service] [-z zoneprog]\n", argv0);
|
fprint(2, "usage: dns [-dnrstT] [-a maxage] [-f ndb-file] [-p port] [-x service] [-z zoneprog]\n");
|
||||||
threadexitsall("usage");
|
threadexitsall("usage");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -134,7 +133,7 @@ threadmain(int argc, char *argv[])
|
||||||
resolver = 1;
|
resolver = 1;
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
serveudp = 1; /* serve network */
|
serveudp = 1;
|
||||||
cachedb = 1;
|
cachedb = 1;
|
||||||
break;
|
break;
|
||||||
case 'T':
|
case 'T':
|
||||||
|
|
@ -165,7 +164,7 @@ threadmain(int argc, char *argv[])
|
||||||
/* start syslog before we fork */
|
/* start syslog before we fork */
|
||||||
fmtinstall('F', fcallfmt);
|
fmtinstall('F', fcallfmt);
|
||||||
dninit();
|
dninit();
|
||||||
if(!haveip && myipaddr(ipaddr, mntpt) < 0)
|
if(myipaddr(ipaddr, mntpt) < 0)
|
||||||
sysfatal("can't read my ip address");
|
sysfatal("can't read my ip address");
|
||||||
|
|
||||||
syslog(0, logfile, "starting dns on %I", ipaddr);
|
syslog(0, logfile, "starting dns on %I", ipaddr);
|
||||||
|
|
@ -665,7 +664,10 @@ rwrite(Job *job, Mfile *mf, Request *req)
|
||||||
dndump(dumpfile);
|
dndump(dumpfile);
|
||||||
goto send;
|
goto send;
|
||||||
} else if(strncmp(p, "dump ", 5) == 0){
|
} else if(strncmp(p, "dump ", 5) == 0){
|
||||||
|
if(*(p+5))
|
||||||
dndump(p+5);
|
dndump(p+5);
|
||||||
|
else
|
||||||
|
err = "bad filename";
|
||||||
goto send;
|
goto send;
|
||||||
} else if(strcmp(p, "refresh")==0){
|
} else if(strcmp(p, "refresh")==0){
|
||||||
needrefresh = 1;
|
needrefresh = 1;
|
||||||
|
|
|
||||||
|
|
@ -381,6 +381,10 @@ extern char* convM2DNS(uchar*, int, DNSmsg*);
|
||||||
extern void mallocsanity(void*);
|
extern void mallocsanity(void*);
|
||||||
extern void lasthist(void*, int, ulong);
|
extern void lasthist(void*, int, ulong);
|
||||||
|
|
||||||
|
/* runproc.c */
|
||||||
|
extern Waitmsg* runproc(char*, char**, int);
|
||||||
|
extern Waitmsg* runprocfd(char*, char**, int[3]);
|
||||||
|
|
||||||
extern int debug;
|
extern int debug;
|
||||||
extern int traceactivity;
|
extern int traceactivity;
|
||||||
extern char *trace;
|
extern char *trace;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ char *logfile = "dns";
|
||||||
char *dbfile;
|
char *dbfile;
|
||||||
char mntpt[Maxpath];
|
char mntpt[Maxpath];
|
||||||
char *zonerefreshprogram;
|
char *zonerefreshprogram;
|
||||||
|
char *portname = "domain";
|
||||||
|
|
||||||
int prettyrrfmt(Fmt*);
|
int prettyrrfmt(Fmt*);
|
||||||
void preloadserveraddrs(void);
|
void preloadserveraddrs(void);
|
||||||
|
|
@ -47,7 +48,6 @@ usage(void)
|
||||||
fprint(2, "usage: dnsdebug -rxf [-p port] [query ...]\n");
|
fprint(2, "usage: dnsdebug -rxf [-p port] [query ...]\n");
|
||||||
threadexitsall("usage");
|
threadexitsall("usage");
|
||||||
}
|
}
|
||||||
char *portname = "domain";
|
|
||||||
|
|
||||||
void
|
void
|
||||||
threadmain(int argc, char *argv[])
|
threadmain(int argc, char *argv[])
|
||||||
|
|
@ -60,9 +60,6 @@ threadmain(int argc, char *argv[])
|
||||||
strcpy(mntpt, "/net");
|
strcpy(mntpt, "/net");
|
||||||
|
|
||||||
ARGBEGIN{
|
ARGBEGIN{
|
||||||
case 'p': /* XXX */
|
|
||||||
portname = EARGF(usage());
|
|
||||||
break;
|
|
||||||
case 'r':
|
case 'r':
|
||||||
resolver = 1;
|
resolver = 1;
|
||||||
break;
|
break;
|
||||||
|
|
@ -73,6 +70,9 @@ threadmain(int argc, char *argv[])
|
||||||
case 'f':
|
case 'f':
|
||||||
dbfile = EARGF(usage());
|
dbfile = EARGF(usage());
|
||||||
break;
|
break;
|
||||||
|
case 'p':
|
||||||
|
portname = EARGF(usage());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
}ARGEND
|
}ARGEND
|
||||||
|
|
|
||||||
|
|
@ -35,10 +35,10 @@ connreadmsg(int tfd, int *fd, uchar *buf, int max)
|
||||||
if (lfd < 0)
|
if (lfd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
*fd = accept(lfd, ldir);
|
*fd = accept(lfd, ldir);
|
||||||
n = -1;
|
if (*fd >= 0)
|
||||||
if (*fd < 0)
|
|
||||||
n = readmsg(*fd, buf, max);
|
n = readmsg(*fd, buf, max);
|
||||||
//close(fd);
|
else
|
||||||
|
n = -1;
|
||||||
close(lfd);
|
close(lfd);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
@ -181,7 +181,7 @@ out:
|
||||||
void
|
void
|
||||||
tcpproc(void *v)
|
tcpproc(void *v)
|
||||||
{
|
{
|
||||||
int len;
|
int len, rv;
|
||||||
Request req;
|
Request req;
|
||||||
DNSmsg reqmsg, repmsg;
|
DNSmsg reqmsg, repmsg;
|
||||||
char *err;
|
char *err;
|
||||||
|
|
@ -191,7 +191,7 @@ tcpproc(void *v)
|
||||||
NetConnInfo *caller;
|
NetConnInfo *caller;
|
||||||
|
|
||||||
rfd = -1;
|
rfd = -1;
|
||||||
fd = (int)v;
|
fd = (uintptr)v;
|
||||||
caller = 0;
|
caller = 0;
|
||||||
/* loop on requests */
|
/* loop on requests */
|
||||||
for(;; putactivity()){
|
for(;; putactivity()){
|
||||||
|
|
@ -244,12 +244,13 @@ tcpproc(void *v)
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
dnserver(&reqmsg, &repmsg, &req);
|
dnserver(&reqmsg, &repmsg, &req);
|
||||||
if(reply(rfd, &repmsg, &req, caller) < 0)
|
rv = reply(rfd, &repmsg, &req, caller);
|
||||||
break;
|
|
||||||
rrfreelist(repmsg.qd);
|
rrfreelist(repmsg.qd);
|
||||||
rrfreelist(repmsg.an);
|
rrfreelist(repmsg.an);
|
||||||
rrfreelist(repmsg.ns);
|
rrfreelist(repmsg.ns);
|
||||||
rrfreelist(repmsg.ar);
|
rrfreelist(repmsg.ar);
|
||||||
|
if(rv < 0)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -264,8 +265,6 @@ enum {
|
||||||
Maxactivetcp = 4,
|
Maxactivetcp = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern char *portname;
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tcpannounce(char *mntpt)
|
tcpannounce(char *mntpt)
|
||||||
{
|
{
|
||||||
|
|
@ -283,12 +282,10 @@ void
|
||||||
dntcpserver(void *v)
|
dntcpserver(void *v)
|
||||||
{
|
{
|
||||||
int i, fd;
|
int i, fd;
|
||||||
char *mntpt;
|
|
||||||
|
|
||||||
mntpt = v;
|
while((fd = tcpannounce(v)) < 0)
|
||||||
while((fd = tcpannounce(mntpt)) < 0)
|
|
||||||
sleep(5*1000);
|
sleep(5*1000);
|
||||||
|
|
||||||
for(i=0; i<Maxactivetcp; i++)
|
for(i=0; i<Maxactivetcp; i++)
|
||||||
proccreate(tcpproc, (void*)fd, STACK);
|
proccreate(tcpproc, (void*)(uintptr)fd, STACK);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,15 +72,13 @@ udpproc(void *v)
|
||||||
char tname[32];
|
char tname[32];
|
||||||
Udphdr *uh;
|
Udphdr *uh;
|
||||||
|
|
||||||
fd = (int)v;
|
fd = (uintptr)v;
|
||||||
|
|
||||||
/* loop on requests */
|
/* loop on requests */
|
||||||
for(;; putactivity()){
|
for(;; putactivity()){
|
||||||
memset(&repmsg, 0, sizeof(repmsg));
|
memset(&repmsg, 0, sizeof(repmsg));
|
||||||
memset(&reqmsg, 0, sizeof(reqmsg));
|
memset(&reqmsg, 0, sizeof(reqmsg));
|
||||||
alarm(60*1000);
|
|
||||||
len = udpread(fd, (Udphdr*)buf, buf+Udphdrsize, sizeof(buf)-Udphdrsize);
|
len = udpread(fd, (Udphdr*)buf, buf+Udphdrsize, sizeof(buf)-Udphdrsize);
|
||||||
alarm(0);
|
|
||||||
if(len <= 0)
|
if(len <= 0)
|
||||||
continue;
|
continue;
|
||||||
uh = (Udphdr*)buf;
|
uh = (Udphdr*)buf;
|
||||||
|
|
@ -161,7 +159,7 @@ udpannounce(char *mntpt)
|
||||||
|
|
||||||
snprint(buf, sizeof buf, "udp!*!%s", portname);
|
snprint(buf, sizeof buf, "udp!*!%s", portname);
|
||||||
if((fd=announce(buf, buf)) < 0)
|
if((fd=announce(buf, buf)) < 0)
|
||||||
warning("can't announce on dns udp port");
|
warning("announce %s: %r", buf);
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -202,6 +200,6 @@ dnudpserver(void *v)
|
||||||
while((fd = udpannounce(v)) < 0)
|
while((fd = udpannounce(v)) < 0)
|
||||||
sleep(5*1000);
|
sleep(5*1000);
|
||||||
for(i=0; i<Maxactive; i++)
|
for(i=0; i<Maxactive; i++)
|
||||||
proccreate(udpproc, (void*)fd, STACK);
|
proccreate(udpproc, (void*)(uintptr)fd, STACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ DNSOFILES=\
|
||||||
dnresolve.$O\
|
dnresolve.$O\
|
||||||
dnserver.$O\
|
dnserver.$O\
|
||||||
dntcpserver.$O\
|
dntcpserver.$O\
|
||||||
|
runproc.$O\
|
||||||
|
|
||||||
$DNSOFILES dns.$O dnstcp.$O dnsdebug.$O: dns.h
|
$DNSOFILES dns.$O dnstcp.$O dnsdebug.$O: dns.h
|
||||||
|
|
||||||
|
|
|
||||||
37
src/cmd/ndb/runproc.c
Normal file
37
src/cmd/ndb/runproc.c
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <thread.h>
|
||||||
|
#include <bio.h>
|
||||||
|
#include <ndb.h>
|
||||||
|
#include "dns.h"
|
||||||
|
|
||||||
|
Waitmsg*
|
||||||
|
runprocfd(char *file, char **v, int fd[3])
|
||||||
|
{
|
||||||
|
int pid, i;
|
||||||
|
|
||||||
|
threadwaitchan();
|
||||||
|
pid = threadspawn(fd, file, v);
|
||||||
|
for(i=0; i<3; i++)
|
||||||
|
close(fd[i]);
|
||||||
|
if(pid < 0)
|
||||||
|
return nil;
|
||||||
|
return procwait(pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
Waitmsg*
|
||||||
|
runproc(char *file, char **v, int devnull)
|
||||||
|
{
|
||||||
|
int fd[3], i;
|
||||||
|
|
||||||
|
if(devnull){
|
||||||
|
fd[0] = open("/dev/null", ORDWR);
|
||||||
|
fd[1] = dup(1, fd[0]);
|
||||||
|
fd[2] = dup(2, fd[0]);
|
||||||
|
}else{
|
||||||
|
for(i=0; i<3; i++)
|
||||||
|
fd[i] = dup(i, -1);
|
||||||
|
}
|
||||||
|
return runprocfd(file, v, fd);
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue