1- // termux-api.c - helper binary for calling termux api classes
2- // Usage: termux-api ${API_METHOD} ${ADDITIONAL_FLAGS}
3- // This executes
4- // am broadcast com.termux.api/.TermuxApiReceiver --es socket_input ${INPUT_SOCKET}
5- // --es socket_output ${OUTPUT_SOCKET}
6- // --es api_method ${API_METHOD}
7- // ${ADDITIONAL_FLAGS}
8- // where ${INPUT_SOCKET} and ${OUTPUT_SOCKET} are addresses to linux abstract namespace sockets,
9- // used to pass on stdin to the java implementation and pass back output from java to stdout.
1+ /* termux-api.c - helper binary for calling termux api classes
2+ * Usage: termux-api ${API_METHOD} ${ADDITIONAL_FLAGS}
3+ * This executes
4+ * am broadcast com.termux.api/.TermuxApiReceiver \
5+ * --es socket_input ${INPUT_SOCKET} \
6+ * --es socket_output ${OUTPUT_SOCKET} \
7+ * --es api_method ${API_METHOD} \
8+ * ${ADDITIONAL_FLAGS}
9+ * where ${INPUT_SOCKET} and ${OUTPUT_SOCKET} are addresses to linux
10+ * abstract namespace sockets, used to pass on stdin to the java
11+ * implementation and pass back output from java to stdout.
12+ */
1013#define _POSIX_SOURCE
1114#define _GNU_SOURCE
1215#include <fcntl.h>
2528#include <unistd.h>
2629
2730// Function which execs "am broadcast ..".
28- _Noreturn void exec_am_broadcast (int argc , char * * argv , char * input_address_string , char * output_address_string )
31+ _Noreturn void exec_am_broadcast (int argc , char * * argv ,
32+ char * input_address_string ,
33+ char * output_address_string )
2934{
3035 // Redirect stdout to /dev/null (but leave stderr open):
3136 close (STDOUT_FILENO );
@@ -95,19 +100,26 @@ _Noreturn void exec_callback(int fd)
95100
96101void generate_uuid (char * str ) {
97102 sprintf (str , "%x%x-%x-%x-%x-%x%x%x" ,
98- arc4random (), arc4random (), // Generates a 64-bit Hex number
99- (uint32_t ) getpid (), // Generates a 32-bit Hex number
100- ((arc4random () & 0x0fff ) | 0x4000 ), // Generates a 32-bit Hex number of the form 4xxx (4 indicates the UUID version)
101- arc4random () % 0x3fff + 0x8000 , // Generates a 32-bit Hex number in the range [0x8000, 0xbfff]
102- arc4random (), arc4random (), arc4random ()); // Generates a 96-bit Hex number
103+ /* 64-bit Hex number */
104+ arc4random (), arc4random (),
105+ /* 32-bit Hex number */
106+ (uint32_t ) getpid (),
107+ /* 32-bit Hex number of the form 4xxx (4 is the UUID version) */
108+ ((arc4random () & 0x0fff ) | 0x4000 ),
109+ /* 32-bit Hex number in the range [0x8000, 0xbfff] */
110+ arc4random () % 0x3fff + 0x8000 ,
111+ /* 96-bit Hex number */
112+ arc4random (), arc4random (), arc4random ());
103113}
104114
105115// Thread function which reads from stdin and writes to socket.
106116void * transmit_stdin_to_socket (void * arg ) {
107117 int output_server_socket = * ((int * ) arg );
108118 struct sockaddr_un remote_addr ;
109119 socklen_t addrlen = sizeof (remote_addr );
110- int output_client_socket = accept (output_server_socket , (struct sockaddr * ) & remote_addr , & addrlen );
120+ int output_client_socket = accept (output_server_socket ,
121+ (struct sockaddr * ) & remote_addr ,
122+ & addrlen );
111123
112124 ssize_t len ;
113125 char buffer [1024 ];
@@ -150,7 +162,10 @@ int transmit_socket_to_stdout(int input_socket_fd) {
150162
151163int main (int argc , char * * argv ) {
152164 // Do not transform children into zombies when they terminate:
153- struct sigaction sigchld_action = { .sa_handler = SIG_DFL , .sa_flags = SA_RESTART | SA_NOCLDSTOP | SA_NOCLDWAIT };
165+ struct sigaction sigchld_action = {
166+ .sa_handler = SIG_DFL ,
167+ .sa_flags = SA_RESTART | SA_NOCLDSTOP | SA_NOCLDWAIT
168+ };
154169 sigaction (SIGCHLD , & sigchld_action , NULL );
155170
156171 char input_address_string [100 ]; // This program reads from it.
@@ -161,20 +176,28 @@ int main(int argc, char** argv) {
161176
162177 struct sockaddr_un input_address = { .sun_family = AF_UNIX };
163178 struct sockaddr_un output_address = { .sun_family = AF_UNIX };
164- // Leave struct sockaddr_un.sun_path[0] as 0 and use the UUID string as abstract linux namespace:
165- strncpy (& input_address .sun_path [1 ], input_address_string , strlen (input_address_string ));
166- strncpy (& output_address .sun_path [1 ], output_address_string , strlen (output_address_string ));
179+ // Leave struct sockaddr_un.sun_path[0] as 0 and use the UUID
180+ // string as abstract linux namespace:
181+ strncpy (& input_address .sun_path [1 ], input_address_string ,
182+ strlen (input_address_string ));
183+ strncpy (& output_address .sun_path [1 ], output_address_string ,
184+ strlen (output_address_string ));
167185
168186 int input_server_socket = socket (AF_UNIX , SOCK_STREAM |SOCK_CLOEXEC , 0 );
169187 if (input_server_socket == -1 ) { perror ("socket()" ); return 1 ; }
170188 int output_server_socket = socket (AF_UNIX , SOCK_STREAM |SOCK_CLOEXEC , 0 );
171189 if (output_server_socket == -1 ) { perror ("socket()" ); return 1 ; }
172190
173- if (bind (input_server_socket , (struct sockaddr * ) & input_address , sizeof (sa_family_t ) + strlen (input_address_string ) + 1 ) == -1 ) {
191+ int ret = bind (input_server_socket , (struct sockaddr * ) & input_address ,
192+ sizeof (sa_family_t ) + strlen (input_address_string ) + 1 );
193+ if (ret == -1 ) {
174194 perror ("bind(input)" );
175195 return 1 ;
176196 }
177- if (bind (output_server_socket , (struct sockaddr * ) & output_address , sizeof (sa_family_t ) + strlen (output_address_string ) + 1 ) == -1 ) {
197+
198+ ret = bind (output_server_socket , (struct sockaddr * ) & output_address ,
199+ sizeof (sa_family_t ) + strlen (output_address_string ) + 1 );
200+ if (ret == -1 ) {
178201 perror ("bind(output)" );
179202 return 1 ;
180203 }
@@ -185,20 +208,22 @@ int main(int argc, char** argv) {
185208 pid_t fork_result = fork ();
186209 switch (fork_result ) {
187210 case -1 : perror ("fork()" ); return 1 ;
188- case 0 : exec_am_broadcast (argc , argv , input_address_string , output_address_string );
211+ case 0 : exec_am_broadcast (argc , argv , input_address_string ,
212+ output_address_string );
189213 }
190214
191215 struct sockaddr_un remote_addr ;
192216 socklen_t addrlen = sizeof (remote_addr );
193- int input_client_socket = accept (input_server_socket , (struct sockaddr * ) & remote_addr , & addrlen );
217+ int input_client_socket = accept (input_server_socket , (struct sockaddr * )
218+ & remote_addr , & addrlen );
194219
195220 pthread_t transmit_thread ;
196- pthread_create (& transmit_thread , NULL , transmit_stdin_to_socket , & output_server_socket );
221+ pthread_create (& transmit_thread , NULL , transmit_stdin_to_socket ,
222+ & output_server_socket );
197223
198224 int fd = transmit_socket_to_stdout (input_client_socket );
199225 close (input_client_socket );
200226 if (fd != -1 ) { exec_callback (fd ); }
201227
202228 return 0 ;
203229}
204-
0 commit comments