diff options
author | Nihal Jere <nihal@nihaljere.xyz> | 2022-03-17 13:00:08 -0500 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2022-05-07 15:57:18 +0200 |
commit | 5d924f2b12055761b8b155bce61925b6384f070b (patch) | |
tree | e1ad0f77c1f7f9600ad13f2d656570d99aad4e31 /swaynag/config.c | |
parent | Avoid inspecting a NULL view in seat_set_focus (diff) | |
download | sway-5d924f2b12055761b8b155bce61925b6384f070b.tar.gz sway-5d924f2b12055761b8b155bce61925b6384f070b.tar.zst sway-5d924f2b12055761b8b155bce61925b6384f070b.zip |
swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
Diffstat (limited to 'swaynag/config.c')
-rw-r--r-- | swaynag/config.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/swaynag/config.c b/swaynag/config.c index b212a0c3..5ff00bdb 100644 --- a/swaynag/config.c +++ b/swaynag/config.c | |||
@@ -11,28 +11,40 @@ | |||
11 | #include "util.h" | 11 | #include "util.h" |
12 | #include "wlr-layer-shell-unstable-v1-client-protocol.h" | 12 | #include "wlr-layer-shell-unstable-v1-client-protocol.h" |
13 | 13 | ||
14 | static char *read_from_stdin(void) { | 14 | static char *read_and_trim_stdin(void) { |
15 | char *buffer = NULL; | 15 | char *buffer = NULL, *line = NULL; |
16 | size_t buffer_len = 0; | 16 | size_t buffer_len = 0, line_size = 0; |
17 | char *line = NULL; | 17 | while (1) { |
18 | size_t line_size = 0; | 18 | ssize_t nread = getline(&line, &line_size, stdin); |
19 | ssize_t nread; | 19 | if (nread == -1) { |
20 | while ((nread = getline(&line, &line_size, stdin)) != -1) { | 20 | if (feof(stdin)) { |
21 | break; | ||
22 | } else { | ||
23 | perror("getline"); | ||
24 | goto freeline; | ||
25 | } | ||
26 | } | ||
21 | buffer = realloc(buffer, buffer_len + nread + 1); | 27 | buffer = realloc(buffer, buffer_len + nread + 1); |
22 | if (!buffer) { | 28 | if (!buffer) { |
23 | perror("realloc"); | 29 | perror("realloc"); |
24 | return NULL; | 30 | goto freebuf; |
25 | } | 31 | } |
26 | snprintf(&buffer[buffer_len], nread + 1, "%s", line); | 32 | memcpy(&buffer[buffer_len], line, nread + 1); |
27 | buffer_len += nread; | 33 | buffer_len += nread; |
28 | } | 34 | } |
29 | free(line); | 35 | free(line); |
30 | 36 | ||
31 | while (buffer && buffer[buffer_len - 1] == '\n') { | 37 | while (buffer_len && buffer[buffer_len - 1] == '\n') { |
32 | buffer[--buffer_len] = '\0'; | 38 | buffer[--buffer_len] = '\0'; |
33 | } | 39 | } |
34 | 40 | ||
35 | return buffer; | 41 | return buffer; |
42 | |||
43 | freeline: | ||
44 | free(line); | ||
45 | freebuf: | ||
46 | free(buffer); | ||
47 | return NULL; | ||
36 | } | 48 | } |
37 | 49 | ||
38 | int swaynag_parse_options(int argc, char **argv, struct swaynag *swaynag, | 50 | int swaynag_parse_options(int argc, char **argv, struct swaynag *swaynag, |
@@ -222,7 +234,7 @@ int swaynag_parse_options(int argc, char **argv, struct swaynag *swaynag, | |||
222 | case 'l': // Detailed Message | 234 | case 'l': // Detailed Message |
223 | if (swaynag) { | 235 | if (swaynag) { |
224 | free(swaynag->details.message); | 236 | free(swaynag->details.message); |
225 | swaynag->details.message = read_from_stdin(); | 237 | swaynag->details.message = read_and_trim_stdin(); |
226 | if (!swaynag->details.message) { | 238 | if (!swaynag->details.message) { |
227 | return EXIT_FAILURE; | 239 | return EXIT_FAILURE; |
228 | } | 240 | } |