X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fload-fragment.c;h=6759255984288fe350101f0552bc46f2add75d2a;hb=bb11271068ff34434f5b8cefd0c2c0bae5ed7fd1;hp=10681307cfc2fe3d7d628a2f6dca6aa3faae590c;hpb=d568a3350ee8a45877eef87cd026a954124e2cf8;p=elogind.git diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 10681307c..675925598 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -4,6 +4,7 @@ This file is part of systemd. Copyright 2010 Lennart Poettering + Copyright 2012 Holger Hans Peter Freyther systemd is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -42,6 +43,7 @@ #include "securebits.h" #include "missing.h" #include "unit-name.h" +#include "unit-printf.h" #include "bus-errors.h" #include "utf8.h" #include "path-util.h" @@ -185,7 +187,7 @@ int config_parse_unit_path_printf( k = unit_full_printf(u, rvalue); if (!k) - return -ENOMEM; + return log_oom(); r = config_parse_path(filename, line, section, lvalue, ltype, k, data, userdata); free(k); @@ -325,10 +327,12 @@ int config_parse_socket_bind( s = SOCKET(data); - if ((b = socket_address_bind_ipv6_only_from_string(rvalue)) < 0) { + b = socket_address_bind_ipv6_only_from_string(rvalue); + if (b < 0) { int r; - if ((r = parse_boolean(rvalue)) < 0) { + r = parse_boolean(rvalue); + if (r < 0) { log_error("[%s:%u] Failed to parse bind IPv6 only value, ignoring: %s", filename, line, rvalue); return 0; } @@ -435,6 +439,7 @@ int config_parse_exec( e += ltype; for (;;) { + int i; char *w; size_t l; char *state; @@ -449,18 +454,21 @@ int config_parse_exec( if (rvalue[0] == 0) break; - if (rvalue[0] == '-') { - ignore = true; - rvalue ++; - } + for (i = 0; i < 2; i++) { + if (rvalue[0] == '-' && !ignore) { + ignore = true; + rvalue ++; + } - if (rvalue[0] == '@') { - honour_argv0 = true; - rvalue ++; + if (rvalue[0] == '@' && !honour_argv0) { + honour_argv0 = true; + rvalue ++; + } } if (*rvalue != '/') { - log_error("[%s:%u] Invalid executable path in command line, ignoring: %s", filename, line, rvalue); + log_error("[%s:%u] Executable path is not absolute, ignoring: %s", + filename, line, rvalue); return 0; } @@ -480,6 +488,8 @@ int config_parse_exec( FOREACH_WORD_QUOTED(w, l, rvalue, state) { if (strncmp(w, ";", MAX(l, 1U)) == 0) break; + else if (strncmp(w, "\\;", MAX(l, 1U)) == 0) + w ++; if (honour_argv0 && w == rvalue) { assert(!path); @@ -613,7 +623,8 @@ int config_parse_exec_io_class( assert(rvalue); assert(data); - if ((x = ioprio_class_from_string(rvalue)) < 0) { + x = ioprio_class_from_string(rvalue); + if (x < 0) { log_error("[%s:%u] Failed to parse IO scheduling class, ignoring: %s", filename, line, rvalue); return 0; } @@ -672,12 +683,15 @@ int config_parse_exec_cpu_sched_policy( assert(rvalue); assert(data); - if ((x = sched_policy_from_string(rvalue)) < 0) { + x = sched_policy_from_string(rvalue); + if (x < 0) { log_error("[%s:%u] Failed to parse CPU scheduling policy, ignoring: %s", filename, line, rvalue); return 0; } c->cpu_sched_policy = x; + /* Moving to or from real-time policy? We need to adjust the priority */ + c->cpu_sched_priority = CLAMP(c->cpu_sched_priority, sched_get_priority_min(x), sched_get_priority_max(x)); c->cpu_sched_set = true; return 0; @@ -694,19 +708,28 @@ int config_parse_exec_cpu_sched_prio( void *userdata) { ExecContext *c = data; - int i; + int i, min, max; assert(filename); assert(lvalue); assert(rvalue); assert(data); - /* On Linux RR/FIFO have the same range */ - if (safe_atoi(rvalue, &i) < 0 || i < sched_get_priority_min(SCHED_RR) || i > sched_get_priority_max(SCHED_RR)) { + if (safe_atoi(rvalue, &i) < 0) { log_error("[%s:%u] Failed to parse CPU scheduling priority, ignoring: %s", filename, line, rvalue); return 0; } + + /* On Linux RR/FIFO range from 1 to 99 and OTHER/BATCH may only be 0 */ + min = sched_get_priority_min(c->cpu_sched_policy); + max = sched_get_priority_max(c->cpu_sched_policy); + + if (i < min || i > max) { + log_error("[%s:%u] CPU scheduling priority is out of range, ignoring: %s", filename, line, rvalue); + return 0; + } + c->cpu_sched_priority = i; c->cpu_sched_set = true; @@ -1192,32 +1215,36 @@ int config_parse_path_spec( Path *p = data; PathSpec *s; PathType b; + char *k; assert(filename); assert(lvalue); assert(rvalue); assert(data); - if ((b = path_type_from_string(lvalue)) < 0) { + b = path_type_from_string(lvalue); + if (b < 0) { log_error("[%s:%u] Failed to parse path type, ignoring: %s", filename, line, lvalue); return 0; } - if (!path_is_absolute(rvalue)) { - log_error("[%s:%u] Path is not absolute, ignoring: %s", filename, line, rvalue); + k = unit_full_printf(UNIT(p), rvalue); + if (!k) + return log_oom(); + + if (!path_is_absolute(k)) { + log_error("[%s:%u] Path is not absolute, ignoring: %s", filename, line, k); + free(k); return 0; } - if (!(s = new0(PathSpec, 1))) - return -ENOMEM; - - if (!(s->path = strdup(rvalue))) { - free(s); - return -ENOMEM; + s = new0(PathSpec, 1); + if (!s) { + free(k); + return log_oom(); } - path_kill_slashes(s->path); - + s->path = path_kill_slashes(k); s->type = b; s->inotify_fd = -1; @@ -1445,11 +1472,11 @@ int config_parse_ip_tos( assert(rvalue); assert(data); - if ((x = ip_tos_from_string(rvalue)) < 0) - if (safe_atoi(rvalue, &x) < 0) { - log_error("[%s:%u] Failed to parse IP TOS value, ignoring: %s", filename, line, rvalue); - return 0; - } + x = ip_tos_from_string(rvalue); + if (x < 0) { + log_error("[%s:%u] Failed to parse IP TOS value, ignoring: %s", filename, line, rvalue); + return 0; + } *ip_tos = x; return 0; @@ -1469,6 +1496,7 @@ int config_parse_unit_condition_path( Unit *u = data; bool trigger, negate; Condition *c; + _cleanup_free_ char *p = NULL; assert(filename); assert(lvalue); @@ -1483,12 +1511,16 @@ int config_parse_unit_condition_path( if (negate) rvalue++; - if (!path_is_absolute(rvalue)) { - log_error("[%s:%u] Path in condition not absolute, ignoring: %s", filename, line, rvalue); + p = unit_full_printf(u, rvalue); + if (!p) + return -ENOMEM; + + if (!path_is_absolute(p)) { + log_error("[%s:%u] Path in condition not absolute, ignoring: %s", filename, line, p); return 0; } - c = condition_new(cond, rvalue, trigger, negate); + c = condition_new(cond, p, trigger, negate); if (!c) return -ENOMEM; @@ -1510,21 +1542,29 @@ int config_parse_unit_condition_string( Unit *u = data; bool trigger, negate; Condition *c; + _cleanup_free_ char *s = NULL; assert(filename); assert(lvalue); assert(rvalue); assert(data); - if ((trigger = rvalue[0] == '|')) + trigger = rvalue[0] == '|'; + if (trigger) rvalue++; - if ((negate = rvalue[0] == '!')) + negate = rvalue[0] == '!'; + if (negate) rvalue++; - if (!(c = condition_new(cond, rvalue, trigger, negate))) + s = unit_full_printf(u, rvalue); + if (!s) return -ENOMEM; + c = condition_new(cond, s, trigger, negate); + if (!c) + return log_oom(); + LIST_PREPEND(Condition, conditions, u->conditions, c); return 0; } @@ -2028,7 +2068,7 @@ int config_parse_syscall_filter( ExecContext *c = data; Unit *u = userdata; - bool invert; + bool invert = false; char *w; size_t l; char *state;