linkd

Control plane daemon for unos
git clone git://git.finwo.net/app/linkd
Log | Files | Refs | README

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 }