]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/strv: return NULL from strv_skip
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 19 Nov 2024 14:41:22 +0000 (15:41 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 27 Mar 2025 11:04:23 +0000 (12:04 +0100)
strv_skip was written to carefully return the original array, but this turns
out to be an unnecessary complication. After the previous patch, no caller
cares about the distinction between NULL and { NULL }, but various callers need
to wrap the process the returned value with strv_isempty(), sometimes more than
once. Let's always return NULL for an empty result to allow callers to be
simplified.

src/basic/strv.c
src/home/homectl.c
src/test/test-strv.c

index 184804cea06282de78a9dce1bf792fd187b8841a..a4ddaa5e78fc0adaed08e5625225b5b6181892ff 100644 (file)
@@ -976,14 +976,16 @@ bool strv_fnmatch_full(
 }
 
 char** strv_skip(char **l, size_t n) {
-
         while (n > 0) {
                 if (strv_isempty(l))
-                        return l;
+                        return NULL;
 
                 l++, n--;
         }
 
+        /* To simplify callers, always return NULL instead of a zero-item array. */
+        if (strv_isempty(l))
+                return NULL;
         return l;
 }
 
index acceadf176eae3262f97d42818ba9b36c4717f48..23570ca31b1442f53888ae6d83194c602e1442fc 100644 (file)
@@ -760,16 +760,16 @@ static int inspect_homes(int argc, char *argv[], void *userdata) {
         pager_open(arg_pager_flags);
 
         char **args = strv_skip(argv, 1);
-        if (strv_isempty(args)) {
+        if (args) {
+                STRV_FOREACH(arg, args)
+                        RET_GATHER(r, inspect_home(bus, *arg));
+                return r;
+        } else {
                 _cleanup_free_ char *myself = getusername_malloc();
                 if (!myself)
                         return log_oom();
 
                 return inspect_home(bus, myself);
-        } else {
-                STRV_FOREACH(arg, args)
-                        RET_GATHER(r, inspect_home(bus, *arg));
-                return r;
         }
 }
 
@@ -818,17 +818,17 @@ static int authenticate_homes(int argc, char *argv[], void *userdata) {
         (void) polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
 
         char **args = strv_skip(argv, 1);
-        if (strv_isempty(args)) {
+        if (args) {
+                STRV_FOREACH(arg, args)
+                        RET_GATHER(r, authenticate_home(bus, *arg));
+
+                return r;
+        } else {
                 _cleanup_free_ char *myself = getusername_malloc();
                 if (!myself)
                         return log_oom();
 
                 return authenticate_home(bus, myself);
-        } else {
-                STRV_FOREACH(arg, args)
-                        RET_GATHER(r, authenticate_home(bus, *arg));
-
-                return r;
         }
 }
 
index d64cc55c5b63a1b62d8d9894f6e1a9e7ecb4556d..028765665b9fe30efd744947671b4500d2e91651 100644 (file)
@@ -1004,17 +1004,21 @@ TEST(strv_skip) {
         test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 0, STRV_MAKE("foo", "bar", "baz"));
         test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 1, STRV_MAKE("bar", "baz"));
         test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 2, STRV_MAKE("baz"));
-        test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 3, STRV_MAKE(NULL));
-        test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 4, STRV_MAKE(NULL));
-        test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 55, STRV_MAKE(NULL));
+        test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 3, NULL);
+        test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 4, NULL);
+        test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 55, NULL);
 
         test_strv_skip_one(STRV_MAKE("quux"), 0, STRV_MAKE("quux"));
-        test_strv_skip_one(STRV_MAKE("quux"), 1, STRV_MAKE(NULL));
-        test_strv_skip_one(STRV_MAKE("quux"), 55, STRV_MAKE(NULL));
+        test_strv_skip_one(STRV_MAKE("quux"), 1, NULL);
+        test_strv_skip_one(STRV_MAKE("quux"), 55, NULL);
 
-        test_strv_skip_one(STRV_MAKE(NULL), 0, STRV_MAKE(NULL));
-        test_strv_skip_one(STRV_MAKE(NULL), 1, STRV_MAKE(NULL));
-        test_strv_skip_one(STRV_MAKE(NULL), 55, STRV_MAKE(NULL));
+        test_strv_skip_one(STRV_MAKE(NULL), 0, NULL);
+        test_strv_skip_one(STRV_MAKE(NULL), 1, NULL);
+        test_strv_skip_one(STRV_MAKE(NULL), 55, NULL);
+
+        test_strv_skip_one(NULL, 0, NULL);
+        test_strv_skip_one(NULL, 1, NULL);
+        test_strv_skip_one(NULL, 55, NULL);
 }
 
 TEST(strv_extend_n) {