- // Do not transform children into zombies when they terminate:
- struct sigaction sigchld_action = { .sa_handler = SIG_DFL, .sa_flags = SA_RESTART | SA_NOCLDSTOP | SA_NOCLDWAIT };
- sigaction(SIGCHLD, &sigchld_action, NULL);
-
- char input_address_string[100]; // This program reads from it.
- char output_address_string[100]; // This program writes to it.
-
- // Seed the random number generator:
- struct timeval time;
- gettimeofday(&time,NULL);
- srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
-
- generate_uuid(input_address_string);
- generate_uuid(output_address_string);
-
- struct sockaddr_un input_address = { .sun_family = AF_UNIX };
- struct sockaddr_un output_address = { .sun_family = AF_UNIX };
- // Leave struct sockaddr_un.sun_path[0] as 0 and use the UUID string as abstract linux namespace:
- strncpy(&input_address.sun_path[1], input_address_string, strlen(input_address_string));
- strncpy(&output_address.sun_path[1], output_address_string, strlen(output_address_string));
-
- int input_server_socket = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
- if (input_server_socket == -1) { perror("socket()"); return 1; }
- int output_server_socket = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
- if (output_server_socket == -1) { perror("socket()"); return 1; }
-
- if (bind(input_server_socket, (struct sockaddr*) &input_address, sizeof(sa_family_t) + strlen(input_address_string) + 1) == -1) {
- perror("bind(input)");
- return 1;
- }
- if (bind(output_server_socket, (struct sockaddr*) &output_address, sizeof(sa_family_t) + strlen(output_address_string) + 1) == -1) {
- perror("bind(output)");
- return 1;
- }
-
- if (listen(input_server_socket, 1) == -1) { perror("listen()"); return 1; }
- if (listen(output_server_socket, 1) == -1) { perror("listen()"); return 1; }
-
- pid_t fork_result = fork();
- switch (fork_result) {
- case -1: perror("fork()"); return 1;
- case 0: exec_am_broadcast(argc, argv, input_address_string, output_address_string); return 0;
- }
-
- struct sockaddr_un remote_addr;
- socklen_t addrlen = sizeof(remote_addr);
- int input_client_socket = accept(input_server_socket, (struct sockaddr*) &remote_addr, &addrlen);
-
- pthread_t transmit_thread;
- pthread_create(&transmit_thread, NULL, transmit_stdin_to_socket, &output_server_socket);
-
- transmit_socket_to_stdout(input_client_socket);
-
- return 0;
+ // Do not transform children into zombies when they terminate:
+ struct sigaction sigchld_action = { .sa_handler = SIG_DFL, .sa_flags = SA_RESTART | SA_NOCLDSTOP | SA_NOCLDWAIT };
+ sigaction(SIGCHLD, &sigchld_action, NULL);
+
+ char input_address_string[100]; // This program reads from it.
+ char output_address_string[100]; // This program writes to it.
+
+ generate_uuid(input_address_string);
+ generate_uuid(output_address_string);
+
+ struct sockaddr_un input_address = { .sun_family = AF_UNIX };
+ struct sockaddr_un output_address = { .sun_family = AF_UNIX };
+ // Leave struct sockaddr_un.sun_path[0] as 0 and use the UUID string as abstract linux namespace:
+ strncpy(&input_address.sun_path[1], input_address_string, strlen(input_address_string));
+ strncpy(&output_address.sun_path[1], output_address_string, strlen(output_address_string));
+
+ int input_server_socket = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
+ if (input_server_socket == -1) { perror("socket()"); return 1; }
+ int output_server_socket = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
+ if (output_server_socket == -1) { perror("socket()"); return 1; }
+
+ if (bind(input_server_socket, (struct sockaddr*) &input_address, sizeof(sa_family_t) + strlen(input_address_string) + 1) == -1) {
+ perror("bind(input)");
+ return 1;
+ }
+ if (bind(output_server_socket, (struct sockaddr*) &output_address, sizeof(sa_family_t) + strlen(output_address_string) + 1) == -1) {
+ perror("bind(output)");
+ return 1;
+ }
+
+ if (listen(input_server_socket, 1) == -1) { perror("listen()"); return 1; }
+ if (listen(output_server_socket, 1) == -1) { perror("listen()"); return 1; }
+
+ pid_t fork_result = fork();
+ switch (fork_result) {
+ case -1: perror("fork()"); return 1;
+ case 0: exec_am_broadcast(argc, argv, input_address_string, output_address_string);
+ }
+
+ struct sockaddr_un remote_addr;
+ socklen_t addrlen = sizeof(remote_addr);
+ int input_client_socket = accept(input_server_socket, (struct sockaddr*) &remote_addr, &addrlen);
+
+ pthread_t transmit_thread;
+ pthread_create(&transmit_thread, NULL, transmit_stdin_to_socket, &output_server_socket);
+
+ transmit_socket_to_stdout(input_client_socket);
+
+ return 0;