]> git.ipfire.org Git - people/ms/dnsmasq.git/commitdiff
Teach the new inotify code about symlinks.
authorSimon Kelley <simon@thekelleys.org.uk>
Mon, 15 Dec 2014 15:58:13 +0000 (15:58 +0000)
committerSimon Kelley <simon@thekelleys.org.uk>
Mon, 15 Dec 2014 15:58:13 +0000 (15:58 +0000)
src/inotify.c

index a0223443d6b60f47076bfc0f97cf18ce1496c89f..960bf5efb41f70786096800f043af58f3b3f3afc 100644 (file)
@@ -41,29 +41,40 @@ void inotify_dnsmasq_init()
 
   inotify_buffer = safe_malloc(INOTIFY_SZ);
 
-  daemon->inotifyfd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
 
+  daemon->inotifyfd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
+  
   if (daemon->inotifyfd == -1)
     die(_("failed to create inotify: %s"), NULL, EC_MISC);
-
+  
   for (res = daemon->resolv_files; res; res = res->next)
     {
-      char *d = strrchr(res->name, '/');
-      
-      if (!d)
-       die(_("resolv-file %s not an absolute path"), res->name, EC_MISC);
-       
-      *d = 0; /* make ->name just directory */
-      res->wd = inotify_add_watch(daemon->inotifyfd, res->name, IN_CLOSE_WRITE | IN_MOVED_TO);
-      res->file = d+1; /* pointer to filename */
-      
-      if (res->wd == -1 && errno == ENOENT)
-       die(_("directory %s for resolv-file is missing, cannot poll"), res->name, EC_MISC);
+      char *d = NULL, *path;
       
-      *d = '/'; /* restore name */
+      if (!(path = realpath(res->name, NULL)))
+       {
+         /* realpath will fail if the file doesn't exist, but
+            dnsmasq copes with missing files, so fall back 
+            and assume that symlinks are not in use in that case. */
+         if (errno == ENOENT)
+           path = res->name;
+         else
+           die(_("cannot cannonicalise resolv-file %s: %s"), res->name, EC_MISC); 
+       }
       
-      if (res->wd == -1)
-       die(_("failed to create inotify for %s: %s"), res->name, EC_MISC);
+      if ((d = strrchr(path, '/')))
+       {
+         *d = 0; /* make path just directory */
+         res->wd = inotify_add_watch(daemon->inotifyfd, path, IN_CLOSE_WRITE | IN_MOVED_TO);
+         res->file = d+1; /* pointer to filename */
+         *d = '/';
+         
+         if (res->wd == -1 && errno == ENOENT)
+           die(_("directory %s for resolv-file is missing, cannot poll"), res->name, EC_MISC);
+         
+         if (res->wd == -1)
+           die(_("failed to create inotify for %s: %s"), res->name, EC_MISC);
+       }
     }
 }