@ -10,6 +10,7 @@
 
			
		
	
		
		
			
				
					
					# include  "stringop.h" # include  "stringop.h"  
			
		
	
		
		
			
				
					
					# include  "ipc.h" # include  "ipc.h"  
			
		
	
		
		
			
				
					
					# include  "readline.h" # include  "readline.h"  
			
		
	
		
		
			
				
					
					# include  "ipc-client.h"  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  const  char  ipc_magic [ ]  =  { ' i ' ,  ' 3 ' ,  ' - ' ,  ' i ' ,  ' p ' ,  ' c ' } ; static  const  char  ipc_magic [ ]  =  { ' i ' ,  ' 3 ' ,  ' - ' ,  ' i ' ,  ' p ' ,  ' c ' } ;  
			
		
	
		
		
			
				
					
					static  const  size_t  ipc_header_size  =  sizeof ( ipc_magic ) + 8 ; 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 ; 
	return  socketfd ; 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					char * ipc_recv_response ( int  socketfd ,  uint32_t  * len )  { struct  ipc_response * ipc_recv_response ( int  socketfd )  {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						char  data [ ipc_header_size ] ; 
	char  data [ ipc_header_size ] ; 
 
			
		
	
		
		
			
				
					
						uint32_t  * data32  =  ( uint32_t  * ) ( data  +  sizeof ( ipc_magic ) ) ; 
	uint32_t  * data32  =  ( uint32_t  * ) ( data  +  sizeof ( ipc_magic ) ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -52,21 +53,29 @@ char *ipc_recv_response(int socketfd, uint32_t *len) {
 
			
		
	
		
		
			
				
					
							total  + =  received ; 
		total  + =  received ; 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						struct  ipc_response  * response  =  malloc ( sizeof ( struct  ipc_response ) ) ; 
 
			
		
	
		
		
			
				
					
						total  =  0 ; 
	total  =  0 ; 
 
			
		
	
		
		
			
				
					
						* len  =  data32 [ 0 ] ; 
	response - > size  =  data32 [ 0 ] ; 
 
			
				
				
			
		
	
		
		
			
				
					
						char  * response  =  malloc ( * len  +  1 ) ; 
	response - > type  =  data32 [ 1 ] ; 
 
			
				
				
			
		
	
		
		
			
				
					
						while  ( total  <  * len )  { 
	char  * payload  =  malloc ( response - > size  +  1 ) ; 
 
			
				
				
			
		
	
		
		
			
				
					
							ssize_t  received  =  recv ( socketfd ,  response  +  total ,  * len  -  total ,  0 ) ; 
	while  ( total  <  response - > size )  { 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
							ssize_t  received  =  recv ( socketfd ,  payload  +  total ,  response - > size  -  total ,  0 ) ; 
 
			
		
	
		
		
			
				
					
							if  ( received  <  0 )  { 
		if  ( received  <  0 )  { 
 
			
		
	
		
		
			
				
					
								sway_abort ( " Unable to receive IPC response " ) ; 
			sway_abort ( " Unable to receive IPC response " ) ; 
 
			
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
							total  + =  received ; 
		total  + =  received ; 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
						response [ * len ]  =  ' \0 ' ; 
	payload [ response - > size ]  =  ' \0 ' ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						response - > payload  =  payload ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						return  response ; 
	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  * ipc_single_command ( int  socketfd ,  uint32_t  type ,  const  char  * payload ,  uint32_t  * len )  {  
			
		
	
		
		
			
				
					
						char  data [ ipc_header_size ] ; 
	char  data [ ipc_header_size ] ; 
 
			
		
	
		
		
			
				
					
						uint32_t  * data32  =  ( uint32_t  * ) ( data  +  sizeof ( ipc_magic ) ) ; 
	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 " ) ; 
		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 ; 
 
			
		
	
		
		
			
				
					
					} }