SCCS-vsn: usr.sbin/timed/timed/timed.c 2.5
#endif not lint
#ifndef lint
#endif not lint
#ifndef lint
-static char sccsid[] = "@(#)timed.c 2.4 (Berkeley) %G%";
+static char sccsid[] = "@(#)timed.c 2.5 (Berkeley) %G%";
#endif not lint
#include "globals.h"
#endif not lint
#include "globals.h"
struct netinfo *slavenet;
struct netinfo *firstslavenet();
int Mflag;
struct netinfo *slavenet;
struct netinfo *firstslavenet();
int Mflag;
+struct nets {
+ char *name;
+ long net;
+ struct nets *next;
+} *nets = (struct nets *)0;
/*
* The timedaemons synchronize the clocks of hosts in a local area network.
/*
* The timedaemons synchronize the clocks of hosts in a local area network.
int on;
int ret;
long seed;
int on;
int ret;
long seed;
- int nflag;
- char *netname;
struct timeval time;
struct servent *srvp;
struct timeval time;
struct servent *srvp;
- struct netent *getnetent();
- struct netent *localnet;
struct tsp resp, conflict, *answer, *readmsg(), *acksend();
long casual();
char *date();
struct tsp resp, conflict, *answer, *readmsg(), *acksend();
long casual();
char *date();
backoff = 1;
trace = OFF;
nflag = OFF;
backoff = 1;
trace = OFF;
nflag = OFF;
openlog("timed", LOG_ODELAY, LOG_DAEMON);
if (getuid() != 0) {
openlog("timed", LOG_ODELAY, LOG_DAEMON);
if (getuid() != 0) {
break;
case 'n':
argc--, argv++;
break;
case 'n':
argc--, argv++;
- nflag = ON;
- netname = *argv;
+ if (iflag) {
+ fprintf(stderr,
+ "timed: -i and -n make no sense together\n");
+ } else {
+ nflag = ON;
+ addnetname(*argv, &nets);
+ }
+ while (*(++(*argv)+1)) ;
+ break;
+ case 'i':
+ argc--, argv++;
+ if (nflag) {
+ fprintf(stderr,
+ "timed: -i and -n make no sense together\n");
+ } else {
+ iflag = ON;
+ addnetname(*argv, &nets);
+ }
while (*(++(*argv)+1)) ;
break;
default:
while (*(++(*argv)+1)) ;
break;
default:
- if (nflag) {
- localnet = getnetbyname(netname);
- if (localnet == NULL) {
- syslog(LOG_ERR, "getnetbyname: unknown net %s",
- netname);
- exit(1);
+ if (nflag || iflag) {
+ struct netent *getnetent();
+ struct netent *n;
+ struct nets *np;
+ for ( np = nets ; np ; np = np->next) {
+ n = getnetbyname(np->name);
+ if (n == NULL) {
+ syslog(LOG_ERR, "getnetbyname: unknown net %s",
+ np->name);
+ exit(1);
+ }
+ np->net = n->n_net;
}
}
ifc.ifc_len = sizeof(buf);
}
}
ifc.ifc_len = sizeof(buf);
ntp->dest_addr = *(struct sockaddr_in *)&ifreq.ifr_dstaddr;
}
ntp->dest_addr.sin_port = port;
ntp->dest_addr = *(struct sockaddr_in *)&ifreq.ifr_dstaddr;
}
ntp->dest_addr.sin_port = port;
addr = ntohl(ntp->dest_addr.sin_addr.s_addr);
mask = ntohl(ntp->mask);
addr = ntohl(ntp->dest_addr.sin_addr.s_addr);
mask = ntohl(ntp->mask);
addr >>= 1;
mask >>= 1;
}
addr >>= 1;
mask >>= 1;
}
- if (addr != localnet->n_net)
+ for (n = nets ; n ; n = n->next)
+ if (addr == n->net)
+ break;
+ if (nflag && !n || iflag && n)
continue;
}
ntp->net = ntp->mask & ntp->dest_addr.sin_addr.s_addr;
continue;
}
ntp->net = ntp->mask & ntp->dest_addr.sin_addr.s_addr;
ret = ctime(&tv.tv_sec);
return(ret);
}
ret = ctime(&tv.tv_sec);
return(ret);
}
+
+addnetname(name)
+ char *name;
+{
+ struct nets **netlist = &nets;
+ while (*netlist)
+ netlist = &((*netlist)->next);
+ *netlist = (struct nets *)malloc(sizeof **netlist);
+ if (*netlist == (struct nets *)0) {
+ syslog(LOG_ERR, "malloc failed");
+ exit(1);
+ }
+ bzero(*netlist, sizeof(**netlist));
+ (*netlist)->name = name;
+}