From 551f1ae54837754ea893d08175fafc85f63ba8b8 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sat, 13 Apr 2024 10:26:57 +0200 Subject: [PATCH] libsrx: two new helpers, unquoute() and fgetkey() Signed-off-by: Joachim Wiberg --- src/confd/src/infix-dhcp.c | 43 +++++++++-------------------------- src/libsrx/src/helpers.c | 46 ++++++++++++++++++++++++++++++++++++++ src/libsrx/src/helpers.h | 3 +++ 3 files changed, 59 insertions(+), 33 deletions(-) diff --git a/src/confd/src/infix-dhcp.c b/src/confd/src/infix-dhcp.c index 6cd1abbb..99dac801 100644 --- a/src/confd/src/infix-dhcp.c +++ b/src/confd/src/infix-dhcp.c @@ -82,47 +82,24 @@ static char *fqdn(const char *value, char *str, size_t len) return str; } -static char *unquote(char *buf) -{ - char q = buf[0]; - char *ptr; - - if (q != '"' && q != '\'') - return buf; - - ptr = &buf[strlen(buf) - 1]; - if (*ptr == q) { - *ptr = 0; - buf++; - } - - return buf; -} - static char *os_name_version(char *str, size_t len) { - char buf[256]; - FILE *fp; + char *val; if (!str || !len) return NULL; - fp = fopen("/etc/os-release", "r"); - if (!fp) - return NULL; - str[0] = 0; - while (fgets(buf, sizeof(buf), fp)) { - chomp(buf); - if (!strncmp(buf, "NAME=", 5)) - snprintf(str, len, "-V \"%.32s ", unquote(&buf[5])); - if (!strncmp(buf, "VERSION=", 8)) { - strlcat(str, unquote(&buf[8]), len); - strlcat(str, "\"", len); - break; - } + + val = fgetkey("/etc/os-release", "NAME"); + if (val) + snprintf(str, len, "-V \"%.32s ", val); + + val = fgetkey("/etc/os-release", "VERSION"); + if (val) { + strlcat(str, val, len); + strlcat(str, "\"", len); } - fclose(fp); if (strlen(str) > 0 && str[strlen(str) - 1] != '"') { str[0] = 0; diff --git a/src/libsrx/src/helpers.c b/src/libsrx/src/helpers.c index 0ccade20..0ffbc359 100644 --- a/src/libsrx/src/helpers.c +++ b/src/libsrx/src/helpers.c @@ -215,3 +215,49 @@ int writesf(const char *str, const char *mode, const char *fmt, ...) return fclose(fp); } +char *unquote(char *buf) +{ + char q = buf[0]; + char *ptr; + + if (q != '"' && q != '\'') + return buf; + + ptr = &buf[strlen(buf) - 1]; + if (*ptr == q) { + *ptr = 0; + buf++; + } + + return buf; +} + +/* + * Reads file, line by line, lookging for key="val". + * Returns val, or NULL. + */ +char *fgetkey(const char *file, const char *key) +{ + static char line[256]; + int len = strlen(key); + char *ptr = NULL; + FILE *fp; + + fp = fopen(file, "r"); + if (!fp) + return NULL; + + while (fgets(line, sizeof(line), fp)) { + chomp(line); + if (strncmp(line, key, len)) + continue; + if (line[len] != '=') + continue; + + ptr = unquote(line + len + 1); /* Skip 'key=' */ + break; + } + fclose(fp); + + return ptr; +} diff --git a/src/libsrx/src/helpers.h b/src/libsrx/src/helpers.h index 56cb712b..0c197531 100644 --- a/src/libsrx/src/helpers.h +++ b/src/libsrx/src/helpers.h @@ -26,4 +26,7 @@ int writedf(int value, const char *mode, const char *fmt, ...) int writesf(const char *str, const char *mode, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); +char *unquote(char *buf); +char *fgetkey(const char *file, const char *key); + #endif /* CONFD_HELPERS_H_ */