miniupnpd: add sendto() queuing
This commit is contained in:
parent
1985cbf3ef
commit
cbc1a3c96a
|
@ -80,7 +80,7 @@ STDOBJS = miniupnpd.o upnphttp.o upnpdescgen.o upnpsoap.o \
|
|||
upnpredirect.o getifaddr.o daemonize.o upnpglobalvars.o \
|
||||
options.o upnppermissions.o minissdp.o natpmp.o pcpserver.o \
|
||||
upnpevents.o upnputils.o getconnstatus.o \
|
||||
upnppinhole.o
|
||||
upnppinhole.o asyncsendto.o
|
||||
BSDOBJS = bsd/getifstats.o bsd/ifacewatcher.o bsd/getroute.o
|
||||
SUNOSOBJS = solaris/getifstats.o bsd/ifacewatcher.o bsd/getroute.o
|
||||
MACOBJS = mac/getifstats.o bsd/ifacewatcher.o bsd/getroute.o
|
||||
|
|
|
@ -47,7 +47,7 @@ BASEOBJS = miniupnpd.o upnphttp.o upnpdescgen.o upnpsoap.o \
|
|||
upnpredirect.o getifaddr.o daemonize.o upnpglobalvars.o \
|
||||
options.o upnppermissions.o minissdp.o natpmp.o pcpserver.o \
|
||||
upnpevents.o upnputils.o getconnstatus.o \
|
||||
upnppinhole.o pcplearndscp.o
|
||||
upnppinhole.o pcplearndscp.o asyncsendto.o
|
||||
|
||||
LNXOBJS = linux/getifstats.o linux/ifacewatcher.o linux/getroute.o
|
||||
NETFILTEROBJS = netfilter/iptcrdr.o netfilter/iptpinhole.o netfilter/nfct_get.o
|
||||
|
|
|
@ -32,7 +32,8 @@ FWNAME = $(shell [ `uname -r | cut -d. -f1` -ge 11 ] && echo "pf" || echo "ipfw
|
|||
STD_OBJS = miniupnpd.o upnphttp.o upnpdescgen.o upnpsoap.o \
|
||||
upnpredirect.o getifaddr.o daemonize.o upnpglobalvars.o \
|
||||
options.o upnppermissions.o minissdp.o natpmp.o \
|
||||
upnpevents.o getconnstatus.o upnputils.o
|
||||
upnpevents.o getconnstatus.o upnputils.o \
|
||||
asyncsendto.o
|
||||
MAC_OBJS = mac/getifstats.o bsd/ifacewatcher.o
|
||||
IPFW_OBJS = ipfw/ipfwrdr.o ipfw/ipfwaux.o
|
||||
PF_OBJS = pf/obsdrdr.o pf/pfpinhole.o
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
#include "miniupnpdtypes.h"
|
||||
#include "daemonize.h"
|
||||
#include "upnpevents.h"
|
||||
#include "asyncsendto.h"
|
||||
#ifdef ENABLE_NATPMP
|
||||
#include "natpmp.h"
|
||||
#ifdef ENABLE_PCP
|
||||
|
@ -1756,6 +1757,38 @@ main(int argc, char * * argv)
|
|||
upnpevents_selectfds(&readset, &writeset, &max_fd);
|
||||
#endif
|
||||
|
||||
/* queued "sendto" */
|
||||
{
|
||||
struct timeval next_send;
|
||||
i = get_next_scheduled_send(&next_send);
|
||||
if(i > 0) {
|
||||
#ifdef DEBUG
|
||||
syslog(LOG_DEBUG, "%d queued sendto", i);
|
||||
#endif
|
||||
i = get_sendto_fds(&writeset, &max_fd, &timeofday);
|
||||
if(timeofday.tv_sec > next_send.tv_sec ||
|
||||
(timeofday.tv_sec == next_send.tv_sec && timeofday.tv_usec >= next_send.tv_usec)) {
|
||||
if(i > 0) {
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
} else {
|
||||
struct timeval tmp_timeout;
|
||||
tmp_timeout.tv_sec = (next_send.tv_sec - timeofday.tv_sec);
|
||||
tmp_timeout.tv_usec = (next_send.tv_usec - timeofday.tv_usec);
|
||||
if(tmp_timeout.tv_usec < 0) {
|
||||
tmp_timeout.tv_usec += 1000000;
|
||||
tmp_timeout.tv_sec--;
|
||||
}
|
||||
if(timeout.tv_sec > tmp_timeout.tv_sec
|
||||
|| (timeout.tv_sec == tmp_timeout.tv_sec && timeout.tv_usec > tmp_timeout.tv_usec)) {
|
||||
timeout.tv_sec = tmp_timeout.tv_sec;
|
||||
timeout.tv_usec = tmp_timeout.tv_usec;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(select(max_fd+1, &readset, &writeset, 0, &timeout) < 0)
|
||||
{
|
||||
if(quitting) goto shutdown;
|
||||
|
@ -1764,6 +1797,9 @@ main(int argc, char * * argv)
|
|||
syslog(LOG_ERR, "Failed to select open sockets. EXITING");
|
||||
return 1; /* very serious cause of error */
|
||||
}
|
||||
if(try_sendto(&writeset) < 0) {
|
||||
syslog(LOG_ERR, "try_sendto: %m");
|
||||
}
|
||||
#ifdef USE_MINIUPNPDCTL
|
||||
for(ectl = ctllisthead.lh_first; ectl;)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue