diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-07-31 11:38:08 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-09-09 09:34:54 +0200 |
commit | da277e90a4de21fc7d9871f1b534c8c7f312ff8c (patch) | |
tree | df00e8d2e042ab4dd0b39a6a47adffa6c6fcdc96 /src/journal | |
parent | cc24f0b8725af5d8bb8f601f49327ed2f8e6d382 (diff) | |
download | systemd-da277e90a4de21fc7d9871f1b534c8c7f312ff8c.tar.gz |
sd-journal: use extract_first_word()
Diffstat (limited to 'src/journal')
-rw-r--r-- | src/journal/sd-journal.c | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 2023cc0c01..bb9daa9719 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -951,74 +951,69 @@ _public_ int sd_journal_get_cursor(sd_journal *j, char **cursor) { } _public_ int sd_journal_seek_cursor(sd_journal *j, const char *cursor) { - const char *word, *state; - size_t l; unsigned long long seqnum, monotonic, realtime, xor_hash; - bool - seqnum_id_set = false, - seqnum_set = false, - boot_id_set = false, - monotonic_set = false, - realtime_set = false, - xor_hash_set = false; + bool seqnum_id_set = false, + seqnum_set = false, + boot_id_set = false, + monotonic_set = false, + realtime_set = false, + xor_hash_set = false; sd_id128_t seqnum_id, boot_id; + int r; assert_return(j, -EINVAL); assert_return(!journal_pid_changed(j), -ECHILD); assert_return(!isempty(cursor), -EINVAL); - FOREACH_WORD_SEPARATOR(word, l, cursor, ";", state) { - char *item; - int k = 0; + for (const char *p = cursor;;) { + _cleanup_free_ char *word = NULL; - if (l < 2 || word[1] != '=') - return -EINVAL; + r = extract_first_word(&p, &word, ";", EXTRACT_DONT_COALESCE_SEPARATORS); + if (r < 0) + return r; + if (r == 0) + break; - item = strndup(word, l); - if (!item) - return -ENOMEM; + if (word[0] == '\0' || word[1] != '=') + return -EINVAL; switch (word[0]) { - case 's': seqnum_id_set = true; - k = sd_id128_from_string(item+2, &seqnum_id); + r = sd_id128_from_string(word + 2, &seqnum_id); + if (r < 0) + return r; break; case 'i': seqnum_set = true; - if (sscanf(item+2, "%llx", &seqnum) != 1) - k = -EINVAL; + if (sscanf(word + 2, "%llx", &seqnum) != 1) + return -EINVAL; break; case 'b': boot_id_set = true; - k = sd_id128_from_string(item+2, &boot_id); + r = sd_id128_from_string(word + 2, &boot_id); break; case 'm': monotonic_set = true; - if (sscanf(item+2, "%llx", &monotonic) != 1) - k = -EINVAL; + if (sscanf(word + 2, "%llx", &monotonic) != 1) + return -EINVAL; break; case 't': realtime_set = true; - if (sscanf(item+2, "%llx", &realtime) != 1) - k = -EINVAL; + if (sscanf(word + 2, "%llx", &realtime) != 1) + return -EINVAL; break; case 'x': xor_hash_set = true; - if (sscanf(item+2, "%llx", &xor_hash) != 1) - k = -EINVAL; + if (sscanf(word + 2, "%llx", &xor_hash) != 1) + return -EINVAL; break; } - - free(item); - - if (k < 0) - return k; } if ((!seqnum_set || !seqnum_id_set) && |