int main(int argc, char **argv) { conf_t conf; if (parse_args(argc, argv, &conf) != 0) { return EXIT_FAILURE; } // Daemonize if (conf.daemon) { if (daemonize(conf.pidfile, conf.logfile) != 0) { return EXIT_FAILURE; } } // 注册 signal handle #ifdef HAVE_SIGACTION struct sigaction sa; sa.sa_handler = signal_cb; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); sigaction(SIGHUP, &sa, NULL); #else signal(SIGINT, signal_cb); signal(SIGTERM, signal_cb); signal(SIGHUP, signal_cb); #endif if (vpn_init(&conf) != 0) { return EXIT_FAILURE; } return vpn_run(); }
int main(int argc, char *argv[]) { const char *root_folder = getenv("RUNVPN_ROOT"); struct vpn *vpn = NULL; struct vpn *prev = NULL; if (root_folder == NULL) { printf("Environment variable \"RUNVPN_ROOT\" is not defined.\n"); return EXIT_FAILURE; } if (argc == 1) { /* fprintf(stdout, "%30s%s%s\n", BLUE_GRAY, "Listing VPNS", RESET); */ puts(" " BLUE_GRAY "Listing VPNS" RESET); vpn = get_vpns(root_folder); while(vpn != NULL) { //for (vpn = get_vpns(root_folder); vpn; vpn = vpn->next) { fprintf(stdout, "%25s - ", vpn->name); switch (vpn_status(vpn)) { case VPN_ERROR: return EXIT_FAILURE; case VPN_DEAD: print_color("Down", YELLOW); break; case VPN_RUNNING: print_color("Up", GREEN); break; case VPN_PERM_DENIED: print_color("Permission denied", RED); break; case VPN_STALE_PID: print_color("Down", YELLOW); vpn_delete_logfile(vpn); vpn_delete_pidfile(vpn); break; default: print_color("Unknown", RED); break; } prev = vpn; vpn = prev->next; vpn_free(prev); free(prev); } } else if (argc == 2) { struct vpn vpn; if (vpn_init(&vpn, root_folder, argv[argc - 1])) { fprintf(stderr, "Problem finding vpn: %s\n", strerror(errno)); return EXIT_FAILURE; } if (vpn_status(&vpn) == VPN_ERROR || vpn_start(&vpn, NO_DAEMON)) return EXIT_FAILURE; vpn_start(&vpn, NO_DAEMON); vpn_free(&vpn); } else if (argc == 3) { struct vpn vpn; char *name = *++argv; char *argument = *++argv; if (vpn_init(&vpn, root_folder, name) == -1) { fprintf(stderr, "Problem finding vpn: %s\n", strerror(errno)); return EXIT_FAILURE; } if (vpn_status(&vpn) == VPN_ERROR) return EXIT_FAILURE; /* Do different things depending on 2nd argument pased. */ if (strcmp(argument, "stop") == 0) { if (vpn_stop(&vpn)) return EXIT_FAILURE; } else if (strcmp(argument, "reload") == 0) { if (vpn_reload(&vpn)) return EXIT_FAILURE; } else if (strcmp(argument, "daemon") == 0) { if (vpn_start(&vpn, DAEMON)) return EXIT_FAILURE; } else if (strcmp(argument, "drestart") == 0) { if (vpn_stop(&vpn) || vpn_start(&vpn, DAEMON)) return EXIT_FAILURE; } else if (strcmp(argument, "restart") == 0) { if (vpn_stop(&vpn) || vpn_start(&vpn, NO_DAEMON)) return EXIT_FAILURE; } else if (strcmp(argument, "log") == 0) { vpn_dumplog(&vpn); } else { fprintf(stderr, "Unknown action '%s'\n", argument); } vpn_free(&vpn); } return EXIT_SUCCESS; }