21611ea9fd
wpa_supplicant and wpa_cli had already moved to allowing up to 4096 byte buffer size to be used for control interface commands. This was limited by the line edit buffer in interactive mode. Increase that limit to match the other buffers to avoid artificially truncating long commands. Signed-off-by: Jouni Malinen <j@w1.fi>
92 lines
1.7 KiB
C
92 lines
1.7 KiB
C
/*
|
|
* Minimal command line editing
|
|
* Copyright (c) 2010, Jouni Malinen <j@w1.fi>
|
|
*
|
|
* This software may be distributed under the terms of the BSD license.
|
|
* See README for more details.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
|
|
#include "common.h"
|
|
#include "eloop.h"
|
|
#include "edit.h"
|
|
|
|
|
|
#define CMD_BUF_LEN 4096
|
|
static char cmdbuf[CMD_BUF_LEN];
|
|
static int cmdbuf_pos = 0;
|
|
static const char *ps2 = NULL;
|
|
|
|
static void *edit_cb_ctx;
|
|
static void (*edit_cmd_cb)(void *ctx, char *cmd);
|
|
static void (*edit_eof_cb)(void *ctx);
|
|
|
|
|
|
static void edit_read_char(int sock, void *eloop_ctx, void *sock_ctx)
|
|
{
|
|
int c;
|
|
unsigned char buf[1];
|
|
int res;
|
|
|
|
res = read(sock, buf, 1);
|
|
if (res < 0)
|
|
perror("read");
|
|
if (res <= 0) {
|
|
edit_eof_cb(edit_cb_ctx);
|
|
return;
|
|
}
|
|
c = buf[0];
|
|
|
|
if (c == '\r' || c == '\n') {
|
|
cmdbuf[cmdbuf_pos] = '\0';
|
|
cmdbuf_pos = 0;
|
|
edit_cmd_cb(edit_cb_ctx, cmdbuf);
|
|
printf("%s> ", ps2 ? ps2 : "");
|
|
fflush(stdout);
|
|
return;
|
|
}
|
|
|
|
if (c >= 32 && c <= 255) {
|
|
if (cmdbuf_pos < (int) sizeof(cmdbuf) - 1) {
|
|
cmdbuf[cmdbuf_pos++] = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int edit_init(void (*cmd_cb)(void *ctx, char *cmd),
|
|
void (*eof_cb)(void *ctx),
|
|
char ** (*completion_cb)(void *ctx, const char *cmd, int pos),
|
|
void *ctx, const char *history_file, const char *ps)
|
|
{
|
|
edit_cb_ctx = ctx;
|
|
edit_cmd_cb = cmd_cb;
|
|
edit_eof_cb = eof_cb;
|
|
eloop_register_read_sock(STDIN_FILENO, edit_read_char, NULL, NULL);
|
|
ps2 = ps;
|
|
|
|
printf("%s> ", ps2 ? ps2 : "");
|
|
fflush(stdout);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void edit_deinit(const char *history_file,
|
|
int (*filter_cb)(void *ctx, const char *cmd))
|
|
{
|
|
eloop_unregister_read_sock(STDIN_FILENO);
|
|
}
|
|
|
|
|
|
void edit_clear_line(void)
|
|
{
|
|
}
|
|
|
|
|
|
void edit_redraw(void)
|
|
{
|
|
cmdbuf[cmdbuf_pos] = '\0';
|
|
printf("\r> %s", cmdbuf);
|
|
}
|