aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Nihal Jere <nihal@nihaljere.xyz>2022-03-17 13:00:08 -0500
committerLibravatar Simon Ser <contact@emersion.fr>2022-05-07 15:57:18 +0200
commit5d924f2b12055761b8b155bce61925b6384f070b (patch)
treee1ad0f77c1f7f9600ad13f2d656570d99aad4e31
parentAvoid inspecting a NULL view in seat_set_focus (diff)
downloadsway-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.
-rw-r--r--swaynag/config.c34
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
14static char *read_from_stdin(void) { 14static 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
43freeline:
44 free(line);
45freebuf:
46 free(buffer);
47 return NULL;
36} 48}
37 49
38int swaynag_parse_options(int argc, char **argv, struct swaynag *swaynag, 50int 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 }