3 #define _POSIX_C_SOURCE 200809L
15 #include <sys/types.h>
20 extern char **environ;
24 int giStack_InFD = -1;
25 int giNumStackArgs = 1;
26 char *gasStackArgs[MAX_ARGS] = {"nettest",NULL};
29 void Stack_AddDevice(const char *Ident, const void *MacAddr)
32 Stack_AddArg("%02x%02x%02x%02x%02x%02x:unix:%s",
33 ((uint8_t*)MacAddr)[0],
34 ((uint8_t*)MacAddr)[1],
35 ((uint8_t*)MacAddr)[2],
36 ((uint8_t*)MacAddr)[3],
37 ((uint8_t*)MacAddr)[4],
38 ((uint8_t*)MacAddr)[5],
42 void Stack_AddInterface(const char *Name, int AddrType, const void *Addr, int MaskBits)
48 Stack_AddArg("%s,%i.%i.%i.%i/%i", Name,
57 assert(AddrType == 4);
58 fprintf(stderr, "Stack_AddInterface: Bad address type %i\n", AddrType);
63 void Stack_AddRoute(int Type, const void *Network, int MaskBits, const void *NextHop)
67 void Stack_AddArg(const char *Fmt, ...)
69 if( giNumStackArgs == MAX_ARGS ) {
70 fprintf(stderr, "ERROR: Too many arguments to stack, %i max\n", MAX_ARGS);
76 size_t len = vsnprintf(NULL, 0, Fmt, args);
79 char *arg = malloc(len+1);
83 vsnprintf(arg, len+1, Fmt, args);
86 assert( arg[len] == '\0' );
87 gasStackArgs[giNumStackArgs++] = arg;
90 void sigchld_handler(int signum)
94 fprintf(stderr, "FAILURE: Child exited (%i)\n", status);
97 int Stack_Start(const char *RunName, const char *Subcommand)
99 Stack_AddArg(Subcommand);
101 for( int i = 3; i < 16; i ++ )
102 fcntl(i, F_SETFD, FD_CLOEXEC);
104 //signal(SIGCHLD, sigchld_handler);
108 giStack_InFD = fds_in[1];
109 fcntl(giStack_InFD, F_SETFD, FD_CLOEXEC);
112 fp = fopen("stdout.txt", "a"); fprintf(fp, "--- TEST: %s\n", RunName); fclose(fp);
113 fp = fopen("stderr.txt", "a"); fprintf(fp, "--- TEST: %s\n", RunName); fclose(fp);
115 posix_spawn_file_actions_t fa;
116 posix_spawn_file_actions_init(&fa);
117 posix_spawn_file_actions_adddup2(&fa, fds_in[0], 0);
118 posix_spawn_file_actions_addopen(&fa, 1, "stdout.txt", O_CREAT|O_APPEND|O_WRONLY, 0644);
119 posix_spawn_file_actions_addopen(&fa, 2, "stderr.txt", O_CREAT|O_APPEND|O_WRONLY, 0644);
121 int rv = posix_spawn(&giStack_PID, "./nettest", &fa, NULL, gasStackArgs, environ);
124 fprintf(stderr, "posix_spawn failed: %s", strerror(rv));
128 posix_spawn_file_actions_destroy(&fa);
132 void Stack_Kill(void)
136 kill(giStack_PID, SIGTERM);
140 for( int i = 1; i < giNumStackArgs; i ++ )
141 free(gasStackArgs[i]);
145 int Stack_SendCommand(const char *Fmt, ...)
149 size_t len = vsnprintf(NULL, 0, Fmt, args);
153 vsnprintf(command, len+1, Fmt, args);
156 write(giStack_InFD, command, len);
157 write(giStack_InFD, "\n", 1);