X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=icmpdnd.c;h=3cd6f5f3cee1d12bf765126a033b6e7d59d296b6;hb=15a913c297d12c0a4b14c01437420ac0df8b6675;hp=3fa1792480861bee2fafa2000b4ba20e4eae539e;hpb=b39da562da7f3a29acb6ba360939ebc4bce4cfdc;p=icmp-dn.git diff --git a/icmpdnd.c b/icmpdnd.c index 3fa1792..3cd6f5f 100644 --- a/icmpdnd.c +++ b/icmpdnd.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -137,6 +138,7 @@ int main(int argc, char **argv) struct reqhdr req; struct rephdr rep; struct iphdr iphdr; + time_t curtime, lasterr; daemonize = 1; ttl = 3600; @@ -168,15 +170,23 @@ int main(int argc, char **argv) openlog("icmpdnd", LOG_PID, LOG_DAEMON); alive = 1; + lasterr = 0; while(alive) { namelen = sizeof(name); ret = recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *)&name, &namelen); + + curtime = time(NULL); if(ret < 0) { if(errno == EINTR) continue; syslog(LOG_ERR, "error in receiving datagram: %m"); - exit(1); + if(lasterr == curtime) { + syslog(LOG_CRIT, "exiting due to repeated errors"); + exit(1); + } + lasterr = curtime; } + if(ret < sizeof(iphdr) + sizeof(req)) continue; memcpy(&iphdr, buf, sizeof(iphdr)); @@ -198,10 +208,8 @@ int main(int argc, char **argv) /* XXX: The correct source address needs to be filled in from * the request's destination address. */ ret = sendto(s, buf, datalen + sizeof(rep), 0, (struct sockaddr *)&name, namelen); - if(ret < 0) { + if(ret < 0) syslog(LOG_WARNING, "error in sending reply: %m"); - exit(1); - } } close(s);