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)
This commit is contained in:
parent
7e2b960721
commit
4c843bf603
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
@ -301,6 +311,42 @@ DoCommand(int ac, char **av)
|
||||
return(rtn);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user