]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: add new strdupcspn()/strdupspn()
authorLennart Poettering <lennart@poettering.net>
Fri, 20 Jan 2023 12:14:42 +0000 (13:14 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 20 Jan 2023 16:27:51 +0000 (17:27 +0100)
These combine strndup() + strspn()/strcspn() into one.

There are a bunch of strndupa() calls that could use similar treatment
(or should be converted to strdup[c]spn(), but this commit doesn't
bother with that.

src/basic/fileio.c
src/basic/hostname-util.c
src/basic/string-util.c
src/basic/string-util.h
src/binfmt/binfmt.c
src/locale/localed-util.c
src/shared/discover-image.c
src/shared/logs-show.c

index 3b920418b09ab78801930e7749279142d9fb8800..51b11ab9c7d12e85dc76500c3216e82deb9cc43b 100644 (file)
@@ -862,7 +862,6 @@ int executable_is_script(const char *path, char **interpreter) {
 int get_proc_field(const char *filename, const char *pattern, const char *terminator, char **field) {
         _cleanup_free_ char *status = NULL;
         char *t, *f;
-        size_t len;
         int r;
 
         assert(terminator);
@@ -914,9 +913,7 @@ int get_proc_field(const char *filename, const char *pattern, const char *termin
                         t--;
         }
 
-        len = strcspn(t, terminator);
-
-        f = strndup(t, len);
+        f = strdupcspn(t, terminator);
         if (!f)
                 return -ENOMEM;
 
index b710f07929e19cf64be5a78af2eabfd1789cb65b..e743033b1ea1a6aae39c35cb7572acc3373ff4e9 100644 (file)
@@ -62,7 +62,7 @@ int gethostname_full(GetHostnameFlags flags, char **ret) {
         }
 
         if (FLAGS_SET(flags, GET_HOSTNAME_SHORT))
-                buf = strndup(s, strcspn(s, "."));
+                buf = strdupcspn(s, ".");
         else
                 buf = strdup(s);
         if (!buf)
index 5e3a92c7c0c9d6c2cd568816c9daf47f6aa24162..577afd37f42a674267b2f966d4a4a7818cda537b 100644 (file)
@@ -1201,3 +1201,19 @@ size_t strspn_from_end(const char *str, const char *accept) {
 
         return n;
 }
+
+char *strdupspn(const char *a, const char *accept) {
+        if (isempty(a) || isempty(accept))
+                return strdup("");
+
+        return strndup(a, strspn(a, accept));
+}
+
+char *strdupcspn(const char *a, const char *reject) {
+        if (isempty(a))
+                return strdup("");
+        if (isempty(reject))
+                return strdup(a);
+
+        return strndup(a, strcspn(a, reject));
+}
index a78b7960e3606986274293a6a4da726a3ad3168e..684b7d5c118639cf332f5ecdcd61d4557778170d 100644 (file)
@@ -240,3 +240,6 @@ bool streq_skip_trailing_chars(const char *s1, const char *s2, const char *ok);
 char *string_replace_char(char *str, char old_char, char new_char);
 
 size_t strspn_from_end(const char *str, const char *accept);
+
+char *strdupspn(const char *a, const char *accept);
+char *strdupcspn(const char *a, const char *reject);
index 624c63ec98b33f8db92b64138b0b6e1428f13de7..e1ddf97914c9d8baf47f111de2847091fd08e102 100644 (file)
@@ -40,11 +40,9 @@ static int apply_rule(const char *filename, unsigned line, const char *rule) {
         assert(rule[0]);
 
         _cleanup_free_ char *rulename = NULL;
-        const char *e;
         int r;
 
-        e = strchrnul(rule + 1, rule[0]);
-        rulename = strndup(rule + 1, e - rule - 1);
+        rulename = strdupcspn(rule + 1, CHAR_TO_STR(rule[0]));
         if (!rulename)
                 return log_oom();
 
index ddca11d908ef281c2a362d3add945f2734991f17..4f2d3aaeb868305962810afa4a7b9ed673ff0324 100644 (file)
@@ -505,7 +505,9 @@ int find_legacy_keymap(Context *c, char **ret) {
 
                                 /* If that didn't work, strip off the
                                  * other layouts from the entry, too */
-                                x = strndup(a[1], strcspn(a[1], ","));
+                                x = strdupcspn(a[1], ",");
+                                if (!x)
+                                        return -ENOMEM;
                                 if (startswith_comma(c->x11_layout, x))
                                         matching = 1;
                         }
index 7f1fe4f4dcda0dcda476d0d879c8d61daa8d7b38..a7d5267696f9ef0d19872a2d1cb8ed46dd131176 100644 (file)
@@ -175,15 +175,13 @@ static int image_new(
 static int extract_pretty(const char *path, const char *suffix, char **ret) {
         _cleanup_free_ char *name = NULL;
         const char *p;
-        size_t n;
 
         assert(path);
         assert(ret);
 
         p = last_path_component(path);
-        n = strcspn(p, "/");
 
-        name = strndup(p, n);
+        name = strdupcspn(p, "/");
         if (!name)
                 return -ENOMEM;
 
index 5c9dd61898a63efb5b7c0d21ee6e1821f83982d0..a43d53073ffef6b20189d95872e2a1b5b0450339 100644 (file)
@@ -108,7 +108,7 @@ static int url_from_catalog(sd_journal *j, char **ret) {
         weblink += strspn(weblink, " \t");
 
         /* Cut out till next whitespace/newline */
-        url = strndup(weblink, strcspn(weblink, WHITESPACE));
+        url = strdupcspn(weblink, WHITESPACE);
         if (!url)
                 return log_oom();