summaryrefslogtreecommitdiffhomepage
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-10-30 18:41:01 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2016-10-30 18:41:01 +0100
commitd4f3db9427c443b2709fc9a00bc46d8a71be806b (patch)
treef71b9fd8f2eb1509621ec434fb9b664928f637dc /shell
parent474ed06c3939391cbfd7b70bf4960403ae166762 (diff)
ash: if using libc glob(), skip it if no metachars are in word
This saves making tons of pointless stat() calls function old new delta expandarg 888 921 +33 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c
index d617168b9..ecd2146e4 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -7047,6 +7047,21 @@ expandmeta(struct strlist *str /*, int flag*/)
if (fflag)
goto nometa;
+
+ /* Avoid glob() (and thus, stat() et al) for words like "echo" */
+ p = str->text;
+ while (*p) {
+ if (*p == '*')
+ goto need_glob;
+ if (*p == '?')
+ goto need_glob;
+ if (*p == '[')
+ goto need_glob;
+ p++;
+ }
+ goto nometa;
+
+ need_glob:
INT_OFF;
p = preglob(str->text, RMESCAPE_ALLOC | RMESCAPE_HEAP);
// GLOB_NOMAGIC (GNU): if no *?[ chars in pattern, return it even if no match