93 lines
1.9 KiB
C
93 lines
1.9 KiB
C
#include "common.h"
|
|
#include "str.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
volatile sig_atomic_t gt_alarm;
|
|
volatile sig_atomic_t gt_reload;
|
|
volatile sig_atomic_t gt_quit;
|
|
|
|
static void
|
|
gt_quit_handler(int sig)
|
|
{
|
|
switch (sig) {
|
|
case SIGALRM:
|
|
gt_alarm = 1;
|
|
return;
|
|
case SIGHUP:
|
|
gt_reload = 1; /* FALLTHRU */
|
|
default:
|
|
gt_quit = 1;
|
|
}
|
|
}
|
|
|
|
static void
|
|
gt_set_signal(void)
|
|
{
|
|
struct sigaction sa = {
|
|
.sa_flags = 0,
|
|
};
|
|
|
|
sigemptyset(&sa.sa_mask);
|
|
|
|
sa.sa_handler = gt_quit_handler;
|
|
sigaction(SIGINT, &sa, NULL);
|
|
sigaction(SIGQUIT, &sa, NULL);
|
|
sigaction(SIGTERM, &sa, NULL);
|
|
sigaction(SIGHUP, &sa, NULL);
|
|
sigaction(SIGALRM, &sa, NULL);
|
|
|
|
sa.sa_handler = SIG_IGN;
|
|
sigaction(SIGPIPE, &sa, NULL);
|
|
sigaction(SIGUSR1, &sa, NULL);
|
|
sigaction(SIGUSR2, &sa, NULL);
|
|
}
|
|
|
|
static int
|
|
gt_version(int argc, char **argv)
|
|
{
|
|
printf(PACKAGE_VERSION "\n");
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
gt_set_signal();
|
|
|
|
struct {
|
|
char *name;
|
|
char *help;
|
|
int (*call)(int, char **);
|
|
} cmd[] = {
|
|
{"show", "show all running tunnels", gt_show},
|
|
{"bench", "start a crypto bench", gt_bench},
|
|
{"bind", "start a new tunnel", gt_bind},
|
|
{"set", "change tunnel properties", gt_set},
|
|
{"keygen", "generate a new secret key", gt_keygen},
|
|
{"path", "manage paths", gt_path},
|
|
{"version", "show version", gt_version},
|
|
{NULL}};
|
|
|
|
if (argv[1]) {
|
|
for (int k = 0; cmd[k].name; k++) {
|
|
if (!str_cmp(cmd[k].name, argv[1]))
|
|
return cmd[k].call(argc - 1, argv + 1);
|
|
}
|
|
}
|
|
|
|
printf("available commands:\n\n");
|
|
|
|
int len = 0;
|
|
|
|
for (int k = 0; cmd[k].name; k++)
|
|
len = MAX(len, (int)str_len(cmd[k].name, 32));
|
|
|
|
for (int k = 0; cmd[k].name; k++)
|
|
printf(" %-*s %s\n", len, cmd[k].name, cmd[k].help);
|
|
|
|
printf("\n");
|
|
|
|
return 1;
|
|
}
|