#include <sys/time.h>
#include <sys/resource.h>
-#include <systemd/sd-messages.h>
-
+#include "sd-messages.h"
#include "unit.h"
#include "strv.h"
#include "conf-parser.h"
p->fd = -1;
if (s->ports) {
- LIST_FIND_TAIL(SocketPort, port, s->ports, tail);
- LIST_INSERT_AFTER(SocketPort, port, s->ports, tail, p);
+ LIST_FIND_TAIL(port, s->ports, tail);
+ LIST_INSERT_AFTER(port, s->ports, tail, p);
} else
- LIST_PREPEND(SocketPort, port, s->ports, p);
+ LIST_PREPEND(port, s->ports, p);
return 0;
}
}
#endif
-int config_parse_fsck_passno(const char *unit,
- const char *filename,
- unsigned line,
- const char *section,
- const char *lvalue,
- int ltype,
- const char *rvalue,
- void *data,
- void *userdata) {
-
- int *passno = data;
- int i, r;
-
- assert(filename);
- assert(lvalue);
- assert(rvalue);
- assert(data);
-
- r = safe_atoi(rvalue, &i);
- if (r || i < 0) {
- log_syntax(unit, LOG_ERR, filename, line, -r,
- "Failed to parse fsck pass number, ignoring: %s", rvalue);
- return 0;
- }
-
- *passno = (int) i;
- return 0;
-}
-
DEFINE_CONFIG_PARSE_ENUM(config_parse_kill_mode, kill_mode, KillMode, "Failed to parse kill mode");
int config_parse_kill_signal(const char *unit,
v->value = u;
v->calendar_spec = c;
- LIST_PREPEND(TimerValue, value, t->values, v);
+ LIST_PREPEND(value, t->values, v);
return 0;
}
s->type = b;
s->inotify_fd = -1;
- LIST_PREPEND(PathSpec, spec, p->specs, s);
+ LIST_PREPEND(spec, p->specs, s);
return 0;
}
if (!c)
return log_oom();
- LIST_PREPEND(Condition, conditions, u->conditions, c);
+ LIST_PREPEND(conditions, u->conditions, c);
return 0;
}
if (!c)
return log_oom();
- LIST_PREPEND(Condition, conditions, u->conditions, c);
+ LIST_PREPEND(conditions, u->conditions, c);
return 0;
}
if (!c)
return log_oom();
- LIST_PREPEND(Condition, conditions, u->conditions, c);
+ LIST_PREPEND(conditions, u->conditions, c);
return 0;
}
DEFINE_CONFIG_PARSE_ENUM(config_parse_notify_access, notify_access, NotifyAccess, "Failed to parse notify access specifier");
DEFINE_CONFIG_PARSE_ENUM(config_parse_start_limit_action, start_limit_action, StartLimitAction, "Failed to parse start limit action specifier");
-int config_parse_unit_requires_mounts_for(const char *unit,
- const char *filename,
- unsigned line,
- const char *section,
- const char *lvalue,
- int ltype,
- const char *rvalue,
- void *data,
- void *userdata) {
+int config_parse_unit_requires_mounts_for(
+ const char *unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
Unit *u = userdata;
- int r;
- bool empty_before;
+ char *state;
+ size_t l;
+ char *w;
assert(filename);
assert(lvalue);
assert(rvalue);
assert(data);
- empty_before = !u->requires_mounts_for;
+ FOREACH_WORD_QUOTED(w, l, rvalue, state) {
+ int r;
+ _cleanup_free_ char *n;
- r = config_parse_path_strv(unit, filename, line, section, lvalue, ltype,
- rvalue, data, userdata);
+ n = strndup(w, l);
+ if (!n)
+ return log_oom();
+
+ if (!utf8_is_valid(n)) {
+ log_syntax(unit, LOG_ERR, filename, line, EINVAL,
+ "Path is not UTF-8 clean, ignoring assignment: %s", rvalue);
+ continue;
+ }
- /* Make it easy to find units with requires_mounts set */
- if (empty_before && u->requires_mounts_for)
- LIST_PREPEND(Unit, has_requires_mounts_for, u->manager->has_requires_mounts_for, u);
+ r = unit_require_mounts_for(u, n);
+ if (r < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, r,
+ "Failed to add required mount for, ignoring: %s", rvalue);
+ continue;
+ }
+ }
- return r;
+ return 0;
}
int config_parse_documentation(const char *unit,
free(*a);
}
}
- *b = NULL;
+ if (b)
+ *b = NULL;
return r;
}
void *userdata) {
CGroupContext *c = data;
- uint64_t *limit;
off_t bytes;
int r;
- limit = streq(lvalue, "MemoryLimit") ? &c->memory_limit : &c->memory_soft_limit;
-
if (isempty(rvalue)) {
- *limit = (uint64_t) -1;
+ c->memory_limit = (uint64_t) -1;
return 0;
}
return 0;
}
- *limit = (uint64_t) bytes;
+ c->memory_limit = (uint64_t) bytes;
return 0;
}
a->w = !!strchr(m, 'w');
a->m = !!strchr(m, 'm');
- LIST_PREPEND(CGroupDeviceAllow, device_allow, c->device_allow, a);
+ LIST_PREPEND(device_allow, c->device_allow, a);
return 0;
}
w->weight = lu;
- LIST_PREPEND(CGroupBlockIODeviceWeight, device_weights, c->blockio_device_weights, w);
+ LIST_PREPEND(device_weights, c->blockio_device_weights, w);
return 0;
}
b->bandwidth = (uint64_t) bytes;
b->read = read;
- LIST_PREPEND(CGroupBlockIODeviceBandwidth, device_bandwidths, c->blockio_device_bandwidths, b);
+ LIST_PREPEND(device_bandwidths, c->blockio_device_bandwidths, b);
return 0;
}
static int load_from_path(Unit *u, const char *path) {
int r;
- Set *symlink_names;
- FILE *f = NULL;
- char *filename = NULL, *id = NULL;
+ _cleanup_set_free_free_ Set *symlink_names = NULL;
+ _cleanup_fclose_ FILE *f = NULL;
+ _cleanup_free_ char *filename = NULL;
+ char *id = NULL;
Unit *merged;
struct stat st;
if (path_is_absolute(path)) {
filename = strdup(path);
- if (!filename) {
- r = -ENOMEM;
- goto finish;
- }
+ if (!filename)
+ return -ENOMEM;
r = open_follow(&filename, &f, symlink_names, &id);
if (r < 0) {
filename = NULL;
if (r != -ENOENT)
- goto finish;
+ return r;
}
} else {
* follow all symlinks and add their name to our unit
* name set while doing so */
filename = path_make_absolute(path, *p);
- if (!filename) {
- r = -ENOMEM;
- goto finish;
- }
+ if (!filename)
+ return -ENOMEM;
if (u->manager->unit_path_cache &&
!set_get(u->manager->unit_path_cache, filename))
filename = NULL;
if (r != -ENOENT)
- goto finish;
+ return r;
/* Empty the symlink names for the next run */
set_clear_free(symlink_names);
}
}
- if (!filename) {
+ if (!filename)
/* Hmm, no suitable file found? */
- r = 0;
- goto finish;
- }
+ return 0;
merged = u;
r = merge_by_names(&merged, symlink_names, id);
if (r < 0)
- goto finish;
+ return r;
if (merged != u) {
u->load_state = UNIT_MERGED;
- r = 0;
- goto finish;
+ return 0;
}
- if (fstat(fileno(f), &st) < 0) {
- r = -errno;
- goto finish;
- }
+ if (fstat(fileno(f), &st) < 0)
+ return -errno;
if (null_or_empty(&st))
u->load_state = UNIT_MASKED;
config_item_perf_lookup,
(void*) load_fragment_gperf_lookup, false, true, u);
if (r < 0)
- goto finish;
+ return r;
}
free(u->fragment_path);
u->source_mtime = 0;
}
- r = 0;
-
-finish:
- set_free_free(symlink_names);
- free(filename);
-
- if (f)
- fclose(f);
-
- return r;
+ return 0;
}
int unit_load_fragment(Unit *u) {
{ config_parse_start_limit_action, "ACTION" },
{ config_parse_set_status, "STATUS" },
{ config_parse_service_sockets, "SOCKETS" },
- { config_parse_fsck_passno, "PASSNO" },
{ config_parse_environ, "ENVIRON" },
{ config_parse_syscall_filter, "SYSCALL" },
{ config_parse_cpu_shares, "SHARES" },