]> git.sur5r.net Git - i3/i3/commitdiff
ipc: correctly shutdown IPC sockets when exiting/restarting
authorMichael Stapelberg <michael@stapelberg.de>
Tue, 16 Mar 2010 01:44:47 +0000 (02:44 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 16 Mar 2010 01:44:47 +0000 (02:44 +0100)
i3-msg/main.c
include/ipc.h
src/commands.c
src/ipc.c
src/util.c

index 193d04e9082e8e4ddd4c0ee89652ba18c932a0fb..a1bdd72e0f0d93f368e0bd6c3f90fe24e44e1039 100644 (file)
@@ -73,6 +73,8 @@ static void ipc_recv_message(int sockfd, uint32_t message_type,
                 int n = read(sockfd, msg + read_bytes, to_read);
                 if (n == -1)
                         err(EXIT_FAILURE, "read() failed");
+                if (n == 0)
+                        errx(EXIT_FAILURE, "received EOF instead of reply");
 
                 read_bytes += n;
                 to_read -= n;
index b798b5ff5444c51922460dd3f13d49756f511467..63d59141cee191c5325e50d79f3bc2364b5eb1d8 100644 (file)
@@ -67,5 +67,11 @@ int ipc_create_socket(const char *filename);
  */
 void ipc_send_event(const char *event, uint32_t message_type, const char *payload);
 
+/**
+ * Calls shutdown() on each socket and closes it. This function to be called
+ * when exiting or restarting only!
+ *
+ */
+void ipc_shutdown();
 
 #endif
index bef0989fa7e714895fb82373f8d298cbce62c896..273f9d39c238052dd1e95b296ecce2dd794d1ad5 100644 (file)
@@ -33,6 +33,7 @@
 #include "log.h"
 #include "sighandler.h"
 #include "manage.h"
+#include "ipc.h"
 
 bool focus_window_in_container(xcb_connection_t *conn, Container *container, direction_t direction) {
         /* If this container is empty, we’re done */
@@ -1015,6 +1016,7 @@ void parse_command(xcb_connection_t *conn, const char *command) {
         if (STARTS_WITH(command, "exit")) {
                 LOG("User issued exit-command, exiting without error.\n");
                 restore_geometry(global_conn);
+                ipc_shutdown();
                 exit(EXIT_SUCCESS);
         }
 
index f74f437e559a37dfeb716110200b9cf8bce6b586..f2dfd1f6718414fa04e6158a9381079132af7f12 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -105,6 +105,19 @@ void ipc_send_event(const char *event, uint32_t message_type, const char *payloa
         }
 }
 
+/*
+ * Calls shutdown() on each socket and closes it. This function to be called
+ * when exiting or restarting only!
+ *
+ */
+void ipc_shutdown() {
+        ipc_client *current;
+        TAILQ_FOREACH(current, &all_clients, clients) {
+                shutdown(current->fd, SHUT_RDWR);
+                close(current->fd);
+        }
+}
+
 /*
  * Executes the command and returns whether it could be successfully parsed
  * or not (at the moment, always returns true).
index dab3199bf777a5f2fbc3e55c799fbf6a2652ea6d..cb37d30aa2619d56f6dbeb8052b6183c3e50328b 100644 (file)
@@ -35,6 +35,7 @@
 #include "ewmh.h"
 #include "manage.h"
 #include "workspace.h"
+#include "ipc.h"
 
 static iconv_t conversion_descriptor = 0;
 struct keyvalue_table_head by_parent = TAILQ_HEAD_INITIALIZER(by_parent);
@@ -513,6 +514,8 @@ static char **append_argument(char **original, char *argument) {
 void i3_restart() {
         restore_geometry(global_conn);
 
+        ipc_shutdown();
+
         LOG("restarting \"%s\"...\n", start_argv[0]);
         /* make sure -a is in the argument list or append it */
         start_argv = append_argument(start_argv, "-a");