aboutsummaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2015-11-11 08:43:36 -0500
committerLibravatar Drew DeVault <sir@cmpwn.com>2015-11-11 08:43:36 -0500
commit4397cff7bcef77e7bd1b1ac9b27aef74e44fa50d (patch)
treec87d5d524ed0924c3d235a54031de87c9d812092 /sway
parentAdd file and line number to log in Debug build (diff)
downloadsway-4397cff7bcef77e7bd1b1ac9b27aef74e44fa50d.tar.gz
sway-4397cff7bcef77e7bd1b1ac9b27aef74e44fa50d.tar.zst
sway-4397cff7bcef77e7bd1b1ac9b27aef74e44fa50d.zip
Fix some IPC issues
Socket now includes pid in the filename (fixes nested sway sessions or old sockets causing problems). Fixed warnings on strict aliasing and cleaned up relevant code in general.
Diffstat (limited to 'sway')
-rw-r--r--sway/ipc.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sway/ipc.c b/sway/ipc.c
index 4c87101c..c8e424e3 100644
--- a/sway/ipc.c
+++ b/sway/ipc.c
@@ -98,7 +98,8 @@ struct sockaddr_un *ipc_user_sockaddr(void) {
98 int path_size = sizeof(ipc_sockaddr->sun_path); 98 int path_size = sizeof(ipc_sockaddr->sun_path);
99 99
100 // Without logind: 100 // Without logind:
101 int allocating_path_size = snprintf(ipc_sockaddr->sun_path, path_size, "/tmp/sway-ipc.%i.sock", getuid()); 101 int allocating_path_size = snprintf(ipc_sockaddr->sun_path, path_size,
102 "/tmp/sway-ipc.%i.%i.sock", getuid(), getpid());
102 103
103 if (allocating_path_size >= path_size) { 104 if (allocating_path_size >= path_size) {
104 sway_abort("socket path won't fit into ipc_sockaddr->sun_path"); 105 sway_abort("socket path won't fit into ipc_sockaddr->sun_path");
@@ -176,7 +177,8 @@ int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data) {
176 return 0; 177 return 0;
177 } 178 }
178 179
179 char buf[ipc_header_size]; 180 uint8_t buf[ipc_header_size];
181 uint32_t *buf32 = (uint32_t*)(buf + sizeof(ipc_magic));
180 ssize_t received = recv(client_fd, buf, ipc_header_size, 0); 182 ssize_t received = recv(client_fd, buf, ipc_header_size, 0);
181 if (received == -1) { 183 if (received == -1) {
182 sway_log_errno(L_INFO, "Unable to receive header from IPC client"); 184 sway_log_errno(L_INFO, "Unable to receive header from IPC client");
@@ -190,8 +192,8 @@ int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data) {
190 return 0; 192 return 0;
191 } 193 }
192 194
193 client->payload_length = *(uint32_t *)&buf[sizeof(ipc_magic)]; 195 client->payload_length = buf32[0];
194 client->current_command = (enum ipc_command_type) *(uint32_t *)&buf[sizeof(ipc_magic)+4]; 196 client->current_command = (enum ipc_command_type)buf32[1];
195 197
196 if (read_available - received >= client->payload_length) { 198 if (read_available - received >= client->payload_length) {
197 ipc_client_handle_command(client); 199 ipc_client_handle_command(client);
@@ -336,10 +338,11 @@ bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t pay
336 assert(payload); 338 assert(payload);
337 339
338 char data[ipc_header_size]; 340 char data[ipc_header_size];
341 uint32_t *data32 = (uint32_t*)(data + sizeof(ipc_magic));
339 342
340 memcpy(data, ipc_magic, sizeof(ipc_magic)); 343 memcpy(data, ipc_magic, sizeof(ipc_magic));
341 *(uint32_t *)&(data[sizeof(ipc_magic)]) = payload_length; 344 data32[0] = payload_length;
342 *(uint32_t *)&(data[sizeof(ipc_magic)+4]) = client->current_command; 345 data32[1] = client->current_command;
343 346
344 if (write(client->fd, data, ipc_header_size) == -1) { 347 if (write(client->fd, data, ipc_header_size) == -1) {
345 sway_log_errno(L_INFO, "Unable to send header to IPC client"); 348 sway_log_errno(L_INFO, "Unable to send header to IPC client");