aux/listen: remove argument clutter
addr and proto are globals. protodir should be a global. let's also avoid reading the remote addr more then once.
This commit is contained in:
parent
a1e3ba1b6d
commit
1da69597bd
1 changed files with 25 additions and 52 deletions
|
@ -23,14 +23,14 @@ struct Announce
|
||||||
};
|
};
|
||||||
|
|
||||||
int readstr(char*, char*, char*, int);
|
int readstr(char*, char*, char*, int);
|
||||||
void dolisten(char*, char*, int, char*, char*, long*);
|
void dolisten(char*, int, char*, char*, long*);
|
||||||
void newcall(int, char*, char*, Service*);
|
void newcall(int, char*, Service*);
|
||||||
int findserv(char*, char*, Service*, char*);
|
int findserv(char*, Service*, char*);
|
||||||
int getserv(char*, char*, Service*);
|
int getserv(char*, Service*);
|
||||||
void error(char*);
|
void error(char*);
|
||||||
void scandir(char*, char*, char*, char*);
|
void scandir(char*);
|
||||||
void becomenone(void);
|
void becomenone(void);
|
||||||
void listendir(char*, char*, char*, int);
|
void listendir(char*, int);
|
||||||
|
|
||||||
char listenlog[] = "listen";
|
char listenlog[] = "listen";
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ long maxprocs;
|
||||||
int quiet;
|
int quiet;
|
||||||
int immutable;
|
int immutable;
|
||||||
char *proto;
|
char *proto;
|
||||||
|
char *protodir;
|
||||||
char *addr;
|
char *addr;
|
||||||
Announce *announcements;
|
Announce *announcements;
|
||||||
#define SEC 1000
|
#define SEC 1000
|
||||||
|
@ -56,7 +57,6 @@ void
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
Service *s;
|
Service *s;
|
||||||
char *protodir;
|
|
||||||
char *trustdir;
|
char *trustdir;
|
||||||
char *servdir;
|
char *servdir;
|
||||||
|
|
||||||
|
@ -125,8 +125,8 @@ main(int argc, char *argv[])
|
||||||
proto = protodir;
|
proto = protodir;
|
||||||
else
|
else
|
||||||
proto++;
|
proto++;
|
||||||
listendir(protodir, addr, servdir, 0);
|
listendir(servdir, 0);
|
||||||
listendir(protodir, addr, trustdir, 1);
|
listendir(trustdir, 1);
|
||||||
|
|
||||||
/* command returns */
|
/* command returns */
|
||||||
exits(0);
|
exits(0);
|
||||||
|
@ -141,7 +141,7 @@ dingdong(void*, char *msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
listendir(char *protodir, char *addr, char *srvdir, int trusted)
|
listendir(char *srvdir, int trusted)
|
||||||
{
|
{
|
||||||
int ctl, pid, start;
|
int ctl, pid, start;
|
||||||
char dir[40], err[128], ds[128];
|
char dir[40], err[128], ds[128];
|
||||||
|
@ -174,7 +174,7 @@ listendir(char *protodir, char *addr, char *srvdir, int trusted)
|
||||||
notify(dingdong);
|
notify(dingdong);
|
||||||
|
|
||||||
pid = getpid();
|
pid = getpid();
|
||||||
scandir(proto, protodir, addr, srvdir);
|
scandir(srvdir);
|
||||||
for(;;){
|
for(;;){
|
||||||
/*
|
/*
|
||||||
* loop through announcements and process trusted services in
|
* loop through announcements and process trusted services in
|
||||||
|
@ -211,7 +211,7 @@ listendir(char *protodir, char *addr, char *srvdir, int trusted)
|
||||||
else
|
else
|
||||||
exits("ctl");
|
exits("ctl");
|
||||||
}
|
}
|
||||||
dolisten(proto, dir, ctl, srvdir, ds, &childs);
|
dolisten(dir, ctl, srvdir, ds, &childs);
|
||||||
close(ctl);
|
close(ctl);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -249,7 +249,7 @@ listendir(char *protodir, char *addr, char *srvdir, int trusted)
|
||||||
}
|
}
|
||||||
if(!immutable){
|
if(!immutable){
|
||||||
alarm(0);
|
alarm(0);
|
||||||
scandir(proto, protodir, addr, srvdir);
|
scandir(srvdir);
|
||||||
}
|
}
|
||||||
start = 60 - (time(0)-start);
|
start = 60 - (time(0)-start);
|
||||||
if(start > 0)
|
if(start > 0)
|
||||||
|
@ -285,7 +285,7 @@ addannounce(char *str)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
scandir(char *proto, char *protodir, char *addr, char *dname)
|
scandir(char *dname)
|
||||||
{
|
{
|
||||||
Announce *a, **l;
|
Announce *a, **l;
|
||||||
int fd, i, n, nlen;
|
int fd, i, n, nlen;
|
||||||
|
@ -341,7 +341,7 @@ becomenone(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dolisten(char *proto, char *dir, int ctl, char *srvdir, char *dialstr, long *pchilds)
|
dolisten(char *dir, int ctl, char *srvdir, char *dialstr, long *pchilds)
|
||||||
{
|
{
|
||||||
Service s;
|
Service s;
|
||||||
char ndir[40], wbuf[64];
|
char ndir[40], wbuf[64];
|
||||||
|
@ -417,7 +417,7 @@ dolisten(char *proto, char *dir, int ctl, char *srvdir, char *dialstr, long *pch
|
||||||
* see if we know the service requested
|
* see if we know the service requested
|
||||||
*/
|
*/
|
||||||
memset(&s, 0, sizeof s);
|
memset(&s, 0, sizeof s);
|
||||||
if(!findserv(proto, ndir, &s, srvdir)){
|
if(!findserv(ndir, &s, srvdir)){
|
||||||
if(!quiet)
|
if(!quiet)
|
||||||
syslog(1, listenlog, "%s: unknown service '%s' from '%s': %r",
|
syslog(1, listenlog, "%s: unknown service '%s' from '%s': %r",
|
||||||
proto, s.serv, s.remote);
|
proto, s.serv, s.remote);
|
||||||
|
@ -434,7 +434,7 @@ dolisten(char *proto, char *dir, int ctl, char *srvdir, char *dialstr, long *pch
|
||||||
close(nctl);
|
close(nctl);
|
||||||
if(wfd >= 0)
|
if(wfd >= 0)
|
||||||
close(wfd);
|
close(wfd);
|
||||||
newcall(data, proto, ndir, &s);
|
newcall(data, ndir, &s);
|
||||||
exits(0);
|
exits(0);
|
||||||
default:
|
default:
|
||||||
close(nctl);
|
close(nctl);
|
||||||
|
@ -453,12 +453,12 @@ dolisten(char *proto, char *dir, int ctl, char *srvdir, char *dialstr, long *pch
|
||||||
* thus providing a way to disable a service with a bind.
|
* thus providing a way to disable a service with a bind.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
findserv(char *proto, char *dir, Service *s, char *srvdir)
|
findserv(char *dir, Service *s, char *srvdir)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
Dir *d;
|
Dir *d;
|
||||||
|
|
||||||
if(!getserv(proto, dir, s))
|
if(!getserv(dir, s))
|
||||||
return 0;
|
return 0;
|
||||||
snprint(s->prog, sizeof s->prog, "%s/%s", srvdir, s->serv);
|
snprint(s->prog, sizeof s->prog, "%s/%s", srvdir, s->serv);
|
||||||
d = dirstat(s->prog);
|
d = dirstat(s->prog);
|
||||||
|
@ -471,7 +471,7 @@ findserv(char *proto, char *dir, Service *s, char *srvdir)
|
||||||
* get the service name out of the local address
|
* get the service name out of the local address
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
getserv(char *proto, char *dir, Service *s)
|
getserv(char *dir, Service *s)
|
||||||
{
|
{
|
||||||
char addr[128], *serv, *p;
|
char addr[128], *serv, *p;
|
||||||
long n;
|
long n;
|
||||||
|
@ -479,6 +479,8 @@ getserv(char *proto, char *dir, Service *s)
|
||||||
readstr(dir, "remote", s->remote, sizeof(s->remote)-1);
|
readstr(dir, "remote", s->remote, sizeof(s->remote)-1);
|
||||||
if(p = utfrune(s->remote, '\n'))
|
if(p = utfrune(s->remote, '\n'))
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
if(p = utfrune(s->remote, '!'))
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
n = readstr(dir, "local", addr, sizeof(addr)-1);
|
n = readstr(dir, "local", addr, sizeof(addr)-1);
|
||||||
if(n <= 0)
|
if(n <= 0)
|
||||||
|
@ -493,42 +495,13 @@ getserv(char *proto, char *dir, Service *s)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
|
||||||
remoteaddr(char *dir)
|
|
||||||
{
|
|
||||||
char buf[128], *p;
|
|
||||||
int n, fd;
|
|
||||||
|
|
||||||
snprint(buf, sizeof buf, "%s/remote", dir);
|
|
||||||
fd = open(buf, OREAD);
|
|
||||||
if(fd < 0)
|
|
||||||
return strdup("");
|
|
||||||
n = read(fd, buf, sizeof(buf));
|
|
||||||
close(fd);
|
|
||||||
if(n > 0){
|
|
||||||
buf[n] = 0;
|
|
||||||
p = strchr(buf, '!');
|
|
||||||
if(p)
|
|
||||||
*p = 0;
|
|
||||||
return strdup(buf);
|
|
||||||
}
|
|
||||||
return strdup("");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
newcall(int fd, char *proto, char *dir, Service *s)
|
newcall(int fd, char *dir, Service *s)
|
||||||
{
|
{
|
||||||
char data[4*NAMELEN];
|
char data[4*NAMELEN];
|
||||||
char *p;
|
|
||||||
|
|
||||||
if(!quiet){
|
if(!quiet)
|
||||||
if(dir != nil){
|
syslog(0, listenlog, "%s call for %s on chan %s (%s)", proto, s->serv, dir, s->remote);
|
||||||
p = remoteaddr(dir);
|
|
||||||
syslog(0, listenlog, "%s call for %s on chan %s (%s)", proto, s->serv, dir, p);
|
|
||||||
free(p);
|
|
||||||
} else
|
|
||||||
syslog(0, listenlog, "%s call for %s on chan %s", proto, s->serv, dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
snprint(data, sizeof data, "%s/data", dir);
|
snprint(data, sizeof data, "%s/data", dir);
|
||||||
bind(data, "/dev/cons", MREPL);
|
bind(data, "/dev/cons", MREPL);
|
||||||
|
|
Loading…
Reference in a new issue