diff options
author | Stefan Tomanek <stefan.tomanek+dnsmasq@wertarbyte.de> | 2015-03-31 22:32:11 +0100 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2015-03-31 22:32:11 +0100 |
commit | 30d0879ed55cb67b1b735beab3d93f3bb3ef1dd2 (patch) | |
tree | dcbb23ae6a6597da580d6648c65714dba7d00200 | |
parent | fd6ad9e481ab7c812a6b1515244908818cbb0442 (diff) | |
download | dnsmasq-30d0879ed55cb67b1b735beab3d93f3bb3ef1dd2.tar.gz |
add --tftp-no-fail to ignore missing tftp root
-rw-r--r-- | CHANGELOG | 3 | ||||
-rw-r--r-- | dnsmasq.conf.example | 3 | ||||
-rw-r--r-- | man/dnsmasq.8 | 3 | ||||
-rw-r--r-- | src/dnsmasq.c | 40 | ||||
-rw-r--r-- | src/dnsmasq.h | 4 | ||||
-rw-r--r-- | src/option.c | 3 |
6 files changed, 45 insertions, 11 deletions
@@ -72,6 +72,9 @@ version 2.73 on systems without an RTC, whilst allowing DNS queries before the clock is valid so that NTP can run. Thanks to Kevin Darbyshire-Bryant for developing this idea. + + Add --tftp-no-fail option. Thanks to Stefan Tomanek for + the patch. version 2.72 diff --git a/dnsmasq.conf.example b/dnsmasq.conf.example index 1bd305d..67be99a 100644 --- a/dnsmasq.conf.example +++ b/dnsmasq.conf.example @@ -486,6 +486,9 @@ # Set the root directory for files available via FTP. #tftp-root=/var/ftpd +# Do not abort if the tftp-root is unavailable +#tftp-no-fail + # Make the TFTP server more secure: with this set, only files owned by # the user dnsmasq is running as will be send over the net. #tftp-secure diff --git a/man/dnsmasq.8 b/man/dnsmasq.8 index 1f1dd7b..6b4626c 100644 --- a/man/dnsmasq.8 +++ b/man/dnsmasq.8 @@ -1711,6 +1711,9 @@ Absolute paths (starting with /) are allowed, but they must be within the tftp-root. If the optional interface argument is given, the directory is only used for TFTP requests via that interface. .TP +.B --tftp-no-fail +Do not abort startup if specified tftp root directories are inaccessible. +.TP .B --tftp-unique-root Add the IP address of the TFTP client as a path component on the end of the TFTP-root (in standard dotted-quad format). Only valid if a diff --git a/src/dnsmasq.c b/src/dnsmasq.c index b784951..0d4d455 100644 --- a/src/dnsmasq.c +++ b/src/dnsmasq.c @@ -58,6 +58,9 @@ int main (int argc, char **argv) struct dhcp_context *context; struct dhcp_relay *relay; #endif +#ifdef HAVE_TFTP + int tftp_prefix_missing = 0; +#endif #ifdef LOCALEDIR setlocale(LC_ALL, ""); @@ -636,7 +639,7 @@ int main (int argc, char **argv) #endif #ifdef HAVE_TFTP - if (option_bool(OPT_TFTP)) + if (option_bool(OPT_TFTP)) { DIR *dir; struct tftp_prefix *p; @@ -645,24 +648,33 @@ int main (int argc, char **argv) { if (!((dir = opendir(daemon->tftp_prefix)))) { - send_event(err_pipe[1], EVENT_TFTP_ERR, errno, daemon->tftp_prefix); - _exit(0); + tftp_prefix_missing = 1; + if (!option_bool(OPT_TFTP_NO_FAIL)) + { + send_event(err_pipe[1], EVENT_TFTP_ERR, errno, daemon->tftp_prefix); + _exit(0); + } } closedir(dir); } - + for (p = daemon->if_prefix; p; p = p->next) { + p->missing = 0; if (!((dir = opendir(p->prefix)))) - { - send_event(err_pipe[1], EVENT_TFTP_ERR, errno, p->prefix); - _exit(0); - } + { + p->missing = 1; + if (!option_bool(OPT_TFTP_NO_FAIL)) + { + send_event(err_pipe[1], EVENT_TFTP_ERR, errno, p->prefix); + _exit(0); + } + } closedir(dir); } } #endif - + if (daemon->port == 0) my_syslog(LOG_INFO, _("started, version %s DNS disabled"), VERSION); else if (daemon->cachesize != 0) @@ -772,7 +784,8 @@ int main (int argc, char **argv) #ifdef HAVE_TFTP if (option_bool(OPT_TFTP)) - { + { + struct tftp_prefix *p; #ifdef FD_SETSIZE if (FD_SETSIZE < (unsigned)max_fd) max_fd = FD_SETSIZE; @@ -782,7 +795,14 @@ int main (int argc, char **argv) daemon->tftp_prefix ? _("root is ") : _("enabled"), daemon->tftp_prefix ? daemon->tftp_prefix: "", option_bool(OPT_TFTP_SECURE) ? _("secure mode") : ""); + + if (tftp_prefix_missing) + my_syslog(MS_TFTP | LOG_WARNING, _("warning: %s inaccessible"), daemon->tftp_prefix); + for (p = daemon->if_prefix; p; p = p->next) + if (p->missing) + my_syslog(MS_TFTP | LOG_WARNING, _("warning: TFTP directory %s inaccessible"), p->prefix); + /* This is a guess, it assumes that for small limits, disjoint files might be served, but for large limits, a single file will be sent to may clients (the file only needs diff --git a/src/dnsmasq.h b/src/dnsmasq.h index de95d0e..42952fc 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -240,7 +240,8 @@ struct event_desc { #define OPT_LOCAL_SERVICE 49 #define OPT_LOOP_DETECT 50 #define OPT_EXTRALOG 51 -#define OPT_LAST 52 +#define OPT_TFTP_NO_FAIL 52 +#define OPT_LAST 53 /* extra flags for my_syslog, we use a couple of facilities since they are known not to occupy the same bits as priorities, no matter how syslog.h is set up. */ @@ -901,6 +902,7 @@ struct addr_list { struct tftp_prefix { char *interface; char *prefix; + int missing; struct tftp_prefix *next; }; diff --git a/src/option.c b/src/option.c index 3009eb5..f91cfbb 100644 --- a/src/option.c +++ b/src/option.c @@ -153,6 +153,7 @@ struct myoption { #define LOPT_DHOPT_INOTIFY 341 #define LOPT_HOST_INOTIFY 342 #define LOPT_DNSSEC_STAMP 343 +#define LOPT_TFTP_NO_FAIL 344 #ifdef HAVE_GETOPT_LONG static const struct option opts[] = @@ -235,6 +236,7 @@ static const struct myoption opts[] = { "dhcp-ignore-names", 2, 0, LOPT_NO_NAMES }, { "enable-tftp", 2, 0, LOPT_TFTP }, { "tftp-secure", 0, 0, LOPT_SECURE }, + { "tftp-no-fail", 0, 0, LOPT_TFTP_NO_FAIL }, { "tftp-unique-root", 0, 0, LOPT_APREF }, { "tftp-root", 1, 0, LOPT_PREFIX }, { "tftp-max", 1, 0, LOPT_TFTP_MAX }, @@ -419,6 +421,7 @@ static struct { { LOPT_PREFIX, ARG_DUP, "<dir>[,<iface>]", gettext_noop("Export files by TFTP only from the specified subtree."), NULL }, { LOPT_APREF, OPT_TFTP_APREF, NULL, gettext_noop("Add client IP address to tftp-root."), NULL }, { LOPT_SECURE, OPT_TFTP_SECURE, NULL, gettext_noop("Allow access only to files owned by the user running dnsmasq."), NULL }, + { LOPT_TFTP_NO_FAIL, OPT_TFTP_NO_FAIL, NULL, gettext_noop("Do not terminate the service if TFTP directories are inaccessible."), NULL }, { LOPT_TFTP_MAX, ARG_ONE, "<integer>", gettext_noop("Maximum number of conncurrent TFTP transfers (defaults to %s)."), "#" }, { LOPT_NOBLOCK, OPT_TFTP_NOBLOCK, NULL, gettext_noop("Disable the TFTP blocksize extension."), NULL }, { LOPT_TFTP_LC, OPT_TFTP_LC, NULL, gettext_noop("Convert TFTP filenames to lowercase"), NULL }, |