#include "ioprio.h"
#include "securebits.h"
#include "missing.h"
+#include "unit-name.h"
#define DEFINE_CONFIG_PARSE_ENUM(function,name,type,msg) \
static int function( \
assert(lvalue);
assert(rvalue);
- if (UNIT_VTABLE(u)->refuse_requires &&
- (d == UNIT_REQUIRES ||
- d == UNIT_SOFT_REQUIRES ||
- d == UNIT_REQUISITE ||
- d == UNIT_SOFT_REQUISITE)) {
- log_error("[%s:%u] Dependency of type %s not acceptable for this unit type.", filename, line, lvalue);
- return -EBADMSG;
- }
-
FOREACH_WORD(w, l, rvalue, state) {
- char *t;
+ char *t, *k;
int r;
if (!(t = strndup(w, l)))
return -ENOMEM;
- r = unit_add_dependency_by_name(u, d, t);
+ k = unit_name_printf(u, t);
free(t);
+ if (!k)
+ return -ENOMEM;
+
+ r = unit_add_dependency_by_name(u, d, k, NULL);
+ free(k);
+
if (r < 0)
return r;
}
assert(data);
FOREACH_WORD(w, l, rvalue, state) {
- char *t;
+ char *t, *k;
int r;
if (!(t = strndup(w, l)))
return -ENOMEM;
- r = unit_merge_by_name(u, t);
+ k = unit_name_printf(u, t);
free(t);
+ if (!k)
+ return -ENOMEM;
+
+ r = unit_merge_by_name(u, k);
+ free(k);
+
if (r < 0)
return r;
}
#define FOLLOW_MAX 8
-static int open_follow(char **filename, FILE **_f, Set *names, char **_id) {
+static int open_follow(char **filename, FILE **_f, Set *names, char **_final) {
unsigned c = 0;
int fd, r;
FILE *f;
if (!(f = fdopen(fd, "r"))) {
r = -errno;
- assert(close_nointr(fd) == 0);
+ close_nointr_nofail(fd);
return r;
}
*_f = f;
- *_id = id;
+ *_final = id;
return 0;
}
{ "ControlGroup", config_parse_cgroup, u, section }
const ConfigItem items[] = {
- { "Names", config_parse_names, u, "Meta" },
- { "Description", config_parse_string, &u->meta.description, "Meta" },
- { "Requires", config_parse_deps, UINT_TO_PTR(UNIT_REQUIRES), "Meta" },
- { "SoftRequires", config_parse_deps, UINT_TO_PTR(UNIT_SOFT_REQUIRES), "Meta" },
- { "Wants", config_parse_deps, UINT_TO_PTR(UNIT_WANTS), "Meta" },
- { "Requisite", config_parse_deps, UINT_TO_PTR(UNIT_REQUISITE), "Meta" },
- { "SoftRequisite", config_parse_deps, UINT_TO_PTR(UNIT_SOFT_REQUISITE), "Meta" },
- { "Conflicts", config_parse_deps, UINT_TO_PTR(UNIT_CONFLICTS), "Meta" },
- { "Before", config_parse_deps, UINT_TO_PTR(UNIT_BEFORE), "Meta" },
- { "After", config_parse_deps, UINT_TO_PTR(UNIT_AFTER), "Meta" },
- { "RecursiveStop", config_parse_bool, &u->meta.recursive_stop, "Meta" },
- { "StopWhenUnneeded", config_parse_bool, &u->meta.stop_when_unneeded, "Meta" },
+ { "Names", config_parse_names, u, "Unit" },
+ { "Description", config_parse_string, &u->meta.description, "Unit" },
+ { "Requires", config_parse_deps, UINT_TO_PTR(UNIT_REQUIRES), "Unit" },
+ { "RequiresOverridable", config_parse_deps, UINT_TO_PTR(UNIT_REQUIRES_OVERRIDABLE), "Unit" },
+ { "Requisite", config_parse_deps, UINT_TO_PTR(UNIT_REQUISITE), "Unit" },
+ { "RequisiteOverridable", config_parse_deps, UINT_TO_PTR(UNIT_REQUISITE_OVERRIDABLE), "Unit" },
+ { "Wants", config_parse_deps, UINT_TO_PTR(UNIT_WANTS), "Unit" },
+ { "Conflicts", config_parse_deps, UINT_TO_PTR(UNIT_CONFLICTS), "Unit" },
+ { "Before", config_parse_deps, UINT_TO_PTR(UNIT_BEFORE), "Unit" },
+ { "After", config_parse_deps, UINT_TO_PTR(UNIT_AFTER), "Unit" },
+ { "RecursiveStop", config_parse_bool, &u->meta.recursive_stop, "Unit" },
+ { "StopWhenUnneeded", config_parse_bool, &u->meta.stop_when_unneeded, "Unit" },
{ "PIDFile", config_parse_path, &u->service.pid_file, "Service" },
{ "ExecStartPre", config_parse_exec, u->service.exec_command+SERVICE_EXEC_START_PRE, "Service" },
{ "SysVStartPriority", config_parse_sysv_priority, &u->service.sysv_start_priority, "Service" },
{ "KillMode", config_parse_kill_mode, &u->service.kill_mode, "Service" },
{ "NonBlocking", config_parse_bool, &u->service.exec_context.non_blocking, "Service" },
+ { "BusName", config_parse_string, &u->service.bus_name, "Service" },
EXEC_CONTEXT_CONFIG_ITEMS(u->service.exec_context, "Service"),
{ "ListenStream", config_parse_listen, &u->socket, "Socket" },
{ "DirectoryMode", config_parse_mode, &u->socket.directory_mode, "Socket" },
{ "SocketMode", config_parse_mode, &u->socket.socket_mode, "Socket" },
{ "KillMode", config_parse_kill_mode, &u->socket.kill_mode, "Socket" },
+ { "Accept", config_parse_bool, &u->socket.accept, "Socket" },
EXEC_CONTEXT_CONFIG_ITEMS(u->socket.exec_context, "Socket"),
{ "What", config_parse_string, &u->mount.parameters_fragment.what, "Mount" },
{ "KillMode", config_parse_kill_mode, &u->mount.kill_mode, "Mount" },
EXEC_CONTEXT_CONFIG_ITEMS(u->mount.exec_context, "Mount"),
+ { "Where", config_parse_path, &u->automount.where, "Automount" },
+
{ NULL, NULL, NULL, NULL }
};
assert(u);
assert(path);
- sections[0] = "Meta";
+ sections[0] = "Unit";
sections[1] = section_table[u->meta.type];
sections[2] = NULL;
const char *t;
/* Try to find the unit under its id */
- if ((t = unit_id(u)))
- if ((r = load_from_path(u, t)) < 0)
- return r;
+ if ((r = load_from_path(u, u->meta.id)) < 0)
+ return r;
/* Try to find an alias we can load this with */
if (u->meta.load_state == UNIT_STUB)
SET_FOREACH(t, u->meta.names, i) {
- if (unit_id(u) == t)
+ if (t == u->meta.id)
continue;
if ((r = load_from_path(u, t)) < 0)
if (u->meta.load_state != UNIT_STUB)
break;
}
+
+ /* Now, follow the same logic, but look for a template */
+ if (u->meta.load_state == UNIT_STUB && u->meta.instance) {
+ char *k;
+
+ if (!(k = unit_name_template(u->meta.id)))
+ return -ENOMEM;
+
+ r = load_from_path(u, k);
+ free(k);
+
+ if (r < 0)
+ return r;
+
+ if (u->meta.load_state == UNIT_STUB)
+ SET_FOREACH(t, u->meta.names, i) {
+
+ if (t == u->meta.id)
+ continue;
+
+ if (!(k = unit_name_template(t)))
+ return -ENOMEM;
+
+ r = load_from_path(u, k);
+ free(k);
+
+ if (r < 0)
+ return r;
+
+ if (u->meta.load_state != UNIT_STUB)
+ break;
+ }
+ }
}
return 0;