config: Create statefile dir
authorHans Dedecker <dedeckeh@gmail.com>
Thu, 29 Dec 2016 11:33:39 +0000 (12:33 +0100)
committerHans Dedecker <dedeckeh@gmail.com>
Thu, 29 Dec 2016 12:49:26 +0000 (13:49 +0100)
Create statefile dir if the specified dir does not yet exist

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
src/config.c

index a3cb2bec3e3ec5ec202b053e4ca577da3aef1207..c0c12152b026e1a48ea75e3159cddf15720a81ba 100644 (file)
@@ -3,6 +3,9 @@
 #include <signal.h>
 #include <arpa/inet.h>
 #include <unistd.h>
+#include <libgen.h>
+#include <string.h>
+#include <sys/stat.h>
 
 #include <uci.h>
 #include <uci_blob.h>
@@ -140,6 +143,30 @@ const struct uci_blob_param_list odhcpd_attr_list = {
        .params = odhcpd_attrs,
 };
 
+static int mkdir_p(char *dir, mode_t mask)
+{
+       char *l = strrchr(dir, '/');
+       int ret;
+
+       if (!l)
+               return 0;
+
+       *l = '\0';
+
+       if (mkdir_p(dir, mask))
+               return -1;
+
+       *l = '/';
+
+       ret = mkdir(dir, mask);
+       if (ret && errno == EEXIST)
+               return 0;
+
+       if (ret)
+               syslog(LOG_ERR, "mkdir(%s, %d) failed: %s\n", dir, mask, strerror(errno));
+
+       return ret;
+}
 
 static struct interface* get_interface(const char *name)
 {
@@ -626,6 +653,12 @@ void odhcpd_reload(void)
                }
        }
 
+       if (config.dhcp_statefile) {
+               char *path = strdup(config.dhcp_statefile);
+
+               mkdir_p(dirname(path), 0755);
+               free(path);
+       }
 
 #ifdef WITH_UBUS
        ubus_apply_network();