diff --git a/miniupnpd/Changelog.txt b/miniupnpd/Changelog.txt index 3fcbc42..7dd3b02 100644 --- a/miniupnpd/Changelog.txt +++ b/miniupnpd/Changelog.txt @@ -1,7 +1,11 @@ $Id: Changelog.txt,v 1.439 2018/04/12 09:32:22 nanard Exp $ +2018/05/02: + option to store remaining time in leasefile + 2018/04/12: pf: set dst address in rule if use_ext_ip_addr is set + 2018/04/06: Add options for netfilter scripts diff --git a/miniupnpd/INSTALL b/miniupnpd/INSTALL index e1ac4d0..6358183 100644 --- a/miniupnpd/INSTALL +++ b/miniupnpd/INSTALL @@ -185,6 +185,7 @@ or if your linux system use /etc/init.d/ miniupnpd handles the following signals : SIGUSR1: Send public IP address change notification SIGUSR2: Handle special actions in Tomato Firmware version + Or rewrite the lease_file SIGINT: Close gracefully SIGTERM: Close gracefully SIGPIPE: Ignore diff --git a/miniupnpd/genconfig.sh b/miniupnpd/genconfig.sh index 65f731b..d0bcf1f 100755 --- a/miniupnpd/genconfig.sh +++ b/miniupnpd/genconfig.sh @@ -472,6 +472,8 @@ if [ -n "$LEASEFILE" ] ; then else echo "/*#define ENABLE_LEASEFILE*/" >> ${CONFIGFILE} fi +echo "/* Uncomment the following line to store remaining time in lease file */" >> ${CONFIGFILE} +echo "/*#define LEASEFILE_USE_REMAINING_TIME*/" >> ${CONFIGFILE} echo "" >> ${CONFIGFILE} echo "/* Uncomment the following line to enable port in use check */" >> ${CONFIGFILE} diff --git a/miniupnpd/miniupnpd.c b/miniupnpd/miniupnpd.c index 943b868..625b5e6 100644 --- a/miniupnpd/miniupnpd.c +++ b/miniupnpd/miniupnpd.c @@ -112,6 +112,9 @@ int get_udp_dst_port (char *payload); /* variables used by signals */ static volatile sig_atomic_t quitting = 0; volatile sig_atomic_t should_send_public_address_change_notif = 0; +#if !defined(TOMATO) && defined(ENABLE_LEASEFILE) && defined(LEASEFILE_USE_REMAINING_TIME) +volatile sig_atomic_t should_rewrite_leasefile = 0; +#endif /* !TOMATO && ENABLE_LEASEFILE && LEASEFILE_USE_REMAINING_TIME */ #ifdef TOMATO #if 1 @@ -792,6 +795,16 @@ sigusr1(int sig) should_send_public_address_change_notif = 1; } +#if !defined(TOMATO) && defined(ENABLE_LEASEFILE) && defined(LEASEFILE_USE_REMAINING_TIME) +/* Handler for the SIGUSR2 signal to request rewrite of lease_file */ +static void +sigusr2(int sig) +{ + UNUSED(sig); + should_rewrite_leasefile = 1; +} +#endif /* !TOMATO && ENABLE_LEASEFILE && LEASEFILE_USE_REMAINING_TIME */ + /* record the startup time, for returning uptime */ static void set_startup_time(void) @@ -1678,6 +1691,13 @@ init(int argc, char * * argv, struct runtime_vars * v) { syslog(LOG_NOTICE, "Failed to set %s handler", "SIGUSR1"); } +#if !defined(TOMATO) && defined(ENABLE_LEASEFILE) && defined(LEASEFILE_USE_REMAINING_TIME) + sa.sa_handler = sigusr2; + if(sigaction(SIGUSR2, &sa, NULL) < 0) + { + syslog(LOG_NOTICE, "Failed to set %s handler", "SIGUSR2"); + } +#endif /* !TOMATO && ENABLE_LEASEFILE && LEASEFILE_USE_REMAINING_TIME */ /* initialize random number generator */ srandom((unsigned int)time(NULL)); @@ -2071,6 +2091,13 @@ main(int argc, char * * argv) upnp_bootid = time(NULL); } #endif +#if !defined(TOMATO) && defined(ENABLE_LEASEFILE) && defined(LEASEFILE_USE_REMAINING_TIME) + if(should_rewrite_leasefile) + { + lease_file_rewrite(); + should_rewrite_leasefile = 0; + } +#endif /* !TOMATO && ENABLE_LEASEFILE && LEASEFILE_USE_REMAINING_TIME */ /* send public address change notifications if needed */ if(should_send_public_address_change_notif) { @@ -2623,6 +2650,9 @@ shutdown: #ifdef TOMATO tomato_save("/etc/upnp/data"); #endif /* TOMATO */ +#if defined(ENABLE_LEASEFILE) && defined(LEASEFILE_USE_REMAINING_TIME) + lease_file_rewrite(); +#endif /* ENABLE_LEASEFILE && LEASEFILE_USE_REMAINING_TIME */ /* close out open sockets */ while(upnphttphead.lh_first != NULL) { diff --git a/miniupnpd/upnpredirect.c b/miniupnpd/upnpredirect.c index 160d703..30b0908 100644 --- a/miniupnpd/upnpredirect.c +++ b/miniupnpd/upnpredirect.c @@ -295,6 +295,31 @@ int reload_from_lease_file() return 0; } + +#ifdef LEASEFILE_USE_REMAINING_TIME +void lease_file_rewrite(void) +{ + int index; + unsigned short eport, iport; + int proto; + char iaddr[32]; + char desc[64]; + char rhost[40]; + unsigned int timestamp; + + if (lease_file == NULL) return; + remove(lease_file); + for(index = 0; ; index++) { + if(get_redirect_rule_by_index(index, 0/*ifname*/, &eport, iaddr, sizeof(iaddr), + &iport, &proto, desc, sizeof(desc), + rhost, sizeof(rhost), ×tamp, + 0, 0) < 0) + break; + if(lease_file_add(eport, iaddr, iport, proto, desc, timestamp) < 0) + break; + } +} +#endif #endif /* upnp_redirect() diff --git a/miniupnpd/upnpredirect.h b/miniupnpd/upnpredirect.h index 32d095c..bb105de 100644 --- a/miniupnpd/upnpredirect.h +++ b/miniupnpd/upnpredirect.h @@ -16,6 +16,9 @@ #ifdef ENABLE_LEASEFILE int reload_from_lease_file(void); +#ifdef LEASEFILE_USE_REMAINING_TIME +void lease_file_rewrite(void); +#endif #endif /* upnp_redirect()