/* * Helper functions for handling target threads/cpus * * Copyright (C) 2012, LG Electronics, Namhyung Kim * * Released under the GPL v2. */ #include "target.h" #include "util.h" #include "debug.h" #include #include enum target_errno target__validate(struct target *target) { enum target_errno ret = TARGET_ERRNO__SUCCESS; if (target->pid) target->tid = target->pid; /* CPU and PID are mutually exclusive */ if (target->tid && target->cpu_list) { target->cpu_list = NULL; if (ret == TARGET_ERRNO__SUCCESS) ret = TARGET_ERRNO__PID_OVERRIDE_CPU; } /* UID and PID are mutually exclusive */ if (target->tid && target->uid_str) { target->uid_str = NULL; if (ret == TARGET_ERRNO__SUCCESS) ret = TARGET_ERRNO__PID_OVERRIDE_UID; } /* UID and CPU are mutually exclusive */ if (target->uid_str && target->cpu_list) { target->cpu_list = NULL; if (ret == TARGET_ERRNO__SUCCESS) ret = TARGET_ERRNO__UID_OVERRIDE_CPU; } /* PID and SYSTEM are mutually exclusive */ if (target->tid && target->system_wide) { target->system_wide = false; if (ret == TARGET_ERRNO__SUCCESS) ret = TARGET_ERRNO__PID_OVERRIDE_SYSTEM; } /* UID and SYSTEM are mutually exclusive */ if (target->uid_str && target->system_wide) { target->system_wide = false; if (ret == TARGET_ERRNO__SUCCESS) ret = TARGET_ERRNO__UID_OVERRIDE_SYSTEM; } /* THREAD and SYSTEM/CPU are mutually exclusive */ if (target->per_thread && (target->system_wide || target->cpu_list)) { target->per_thread = false; if (ret == TARGET_ERRNO__SUCCESS) ret = TARGET_ERRNO__SYSTEM_OVERRIDE_THREAD; } return ret; } enum target_errno target__parse_uid(struct target *target) { struct passwd pwd, *result; char buf[1024]; const char *str = target->uid_str; target->uid = UINT_MAX; if (str == NULL) return TARGET_ERRNO__SUCCESS; /* Try user name first */ getpwnam_r(str, &pwd, buf, sizeof(buf), &result); if (result == NULL) { /* * The user name not found. Maybe it's a UID number. */ char *endptr; int uid = strtol(str, &endptr, 10); if (*endptr != '\0') return TARGET_ERRNO__INVALID_UID; getpwuid_r(uid, &pwd, buf, sizeof(buf), &result); if (result == NULL) return TARGET_ERRNO__USER_NOT_FOUND; } target->uid = result->pw_uid; return TARGET_ERRNO__SUCCESS; } /* * This must have a same ordering as the enum target_errno. */ static const char *target__error_str[] = { "PID/TID switch overriding CPU", "PID/TID switch overriding UID", "UID switch overriding CPU", "PID/TID switch overriding SYSTEM", "UID switch overriding SYSTEM", "SYSTEM/CPU switch overriding PER-THREAD", "Invalid User: %s", "Problems obtaining information for user %s", }; int target__strerror(struct target *target, int errnum, char *buf, size_t buflen) { int idx; const char *msg; BUG_ON(buflen == 0); if (errnum >= 0) { str_error_r(errnum, buf, buflen); return 0; } if (errnum < __TARGET_ERRNO__START || errnum >= __TARGET_ERRNO__END) return -1; idx = errnum - __TARGET_ERRNO__START; msg = target__error_str[idx]; switch (errnum) { case TARGET_ERRNO__PID_OVERRIDE_CPU ... TARGET_ERRNO__SYSTEM_OVERRIDE_THREAD: snprintf(buf, buflen, "%s", msg); break; case TARGET_ERRNO__INVALID_UID: case TARGET_ERRNO__USER_NOT_FOUND: snprintf(buf, buflen, msg, target->uid_str); break; default: /* cannot reach here */ break; } return 0; } .form.submit();'>space:mode:
authorDavid Ahern <dsa@cumulusnetworks.com>2016-12-29 15:29:03 -0800
committerDavid S. Miller <davem@davemloft.net>2016-12-29 22:27:23 -0500
commitf5a0aab84b74de68523599817569c057c7ac1622 (patch)
tree321a7119a443d99853b4d3e747db583ad3a39912 /include/dt-bindings/clock
parent2344ef3c86a7fe41f97bf66c7936001b6132860b (diff)
net: ipv4: dst for local input routes should use l3mdev if relevant
IPv4 output routes already use l3mdev device instead of loopback for dst's if it is applicable. Change local input routes to do the same. This fixes icmp responses for unreachable UDP ports which are directed to the wrong table after commit 9d1a6c4ea43e4 because local_input routes use the loopback device. Moving from ingress device to loopback loses the L3 domain causing responses based on the dst to get to lost. Fixes: 9d1a6c4ea43e4 ("net: icmp_route_lookup should use rt dev to determine L3 domain") Signed-off-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/dt-bindings/clock')