*/
#include <string.h>
#include <stdlib.h>
-#include "utils.h"
#include <arpa/inet.h>
#include <netinet/in.h>
+#include <sys/socket.h>
+
+#ifdef __APPLE__
+#include <libproc.h>
+#endif
+
+#include "utils.h"
void
__vlist_simple_init(struct vlist_simple_tree *tree, int offset)
return str;
}
+
+uint32_t
+crc32_file(FILE *fp)
+{
+ static uint32_t *crcvals = NULL;
+ if (!crcvals) {
+ crcvals = malloc(sizeof(*crcvals) * 256);
+
+ for (size_t i = 0; i < 256; ++i) {
+ uint32_t c = i;
+ for (size_t j = 0; j < 8; ++j)
+ c = (c & 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1);
+ crcvals[i] = c;
+ }
+ }
+
+ uint8_t buf[1024];
+ size_t len;
+ uint32_t c = 0xFFFFFFFF;
+
+ do {
+ len = fread(buf, 1, sizeof(buf), fp);
+ for (size_t i = 0; i < len; ++i)
+ c = crcvals[(c ^ buf[i]) & 0xFF] ^ (c >> 8);
+ } while (len == sizeof(buf));
+
+ return c ^ 0xFFFFFFFF;
+}
+
+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);
+
+#ifdef __APPLE__
+ char proc_exe_buf[PROC_PIDPATHINFO_SIZE];
+
+ proc_exe_len = proc_pidpath(pid, proc_exe_buf, sizeof(proc_exe_buf));
+#else
+ char proc_exe[32];
+ char *proc_exe_buf = alloca(exe_len);
+
+ sprintf(proc_exe, "/proc/%d/exe", pid);
+ proc_exe_len = readlink(proc_exe, proc_exe_buf, exe_len);
+#endif
+
+ 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 p->validate[BLOBMSG_TYPE_STRING];
+}