summaryrefslogtreecommitdiffstats
path: root/src/analyze
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-05-29 14:24:12 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-06-10 09:45:55 +0200
commit934ef6a5220a0486ef4c212c01a91064024cb998 (patch)
tree9e9c219f396e85a5f29df8207163b407f9890888 /src/analyze
parentcore: rework error messages in unit_add_name() (diff)
downloadsystemd-934ef6a5220a0486ef4c212c01a91064024cb998.tar.xz
systemd-934ef6a5220a0486ef4c212c01a91064024cb998.zip
core: create socket service instances with the correct name from the start
Upon an incoming connection for an accepting socket, we'd create a unit like foo@0.service, then figure out that the instance name should be e.g. "0-41-0", and then add the name foo@0-41-0.service to the unit. This obviously violates the rule that any service needs to have a constance instance part. So let's reverse the order: we first determine the instance name and then create the unit with the correct name from the start. There are two cases where we don't know the instance name: - analyze-verify: we just do a quick check that the instance unit can be created. So let's use a bogus instance string. - selinux: the code wants to load the service unit to extract the ExecStart path and query it for the selinux label. Do the same as above. Note that in both cases it is possible that the real unit that is loaded could be different than the one with the bogus instance value, for example if there is a dropin for a specific instance name. We can't do much about this, since we can't figure out the instance name in advance. The old code had the same shortcoming.
Diffstat (limited to 'src/analyze')
-rw-r--r--src/analyze/analyze-verify.c24
1 files changed, 7 insertions, 17 deletions
diff --git a/src/analyze/analyze-verify.c b/src/analyze/analyze-verify.c
index 8275360adc..30cb79d509 100644
--- a/src/analyze/analyze-verify.c
+++ b/src/analyze/analyze-verify.c
@@ -94,6 +94,7 @@ static int generate_path(char **var, char **filenames) {
}
static int verify_socket(Unit *u) {
+ Unit *service;
int r;
assert(u);
@@ -101,26 +102,15 @@ static int verify_socket(Unit *u) {
if (u->type != UNIT_SOCKET)
return 0;
- /* Cannot run this without the service being around */
-
- /* This makes sure instance is created if necessary. */
- r = socket_instantiate_service(SOCKET(u));
+ r = socket_load_service_unit(SOCKET(u), -1, &service);
if (r < 0)
- return log_unit_error_errno(u, r, "Socket cannot be started, failed to create instance: %m");
-
- /* This checks both type of sockets */
- if (UNIT_ISSET(SOCKET(u)->service)) {
- Service *service;
-
- service = SERVICE(UNIT_DEREF(SOCKET(u)->service));
- log_unit_debug(u, "Using %s", UNIT(service)->id);
+ return log_unit_error_errno(u, r, "service unit for the socket cannot be loaded: %m");
- if (UNIT(service)->load_state != UNIT_LOADED) {
- log_unit_error(u, "Service %s not loaded, %s cannot be started.", UNIT(service)->id, u->id);
- return -ENOENT;
- }
- }
+ if (service->load_state != UNIT_LOADED)
+ return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT),
+ "service %s not loaded, socket cannot be started.", service->id);
+ log_unit_debug(u, "using service unit %s.", service->id);
return 0;
}