commit bbaeb57

wf  ·  2026-04-01 07:19:41 +0000 UTC
parent dd0bc95
Fix a number of crashes and improve code quality
5 files changed,  +30, -30
M ipc.c
M log.c
+2, -2
 1@@ -1,5 +1,5 @@
 2 CC        ?= cc
 3-CFLAGS    := -std=c99 -Wall -Wimplicit-function-declaration -O0 -g -pedantic
 4+CFLAGS    := -std=c99 -Wall -Wimplicit-function-declaration -Oz -pedantic
 5 LDFLAGS   := `pkg-config --cflags --libs swc` -Iinclude
 6 LDLIBS    := `pkg-config --libs swc`
 7 PREFIX    ?= /usr/local
 8@@ -8,7 +8,7 @@ howl      := howl
 9 howl_src  := ipc.c log.c howl.c
10 
11 howlc     := howlc
12-howlc_src := ipc.c client.c
13+howlc_src := client.c
14 
15 .PHONY: all install uninstall clean
16 
+12, -13
 1@@ -34,14 +34,6 @@ static const struct command commands[] = {
 2 	{ "border_width",  cmd_border_width,  1, true },
 3 };
 4 
 5-static char *
 6-int_str(int i) {
 7-	const size_t len = 4 * sizeof(int);
 8-	char t[len];
 9-	snprintf(t, len, "%d", i);
10-	return t;
11-}
12-
13 static void
14 ipc_msg(const struct command *cmd, int argc, char **argv) {
15 	struct sockaddr_un addr;
16@@ -64,14 +56,21 @@ ipc_msg(const struct command *cmd, int argc, char **argv) {
17 	}
18 
19 	if (cmd->config) {
20-		data[0] = int_str(cmd_config);
21-		data[1] = int_str(cmd->id);
22+		static char b0[5], b1[5];
23+		snprintf(b0, sizeof b0, "%d", cmd_config);
24+		snprintf(b1, sizeof b1, "%d", cmd->id);
25+		data[0] = b0;
26+		data[1] = b1;
27 	} else {
28-		data[0] = int_str(cmd->id);
29+		static char b0[5];
30+		snprintf(b0, sizeof b0, "%d", cmd->id);
31+		data[0] = b0;
32 	}
33 
34+	int o = cmd->config ? 2 : 1;
35 	for (int i = 0; i < argc - 2; i++)
36-		data[i + (cmd->config ? 2 : 1)] = argv[i + 2];
37+		data[i + o] = argv[i + 2];
38+	data[o + (argc - 2)] = NULL;
39 
40 	msg[0] = '\0';
41 	for (int i = 0; data[i] != NULL; i++) {
42@@ -99,7 +98,7 @@ main(int argc, char **argv) {
43 				fprintf(stderr, "wrong number of arguments for %s (need %d)\n", commands[i].name, commands[i].argc);
44 				return 1;
45 			}
46-			ipc_msg(&commands[i], argc, argv + 1);
47+			ipc_msg(&commands[i], argc, argv);
48 			return 0;
49 		}
50 	}
+1, -1
 1@@ -13,10 +13,10 @@ enum cmd {
 2 	cmd_pid,
 3 	cmd_title,
 4 	cmd_app_id,
 5-	cmd_config,
 6 	cmd_focus_color,
 7 	cmd_unfocus_color,
 8 	cmd_border_width,
 9+	cmd_config,
10 	cmd_last
11 };
12 
M ipc.c
+9, -11
 1@@ -27,6 +27,8 @@ fn_hex(char *s) {
 2 	return strtoul(s, NULL, 16);
 3 }
 4 
 5+/*********/
 6+
 7 void
 8 ipc_move(char **arg) {
 9 	if (arg[1] == NULL || arg[2] == NULL || !wm.cur)
10@@ -118,9 +120,7 @@ ipc_close(char **arg) {
11 	swc_window_close(wm.cur->win);
12 }
13 
14-/*
15- * window info
16- */
17+/*********/
18 
19 void
20 ipc_get_geometry(char **arg) {
21@@ -159,24 +159,22 @@ ipc_get_app_id(char **arg) {
22 	printf("%s\n", wm.cur->win->app_id);
23 }
24 
25-/*
26- * configuration
27- */
28+/*********/
29 
30 void
31 ipc_config(char **arg) {
32-	if (arg[0] == NULL || arg[1] == NULL) return;
33+	if (arg[1] == NULL || arg[2] == NULL) return;
34 
35-	enum cmd cmd = atoi(arg[0]);
36+	enum cmd cmd = atoi(arg[1]);
37 	switch (cmd) {
38 		case cmd_focus_color:
39-			config.focus_color = fn_hex(arg[1]);
40+			config.focus_color = fn_hex(arg[2]);
41 			break;
42 		case cmd_unfocus_color:
43-			config.unfocus_color = fn_hex(arg[1]);
44+			config.unfocus_color = fn_hex(arg[2]);
45 			break;
46 		case cmd_border_width:
47-			config.border_width = fn_int(arg[1]);
48+			config.border_width = fn_int(arg[2]);
49 			break;
50 		default:
51 			break;
M log.c
+6, -3
 1@@ -1,4 +1,5 @@
 2 #include <stdio.h>
 3+#include <stdlib.h>
 4 #include <stdarg.h>
 5 
 6 #include "howl.h"
 7@@ -7,7 +8,7 @@ void
 8 _inf(const char *msg, ...) {
 9 	va_list list;
10 
11-	fprintf(stdout, "%s \033[92mINFO\033[0m: ", __TIME__);
12+	fprintf(stdout, "\033[92mINFO\033[0m: ");
13 
14 	va_start(list, msg);
15 	vfprintf(stdout, msg, list);
16@@ -21,7 +22,7 @@ void
17 _wrn(const char *msg, ...) {
18 	va_list list;
19 
20-	fprintf(stderr, "%s \033[93mWARN\033[0m: ", __TIME__);
21+	fprintf(stderr, "\033[93mWARN\033[0m: ");
22 
23 	va_start(list, msg);
24 	vfprintf(stderr, msg, list);
25@@ -35,7 +36,7 @@ void
26 _err(int ret, const char *msg, ...) {
27 	va_list list;
28 
29-	fprintf(stderr, "%s \033[91mFATAL\033[0m: ", __TIME__);
30+	fprintf(stderr, "\033[91mFATAL\033[0m: ");
31 
32 	va_start(list, msg);
33 	vfprintf(stderr, msg, list);
34@@ -43,4 +44,6 @@ _err(int ret, const char *msg, ...) {
35 
36 	fputc('\n', stderr);
37 	fflush(stderr);
38+
39+	exit(ret);
40 }