main.c (1081B)
1 #define _GNU_SOURCE 2 #include <libgen.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <string.h> 6 7 #include "cli/registry.h" 8 9 // Multicall: basename(argv[0]) selects which main runs. Commands self-register 10 // from constructors in src/cli/. 11 12 static const char *AVAILABLE = "linkd, linkctl, ifup, ifdown, ifquery, ifreload"; 13 14 int main(int argc, char *argv[]) { 15 const char *prog = basename(argv[0]); 16 17 cli_main_fn fn = cli_find(prog); 18 if (fn) return fn(argc, argv); 19 20 // Unrecognised name (build tree, wrapper script): try argv[1], shifting so 21 // the callee sees its own name in argv[0]. 22 if (argc > 1 && (fn = cli_find(argv[1]))) { 23 char **shifted = malloc(sizeof(char *) * (size_t)argc); 24 if (!shifted) { 25 fprintf(stderr, "out of memory\n"); 26 return 1; 27 } 28 shifted[0] = argv[1]; 29 for (int i = 2; i < argc; i++) shifted[i - 1] = argv[i]; 30 int rc = fn(argc - 1, shifted); 31 free(shifted); 32 return rc; 33 } 34 35 fprintf(stderr, "%s: unknown command: %s\n", argv[0], prog); 36 fprintf(stderr, "available commands: %s\n", AVAILABLE); 37 return 1; 38 }