diff options
Diffstat (limited to 'win32/process.c')
-rw-r--r-- | win32/process.c | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/win32/process.c b/win32/process.c index 20e73baee..60fea01ad 100644 --- a/win32/process.c +++ b/win32/process.c | |||
@@ -57,33 +57,42 @@ parse_interpreter(const char *cmd, interp_t *interp) | |||
57 | char *path, *t; | 57 | char *path, *t; |
58 | int n; | 58 | int n; |
59 | 59 | ||
60 | n = open_read_close(cmd, interp->buf, sizeof(interp->buf)-1); | 60 | while (TRUE) { |
61 | if (n < 4) /* at least '#!/x' and not error */ | 61 | n = open_read_close(cmd, interp->buf, sizeof(interp->buf)-1); |
62 | return 0; | 62 | if (n < 4) /* at least '#!/x' and not error */ |
63 | 63 | break; | |
64 | /* | 64 | |
65 | * See http://www.in-ulm.de/~mascheck/various/shebang/ for trivia | 65 | /* |
66 | * relating to '#!'. | 66 | * See http://www.in-ulm.de/~mascheck/various/shebang/ for trivia |
67 | */ | 67 | * relating to '#!'. |
68 | if (interp->buf[0] != '#' || interp->buf[1] != '!') | 68 | */ |
69 | return 0; | 69 | if (interp->buf[0] != '#' || interp->buf[1] != '!') |
70 | interp->buf[n] = '\0'; | 70 | break; |
71 | if ((t=strchr(interp->buf, '\n')) == NULL) | 71 | interp->buf[n] = '\0'; |
72 | return 0; | 72 | if ((t=strchr(interp->buf, '\n')) == NULL) |
73 | t[1] = '\0'; | 73 | break; |
74 | 74 | t[1] = '\0'; | |
75 | if ((path=strtok(interp->buf+2, " \t\r\n")) == NULL) | 75 | |
76 | return 0; | 76 | if ((path=strtok(interp->buf+2, " \t\r\n")) == NULL) |
77 | 77 | break; | |
78 | t = (char *)bb_basename(path); | 78 | |
79 | if (*t == '\0') | 79 | t = (char *)bb_basename(path); |
80 | return 0; | 80 | if (*t == '\0') |
81 | 81 | break; | |
82 | interp->path = path; | 82 | |
83 | interp->name = t; | 83 | interp->path = path; |
84 | interp->opts = strtok(NULL, "\r\n"); | 84 | interp->name = t; |
85 | 85 | interp->opts = strtok(NULL, "\r\n"); | |
86 | return 1; | 86 | return 1; |
87 | } | ||
88 | |||
89 | if (is_suffixed_with_case(cmd, ".sh")) { | ||
90 | interp->path = (char *)DEFAULT_SHELL; | ||
91 | interp->name = (char *)DEFAULT_SHELL_SHORT_NAME; | ||
92 | interp->opts = NULL; | ||
93 | return 1; | ||
94 | } | ||
95 | return 0; | ||
87 | } | 96 | } |
88 | 97 | ||
89 | /* | 98 | /* |