diff --git a/common/ipc-client.c b/common/ipc-client.c index e92a09fe..81348913 100644 --- a/common/ipc-client.c +++ b/common/ipc-client.c @@ -10,6 +10,7 @@ #include "stringop.h" #include "ipc.h" #include "readline.h" +#include "ipc-client.h" static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'}; static const size_t ipc_header_size = sizeof(ipc_magic)+8; @@ -39,7 +40,7 @@ int ipc_open_socket(const char *socket_path) { return socketfd; } -char *ipc_recv_response(int socketfd, uint32_t *len) { +struct ipc_response *ipc_recv_response(int socketfd) { char data[ipc_header_size]; uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic)); @@ -52,21 +53,29 @@ char *ipc_recv_response(int socketfd, uint32_t *len) { total += received; } + struct ipc_response *response = malloc(sizeof(struct ipc_response)); total = 0; - *len = data32[0]; - char *response = malloc(*len + 1); - while (total < *len) { - ssize_t received = recv(socketfd, response + total, *len - total, 0); + response->size = data32[0]; + response->type = data32[1]; + char *payload = malloc(response->size + 1); + while (total < response->size) { + ssize_t received = recv(socketfd, payload + total, response->size - total, 0); if (received < 0) { sway_abort("Unable to receive IPC response"); } total += received; } - response[*len] = '\0'; + payload[response->size] = '\0'; + response->payload = payload; return response; } +void free_ipc_response(struct ipc_response *response) { + free(response->payload); + free(response); +} + char *ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len) { char data[ipc_header_size]; uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic)); @@ -82,5 +91,10 @@ char *ipc_single_command(int socketfd, uint32_t type, const char *payload, uint3 sway_abort("Unable to send IPC payload"); } - return ipc_recv_response(socketfd, len); + struct ipc_response *resp = ipc_recv_response(socketfd); + char *response = resp->payload; + *len = resp->size; + free(resp); + + return response; } diff --git a/include/ipc-client.h b/include/ipc-client.h index a4cfd87f..030c80b6 100644 --- a/include/ipc-client.h +++ b/include/ipc-client.h @@ -3,6 +3,16 @@ #include "ipc.h" +/** + * IPC response including type of IPC response, size of payload and the json + * encoded payload string. + */ +struct ipc_response { + uint32_t size; + uint32_t type; + char *payload; +}; + /** * Gets the path to the IPC socket from sway. */ @@ -17,9 +27,12 @@ int ipc_open_socket(const char *socket_path); */ char *ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len); /** - * Receives a single IPC resposne and returns the buffer. len will be updated - * with the length of the buffer returned from sway. + * Receives a single IPC response and returns an ipc_response. + */ +struct ipc_response *ipc_recv_response(int socketfd); +/** + * Free ipc_response struct */ -char *ipc_recv_response(int socketfd, uint32_t *len); +void free_ipc_response(struct ipc_response *response); #endif diff --git a/swaybar/main.c b/swaybar/main.c index aa761b7d..d534345a 100644 --- a/swaybar/main.c +++ b/swaybar/main.c @@ -1025,9 +1025,8 @@ void poll_for_update() { if (FD_ISSET(ipc_event_socketfd, &readfds)) { sway_log(L_DEBUG, "Got workspace update."); - uint32_t len; - char *buf = ipc_recv_response(ipc_event_socketfd, &len); - free(buf); + struct ipc_response *resp = ipc_recv_response(ipc_event_socketfd); + free_ipc_response(resp); ipc_update_workspaces(); dirty = true; }