+
+static const struct {
+ const char *command;
+ int (*function)(int argc, char *argv[]);
+} commands[] = {
+ {"start", cmd_start},
+ {"stop", cmd_stop},
+ {"restart", cmd_restart},
+ {"reload", cmd_reload},
+ {"dump", cmd_dump},
+ {"purge", cmd_purge},
+ {"debug", cmd_debug},
+ {"retry", cmd_retry},
+ {"connect", cmd_connect},
+ {"disconnect", cmd_disconnect},
+ {"top", cmd_top},
+ {"pcap", cmd_pcap},
+ {"log", cmd_log},
+ {"pid", cmd_pid},
+ {"config", cmd_config},
+ {"init", cmd_init},
+ {"generate-keys", cmd_generate_keys},
+ {"generate-rsa-keys", cmd_generate_rsa_keys},
+ {"generate-ecdsa-keys", cmd_generate_ecdsa_keys},
+ {"help", cmd_help},
+ {"version", cmd_version},
+ {NULL, NULL},
+};
+
+int main(int argc, char *argv[]) {
+ program_name = argv[0];
+
+ if(!parse_options(argc, argv))
+ return 1;
+
+ make_names();
+
+ if(show_version) {
+ version();
+ return 0;
+ }
+
+ if(show_help) {
+ usage(false);
+ return 0;
+ }
+
+ if(optind >= argc) {
+ fprintf(stderr, "No command given.\n");
+ usage(true);
+ return 1;
+ }
+
+ for(int i = 0; commands[i].command; i++) {
+ if(!strcasecmp(argv[optind], commands[i].command))
+ return commands[i].function(argc - optind, argv + optind);
+ }
+
+ fprintf(stderr, "Unknown command `%s'.\n", argv[optind]);
+ usage(true);
+ return 1;
+}