interface-ip: add support for IPv6 prefix invalidation
[project/netifd.git] / utils.c
diff --git a/utils.c b/utils.c
index d202505397f330ea999d6583ef75285f6ffb1f45..4f40b4b99baf06fe242d55b5908bb0a15f623327 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -17,6 +17,7 @@
 
 #include <arpa/inet.h>
 #include <netinet/in.h>
+#include <sys/socket.h>
 
 #ifdef __APPLE__
 #include <libproc.h>
@@ -175,6 +176,8 @@ crc32_file(FILE *fp)
 
 bool check_pid_path(int pid, const char *exe)
 {
+       const char deleted[] = " (deleted)";
+       const int deleted_len = strlen(deleted);
        int proc_exe_len;
        int exe_len = strlen(exe);
 
@@ -190,8 +193,30 @@ bool check_pid_path(int pid, const char *exe)
        proc_exe_len = readlink(proc_exe, proc_exe_buf, exe_len);
 #endif
 
-       if (proc_exe_len != exe_len)
+       if (proc_exe_len == exe_len)
+               return !memcmp(exe, proc_exe_buf, exe_len);
+       else if (proc_exe_len == exe_len + deleted_len)
+               return !memcmp(exe, proc_exe_buf, exe_len) &&
+                       !memcmp(exe + exe_len, deleted, deleted_len);
+       else
                return false;
+}
+
+static const char * const uci_validate_name[__BLOBMSG_TYPE_LAST] = {
+       [BLOBMSG_TYPE_STRING] = "string",
+       [BLOBMSG_TYPE_ARRAY] = "list(string)",
+       [BLOBMSG_TYPE_INT32] = "uinteger",
+       [BLOBMSG_TYPE_BOOL] = "bool",
+};
+
+const char*
+uci_get_validate_string(const struct uci_blob_param_list *p, int i)
+{
+       if (p->validate[i])
+               return p->validate[i];
+
+       else if (uci_validate_name[p->params[i].type])
+               return uci_validate_name[p->params[i].type];
 
-       return !memcmp(exe, proc_exe_buf, exe_len);
+       return p->validate[BLOBMSG_TYPE_STRING];
 }