void *CLIProcessCmdsInteractive(void *arg) { FILE *fp = (FILE *)arg; CLIPrintHelpPreamble(); CLIProcessCmds(fp, 1); }
/* * This is the main routine of the CLI. Everything starts here. * The CLI registers and commands into a hash table and forks a thread to * handle the command line. */ int CLIInit(router_config *rarg) { int stat, *jstat; if (!(cli_map = map_create(free))) return EXIT_FAILURE; /* * Disable certain signals such as Ctrl+C.. make the shell a little stable */ redefineSignalHandler(SIGINT, dummyFunction); redefineSignalHandler(SIGQUIT, dummyFunction); redefineSignalHandler(SIGTSTP, dummyFunction); verbose(2, "[cliHandler]:: Registering CLI commands in the command table "); /* * Register the commands allowed in the CLI. Each command is implemented by a * function. The function is inserted into the command registary and picked up * when the leading string is typed in the CLI. */ registerCLI("help", helpCmd, SHELP_HELP, USAGE_HELP, LHELP_HELP); // Check registerCLI("version", versionCmd, SHELP_VERSION, USAGE_VERSION, LHELP_VERSION); // Check registerCLI("set", setCmd, SHELP_SET, USAGE_SET, LHELP_SET); // Check registerCLI("get", getCmd, SHELP_GET, USAGE_GET, LHELP_GET); // Check registerCLI("source", sourceCmd, SHELP_SOURCE, USAGE_SOURCE, LHELP_SOURCE); // Check registerCLI("ifconfig", ifconfigCmd, SHELP_IFCONFIG, USAGE_IFCONFIG, LHELP_IFCONFIG); registerCLI("route", routeCmd, SHELP_ROUTE, USAGE_ROUTE, LHELP_ROUTE); registerCLI("arp", arpCmd, SHELP_ARP, USAGE_ARP, LHELP_ARP); registerCLI("ping", pingCmd, SHELP_PING, USAGE_PING, LHELP_PING); // Check registerCLI("console", consoleCmd, SHELP_CONSOLE, USAGE_CONSOLE, LHELP_CONSOLE); // Check registerCLI("halt", haltCmd, SHELP_HALT, USAGE_HALT, LHELP_HALT); // Check registerCLI("exit", haltCmd, SHELP_EXIT, USAGE_EXIT, LHELP_EXIT); // Check registerCLI("queue", queueCmd, SHELP_QUEUE, USAGE_QUEUE, LHELP_QUEUE); // Check registerCLI("qdisc", qdiscCmd, SHELP_QDISC, USAGE_QDISC, LHELP_QDISC); // Check registerCLI("spolicy", spolicyCmd, SHELP_SPOLICY, USAGE_SPOLICY, LHELP_SPOLICY); // Check registerCLI("class", classCmd, SHELP_CLASS, USAGE_CLASS, LHELP_CLASS); registerCLI("filter", filterCmd, SHELP_FILTER, USAGE_FILTER, LHELP_FILTER); registerCLI("hello", helloCmd, SHELP_EXIT, USAGE_EXIT, LHELP_EXIT); if (rarg->config_dir != NULL) chdir(rarg->config_dir); // change to the configuration directory if (rarg->config_file != NULL) { FILE *ifile = fopen(rarg->config_file, "r"); rl_instream = ifile; // redirect the input stream CLIProcessCmds(ifile, 0); rl_instream = stdin; } if (rarg->cli_flag != 0) stat = pthread_create((pthread_t *)(&(rarg->clihandler)), NULL, CLIProcessCmdsInteractive, (void *)stdin); pthread_join(rarg->clihandler, (void **)&jstat); verbose(2, "[cliHandler]:: Destroying the CLI datastructures "); CLIDestroy(); }
void sourceCmd() { FILE *fp; char *next_tok = strtok(NULL, " \n"); if (next_tok == NULL) { error("[sourceCmd]:: ERROR!! missing file specification..."); return; } if ((fp = fopen(next_tok, "r")) == NULL) { error("[sourceCmd]:: ERROR!! cannot open file %s.. ", next_tok); return; } rl_instream = fp; CLIProcessCmds(fp, 0); rl_instream = stdin; }