diff options
author | Eric Andersen <andersen@codepoet.org> | 2000-11-14 21:59:22 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2000-11-14 21:59:22 +0000 |
commit | 46f0beb16723acec0f03859ba813209e96396901 (patch) | |
tree | 60440e241f5a393651914e5006857fd23bceda0f | |
parent | 2aa1091130d86465534ab51adb42a0f33a40958b (diff) | |
download | busybox-w32-46f0beb16723acec0f03859ba813209e96396901.tar.gz busybox-w32-46f0beb16723acec0f03859ba813209e96396901.tar.bz2 busybox-w32-46f0beb16723acec0f03859ba813209e96396901.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).
-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) { |