hostap/src/utils/edit_simple.c
Jouni Malinen 21611ea9fd edit: Increase buffer size to 4096 bytes
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>
2014-03-31 12:30:50 +03:00

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);
}