From 4c843bf603e3536ed17e7f600572fd63d94592d1 Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 16 Mar 2001 19:35:07 +0000 Subject: Add -ledit to ngctl. Somebody submitted this long time ago, and it has been sitting in my tree for months because I thought archie would pick it up. Submitted by: (sorry, lost track) --- usr.sbin/ngctl/Makefile | 2 +- usr.sbin/ngctl/main.c | 60 +++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/usr.sbin/ngctl/Makefile b/usr.sbin/ngctl/Makefile index d8dee7c..9565b15 100644 --- a/usr.sbin/ngctl/Makefile +++ b/usr.sbin/ngctl/Makefile @@ -6,7 +6,7 @@ SRCS= main.c mkpeer.c config.c connect.c name.c show.c list.c \ msg.c debug.c shutdown.c rmhook.c status.c types.c MAN8= ngctl.8 DPADD+= ${LIBNETGRAPH} -LDADD+= -lnetgraph +LDADD+= -lnetgraph -ledit COPTS+= -Wall .include diff --git a/usr.sbin/ngctl/main.c b/usr.sbin/ngctl/main.c index 5e9411c..93dfed3 100644 --- a/usr.sbin/ngctl/main.c +++ b/usr.sbin/ngctl/main.c @@ -39,23 +39,27 @@ */ #include "ngctl.h" +#include #define PROMPT "+ " #define MAX_ARGS 512 #define WHITESPACE " \t\r\n\v\f" #define DUMP_BYTES_PER_LINE 16 +#define HISTSIZE 100 /* Internal functions */ static int ReadFile(FILE *fp); static int DoParseCommand(char *line); static int DoCommand(int ac, char **av); static int DoInteractive(void); +static int DoEditLine(void); static const struct ngcmd *FindCommand(const char *string); static int MatchCommand(const struct ngcmd *cmd, const char *s); static void Usage(const char *msg); static int ReadCmd(int ac, char **av); static int HelpCmd(int ac, char **av); static int QuitCmd(int ac, char **av); +static char * prompt(EditLine *el); /* List of commands */ static const struct ngcmd *const cmds[] = { @@ -103,6 +107,18 @@ const struct ngcmd quit_cmd = { /* Our control and data sockets */ int csock, dsock; +/* Provide editline(3) functionality */ +static EditLine *el = NULL; + +/* + * EL_PROMPT expects a function for the prompt + */ +static char * +prompt(EditLine *el) +{ + return PROMPT; +} + /* * main() */ @@ -252,13 +268,7 @@ DoInteractive(void) /* Get any user input */ if (FD_ISSET(0, &rfds)) { - char buf[LINE_MAX]; - - if (fgets(buf, sizeof(buf), stdin) == NULL) { - printf("\n"); - break; - } - if (DoParseCommand(buf) == CMDRTN_QUIT) + if (DoEditLine() == CMDRTN_QUIT) break; } } @@ -302,6 +312,42 @@ DoCommand(int ac, char **av) } /* + * Handle user input with editline(3) + */ +static int +DoEditLine(void) +{ + int num; + char *av = "ngctl"; + const char *buf; + History *hist; + + hist = history_init(); /* Initialize history */ + history(hist, H_EVENT, HISTSIZE); /* Size of history */ + + el = el_init(av, stdin, stdout); /* Initialize editline */ + + el_set(el, EL_PROMPT, prompt); /* Set the prompt */ + el_set(el, EL_EDITOR, "vi"); /* Default editor is vi */ + el_set(el, EL_HIST, history, hist); /* Use history */ + el_set(el, EL_SIGNAL, 1); /* Handle signals properly */ + el_source(el, NULL); /* Source user defaults */ + + while ((buf = el_gets(el, &num)) != NULL && num != 0) { + + history(hist, H_ENTER, buf); /* Add command to history */ + + if (DoParseCommand((char *)buf) == CMDRTN_QUIT) + return (CMDRTN_QUIT); /* Handle "quit" command */ + } + + el_end(el); /* Clean up editline */ + history_end(hist); /* and history */ + + return 0; +} + +/* * Find a command */ static const struct ngcmd * -- cgit v1.1