aboutsummaryrefslogtreecommitdiff
path: root/coreutils/ls.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-01-26 01:52:43 +0000
committerEric Andersen <andersen@codepoet.org>2001-01-26 01:52:43 +0000
commit5307eca7de2caf1d4efb8ee3e802a69a1a076376 (patch)
tree2886cc812856a1f2fa060cdaaf224810e99e3ff0 /coreutils/ls.c
parent114ad9c753aeefac32a2d53b861790a4ecd5da30 (diff)
downloadbusybox-w32-5307eca7de2caf1d4efb8ee3e802a69a1a076376.tar.gz
busybox-w32-5307eca7de2caf1d4efb8ee3e802a69a1a076376.tar.bz2
busybox-w32-5307eca7de2caf1d4efb8ee3e802a69a1a076376.zip
Make ls understand termios.
-Erik
Diffstat (limited to 'coreutils/ls.c')
-rw-r--r--coreutils/ls.c61
1 files changed, 60 insertions, 1 deletions
diff --git a/coreutils/ls.c b/coreutils/ls.c
index 64e5bf828..215c58bb6 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -60,6 +60,10 @@ static const int COLUMN_GAP = 2; /* includes the file type char, if present */
60#endif 60#endif
61#include <string.h> 61#include <string.h>
62 62
63#include <fcntl.h>
64#include <signal.h>
65#include <sys/ioctl.h>
66
63#ifndef NAJOR 67#ifndef NAJOR
64#define MAJOR(dev) (((dev)>>8)&0xff) 68#define MAJOR(dev) (((dev)>>8)&0xff)
65#define MINOR(dev) ((dev)&0xff) 69#define MINOR(dev) ((dev)&0xff)
@@ -181,6 +185,31 @@ static int status = EXIT_SUCCESS;
181unsigned long ls_disp_hr = KILOBYTE; 185unsigned long ls_disp_hr = KILOBYTE;
182#endif 186#endif
183 187
188/* sparc termios is broken -- use old termio handling. */
189#ifdef BB_FEATURE_USE_TERMIOS
190# if #cpu(sparc)
191# include <termio.h>
192# define termios termio
193# define setTermSettings(fd,argp) ioctl(fd,TCSETAF,argp)
194# define getTermSettings(fd,argp) ioctl(fd,TCGETA,argp)
195# else
196# include <termios.h>
197# define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp)
198# define getTermSettings(fd,argp) tcgetattr(fd, argp);
199# endif
200
201FILE *cin;
202
203static struct termios initial_settings, new_settings;
204
205static void gotsig(int sig)
206{
207 setTermSettings(fileno(cin), &initial_settings);
208 putchar('\n');
209 exit(EXIT_FAILURE);
210}
211#endif /* BB_FEATURE_USE_TERMIOS */
212
184static int my_stat(struct dnode *cur) 213static int my_stat(struct dnode *cur)
185{ 214{
186#ifdef BB_FEATURE_LS_FOLLOWLINKS 215#ifdef BB_FEATURE_LS_FOLLOWLINKS
@@ -707,6 +736,9 @@ extern int ls_main(int argc, char **argv)
707 int opt; 736 int opt;
708 int oi, ac; 737 int oi, ac;
709 char **av; 738 char **av;
739#if defined BB_FEATURE_AUTOWIDTH && defined BB_FEATURE_USE_TERMIOS
740 struct winsize win = { 0, 0, 0, 0 };
741#endif
710 742
711 disp_opts= DISP_NORMAL; 743 disp_opts= DISP_NORMAL;
712 style_fmt= STYLE_AUTO; 744 style_fmt= STYLE_AUTO;
@@ -719,10 +751,34 @@ extern int ls_main(int argc, char **argv)
719 time_fmt= TIME_MOD; 751 time_fmt= TIME_MOD;
720#endif 752#endif
721#ifdef BB_FEATURE_AUTOWIDTH 753#ifdef BB_FEATURE_AUTOWIDTH
754#ifdef BB_FEATURE_USE_TERMIOS
755 cin = fopen("/dev/tty", "r");
756 if (!cin)
757 cin = fopen("/dev/console", "r");
758 getTermSettings(fileno(cin), &initial_settings);
759 new_settings = initial_settings;
760 new_settings.c_cc[VMIN] = 1;
761 new_settings.c_cc[VTIME] = 0;
762 new_settings.c_lflag &= ~ICANON;
763 new_settings.c_lflag &= ~ECHO;
764 setTermSettings(fileno(cin), &new_settings);
765
766 ioctl(fileno(stdout), TIOCGWINSZ, &win);
767 if (win.ws_row > 4)
768 column_width = win.ws_row - 2;
769 if (win.ws_col > 0)
770 terminal_width = win.ws_col - 1;
771
772 (void) signal(SIGINT, gotsig);
773 (void) signal(SIGQUIT, gotsig);
774 (void) signal(SIGTERM, gotsig);
775#else
776
722 terminal_width = TERMINAL_WIDTH; 777 terminal_width = TERMINAL_WIDTH;
723 column_width = COLUMN_WIDTH; 778 column_width = COLUMN_WIDTH;
724 tabstops = 8;
725#endif 779#endif
780#endif
781 tabstops = 8;
726 nfiles=0; 782 nfiles=0;
727 783
728 /* process options */ 784 /* process options */
@@ -908,6 +964,9 @@ extern int ls_main(int argc, char **argv)
908 } 964 }
909 } 965 }
910 966
967#ifdef BB_FEATURE_USE_TERMIOS
968 gotsig(0);
969#endif
911 return(status); 970 return(status);
912 971
913 print_usage_message: 972 print_usage_message: