From: Daan De Meyer Date: Sat, 21 Feb 2026 16:52:49 +0000 (+0100) Subject: core: Introduce ConditionPathIsSocket= X-Git-Tag: v260-rc1~40^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a51e5bd1f130b59ad2a3366be7c6f033781aee78;p=thirdparty%2Fsystemd.git core: Introduce ConditionPathIsSocket= --- diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml index afc66716d2a..37022ecc1c3 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -1797,6 +1797,17 @@ + + ConditionPathIsSocket= + + ConditionPathIsSocket= is similar to + ConditionPathExists= but verifies that a certain path exists and is a + socket. + + + + + ConditionDirectoryNotEmpty= @@ -2052,6 +2063,7 @@ AssertPathIsMountPoint= AssertPathIsReadWrite= AssertPathIsEncrypted= + AssertPathIsSocket= AssertDirectoryNotEmpty= AssertFileNotEmpty= AssertFileIsExecutable= diff --git a/src/core/load-fragment-gperf.gperf.in b/src/core/load-fragment-gperf.gperf.in index 60e616a03f6..bf808d220bb 100644 --- a/src/core/load-fragment-gperf.gperf.in +++ b/src/core/load-fragment-gperf.gperf.in @@ -366,6 +366,7 @@ Unit.ConditionPathIsSymbolicLink, config_parse_unit_condition_path, Unit.ConditionPathIsMountPoint, config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT, offsetof(Unit, conditions) Unit.ConditionPathIsReadWrite, config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE, offsetof(Unit, conditions) Unit.ConditionPathIsEncrypted, config_parse_unit_condition_path, CONDITION_PATH_IS_ENCRYPTED, offsetof(Unit, conditions) +Unit.ConditionPathIsSocket, config_parse_unit_condition_path, CONDITION_PATH_IS_SOCKET, offsetof(Unit, conditions) Unit.ConditionDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, offsetof(Unit, conditions) Unit.ConditionFileNotEmpty, config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY, offsetof(Unit, conditions) Unit.ConditionFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, offsetof(Unit, conditions) @@ -401,6 +402,7 @@ Unit.AssertPathIsSymbolicLink, config_parse_unit_condition_path, Unit.AssertPathIsMountPoint, config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT, offsetof(Unit, asserts) Unit.AssertPathIsReadWrite, config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE, offsetof(Unit, asserts) Unit.AssertPathIsEncrypted, config_parse_unit_condition_path, CONDITION_PATH_IS_ENCRYPTED, offsetof(Unit, asserts) +Unit.AssertPathIsSocket, config_parse_unit_condition_path, CONDITION_PATH_IS_SOCKET, offsetof(Unit, asserts) Unit.AssertDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, offsetof(Unit, asserts) Unit.AssertFileNotEmpty, config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY, offsetof(Unit, asserts) Unit.AssertFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, offsetof(Unit, asserts) diff --git a/src/shared/condition.c b/src/shared/condition.c index 15e3ee9840c..903662edf1a 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -992,6 +992,14 @@ static int condition_test_path_is_encrypted(Condition *c, char **env) { return r > 0; } +static int condition_test_path_is_socket(Condition *c, char **env) { + assert(c); + assert(c->parameter); + assert(c->type == CONDITION_PATH_IS_SOCKET); + + return is_socket(c->parameter) > 0; +} + static int condition_test_directory_not_empty(Condition *c, char **env) { int r; @@ -1233,6 +1241,7 @@ int condition_test(Condition *c, char **env) { [CONDITION_PATH_IS_MOUNT_POINT] = condition_test_path_is_mount_point, [CONDITION_PATH_IS_READ_WRITE] = condition_test_path_is_read_write, [CONDITION_PATH_IS_ENCRYPTED] = condition_test_path_is_encrypted, + [CONDITION_PATH_IS_SOCKET] = condition_test_path_is_socket, [CONDITION_DIRECTORY_NOT_EMPTY] = condition_test_directory_not_empty, [CONDITION_FILE_NOT_EMPTY] = condition_test_file_not_empty, [CONDITION_FILE_IS_EXECUTABLE] = condition_test_file_is_executable, @@ -1370,6 +1379,7 @@ static const char* const _condition_type_table[_CONDITION_TYPE_MAX] = { [CONDITION_PATH_IS_MOUNT_POINT] = "ConditionPathIsMountPoint", [CONDITION_PATH_IS_READ_WRITE] = "ConditionPathIsReadWrite", [CONDITION_PATH_IS_ENCRYPTED] = "ConditionPathIsEncrypted", + [CONDITION_PATH_IS_SOCKET] = "ConditionPathIsSocket", [CONDITION_DIRECTORY_NOT_EMPTY] = "ConditionDirectoryNotEmpty", [CONDITION_FILE_NOT_EMPTY] = "ConditionFileNotEmpty", [CONDITION_FILE_IS_EXECUTABLE] = "ConditionFileIsExecutable", @@ -1425,6 +1435,7 @@ static const char* const _assert_type_table[_CONDITION_TYPE_MAX] = { [CONDITION_PATH_IS_MOUNT_POINT] = "AssertPathIsMountPoint", [CONDITION_PATH_IS_READ_WRITE] = "AssertPathIsReadWrite", [CONDITION_PATH_IS_ENCRYPTED] = "AssertPathIsEncrypted", + [CONDITION_PATH_IS_SOCKET] = "AssertPathIsSocket", [CONDITION_DIRECTORY_NOT_EMPTY] = "AssertDirectoryNotEmpty", [CONDITION_FILE_NOT_EMPTY] = "AssertFileNotEmpty", [CONDITION_FILE_IS_EXECUTABLE] = "AssertFileIsExecutable", diff --git a/src/shared/condition.h b/src/shared/condition.h index ec17cbe3976..d2274522f4f 100644 --- a/src/shared/condition.h +++ b/src/shared/condition.h @@ -34,6 +34,7 @@ typedef enum ConditionType { CONDITION_PATH_IS_MOUNT_POINT, CONDITION_PATH_IS_READ_WRITE, CONDITION_PATH_IS_ENCRYPTED, + CONDITION_PATH_IS_SOCKET, CONDITION_DIRECTORY_NOT_EMPTY, CONDITION_FILE_NOT_EMPTY, CONDITION_FILE_IS_EXECUTABLE, @@ -104,6 +105,7 @@ static inline bool condition_takes_path(ConditionType t) { CONDITION_PATH_IS_MOUNT_POINT, CONDITION_PATH_IS_READ_WRITE, CONDITION_PATH_IS_ENCRYPTED, + CONDITION_PATH_IS_SOCKET, CONDITION_DIRECTORY_NOT_EMPTY, CONDITION_FILE_NOT_EMPTY, CONDITION_FILE_IS_EXECUTABLE, diff --git a/src/test/test-bus-unit-util.c b/src/test/test-bus-unit-util.c index 7b0aa84463c..a330bd80545 100644 --- a/src/test/test-bus-unit-util.c +++ b/src/test/test-bus-unit-util.c @@ -1105,6 +1105,7 @@ TEST(unit_properties) { "ConditionPathIsMountPoint=|foo", "ConditionPathIsReadWrite=|foo", "ConditionPathIsEncrypted=|foo", + "ConditionPathIsSocket=|foo", "ConditionDirectoryNotEmpty=|foo", "ConditionFileNotEmpty=|foo", "ConditionFileIsExecutable=|foo", @@ -1139,6 +1140,7 @@ TEST(unit_properties) { "AssertPathIsMountPoint=|foo", "AssertPathIsReadWrite=|foo", "AssertPathIsEncrypted=|foo", + "AssertPathIsSocket=|foo", "AssertDirectoryNotEmpty=|foo", "AssertFileNotEmpty=|foo", "AssertFileIsExecutable=|foo", diff --git a/src/test/test-condition.c b/src/test/test-condition.c index 1ea471dd1fd..234041d1268 100644 --- a/src/test/test-condition.c +++ b/src/test/test-condition.c @@ -110,6 +110,16 @@ TEST(condition_test_path) { ASSERT_OK_ZERO(condition_test(condition, environ)); condition_free(condition); + if (access("/run/dbus/system_bus_socket", F_OK) >= 0) { + ASSERT_NOT_NULL((condition = condition_new(CONDITION_PATH_IS_SOCKET, "/run/dbus/system_bus_socket", false, false))); + ASSERT_OK_POSITIVE(condition_test(condition, environ)); + condition_free(condition); + } + + ASSERT_NOT_NULL((condition = condition_new(CONDITION_PATH_IS_SOCKET, "/sys", false, false))); + ASSERT_OK_ZERO(condition_test(condition, environ)); + condition_free(condition); + ASSERT_NOT_NULL((condition = condition_new(CONDITION_PATH_IS_SYMBOLIC_LINK, "/dev/stdout", false, false))); ASSERT_OK_POSITIVE(condition_test(condition, environ)); condition_free(condition);