aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-02-20 22:23:24 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-02-20 22:23:24 +0000
commite376d454bb70ed41bbc3eb0358d37fa30c94358d (patch)
treeeb53c600dcde841a7617a19f819ae3e9cfe7fd84 /shell
parentae86a338b89c1339588226cb2298e1785aaa7b90 (diff)
downloadbusybox-w32-e376d454bb70ed41bbc3eb0358d37fa30c94358d.tar.gz
busybox-w32-e376d454bb70ed41bbc3eb0358d37fa30c94358d.tar.bz2
busybox-w32-e376d454bb70ed41bbc3eb0358d37fa30c94358d.zip
libbb: introduce and use nonblock_safe_read(). Yay!
Our shells are immune from this nasty O_NONBLOCK now! function old new delta nonblock_safe_read - 78 +78 file_get 276 295 +19 generateMTFValues 428 435 +7 read_line_input 1776 1772 -4 preadbuffer 543 450 -93 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 2/2 up/down: 104/-97) Total: 7 bytes text data bss dec hex filename 615190 715 23924 639829 9c355 busybox_old 615168 715 23924 639807 9c33f busybox_unstripped
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c11
-rw-r--r--shell/hush.c8
-rw-r--r--shell/msh.c9
3 files changed, 16 insertions, 12 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 65f94f682..debe8ecdd 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -5428,7 +5428,7 @@ expbackq(union node *cmd, int quoted, int quotes)
5428 read: 5428 read:
5429 if (in.fd < 0) 5429 if (in.fd < 0)
5430 break; 5430 break;
5431 i = safe_read(in.fd, buf, sizeof(buf)); 5431 i = nonblock_safe_read(in.fd, buf, sizeof(buf));
5432 TRACE(("expbackq: read returns %d\n", i)); 5432 TRACE(("expbackq: read returns %d\n", i));
5433 if (i <= 0) 5433 if (i <= 0)
5434 break; 5434 break;
@@ -8678,7 +8678,7 @@ preadfd(void)
8678 retry: 8678 retry:
8679#if ENABLE_FEATURE_EDITING 8679#if ENABLE_FEATURE_EDITING
8680 if (!iflag || parsefile->fd) 8680 if (!iflag || parsefile->fd)
8681 nr = safe_read(parsefile->fd, buf, BUFSIZ - 1); 8681 nr = nonblock_safe_read(parsefile->fd, buf, BUFSIZ - 1);
8682 else { 8682 else {
8683#if ENABLE_FEATURE_TAB_COMPLETION 8683#if ENABLE_FEATURE_TAB_COMPLETION
8684 line_input_state->path_lookup = pathval(); 8684 line_input_state->path_lookup = pathval();
@@ -8700,9 +8700,11 @@ preadfd(void)
8700 } 8700 }
8701 } 8701 }
8702#else 8702#else
8703 nr = safe_read(parsefile->fd, buf, BUFSIZ - 1); 8703 nr = nonblock_safe_read(parsefile->fd, buf, BUFSIZ - 1);
8704#endif 8704#endif
8705 8705
8706#if 0
8707/* nonblock_safe_read() handles this problem */
8706 if (nr < 0) { 8708 if (nr < 0) {
8707 if (parsefile->fd == 0 && errno == EWOULDBLOCK) { 8709 if (parsefile->fd == 0 && errno == EWOULDBLOCK) {
8708 int flags = fcntl(0, F_GETFL); 8710 int flags = fcntl(0, F_GETFL);
@@ -8715,6 +8717,7 @@ preadfd(void)
8715 } 8717 }
8716 } 8718 }
8717 } 8719 }
8720#endif
8718 return nr; 8721 return nr;
8719} 8722}
8720 8723
@@ -11801,7 +11804,7 @@ readcmd(int argc, char **argv)
11801 backslash = 0; 11804 backslash = 0;
11802 STARTSTACKSTR(p); 11805 STARTSTACKSTR(p);
11803 do { 11806 do {
11804 if (read(0, &c, 1) != 1) { 11807 if (nonblock_safe_read(0, &c, 1) != 1) {
11805 status = 1; 11808 status = 1;
11806 break; 11809 break;
11807 } 11810 }
diff --git a/shell/hush.c b/shell/hush.c
index 4d4843173..820fd888d 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -1273,10 +1273,10 @@ static void get_user_input(struct in_str *i)
1273 prompt_str = setup_prompt_string(i->promptmode); 1273 prompt_str = setup_prompt_string(i->promptmode);
1274#if ENABLE_FEATURE_EDITING 1274#if ENABLE_FEATURE_EDITING
1275 /* Enable command line editing only while a command line 1275 /* Enable command line editing only while a command line
1276 * is actually being read; otherwise, we'll end up bequeathing 1276 * is actually being read */
1277 * atexit() handlers and other unwanted stuff to our 1277 do {
1278 * child processes (rob@sysgo.de) */ 1278 r = read_line_input(prompt_str, user_input_buf, BUFSIZ-1, line_input_state);
1279 r = read_line_input(prompt_str, user_input_buf, BUFSIZ-1, line_input_state); 1279 } while (r == 0); /* repeat if Ctrl-C */
1280 i->eof_flag = (r < 0); 1280 i->eof_flag = (r < 0);
1281 if (i->eof_flag) { /* EOF/error detected */ 1281 if (i->eof_flag) { /* EOF/error detected */
1282 user_input_buf[0] = EOF; /* yes, it will be truncated, it's ok */ 1282 user_input_buf[0] = EOF; /* yes, it will be truncated, it's ok */
diff --git a/shell/msh.c b/shell/msh.c
index fd287f16e..917b08a1e 100644
--- a/shell/msh.c
+++ b/shell/msh.c
@@ -42,6 +42,7 @@
42# define xmalloc(size) malloc(size) 42# define xmalloc(size) malloc(size)
43# define msh_main(argc,argv) main(argc,argv) 43# define msh_main(argc,argv) main(argc,argv)
44# define safe_read(fd,buf,count) read(fd,buf,count) 44# define safe_read(fd,buf,count) read(fd,buf,count)
45# define nonblock_safe_read(fd,buf,count) read(fd,buf,count)
45# define NOT_LONE_DASH(s) ((s)[0] != '-' || (s)[1]) 46# define NOT_LONE_DASH(s) ((s)[0] != '-' || (s)[1])
46# define LONE_CHAR(s,c) ((s)[0] == (c) && !(s)[1]) 47# define LONE_CHAR(s,c) ((s)[0] == (c) && !(s)[1])
47# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) 48# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
@@ -3376,7 +3377,7 @@ static int doread(struct op *t)
3376 } 3377 }
3377 for (wp = t->words + 1; *wp; wp++) { 3378 for (wp = t->words + 1; *wp; wp++) {
3378 for (cp = global_env.linep; !nl && cp < elinep - 1; cp++) { 3379 for (cp = global_env.linep; !nl && cp < elinep - 1; cp++) {
3379 nb = read(0, cp, sizeof(*cp)); 3380 nb = nonblock_safe_read(0, cp, sizeof(*cp));
3380 if (nb != sizeof(*cp)) 3381 if (nb != sizeof(*cp))
3381 break; 3382 break;
3382 nl = (*cp == '\n'); 3383 nl = (*cp == '\n');
@@ -4799,7 +4800,7 @@ static int filechar(struct ioarg *ap)
4799 if (i) 4800 if (i)
4800 lseek(ap->afile, ap->afpos, SEEK_SET); 4801 lseek(ap->afile, ap->afpos, SEEK_SET);
4801 4802
4802 i = safe_read(ap->afile, bp->buf, sizeof(bp->buf)); 4803 i = nonblock_safe_read(ap->afile, bp->buf, sizeof(bp->buf));
4803 if (i <= 0) { 4804 if (i <= 0) {
4804 closef(ap->afile); 4805 closef(ap->afile);
4805 return 0; 4806 return 0;
@@ -4830,7 +4831,7 @@ static int filechar(struct ioarg *ap)
4830 return c; 4831 return c;
4831 } 4832 }
4832#endif 4833#endif
4833 i = safe_read(ap->afile, &c, sizeof(c)); 4834 i = nonblock_safe_read(ap->afile, &c, sizeof(c));
4834 return i == sizeof(c) ? (c & 0x7f) : (closef(ap->afile), 0); 4835 return i == sizeof(c) ? (c & 0x7f) : (closef(ap->afile), 0);
4835} 4836}
4836 4837
@@ -4841,7 +4842,7 @@ static int herechar(struct ioarg *ap)
4841{ 4842{
4842 char c; 4843 char c;
4843 4844
4844 if (read(ap->afile, &c, sizeof(c)) != sizeof(c)) { 4845 if (nonblock_safe_read(ap->afile, &c, sizeof(c)) != sizeof(c)) {
4845 close(ap->afile); 4846 close(ap->afile);
4846 c = '\0'; 4847 c = '\0';
4847 } 4848 }