3 #define _POSIX_C_SOURCE 200809L
18 extern char **environ;
22 int giStack_InFD = -1;
23 int giNumStackArgs = 1;
24 char *gasStackArgs[MAX_ARGS] = {"nettest",NULL};
27 void Stack_AddDevice(const char *Ident, const void *MacAddr)
30 Stack_AddArg("%02x%02x%02x%02x%02x%02x:unix:%s",
31 ((uint8_t*)MacAddr)[0],
32 ((uint8_t*)MacAddr)[1],
33 ((uint8_t*)MacAddr)[2],
34 ((uint8_t*)MacAddr)[3],
35 ((uint8_t*)MacAddr)[4],
36 ((uint8_t*)MacAddr)[5],
40 void Stack_AddInterface(const char *Name, int AddrType, const void *Addr, int MaskBits)
46 Stack_AddArg("%s,%i.%i.%i.%i/%i", Name,
55 assert(AddrType == 4);
60 void Stack_AddRoute(int Type, const void *Network, int MaskBits, const void *NextHop)
64 void Stack_AddArg(const char *Fmt, ...)
68 size_t len = vsnprintf(NULL, 0, Fmt, args);
70 char *arg = malloc(len+1);
72 vsnprintf(arg, len+1, Fmt, args);
74 gasStackArgs[giNumStackArgs++] = arg;
77 void sigchld_handler(int signum)
81 fprintf(stderr, "FAILURE: Child exited (%i)\n", status);
84 int Stack_Start(const char *Subcommand)
86 Stack_AddArg(Subcommand);
88 for( int i = 3; i < 16; i ++ )
89 fcntl(i, F_SETFD, FD_CLOEXEC);
91 //signal(SIGCHLD, sigchld_handler);
95 giStack_InFD = fds_in[1];
96 fcntl(giStack_InFD, F_SETFD, FD_CLOEXEC);
99 fp = fopen("stdout.txt", "a"); fprintf(fp, "--- Startup\n"); fclose(fp);
100 fp = fopen("stderr.txt", "a"); fprintf(fp, "--- Startup\n"); fclose(fp);
102 posix_spawn_file_actions_t fa;
103 posix_spawn_file_actions_init(&fa);
104 posix_spawn_file_actions_adddup2(&fa, fds_in[0], 0);
105 posix_spawn_file_actions_addopen(&fa, 1, "stdout.txt", O_CREAT|O_APPEND|O_WRONLY, 0644);
106 posix_spawn_file_actions_addopen(&fa, 2, "stderr.txt", O_CREAT|O_APPEND|O_WRONLY, 0644);
108 int rv = posix_spawn(&giStack_PID, "./nettest", &fa, NULL, gasStackArgs, environ);
111 fprintf(stderr, "posix_spawn failed: %s", strerror(rv));
117 void Stack_Kill(void)
121 kill(giStack_PID, SIGTERM);
126 int Stack_SendCommand(const char *CommandString)
128 write(giStack_InFD, CommandString, strlen(CommandString));
129 write(giStack_InFD, "\n", 1);