]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #10152 from yuwata/udev-use-extract
authorLennart Poettering <lennart@poettering.net>
Fri, 5 Oct 2018 15:11:43 +0000 (17:11 +0200)
committerGitHub <noreply@github.com>
Fri, 5 Oct 2018 15:11:43 +0000 (17:11 +0200)
udev: small cleanups

1  2 
src/basic/string-util.c
src/basic/string-util.h
src/test/meson.build

diff --combined src/basic/string-util.c
index dfa739996f1e072ffe520e17fa73717270e4924c,07b11d4fc8b3de4348c30f7c2797216fef49a557..c6dad5275fe16b08e4fac292bb12315845479a52
@@@ -128,7 -128,7 +128,7 @@@ static size_t strcspn_escaped(const cha
  }
  
  /* Split a string into words. */
- const char* split(const char **state, size_t *l, const char *separator, bool quoted) {
+ const char* split(const char **state, size_t *l, const char *separator, SplitFlags flags) {
          const char *current;
  
          current = *state;
                  return NULL;
          }
  
-         if (quoted && strchr("\'\"", *current)) {
+         if (flags & SPLIT_QUOTES && strchr("\'\"", *current)) {
                  char quotechars[2] = {*current, '\0'};
  
                  *l = strcspn_escaped(current + 1, quotechars);
                  if (current[*l + 1] == '\0' || current[*l + 1] != quotechars[0] ||
                      (current[*l + 2] && !strchr(separator, current[*l + 2]))) {
                          /* right quote missing or garbage at the end */
+                         if (flags & SPLIT_RELAX) {
+                                 *state = current + *l + 1 + (current[*l + 1] != '\0');
+                                 return current + 1;
+                         }
                          *state = current;
                          return NULL;
                  }
                  *state = current++ + *l + 2;
-         } else if (quoted) {
+         } else if (flags & SPLIT_QUOTES) {
                  *l = strcspn_escaped(current, separator);
-                 if (current[*l] && !strchr(separator, current[*l])) {
+                 if (current[*l] && !strchr(separator, current[*l]) && !(flags & SPLIT_RELAX)) {
                          /* unfinished escape */
                          *state = current;
                          return NULL;
@@@ -1004,7 -1008,7 +1008,7 @@@ int free_and_strdup(char **p, const cha
  
          assert(p);
  
 -        /* Replaces a string pointer with an strdup()ed new string,
 +        /* Replaces a string pointer with a strdup()ed new string,
           * possibly freeing the old one. */
  
          if (streq_ptr(*p, s))
          return 1;
  }
  
 +int free_and_strndup(char **p, const char *s, size_t l) {
 +        char *t;
 +
 +        assert(p);
 +        assert(s || l == 0);
 +
 +        /* Replaces a string pointer with a strndup()ed new string,
 +         * freeing the old one. */
 +
 +        if (!*p && !s)
 +                return 0;
 +
 +        if (*p && s && strneq(*p, s, l) && (l > strlen(*p) || (*p)[l] == '\0'))
 +                return 0;
 +
 +        if (s) {
 +                t = strndup(s, l);
 +                if (!t)
 +                        return -ENOMEM;
 +        } else
 +                t = NULL;
 +
 +        free_and_replace(*p, t);
 +        return 1;
 +}
 +
  #if !HAVE_EXPLICIT_BZERO
  /*
   * Pointer to memset is volatile so that compiler must de-reference
diff --combined src/basic/string-util.h
index 72c075aa394b7ae3b554f2f590e495434b4b8993,a337dbc35f769d3b8761aa93199453d6661b6905..2d9788ac13f80f272cf7a02a5754f1db50e11bdf
@@@ -81,16 -81,21 +81,21 @@@ char *endswith_no_case(const char *s, c
  
  char *first_word(const char *s, const char *word) _pure_;
  
- const char* split(const char **state, size_t *l, const char *separator, bool quoted);
+ typedef enum SplitFlags {
+         SPLIT_QUOTES                     = 0x01 << 0,
+         SPLIT_RELAX                      = 0x01 << 1,
+ } SplitFlags;
+ const char* split(const char **state, size_t *l, const char *separator, SplitFlags flags);
  
  #define FOREACH_WORD(word, length, s, state)                            \
-         _FOREACH_WORD(word, length, s, WHITESPACE, false, state)
+         _FOREACH_WORD(word, length, s, WHITESPACE, 0, state)
  
  #define FOREACH_WORD_SEPARATOR(word, length, s, separator, state)       \
-         _FOREACH_WORD(word, length, s, separator, false, state)
+         _FOREACH_WORD(word, length, s, separator, 0, state)
  
- #define _FOREACH_WORD(word, length, s, separator, quoted, state)        \
-         for ((state) = (s), (word) = split(&(state), &(length), (separator), (quoted)); (word); (word) = split(&(state), &(length), (separator), (quoted)))
+ #define _FOREACH_WORD(word, length, s, separator, flags, state)         \
+         for ((state) = (s), (word) = split(&(state), &(length), (separator), (flags)); (word); (word) = split(&(state), &(length), (separator), (flags)))
  
  char *strappend(const char *s, const char *suffix);
  char *strnappend(const char *s, const char *suffix, size_t length);
@@@ -176,7 -181,6 +181,7 @@@ char *strrep(const char *s, unsigned n)
  int split_pair(const char *s, const char *sep, char **l, char **r);
  
  int free_and_strdup(char **p, const char *s);
 +int free_and_strndup(char **p, const char *s, size_t l);
  
  /* Normal memmem() requires haystack to be nonnull, which is annoying for zero-length buffers */
  static inline void *memmem_safe(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) {
diff --combined src/test/meson.build
index b3d8b72c2ac8db7e0b748dc91af4344bca6f481d,7e603cf1c0d75b0df2db0c05e3863a29ee67a8da..3d1e28bdf130e349ff0d51bfaecd2168d6c548ae
@@@ -632,6 -632,18 +632,18 @@@ tests += 
            libacl],
           '', 'manual', '-DLOG_REALM=LOG_REALM_UDEV'],
  
+         [['src/test/test-udev-build-argv.c'],
+          [libudev_core,
+           libudev_static,
+           libsystemd_network,
+           libshared],
+          [threads,
+           librt,
+           libblkid,
+           libkmod,
+           libacl],
+          '', '', '-DLOG_REALM=LOG_REALM_UDEV'],
          [['src/test/test-id128.c'],
           [],
           []],
          [['src/test/test-bus-util.c'],
           [],
           []],
 +
 +        [['src/test/test-sd-hwdb.c'],
 +         [],
 +         []],
  ]
  
  ############################################################
@@@ -880,10 -888,6 +892,10 @@@ tests += 
          [['src/libsystemd/sd-login/test-login.c'],
           [],
           []],
 +
 +        [['src/libsystemd/sd-device/test-sd-device.c'],
 +         [],
 +         []],
  ]
  
  if cxx.found()