diff options
| author | andersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2000-11-14 21:59:22 +0000 |
|---|---|---|
| committer | andersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2000-11-14 21:59:22 +0000 |
| commit | 257cd1e2b05fa01eebbffd1c9f991742faa8e656 (patch) | |
| tree | 60440e241f5a393651914e5006857fd23bceda0f | |
| parent | 57997507c0af233d0746d08ca05f165fe893db8b (diff) | |
| download | busybox-w32-257cd1e2b05fa01eebbffd1c9f991742faa8e656.tar.gz busybox-w32-257cd1e2b05fa01eebbffd1c9f991742faa8e656.tar.bz2 busybox-w32-257cd1e2b05fa01eebbffd1c9f991742faa8e656.zip | |
Patch from Gennady Feldman <gfeldman@tradeline.net> to:
1. Opens redirections w/ the right access.
2. Doesn't do globbing for every single parameter (so it
doesn't stat every parameter).
git-svn-id: svn://busybox.net/trunk/busybox@1299 69ca8d6d-28ef-0310-b511-8ec308f3f277
| -rw-r--r-- | lash.c | 57 | ||||
| -rw-r--r-- | sh.c | 57 | ||||
| -rw-r--r-- | shell/lash.c | 57 |
3 files changed, 102 insertions, 69 deletions
| @@ -627,10 +627,10 @@ static int setupRedirections(struct childProgram *prog) | |||
| 627 | mode = O_RDONLY; | 627 | mode = O_RDONLY; |
| 628 | break; | 628 | break; |
| 629 | case REDIRECT_OVERWRITE: | 629 | case REDIRECT_OVERWRITE: |
| 630 | mode = O_RDWR | O_CREAT | O_TRUNC; | 630 | mode = O_WRONLY | O_CREAT | O_TRUNC; |
| 631 | break; | 631 | break; |
| 632 | case REDIRECT_APPEND: | 632 | case REDIRECT_APPEND: |
| 633 | mode = O_RDWR | O_CREAT | O_APPEND; | 633 | mode = O_WRONLY | O_CREAT | O_APPEND; |
| 634 | break; | 634 | break; |
| 635 | } | 635 | } |
| 636 | 636 | ||
| @@ -785,30 +785,42 @@ static void globLastArgument(struct childProgram *prog, int *argcPtr, | |||
| 785 | #endif | 785 | #endif |
| 786 | } | 786 | } |
| 787 | 787 | ||
| 788 | rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); | 788 | if (strpbrk(prog->argv[argc_l - 1],"*[]?")!= NULL){ |
| 789 | if (rc == GLOB_NOSPACE) { | 789 | rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); |
| 790 | errorMsg("out of space during glob operation\n"); | 790 | if (rc == GLOB_NOSPACE) { |
| 791 | return; | 791 | errorMsg("out of space during glob operation\n"); |
| 792 | } else if (rc == GLOB_NOMATCH || | 792 | return; |
| 793 | } else if (rc == GLOB_NOMATCH || | ||
| 793 | (!rc && (prog->globResult.gl_pathc - i) == 1 && | 794 | (!rc && (prog->globResult.gl_pathc - i) == 1 && |
| 794 | strcmp(prog->argv[argc_l - 1], | 795 | strcmp(prog->argv[argc_l - 1], |
| 795 | prog->globResult.gl_pathv[i]) == 0)) { | 796 | prog->globResult.gl_pathv[i]) == 0)) { |
| 796 | /* we need to remove whatever \ quoting is still present */ | 797 | /* we need to remove whatever \ quoting is still present */ |
| 797 | src = dst = prog->argv[argc_l - 1]; | 798 | src = dst = prog->argv[argc_l - 1]; |
| 798 | while (*src) { | 799 | while (*src) { |
| 799 | if (*src != '\\') | 800 | if (*src != '\\') |
| 800 | *dst++ = *src; | 801 | *dst++ = *src; |
| 801 | src++; | 802 | src++; |
| 803 | } | ||
| 804 | *dst = '\0'; | ||
| 805 | } else if (!rc) { | ||
| 806 | argcAlloced += (prog->globResult.gl_pathc - i); | ||
| 807 | prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); | ||
| 808 | memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, | ||
| 809 | sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); | ||
| 810 | argc_l += (prog->globResult.gl_pathc - i - 1); | ||
| 802 | } | 811 | } |
| 803 | *dst = '\0'; | 812 | }else{ |
| 804 | } else if (!rc) { | 813 | src = dst = prog->argv[argc_l - 1]; |
| 805 | argcAlloced += (prog->globResult.gl_pathc - i); | 814 | while (*src) { |
| 806 | prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); | 815 | if (*src != '\\') |
| 807 | memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, | 816 | *dst++ = *src; |
| 808 | sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); | 817 | src++; |
| 809 | argc_l += (prog->globResult.gl_pathc - i - 1); | 818 | } |
| 819 | *dst = '\0'; | ||
| 820 | prog->globResult.gl_pathc=0; | ||
| 821 | if (flags==0) | ||
| 822 | prog->globResult.gl_pathv=NULL; | ||
| 810 | } | 823 | } |
| 811 | |||
| 812 | *argcAllocedPtr = argcAlloced; | 824 | *argcAllocedPtr = argcAlloced; |
| 813 | *argcPtr = argc_l; | 825 | *argcPtr = argc_l; |
| 814 | } | 826 | } |
| @@ -1128,7 +1140,7 @@ static int parseCommand(char **commandPtr, struct job *job, struct jobSet *jobLi | |||
| 1128 | } | 1140 | } |
| 1129 | 1141 | ||
| 1130 | *commandPtr = returnCommand; | 1142 | *commandPtr = returnCommand; |
| 1131 | 1143 | ||
| 1132 | return 0; | 1144 | return 0; |
| 1133 | } | 1145 | } |
| 1134 | 1146 | ||
| @@ -1143,7 +1155,6 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int | |||
| 1143 | const struct BB_applet *a = applets; | 1155 | const struct BB_applet *a = applets; |
| 1144 | #endif | 1156 | #endif |
| 1145 | 1157 | ||
| 1146 | |||
| 1147 | nextin = 0, nextout = 1; | 1158 | nextin = 0, nextout = 1; |
| 1148 | for (i = 0; i < newJob->numProgs; i++) { | 1159 | for (i = 0; i < newJob->numProgs; i++) { |
| 1149 | if ((i + 1) < newJob->numProgs) { | 1160 | if ((i + 1) < newJob->numProgs) { |
| @@ -627,10 +627,10 @@ static int setupRedirections(struct childProgram *prog) | |||
| 627 | mode = O_RDONLY; | 627 | mode = O_RDONLY; |
| 628 | break; | 628 | break; |
| 629 | case REDIRECT_OVERWRITE: | 629 | case REDIRECT_OVERWRITE: |
| 630 | mode = O_RDWR | O_CREAT | O_TRUNC; | 630 | mode = O_WRONLY | O_CREAT | O_TRUNC; |
| 631 | break; | 631 | break; |
| 632 | case REDIRECT_APPEND: | 632 | case REDIRECT_APPEND: |
| 633 | mode = O_RDWR | O_CREAT | O_APPEND; | 633 | mode = O_WRONLY | O_CREAT | O_APPEND; |
| 634 | break; | 634 | break; |
| 635 | } | 635 | } |
| 636 | 636 | ||
| @@ -785,30 +785,42 @@ static void globLastArgument(struct childProgram *prog, int *argcPtr, | |||
| 785 | #endif | 785 | #endif |
| 786 | } | 786 | } |
| 787 | 787 | ||
| 788 | rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); | 788 | if (strpbrk(prog->argv[argc_l - 1],"*[]?")!= NULL){ |
| 789 | if (rc == GLOB_NOSPACE) { | 789 | rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); |
| 790 | errorMsg("out of space during glob operation\n"); | 790 | if (rc == GLOB_NOSPACE) { |
| 791 | return; | 791 | errorMsg("out of space during glob operation\n"); |
| 792 | } else if (rc == GLOB_NOMATCH || | 792 | return; |
| 793 | } else if (rc == GLOB_NOMATCH || | ||
| 793 | (!rc && (prog->globResult.gl_pathc - i) == 1 && | 794 | (!rc && (prog->globResult.gl_pathc - i) == 1 && |
| 794 | strcmp(prog->argv[argc_l - 1], | 795 | strcmp(prog->argv[argc_l - 1], |
| 795 | prog->globResult.gl_pathv[i]) == 0)) { | 796 | prog->globResult.gl_pathv[i]) == 0)) { |
| 796 | /* we need to remove whatever \ quoting is still present */ | 797 | /* we need to remove whatever \ quoting is still present */ |
| 797 | src = dst = prog->argv[argc_l - 1]; | 798 | src = dst = prog->argv[argc_l - 1]; |
| 798 | while (*src) { | 799 | while (*src) { |
| 799 | if (*src != '\\') | 800 | if (*src != '\\') |
| 800 | *dst++ = *src; | 801 | *dst++ = *src; |
| 801 | src++; | 802 | src++; |
| 803 | } | ||
| 804 | *dst = '\0'; | ||
| 805 | } else if (!rc) { | ||
| 806 | argcAlloced += (prog->globResult.gl_pathc - i); | ||
| 807 | prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); | ||
| 808 | memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, | ||
| 809 | sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); | ||
| 810 | argc_l += (prog->globResult.gl_pathc - i - 1); | ||
| 802 | } | 811 | } |
| 803 | *dst = '\0'; | 812 | }else{ |
| 804 | } else if (!rc) { | 813 | src = dst = prog->argv[argc_l - 1]; |
| 805 | argcAlloced += (prog->globResult.gl_pathc - i); | 814 | while (*src) { |
| 806 | prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); | 815 | if (*src != '\\') |
| 807 | memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, | 816 | *dst++ = *src; |
| 808 | sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); | 817 | src++; |
| 809 | argc_l += (prog->globResult.gl_pathc - i - 1); | 818 | } |
| 819 | *dst = '\0'; | ||
| 820 | prog->globResult.gl_pathc=0; | ||
| 821 | if (flags==0) | ||
| 822 | prog->globResult.gl_pathv=NULL; | ||
| 810 | } | 823 | } |
| 811 | |||
| 812 | *argcAllocedPtr = argcAlloced; | 824 | *argcAllocedPtr = argcAlloced; |
| 813 | *argcPtr = argc_l; | 825 | *argcPtr = argc_l; |
| 814 | } | 826 | } |
| @@ -1128,7 +1140,7 @@ static int parseCommand(char **commandPtr, struct job *job, struct jobSet *jobLi | |||
| 1128 | } | 1140 | } |
| 1129 | 1141 | ||
| 1130 | *commandPtr = returnCommand; | 1142 | *commandPtr = returnCommand; |
| 1131 | 1143 | ||
| 1132 | return 0; | 1144 | return 0; |
| 1133 | } | 1145 | } |
| 1134 | 1146 | ||
| @@ -1143,7 +1155,6 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int | |||
| 1143 | const struct BB_applet *a = applets; | 1155 | const struct BB_applet *a = applets; |
| 1144 | #endif | 1156 | #endif |
| 1145 | 1157 | ||
| 1146 | |||
| 1147 | nextin = 0, nextout = 1; | 1158 | nextin = 0, nextout = 1; |
| 1148 | for (i = 0; i < newJob->numProgs; i++) { | 1159 | for (i = 0; i < newJob->numProgs; i++) { |
| 1149 | if ((i + 1) < newJob->numProgs) { | 1160 | if ((i + 1) < newJob->numProgs) { |
diff --git a/shell/lash.c b/shell/lash.c index b10614259..7a8810aef 100644 --- a/shell/lash.c +++ b/shell/lash.c | |||
| @@ -627,10 +627,10 @@ static int setupRedirections(struct childProgram *prog) | |||
| 627 | mode = O_RDONLY; | 627 | mode = O_RDONLY; |
| 628 | break; | 628 | break; |
| 629 | case REDIRECT_OVERWRITE: | 629 | case REDIRECT_OVERWRITE: |
| 630 | mode = O_RDWR | O_CREAT | O_TRUNC; | 630 | mode = O_WRONLY | O_CREAT | O_TRUNC; |
| 631 | break; | 631 | break; |
| 632 | case REDIRECT_APPEND: | 632 | case REDIRECT_APPEND: |
| 633 | mode = O_RDWR | O_CREAT | O_APPEND; | 633 | mode = O_WRONLY | O_CREAT | O_APPEND; |
| 634 | break; | 634 | break; |
| 635 | } | 635 | } |
| 636 | 636 | ||
| @@ -785,30 +785,42 @@ static void globLastArgument(struct childProgram *prog, int *argcPtr, | |||
| 785 | #endif | 785 | #endif |
| 786 | } | 786 | } |
| 787 | 787 | ||
| 788 | rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); | 788 | if (strpbrk(prog->argv[argc_l - 1],"*[]?")!= NULL){ |
| 789 | if (rc == GLOB_NOSPACE) { | 789 | rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); |
| 790 | errorMsg("out of space during glob operation\n"); | 790 | if (rc == GLOB_NOSPACE) { |
| 791 | return; | 791 | errorMsg("out of space during glob operation\n"); |
| 792 | } else if (rc == GLOB_NOMATCH || | 792 | return; |
| 793 | } else if (rc == GLOB_NOMATCH || | ||
| 793 | (!rc && (prog->globResult.gl_pathc - i) == 1 && | 794 | (!rc && (prog->globResult.gl_pathc - i) == 1 && |
| 794 | strcmp(prog->argv[argc_l - 1], | 795 | strcmp(prog->argv[argc_l - 1], |
| 795 | prog->globResult.gl_pathv[i]) == 0)) { | 796 | prog->globResult.gl_pathv[i]) == 0)) { |
| 796 | /* we need to remove whatever \ quoting is still present */ | 797 | /* we need to remove whatever \ quoting is still present */ |
| 797 | src = dst = prog->argv[argc_l - 1]; | 798 | src = dst = prog->argv[argc_l - 1]; |
| 798 | while (*src) { | 799 | while (*src) { |
| 799 | if (*src != '\\') | 800 | if (*src != '\\') |
| 800 | *dst++ = *src; | 801 | *dst++ = *src; |
| 801 | src++; | 802 | src++; |
| 803 | } | ||
| 804 | *dst = '\0'; | ||
| 805 | } else if (!rc) { | ||
| 806 | argcAlloced += (prog->globResult.gl_pathc - i); | ||
| 807 | prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); | ||
| 808 | memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, | ||
| 809 | sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); | ||
| 810 | argc_l += (prog->globResult.gl_pathc - i - 1); | ||
| 802 | } | 811 | } |
| 803 | *dst = '\0'; | 812 | }else{ |
| 804 | } else if (!rc) { | 813 | src = dst = prog->argv[argc_l - 1]; |
| 805 | argcAlloced += (prog->globResult.gl_pathc - i); | 814 | while (*src) { |
| 806 | prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); | 815 | if (*src != '\\') |
| 807 | memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, | 816 | *dst++ = *src; |
| 808 | sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); | 817 | src++; |
| 809 | argc_l += (prog->globResult.gl_pathc - i - 1); | 818 | } |
| 819 | *dst = '\0'; | ||
| 820 | prog->globResult.gl_pathc=0; | ||
| 821 | if (flags==0) | ||
| 822 | prog->globResult.gl_pathv=NULL; | ||
| 810 | } | 823 | } |
| 811 | |||
| 812 | *argcAllocedPtr = argcAlloced; | 824 | *argcAllocedPtr = argcAlloced; |
| 813 | *argcPtr = argc_l; | 825 | *argcPtr = argc_l; |
| 814 | } | 826 | } |
| @@ -1128,7 +1140,7 @@ static int parseCommand(char **commandPtr, struct job *job, struct jobSet *jobLi | |||
| 1128 | } | 1140 | } |
| 1129 | 1141 | ||
| 1130 | *commandPtr = returnCommand; | 1142 | *commandPtr = returnCommand; |
| 1131 | 1143 | ||
| 1132 | return 0; | 1144 | return 0; |
| 1133 | } | 1145 | } |
| 1134 | 1146 | ||
| @@ -1143,7 +1155,6 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int | |||
| 1143 | const struct BB_applet *a = applets; | 1155 | const struct BB_applet *a = applets; |
| 1144 | #endif | 1156 | #endif |
| 1145 | 1157 | ||
| 1146 | |||
| 1147 | nextin = 0, nextout = 1; | 1158 | nextin = 0, nextout = 1; |
| 1148 | for (i = 0; i < newJob->numProgs; i++) { | 1159 | for (i = 0; i < newJob->numProgs; i++) { |
| 1149 | if ((i + 1) < newJob->numProgs) { | 1160 | if ((i + 1) < newJob->numProgs) { |
