diff options
Diffstat (limited to 'common/ipc-client.c')
-rw-r--r-- | common/ipc-client.c | 28 |
1 files changed, 21 insertions, 7 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 @@ | |||
10 | #include "stringop.h" | 10 | #include "stringop.h" |
11 | #include "ipc.h" | 11 | #include "ipc.h" |
12 | #include "readline.h" | 12 | #include "readline.h" |
13 | #include "ipc-client.h" | ||
13 | 14 | ||
14 | static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'}; | 15 | static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'}; |
15 | static const size_t ipc_header_size = sizeof(ipc_magic)+8; | 16 | static const size_t ipc_header_size = sizeof(ipc_magic)+8; |
@@ -39,7 +40,7 @@ int ipc_open_socket(const char *socket_path) { | |||
39 | return socketfd; | 40 | return socketfd; |
40 | } | 41 | } |
41 | 42 | ||
42 | char *ipc_recv_response(int socketfd, uint32_t *len) { | 43 | struct ipc_response *ipc_recv_response(int socketfd) { |
43 | char data[ipc_header_size]; | 44 | char data[ipc_header_size]; |
44 | uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic)); | 45 | uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic)); |
45 | 46 | ||
@@ -52,21 +53,29 @@ char *ipc_recv_response(int socketfd, uint32_t *len) { | |||
52 | total += received; | 53 | total += received; |
53 | } | 54 | } |
54 | 55 | ||
56 | struct ipc_response *response = malloc(sizeof(struct ipc_response)); | ||
55 | total = 0; | 57 | total = 0; |
56 | *len = data32[0]; | 58 | response->size = data32[0]; |
57 | char *response = malloc(*len + 1); | 59 | response->type = data32[1]; |
58 | while (total < *len) { | 60 | char *payload = malloc(response->size + 1); |
59 | ssize_t received = recv(socketfd, response + total, *len - total, 0); | 61 | while (total < response->size) { |
62 | ssize_t received = recv(socketfd, payload + total, response->size - total, 0); | ||
60 | if (received < 0) { | 63 | if (received < 0) { |
61 | sway_abort("Unable to receive IPC response"); | 64 | sway_abort("Unable to receive IPC response"); |
62 | } | 65 | } |
63 | total += received; | 66 | total += received; |
64 | } | 67 | } |
65 | response[*len] = '\0'; | 68 | payload[response->size] = '\0'; |
69 | response->payload = payload; | ||
66 | 70 | ||
67 | return response; | 71 | return response; |
68 | } | 72 | } |
69 | 73 | ||
74 | void free_ipc_response(struct ipc_response *response) { | ||
75 | free(response->payload); | ||
76 | free(response); | ||
77 | } | ||
78 | |||
70 | char *ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len) { | 79 | char *ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len) { |
71 | char data[ipc_header_size]; | 80 | char data[ipc_header_size]; |
72 | uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic)); | 81 | 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 | |||
82 | sway_abort("Unable to send IPC payload"); | 91 | sway_abort("Unable to send IPC payload"); |
83 | } | 92 | } |
84 | 93 | ||
85 | return ipc_recv_response(socketfd, len); | 94 | struct ipc_response *resp = ipc_recv_response(socketfd); |
95 | char *response = resp->payload; | ||
96 | *len = resp->size; | ||
97 | free(resp); | ||
98 | |||
99 | return response; | ||
86 | } | 100 | } |