SCCS-vsn: usr.sbin/timed/timed/readmsg.c 2.7
-static char sccsid[] = "@(#)readmsg.c 2.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)readmsg.c 2.7 (Berkeley) %G%";
#endif not lint
#include "globals.h"
#endif not lint
#include "globals.h"
(((netp)->mask & (froms).sin_addr.s_addr) == (netp)->net))) \
? 1 : 0)
(((netp)->mask & (froms).sin_addr.s_addr) == (netp)->net))) \
? 1 : 0)
-#define ISTOUTOFF(rtime, rtout) \
+#define MORETIME(rtime, rtout) \
(((rtime).tv_sec > (rtout).tv_sec || \
((rtime).tv_sec == (rtout).tv_sec && \
(rtime).tv_usec >= (rtout).tv_usec)) \
(((rtime).tv_sec > (rtout).tv_sec || \
((rtime).tv_sec == (rtout).tv_sec && \
(rtime).tv_usec >= (rtout).tv_usec)) \
struct timeval rtime, rwait, rtout;
struct tsp msgin;
struct timeval rtime, rwait, rtout;
struct tsp msgin;
{
int length;
fd_set ready;
{
int length;
fd_set ready;
- struct tsp *ret = NULL;
static struct tsplist *head = &msgslist;
static struct tsplist *tail = &msgslist;
static struct tsplist *head = &msgslist;
static struct tsplist *tail = &msgslist;
- int inet_netof();
- int bytenetorder(), bytehostorder();
struct tsplist *prev;
register struct netinfo *ntp;
register struct tsplist *ptr;
struct tsplist *prev;
register struct netinfo *ntp;
register struct tsplist *ptr;
while (ptr != NULL) {
if (LOOKAT(ptr->info, type, machfrom, netfrom, ptr->addr)) {
while (ptr != NULL) {
if (LOOKAT(ptr->info, type, machfrom, netfrom, ptr->addr)) {
- ret = (struct tsp *)malloc(sizeof(struct tsp));
- *ret = ptr->info;
from = ptr->addr;
prev->p = ptr->p;
if (ptr == tail)
tail = prev;
free((char *)ptr);
from = ptr->addr;
prev->p = ptr->p;
if (ptr == tail)
tail = prev;
free((char *)ptr);
+ if (netfrom == NULL)
+ for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
+ if ((ntp->mask & from.sin_addr.s_addr) ==
+ ntp->net) {
+ fromnet = ntp;
+ break;
+ }
+ }
+ else
+ fromnet = netfrom;
+ if (trace) {
+ fprintf(fd, "readmsg: ");
+ print(&msgin, &from);
+ }
+ return(&msgin);
} else {
prev = ptr;
ptr = ptr->p;
}
}
} else {
prev = ptr;
ptr = ptr->p;
}
}
- if (ret != NULL)
- goto out;
-
/*
* If the message was not in the linked list, it may still be
* coming from the network. Set the timer and wait
/*
* If the message was not in the linked list, it may still be
* coming from the network. Set the timer and wait
+ for (; MORETIME(rtime, rtout);
+ (void)gettimeofday(&rtime, (struct timezone *)0)) {
rwait.tv_sec = rtout.tv_sec - rtime.tv_sec;
rwait.tv_usec = rtout.tv_usec - rtime.tv_usec;
if (rwait.tv_usec < 0) {
rwait.tv_sec = rtout.tv_sec - rtime.tv_sec;
rwait.tv_usec = rtout.tv_usec - rtime.tv_usec;
if (rwait.tv_usec < 0) {
+ fromnet = NULL;
+ for (ntp = nettab; ntp != NULL; ntp = ntp->next)
+ if ((ntp->mask & from.sin_addr.s_addr) ==
+ ntp->net) {
+ fromnet = ntp;
+ break;
+ }
+
+ /*
+ * drop packets from nets we are ignoring permanently
+ */
+ if (fromnet == NULL) {
+ if (trace) {
+ fprintf(fd, "readmsg: discarded: ");
+ print(&msgin, &from);
+ }
+ continue;
+ }
+
/*
* Throw away messages coming from this machine, unless
* they are of some particular type.
/*
* Throw away messages coming from this machine, unless
* they are of some particular type.
fprintf(fd, "readmsg: discarded: ");
print(&msgin, &from);
}
fprintf(fd, "readmsg: discarded: ");
print(&msgin, &from);
}
- (void)gettimeofday(&rtime,(struct timezone *)0);
- if (ISTOUTOFF(rtime, rtout))
- break;
- else
- continue;
* higher level routine. Different acknowledgements are
* necessary, depending on status.
*/
* higher level routine. Different acknowledgements are
* necessary, depending on status.
*/
- for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
- if ((ntp->mask & from.sin_addr.s_addr) ==
- ntp->net) {
- if (ntp->status == MASTER)
- masterack();
- else
- slaveack();
- break;
- }
- }
+ if (fromnet->status == MASTER)
+ masterack();
+ else if (fromnet->status == SLAVE)
+ slaveack();
if (LOOKAT(msgin, type, machfrom, netfrom, from)) {
if (LOOKAT(msgin, type, machfrom, netfrom, from)) {
+ if (trace) {
+ fprintf(fd, "readmsg: ");
+ print(&msgin, &from);
+ }
+ return(&msgin);
} else {
tail->p = (struct tsplist *)
malloc(sizeof(struct tsplist));
} else {
tail->p = (struct tsplist *)
malloc(sizeof(struct tsplist));
tail->info = msgin;
tail->addr = from;
}
tail->info = msgin;
tail->addr = from;
}
-
- (void)gettimeofday(&rtime, (struct timezone *)0);
- if (ISTOUTOFF(rtime, rtout))
- break;
-out:
- if (ret != NULL) {
- if (trace) {
- fprintf(fd, "readmsg: ");
- print(ret, &from);
- }
- fromnet = NULL;
- for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
- if ((ntp->mask & from.sin_addr.s_addr) ==
- ntp->net) {
- fromnet = ntp;
- break;
- }
- }
- }
- return(ret);
+ return((struct tsp *)NULL);