@ -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 ;
}