aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorErik Andersen <andersen@codepoet.org>2000-04-21 01:26:49 +0000
committerErik Andersen <andersen@codepoet.org>2000-04-21 01:26:49 +0000
commit1d1d95051a288b6bf64498aac9fb20047f384b7d (patch)
tree2c99ce8ba7d4d592806fbf81899e663bc884676b /shell
parentcf8d38a3eb46f4f9c4e674d43cff486cd79c9c0f (diff)
downloadbusybox-w32-1d1d95051a288b6bf64498aac9fb20047f384b7d.tar.gz
busybox-w32-1d1d95051a288b6bf64498aac9fb20047f384b7d.tar.bz2
busybox-w32-1d1d95051a288b6bf64498aac9fb20047f384b7d.zip
More Doc updates. cmdedit and more termio fixes.
Diffstat (limited to 'shell')
-rw-r--r--shell/cmdedit.c74
-rw-r--r--shell/cmdedit.h2
-rw-r--r--shell/lash.c1
3 files changed, 57 insertions, 20 deletions
diff --git a/shell/cmdedit.c b/shell/cmdedit.c
index ebc6b9696..e4c88c265 100644
--- a/shell/cmdedit.c
+++ b/shell/cmdedit.c
@@ -39,7 +39,7 @@
39#include <unistd.h> 39#include <unistd.h>
40#include <stdlib.h> 40#include <stdlib.h>
41#include <string.h> 41#include <string.h>
42#include <termio.h> 42#include <sys/ioctl.h>
43#include <ctype.h> 43#include <ctype.h>
44#include <signal.h> 44#include <signal.h>
45 45
@@ -53,7 +53,26 @@
53 53
54static struct history *his_front = NULL; /* First element in command line list */ 54static struct history *his_front = NULL; /* First element in command line list */
55static struct history *his_end = NULL; /* Last element in command line list */ 55static struct history *his_end = NULL; /* Last element in command line list */
56static struct termio old_term, new_term; /* Current termio and the previous termio before starting ash */ 56
57/* ED: sparc termios is broken: revert back to old termio handling. */
58#ifdef BB_FEATURE_USE_TERMIOS
59
60#if #cpu(sparc)
61# include <termio.h>
62# define termios termio
63# define setTermSettings(fd,argp) ioctl(fd,TCSETAF,argp)
64# define getTermSettings(fd,argp) ioctl(fd,TCGETA,argp)
65#else
66# include <termios.h>
67# define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp)
68# define getTermSettings(fd,argp) tcgetattr(fd, argp);
69#endif
70
71/* Current termio and the previous termio before starting sh */
72struct termios initial_settings, new_settings;
73#endif
74
75
57 76
58static int cmdedit_termw = 80; /* actual terminal width */ 77static int cmdedit_termw = 80; /* actual terminal width */
59static int cmdedit_scroll = 27; /* width of EOL scrolling region */ 78static int cmdedit_scroll = 27; /* width of EOL scrolling region */
@@ -84,14 +103,15 @@ void cmdedit_reset_term(void)
84{ 103{
85 if (reset_term) 104 if (reset_term)
86 /* sparc and other have broken termios support: use old termio handling. */ 105 /* sparc and other have broken termios support: use old termio handling. */
87 ioctl(fileno(stdin), TCSETA, (void *) &old_term); 106 setTermSettings(fileno(stdin), (void*) &initial_settings);
88} 107}
89 108
90void clean_up_and_die(int sig) 109void clean_up_and_die(int sig)
91{ 110{
92 cmdedit_reset_term(); 111 cmdedit_reset_term();
93 fprintf(stdout, "\n"); 112 fprintf(stdout, "\n");
94 exit(TRUE); 113 if (sig!=SIGINT)
114 exit(TRUE);
95} 115}
96 116
97/* Go to HOME position */ 117/* Go to HOME position */
@@ -233,7 +253,7 @@ char** exe_n_cwd_tab_completion(char* command, int *num_matches)
233 return (matches); 253 return (matches);
234} 254}
235 255
236void input_tab(char* command, int outputFd, int *cursor, int *len) 256void input_tab(char* command, char* prompt, int outputFd, int *cursor, int *len)
237{ 257{
238 /* Do TAB completion */ 258 /* Do TAB completion */
239 static int num_matches=0; 259 static int num_matches=0;
@@ -379,19 +399,17 @@ extern void cmdedit_read_input(char* prompt, char command[BUFSIZ])
379 399
380 memset(command, 0, sizeof(command)); 400 memset(command, 0, sizeof(command));
381 if (!reset_term) { 401 if (!reset_term) {
382 /* sparc and other have broken termios support: use old termio handling. */ 402
383 ioctl(inputFd, TCGETA, (void *) &old_term); 403 getTermSettings(inputFd, (void*) &initial_settings);
384 memcpy(&new_term, &old_term, sizeof(struct termio)); 404 memcpy(&new_settings, &initial_settings, sizeof(struct termios));
385 405 new_settings.c_cc[VMIN] = 1;
386 new_term.c_cc[VMIN] = 1; 406 new_settings.c_cc[VTIME] = 0;
387 new_term.c_cc[VTIME] = 0; 407 new_settings.c_cc[VINTR] = _POSIX_VDISABLE; /* Turn off CTRL-C, so we can trap it */
388 new_term.c_lflag &= ~ICANON; /* unbuffered input */ 408 new_settings.c_lflag &= ~ICANON; /* unbuffered input */
389 new_term.c_lflag &= ~ECHO; 409 new_settings.c_lflag &= ~(ECHO|ECHOCTL|ECHONL); /* Turn off echoing */
390 reset_term = 1; 410 reset_term = 1;
391 ioctl(inputFd, TCSETA, (void *) &new_term);
392 } else {
393 ioctl(inputFd, TCSETA, (void *) &new_term);
394 } 411 }
412 setTermSettings(inputFd, (void*) &new_settings);
395 413
396 memset(command, 0, BUFSIZ); 414 memset(command, 0, BUFSIZ);
397 415
@@ -399,6 +417,7 @@ extern void cmdedit_read_input(char* prompt, char command[BUFSIZ])
399 417
400 if ((ret = read(inputFd, &c, 1)) < 1) 418 if ((ret = read(inputFd, &c, 1)) < 1)
401 return; 419 return;
420 //fprintf(stderr, "got a '%c' (%d)\n", c, c);
402 421
403 switch (c) { 422 switch (c) {
404 case '\n': 423 case '\n':
@@ -415,6 +434,21 @@ extern void cmdedit_read_input(char* prompt, char command[BUFSIZ])
415 /* Control-b -- Move back one character */ 434 /* Control-b -- Move back one character */
416 input_backward(outputFd, &cursor); 435 input_backward(outputFd, &cursor);
417 break; 436 break;
437 case 3:
438 /* Control-c -- leave the current line,
439 * and start over on the next line */
440
441 /* Go to the next line */
442 xwrite(outputFd, "\n", 1);
443
444 /* Rewrite the prompt */
445 xwrite(outputFd, prompt, strlen(prompt));
446
447 /* Reset the command string */
448 memset(command, 0, sizeof(command));
449 len = cursor = 0;
450
451 break;
418 case 4: 452 case 4:
419 /* Control-d -- Delete one character, or exit 453 /* Control-d -- Delete one character, or exit
420 * if the len=0 and no chars to delete */ 454 * if the len=0 and no chars to delete */
@@ -435,12 +469,12 @@ extern void cmdedit_read_input(char* prompt, char command[BUFSIZ])
435 break; 469 break;
436 case '\b': 470 case '\b':
437 case DEL: 471 case DEL:
438 /* control-h and DEL */ 472 /* Control-h and DEL */
439 input_backspace(command, outputFd, &cursor, &len); 473 input_backspace(command, outputFd, &cursor, &len);
440 break; 474 break;
441 case '\t': 475 case '\t':
442#ifdef BB_FEATURE_SH_TAB_COMPLETION 476#ifdef BB_FEATURE_SH_TAB_COMPLETION
443 input_tab(command, outputFd, &cursor, &len); 477 input_tab(command, prompt, outputFd, &cursor, &len);
444#endif 478#endif
445 break; 479 break;
446 case 14: 480 case 14:
@@ -591,8 +625,7 @@ extern void cmdedit_read_input(char* prompt, char command[BUFSIZ])
591 } 625 }
592 626
593 nr = len + 1; 627 nr = len + 1;
594 /* sparc and other have broken termios support: use old termio handling. */ 628 setTermSettings(inputFd, (void *) &initial_settings);
595 ioctl(inputFd, TCSETA, (void *) &old_term);
596 reset_term = 0; 629 reset_term = 0;
597 630
598 631
@@ -644,6 +677,7 @@ extern void cmdedit_read_input(char* prompt, char command[BUFSIZ])
644extern void cmdedit_init(void) 677extern void cmdedit_init(void)
645{ 678{
646 atexit(cmdedit_reset_term); 679 atexit(cmdedit_reset_term);
680 signal(SIGKILL, clean_up_and_die);
647 signal(SIGINT, clean_up_and_die); 681 signal(SIGINT, clean_up_and_die);
648 signal(SIGQUIT, clean_up_and_die); 682 signal(SIGQUIT, clean_up_and_die);
649 signal(SIGTERM, clean_up_and_die); 683 signal(SIGTERM, clean_up_and_die);
diff --git a/shell/cmdedit.h b/shell/cmdedit.h
index 0e465e50e..9ac7daca3 100644
--- a/shell/cmdedit.h
+++ b/shell/cmdedit.h
@@ -10,6 +10,7 @@
10 10
11typedef size_t (*cmdedit_strwidth_proc)(char *); 11typedef size_t (*cmdedit_strwidth_proc)(char *);
12 12
13void cmdedit_init(void);
13void cmdedit_read_input(char* promptStr, char* command); /* read a line of input */ 14void cmdedit_read_input(char* promptStr, char* command); /* read a line of input */
14void cmdedit_setwidth(int); /* specify width of screen */ 15void cmdedit_setwidth(int); /* specify width of screen */
15void cmdedit_histadd(char *); /* adds entries to hist */ 16void cmdedit_histadd(char *); /* adds entries to hist */
@@ -21,6 +22,7 @@ extern int (*cmdedit_tab_hook)(char *, int, int *);
21 22
22#else /* not __STDC__ */ 23#else /* not __STDC__ */
23 24
25void cmdedit_init(void);
24void cmdedit_read_input(char* promptStr, char* command); 26void cmdedit_read_input(char* promptStr, char* command);
25void cmdedit_setwidth(); 27void cmdedit_setwidth();
26void cmdedit_histadd(); 28void cmdedit_histadd();
diff --git a/shell/lash.c b/shell/lash.c
index 97db8afaf..b96b46456 100644
--- a/shell/lash.c
+++ b/shell/lash.c
@@ -947,6 +947,7 @@ int shell_main(int argc, char **argv)
947 getcwd(cwd, sizeof(cwd)); 947 getcwd(cwd, sizeof(cwd));
948 948
949#ifdef BB_FEATURE_SH_COMMAND_EDITING 949#ifdef BB_FEATURE_SH_COMMAND_EDITING
950 cmdedit_init();
950 signal(SIGWINCH, win_changed); 951 signal(SIGWINCH, win_changed);
951 win_changed(0); 952 win_changed(0);
952#endif 953#endif