From c07936d91b38863f4e404a73aebe8a02820e4dfc Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 26 Nov 2017 16:41:59 +0100 Subject: [PATCH] no-op refactoring: make ipc_connect find socket path --- i3-config-wizard/main.c | 9 +-------- i3-input/main.c | 9 +-------- i3-msg/main.c | 30 +++--------------------------- libi3/ipc_connect.c | 25 ++++++++++++++++++++++--- src/display_version.c | 18 +----------------- 5 files changed, 28 insertions(+), 63 deletions(-) diff --git a/i3-config-wizard/main.c b/i3-config-wizard/main.c index dd58fd1245..97c2a602fa 100644 --- a/i3-config-wizard/main.c +++ b/i3-config-wizard/main.c @@ -94,7 +94,7 @@ static xcb_get_modifier_mapping_reply_t *modmap_reply; static i3Font font; static i3Font bold_font; static int char_width; -static char *socket_path; +static char *socket_path = NULL; static xcb_window_t win; static surface_t surface; static xcb_key_symbols_t *symbols; @@ -744,7 +744,6 @@ static void finish() { int main(int argc, char *argv[]) { char *xdg_config_home; - socket_path = getenv("I3SOCK"); char *pattern = "pango:monospace 8"; char *patternbold = "pango:monospace bold 8"; int o, option_index = 0; @@ -824,12 +823,6 @@ int main(int argc, char *argv[]) { &xkb_base_error) != 1) errx(EXIT_FAILURE, "Could not setup XKB extension."); - if (socket_path == NULL) - socket_path = root_atom_contents("I3_SOCKET_PATH", conn, screen); - - if (socket_path == NULL) - socket_path = "/tmp/i3-ipc.sock"; - keysyms = xcb_key_symbols_alloc(conn); xcb_get_modifier_mapping_cookie_t modmap_cookie; modmap_cookie = xcb_get_modifier_mapping(conn); diff --git a/i3-input/main.c b/i3-input/main.c index 785a133fc1..efb7b20c2b 100644 --- a/i3-input/main.c +++ b/i3-input/main.c @@ -41,7 +41,6 @@ * the command will be sent to i3 */ static char *format; -static char *socket_path; static int sockfd; static xcb_key_symbols_t *symbols; static bool modeswitch_active = false; @@ -374,7 +373,7 @@ static xcb_rectangle_t get_window_position(void) { int main(int argc, char *argv[]) { format = sstrdup("%s"); - socket_path = getenv("I3SOCK"); + char *socket_path = NULL; char *pattern = sstrdup("pango:monospace 8"); int o, option_index = 0; @@ -438,12 +437,6 @@ int main(int argc, char *argv[]) { if (!conn || xcb_connection_has_error(conn)) die("Cannot open display\n"); - if (socket_path == NULL) - socket_path = root_atom_contents("I3_SOCKET_PATH", conn, screen); - - if (socket_path == NULL) - socket_path = "/tmp/i3-ipc.sock"; - sockfd = ipc_connect(socket_path); root_screen = xcb_aux_get_screen(conn, screen); diff --git a/i3-msg/main.c b/i3-msg/main.c index a4f948500f..91a714e566 100644 --- a/i3-msg/main.c +++ b/i3-msg/main.c @@ -38,8 +38,6 @@ #include -static char *socket_path; - /* * Having verboselog() and errorlog() is necessary when using libi3. * @@ -161,11 +159,7 @@ int main(int argc, char *argv[]) { if (pledge("stdio rpath unix", NULL) == -1) err(EXIT_FAILURE, "pledge"); #endif - char *env_socket_path = getenv("I3SOCK"); - if (env_socket_path) - socket_path = sstrdup(env_socket_path); - else - socket_path = NULL; + char *socket_path = NULL; int o, option_index = 0; uint32_t message_type = I3_IPC_MESSAGE_TYPE_RUN_COMMAND; char *payload = NULL; @@ -183,8 +177,7 @@ int main(int argc, char *argv[]) { while ((o = getopt_long(argc, argv, options_string, long_options, &option_index)) != -1) { if (o == 's') { - if (socket_path != NULL) - free(socket_path); + free(socket_path); socket_path = sstrdup(optarg); } else if (o == 't') { if (strcasecmp(optarg, "command") == 0) { @@ -228,13 +221,6 @@ int main(int argc, char *argv[]) { } } - if (socket_path == NULL) - socket_path = root_atom_contents("I3_SOCKET_PATH", NULL, 0); - - /* Fall back to the default socket path */ - if (socket_path == NULL) - socket_path = sstrdup("/tmp/i3-ipc.sock"); - /* Use all arguments, separated by whitespace, as payload. * This way, you don’t have to do i3-msg 'mark foo', you can use * i3-msg mark foo */ @@ -253,17 +239,7 @@ int main(int argc, char *argv[]) { if (!payload) payload = sstrdup(""); - int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0); - if (sockfd == -1) - err(EXIT_FAILURE, "Could not create socket"); - - struct sockaddr_un addr; - memset(&addr, 0, sizeof(struct sockaddr_un)); - addr.sun_family = AF_LOCAL; - strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1); - if (connect(sockfd, (const struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) - err(EXIT_FAILURE, "Could not connect to i3 on socket \"%s\"", socket_path); - + int sockfd = ipc_connect(socket_path); if (ipc_send_message(sockfd, strlen(payload), message_type, (uint8_t *)payload) == -1) err(EXIT_FAILURE, "IPC: write()"); free(payload); diff --git a/libi3/ipc_connect.c b/libi3/ipc_connect.c index 2e6283425d..f659a1a472 100644 --- a/libi3/ipc_connect.c +++ b/libi3/ipc_connect.c @@ -22,6 +22,25 @@ * */ int ipc_connect(const char *socket_path) { + char *path = NULL; + if (socket_path != NULL) { + path = sstrdup(socket_path); + } + + if (path == NULL) { + if ((path = getenv("I3SOCK")) != NULL) { + path = sstrdup(path); + } + } + + if (path == NULL) { + path = root_atom_contents("I3_SOCKET_PATH", NULL, 0); + } + + if (path == NULL) { + path = sstrdup("/tmp/i3-ipc.sock"); + } + int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0); if (sockfd == -1) err(EXIT_FAILURE, "Could not create socket"); @@ -31,9 +50,9 @@ int ipc_connect(const char *socket_path) { struct sockaddr_un addr; memset(&addr, 0, sizeof(struct sockaddr_un)); addr.sun_family = AF_LOCAL; - strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1); + strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1); if (connect(sockfd, (const struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) - err(EXIT_FAILURE, "Could not connect to i3"); - + err(EXIT_FAILURE, "Could not connect to i3 on socket %s", path); + free(path); return sockfd; } diff --git a/src/display_version.c b/src/display_version.c index 764ee75317..2e05cafa89 100644 --- a/src/display_version.c +++ b/src/display_version.c @@ -55,10 +55,6 @@ static yajl_callbacks version_callbacks = { * */ void display_running_version(void) { - char *socket_path = root_atom_contents("I3_SOCKET_PATH", conn, conn_screen); - if (socket_path == NULL) - exit(EXIT_SUCCESS); - char *pid_from_atom = root_atom_contents("I3_PID", conn, conn_screen); if (pid_from_atom == NULL) { /* If I3_PID is not set, the running version is older than 4.2-200. */ @@ -71,18 +67,7 @@ void display_running_version(void) { printf("(Getting version from running i3, press ctrl-c to abort…)"); fflush(stdout); - /* TODO: refactor this with the code for sending commands */ - int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0); - if (sockfd == -1) - err(EXIT_FAILURE, "Could not create socket"); - - struct sockaddr_un addr; - memset(&addr, 0, sizeof(struct sockaddr_un)); - addr.sun_family = AF_LOCAL; - strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1); - if (connect(sockfd, (const struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) - err(EXIT_FAILURE, "Could not connect to i3"); - + int sockfd = ipc_connect(NULL); if (ipc_send_message(sockfd, 0, I3_IPC_MESSAGE_TYPE_GET_VERSION, (uint8_t *)"") == -1) err(EXIT_FAILURE, "IPC: write()"); @@ -184,5 +169,4 @@ void display_running_version(void) { yajl_free(handle); free(reply); free(pid_from_atom); - free(socket_path); }