aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/ipc-client.c28
-rw-r--r--include/ipc-client.h19
-rw-r--r--swaybar/main.c5
3 files changed, 39 insertions, 13 deletions
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
@@ -4,6 +4,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.
*/
char *get_socketpath(void);
@@ -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;
}