summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2001-03-16 19:35:07 +0000
committerphk <phk@FreeBSD.org>2001-03-16 19:35:07 +0000
commit4c843bf603e3536ed17e7f600572fd63d94592d1 (patch)
tree6c794f30879bb14eeb51bce18888ca9ba4938ed1 /usr.sbin
parent7e2b960721c72e72639ea828c5fe48c267966e12 (diff)
downloadFreeBSD-src-4c843bf603e3536ed17e7f600572fd63d94592d1.zip
FreeBSD-src-4c843bf603e3536ed17e7f600572fd63d94592d1.tar.gz
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)
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/ngctl/Makefile2
-rw-r--r--usr.sbin/ngctl/main.c60
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 <bsd.prog.mk>
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 <histedit.h>
#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 *
OpenPOWER on IntegriCloud