]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: Introduce ConditionPathIsSocket= 40791/head
authorDaan De Meyer <daan@amutable.com>
Sat, 21 Feb 2026 16:52:49 +0000 (17:52 +0100)
committerDaan De Meyer <daan@amutable.com>
Mon, 23 Feb 2026 12:08:49 +0000 (13:08 +0100)
man/systemd.unit.xml
src/core/load-fragment-gperf.gperf.in
src/shared/condition.c
src/shared/condition.h
src/test/test-bus-unit-util.c
src/test/test-condition.c

index afc66716d2ab25b42d168d21e1dd270d47f5eaca..37022ecc1c3aa1a5160d1953ccec02befeded6af 100644 (file)
           </listitem>
         </varlistentry>
 
+        <varlistentry>
+          <term><varname>ConditionPathIsSocket=</varname></term>
+
+          <listitem><para><varname>ConditionPathIsSocket=</varname> is similar to
+          <varname>ConditionPathExists=</varname> but verifies that a certain path exists and is a
+          socket.</para>
+
+          <xi:include href="version-info.xml" xpointer="v260"/>
+          </listitem>
+        </varlistentry>
+
         <varlistentry>
           <term><varname>ConditionDirectoryNotEmpty=</varname></term>
 
           <term><varname>AssertPathIsMountPoint=</varname></term>
           <term><varname>AssertPathIsReadWrite=</varname></term>
           <term><varname>AssertPathIsEncrypted=</varname></term>
+          <term><varname>AssertPathIsSocket=</varname></term>
           <term><varname>AssertDirectoryNotEmpty=</varname></term>
           <term><varname>AssertFileNotEmpty=</varname></term>
           <term><varname>AssertFileIsExecutable=</varname></term>
index 60e616a03f6c4f6d2d9fe443c1eaa3fba6d7b2a7..bf808d220bb73caff33f469bb8eca7d047ea34a1 100644 (file)
@@ -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)
index 15e3ee9840c459fc025b837ff5002875f15f6728..903662edf1a8f5efc07b8c2985ea406a91e7a57e 100644 (file)
@@ -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",
index ec17cbe39765a9348cac43383b3df7bb33757b9a..d2274522f4f3ba098eacdf589258f751d32d1e52 100644 (file)
@@ -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,
index 7b0aa84463c91d7d0c3cff6ecc3de24454b7cac4..a330bd80545d31f8e1e5cacfaa19cab5d6a34c86 100644 (file)
@@ -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",
index 1ea471dd1fdad944a4408bde586308314887eb1c..234041d1268a13b4515ae5b806adf48e6d85e010 100644 (file)
@@ -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);