X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=ctdlsh%2Fmain.c;h=cda33ec44c1fff20c562b3d02dc04576afbf815e;hb=HEAD;hp=69d7f777ba1c0ff6803494f475f1fe5d51132419;hpb=aae29a7692b6df8429a1d81b1f33b43f703e78dd;p=citadel.git diff --git a/ctdlsh/main.c b/ctdlsh/main.c index 69d7f777b..7e1d93e5b 100644 --- a/ctdlsh/main.c +++ b/ctdlsh/main.c @@ -1,5 +1,5 @@ /* - * (c) 2009-2019 by Art Cancro and citadel.org + * (c) 2009-2020 by Art Cancro and citadel.org * This program is open source. It runs great on the Linux operating system. * It's released under the General Public License (GPL) version 3. */ @@ -17,58 +17,46 @@ typedef struct { } COMMAND; COMMAND commands[] = { - {"?", cmd_help, "Display this message"}, - {"help", cmd_help, "Display this message"}, - {"date", cmd_datetime, "Print the server's date and time"}, - {"config", cmd_config, "Configure the Citadel server"}, - {"export", cmd_export, "Export all Citadel databases"}, - {"shutdown", cmd_shutdown, "Shut down the Citadel server"}, - {"time", cmd_datetime, "Print the server's date and time"}, - {"passwd", cmd_passwd, "Set or change an account password"}, - {"who", cmd_who, "Display a list of online users"}, - {"mailq", cmd_mailq, "Show the outbound email queue"}, - {NULL, NULL, NULL} + { "?", cmd_help, "Display this message" }, + { "help", cmd_help, "Display this message" }, + { "date", cmd_datetime, "Print the server's date and time" }, + { "config", cmd_config, "Configure the Citadel server" }, + { "export", cmd_export, "Export all Citadel databases" }, + { "shutdown", cmd_shutdown, "Shut down the Citadel server" }, + { "time", cmd_datetime, "Print the server's date and time" }, + { "passwd", cmd_passwd, "Set or change an account password" }, + { "who", cmd_who, "Display a list of online users" }, + { "mailq", cmd_mailq, "Show the outbound email queue" }, + { NULL, NULL, NULL } }; -struct wow { - char *cmd[5]; // increase this if we need to have larger commands - char *description; -}; - -struct wow wows[] = { - {{ "help" } , "list available commands" }, - {{ "date" } , "print the server's date and time" }, - {{ "show", "eggs" } , "show how many eggs are available for serving" }, - {{ "kill", "mark", "zuckerberg" } , "die motherfucker die" }, - {{ "show", "undead", "zombies", "real" } , "show how many zombies are actually undead" }, - {{ "show", "undead", "zombies", "hollywood" } , "show how many zombies are hollywood communists" }, - {{ NULL } , "NULL" } -}; - - -int num_wows = sizeof(wows) / sizeof(struct wow); - - - - - int cmd_help(int sock, char *cmdbuf) { int i; - for (i = 0; wows[i].cmd[0]; ++i) { - printf("%-10s %s\n", wows[i].cmd[0], wows[i].description); + for (i = 0; commands[i].func != NULL; ++i) { + printf("%10s %s\n", commands[i].name, commands[i].doc); } } -/* Auto-completer function */ -char *command_generator(const char *text, int state) +int do_one_command(int server_socket, char *cmd) +{ + int i; + int ret; + for (i = 0; commands[i].func != NULL; ++i) { + if (!strncasecmp(cmd, commands[i].name, strlen(commands[i].name))) { + ret = (*commands[i].func) (server_socket, cmd); + } + } + return ret; +} + +char *command_name_generator(const char *text, int state) { - static int list_index; - static int len; + static int list_index, len; char *name; if (!state) { @@ -76,44 +64,20 @@ char *command_generator(const char *text, int state) len = strlen(text); } - while (name = commands[list_index].name) { - ++list_index; - - if (!strncmp(name, text, len)) { - return (strdup(name)); + while (name = commands[list_index++].name) { + if (strncmp(name, text, len) == 0) { + return strdup(name); } } - return (NULL); + return NULL; } -/* Auto-completer function */ -char **ctdlsh_completion(const char *text, int start, int end) +char **command_name_completion(const char *text, int start, int end) { - char **matches = (char **) NULL; - - rl_completer_word_break_characters = " "; - if (start == 0) { - matches = rl_completion_matches(text, command_generator); - } else { - rl_bind_key('\t', rl_abort); - } - - return (matches); -} - - -int do_one_command(int server_socket, char *cmd) -{ - int i; - int ret; - for (i = 0; commands[i].func != NULL; ++i) { - if (!strncasecmp(cmd, commands[i].name, strlen(commands[i].name))) { - ret = (*commands[i].func) (server_socket, cmd); - } - } - return ret; + rl_attempted_completion_over = 1; + return rl_completion_matches(text, command_name_generator); } @@ -126,7 +90,6 @@ void do_main_loop(int server_socket) int i; int ret = (-1); - strcpy(prompt, "> "); /* Do an INFO command and learn the hostname for the prompt */ @@ -134,7 +97,8 @@ void do_main_loop(int server_socket) sock_getln(server_socket, buf, sizeof buf); if (buf[0] == '1') { i = 0; - while (sock_getln(server_socket, buf, sizeof buf), strcmp(buf, "000")) { + while (sock_getln(server_socket, buf, sizeof buf), + strcmp(buf, "000")) { if (i == 1) { sprintf(prompt, "\n%s> ", buf); } @@ -142,11 +106,9 @@ void do_main_loop(int server_socket) } } - /* Tell libreadline how we will help with auto-completion of commands */ - rl_attempted_completion_function = ctdlsh_completion; - /* Here we go ... main command loop */ - while ( (cmd = readline(prompt)) , cmd ) { + rl_attempted_completion_function = command_name_completion; + while ((cmd = readline(prompt)), cmd) { if (*cmd) { add_history(cmd); ret = do_one_command(server_socket, cmd); @@ -182,9 +144,10 @@ int main(int argc, char **argv) int is_interactive = ((strlen(cmd) == 0) ? 1 : 0); if (is_interactive) { - printf("\nCitadel administration shell (c) 2009-2019 by citadel.org\n" - "This is open source software made available to you under the terms\n" - "of the GNU General Public License v3. All other rights reserved.\n"); + printf + ("\nCitadel administration shell (c) 2009-2020 by citadel.org\n" + "This is open source software made available to you under the terms\n" + "of the GNU General Public License v3. All other rights reserved.\n"); printf("Connecting to Citadel server in %s...\n", ctdldir); }