Home | History | Annotate | Download | only in utils
      1 /*
      2  * Minimal command line editing
      3  * Copyright (c) 2010, Jouni Malinen <j (at) w1.fi>
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License version 2 as
      7  * published by the Free Software Foundation.
      8  *
      9  * Alternatively, this software may be distributed under the terms of BSD
     10  * license.
     11  *
     12  * See README and COPYING for more details.
     13  */
     14 
     15 #include "includes.h"
     16 
     17 #include "common.h"
     18 #include "eloop.h"
     19 #include "edit.h"
     20 
     21 
     22 #define CMD_BUF_LEN 256
     23 static char cmdbuf[CMD_BUF_LEN];
     24 static int cmdbuf_pos = 0;
     25 
     26 static void *edit_cb_ctx;
     27 static void (*edit_cmd_cb)(void *ctx, char *cmd);
     28 static void (*edit_eof_cb)(void *ctx);
     29 
     30 
     31 static void edit_read_char(int sock, void *eloop_ctx, void *sock_ctx)
     32 {
     33 	int c;
     34 	unsigned char buf[1];
     35 	int res;
     36 
     37 	res = read(sock, buf, 1);
     38 	if (res < 0)
     39 		perror("read");
     40 	if (res <= 0) {
     41 		edit_eof_cb(edit_cb_ctx);
     42 		return;
     43 	}
     44 	c = buf[0];
     45 
     46 	if (c == '\r' || c == '\n') {
     47 		cmdbuf[cmdbuf_pos] = '\0';
     48 		cmdbuf_pos = 0;
     49 		edit_cmd_cb(edit_cb_ctx, cmdbuf);
     50 		printf("> ");
     51 		fflush(stdout);
     52 		return;
     53 	}
     54 
     55 	if (c >= 32 && c <= 255) {
     56 		if (cmdbuf_pos < (int) sizeof(cmdbuf) - 1) {
     57 			cmdbuf[cmdbuf_pos++] = c;
     58 		}
     59 	}
     60 }
     61 
     62 
     63 int edit_init(void (*cmd_cb)(void *ctx, char *cmd),
     64 	      void (*eof_cb)(void *ctx),
     65 	      char ** (*completion_cb)(void *ctx, const char *cmd, int pos),
     66 	      void *ctx, const char *history_file)
     67 {
     68 	edit_cb_ctx = ctx;
     69 	edit_cmd_cb = cmd_cb;
     70 	edit_eof_cb = eof_cb;
     71 	eloop_register_read_sock(STDIN_FILENO, edit_read_char, NULL, NULL);
     72 
     73 	printf("> ");
     74 	fflush(stdout);
     75 
     76 	return 0;
     77 }
     78 
     79 
     80 void edit_deinit(const char *history_file,
     81 		 int (*filter_cb)(void *ctx, const char *cmd))
     82 {
     83 	eloop_unregister_read_sock(STDIN_FILENO);
     84 }
     85 
     86 
     87 void edit_clear_line(void)
     88 {
     89 }
     90 
     91 
     92 void edit_redraw(void)
     93 {
     94 	cmdbuf[cmdbuf_pos] = '\0';
     95 	printf("\r> %s", cmdbuf);
     96 }
     97