From d8e8eb2eef04443d3489d79cf5bf02d8ee2373c2 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Fri, 1 May 2020 12:15:30 +0200 Subject: [PATCH 1/2] Move general functions scalloc, sstrdup out of i3status.c --- i3status.c | 55 -------------------------------------- include/i3status.h | 5 ++-- src/general.c | 56 +++++++++++++++++++++++++++++++++++++++ src/print_file_contents.c | 8 ------ 4 files changed, 59 insertions(+), 65 deletions(-) diff --git a/i3status.c b/i3status.c index 2108e04..7d9f4d5 100644 --- a/i3status.c +++ b/i3status.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -35,12 +34,6 @@ #include "i3status.h" -#define exit_if_null(pointer, ...) \ - { \ - if (pointer == NULL) \ - die(__VA_ARGS__); \ - } - #define CFG_CUSTOM_ALIGN_OPT \ CFG_STR_CB("align", NULL, CFGF_NONE, parse_align) @@ -106,21 +99,6 @@ static bool path_exists(const char *path) { return (stat(path, &buf) == 0); } -static void *scalloc(size_t size) { - void *result = calloc(size, 1); - exit_if_null(result, "Error: out of memory (calloc(%zu))\n", size); - return result; -} - -char *sstrdup(const char *str) { - if (str == NULL) { - return NULL; - } - char *result = strdup(str); - exit_if_null(result, "Error: out of memory (strdup())\n"); - return result; -} - /* * Parses the "align" module option (to validate input). */ @@ -205,39 +183,6 @@ static int valid_color(const char *value) { return 1; } -/* - * This function resolves ~ in pathnames. - * It may resolve wildcards in the first part of the path, but if no match - * or multiple matches are found, it just returns a copy of path as given. - * - */ -static char *resolve_tilde(const char *path) { - static glob_t globbuf; - char *head, *tail, *result = NULL; - - tail = strchr(path, '/'); - head = strndup(path, tail ? (size_t)(tail - path) : strlen(path)); - - int res = glob(head, GLOB_TILDE, NULL, &globbuf); - free(head); - /* no match, or many wildcard matches are bad */ - if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1) - result = sstrdup(path); - else if (res != 0) { - die("glob() failed"); - } else { - head = globbuf.gl_pathv[0]; - result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1); - strcpy(result, head); - if (tail) { - strcat(result, tail); - } - } - globfree(&globbuf); - - return result; -} - static char *get_config_path(void) { char *xdg_config_home, *xdg_config_dirs, *config_path; diff --git a/include/i3status.h b/include/i3status.h index 6e5278f..575d2d9 100644 --- a/include/i3status.h +++ b/include/i3status.h @@ -183,13 +183,14 @@ struct min_width { const char *str; }; -char *sstrdup(const char *str); - /* src/general.c */ char *skip_character(char *input, char character, int amount); void die(const char *fmt, ...) __attribute__((format(printf, 1, 2), noreturn)); bool slurp(const char *filename, char *destination, int size); +char *resolve_tilde(const char *path); +void *scalloc(size_t size); +char *sstrdup(const char *str); /* src/output.c */ void print_separator(const char *separator); diff --git a/src/general.c b/src/general.c index e3d4f96..c089126 100644 --- a/src/general.c +++ b/src/general.c @@ -6,11 +6,19 @@ #include #include #include +#include #include #include #include "i3status.h" +#define exit_if_null(pointer, ...) \ + { \ + if (pointer == NULL) \ + die(__VA_ARGS__); \ + } + + /* * Reads size bytes into the destination buffer from filename. * @@ -33,6 +41,54 @@ bool slurp(const char *filename, char *destination, int size) { return n != -1; } +/* + * This function resolves ~ in pathnames. + * It may resolve wildcards in the first part of the path, but if no match + * or multiple matches are found, it just returns a copy of path as given. + * + */ +char *resolve_tilde(const char *path) { + static glob_t globbuf; + char *head, *tail, *result = NULL; + + tail = strchr(path, '/'); + head = strndup(path, tail ? (size_t)(tail - path) : strlen(path)); + + int res = glob(head, GLOB_TILDE, NULL, &globbuf); + free(head); + /* no match, or many wildcard matches are bad */ + if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1) + result = sstrdup(path); + else if (res != 0) { + die("glob() failed"); + } else { + head = globbuf.gl_pathv[0]; + result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1); + strcpy(result, head); + if (tail) { + strcat(result, tail); + } + } + globfree(&globbuf); + + return result; +} + +char *sstrdup(const char *str) { + if (str == NULL) { + return NULL; + } + char *result = strdup(str); + exit_if_null(result, "Error: out of memory (strdup())\n"); + return result; +} + +void *scalloc(size_t size) { + void *result = calloc(size, 1); + exit_if_null(result, "Error: out of memory (calloc(%zu))\n", size); + return result; +} + /* * Skip the given character for exactly 'amount' times, returns * a pointer to the first non-'character' character in 'input'. diff --git a/src/print_file_contents.c b/src/print_file_contents.c index 65813f5..37701f1 100644 --- a/src/print_file_contents.c +++ b/src/print_file_contents.c @@ -14,14 +14,6 @@ #define STRING_SIZE 10 -static void *scalloc(size_t size) { - void *result = calloc(size, 1); - if (result == NULL) { - die("Error: out of memory (calloc(%zu))\n", size); - } - return result; -} - void print_file_contents(yajl_gen json_gen, char *buffer, const char *title, const char *path, const char *format, const char *format_bad, const int max_chars) { const char *walk = format; char *outwalk = buffer; From 94d10968c94ad1a13392db1e17ed26265336fd33 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Fri, 1 May 2020 12:16:59 +0200 Subject: [PATCH 2/2] print_file_contents: Resolve tilde Fixes #350 --- src/general.c | 1 - src/print_file_contents.c | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/general.c b/src/general.c index c089126..6036b69 100644 --- a/src/general.c +++ b/src/general.c @@ -18,7 +18,6 @@ die(__VA_ARGS__); \ } - /* * Reads size bytes into the destination buffer from filename. * diff --git a/src/print_file_contents.c b/src/print_file_contents.c index 37701f1..b66321a 100644 --- a/src/print_file_contents.c +++ b/src/print_file_contents.c @@ -19,11 +19,13 @@ void print_file_contents(yajl_gen json_gen, char *buffer, const char *title, con char *outwalk = buffer; char *buf = scalloc(max_chars * sizeof(char) + 1); - int n = -1; - int fd = open(path, O_RDONLY); + char *abs_path = resolve_tilde(path); + int fd = open(abs_path, O_RDONLY); + free(abs_path); INSTANCE(path); + int n = -1; if (fd > -1) { n = read(fd, buf, max_chars); if (n != -1) {