*/
#include <string.h>
#include <stdlib.h>
-#include "utils.h"
#include <arpa/inet.h>
#include <netinet/in.h>
#include <libproc.h>
#endif
+#include "utils.h"
+
void
__vlist_simple_init(struct vlist_simple_tree *tree, int offset)
{
parse_ip_and_netmask(int af, const char *str, void *addr, unsigned int *netmask)
{
char *astr = alloca(strlen(str) + 1);
- int ret = 0;
strcpy(astr, str);
if (!split_netmask(astr, netmask, af == AF_INET6))
return 0;
}
- ret = inet_pton(af, astr, addr);
- if (ret > 0) {
- if (af == AF_INET) {
- struct in_addr *ip4_addr = (struct in_addr *)addr;
- uint32_t host_addr = ntohl(ip4_addr->s_addr);
-
- if (IN_EXPERIMENTAL(host_addr)) {
- return 0;
- }
- }
- else if (af == AF_INET6) {
- if (IN6_IS_ADDR_MULTICAST((struct in6_addr *)addr)) {
- return 0;
- }
- }
- }
- return ret;
+ return inet_pton(af, astr, addr);
}
char *
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);
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;
-
- return !memcmp(exe, proc_exe_buf, exe_len);
}
static const char * const uci_validate_name[__BLOBMSG_TYPE_LAST] = {