]> git.ipfire.org Git - people/ms/dnsmasq.git/commitdiff
add --tftp-no-fail to ignore missing tftp root
authorStefan Tomanek <stefan.tomanek+dnsmasq@wertarbyte.de>
Tue, 31 Mar 2015 21:32:11 +0000 (22:32 +0100)
committerSimon Kelley <simon@thekelleys.org.uk>
Tue, 31 Mar 2015 21:32:11 +0000 (22:32 +0100)
CHANGELOG
dnsmasq.conf.example
man/dnsmasq.8
src/dnsmasq.c
src/dnsmasq.h
src/option.c

index 4f4fa305deaad4a1853c03e2798243b210cd044d..34432ae4807f5e43e6e5fd5b962bddbfc8141a3c 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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
index 1bd305dbdbadeed0c214befef77f020dafeb17b5..67be99acb028d8db296311fe962adcaf5ff92d20 100644 (file)
 # 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
index 1f1dd7b69c53a10589e0440cb9fbd6b43792c7dd..6b4626cc0aadb73e9c6270234ed1552ad6f2cfe8 100644 (file)
@@ -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
index b784951950d400745bce96bfee04bdd0c11737a1..0d4d4558a2e2e7ce62f0f50fea4c71d766c474f3 100644 (file)
@@ -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
index de95d0e875e3d357f4f3007ffaa2bf6f9b0547a4..42952fc76c7a1e6ef48bc068d53292f393aaa742 100644 (file)
@@ -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;
 };
 
index 3009eb545fdec0469cc400763c9f9ef8133205b8..f91cfbb1aa545f62bebaaa72f34249b77de83339 100644 (file)
@@ -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 },