From 53800208bd762b1ecf14b60585cb906f22db7de8 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 4 Aug 2020 16:21:37 +0200 Subject: [PATCH] rc: avoid stat calls for directory globbing On Plan9, we can count on Readdir() onlydirs argument to work, which allows us to avoid stating every single file to see if it is a directory. --- sys/src/cmd/rc/glob.c | 8 +++++++- sys/src/cmd/rc/plan9.c | 27 ++++++--------------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/sys/src/cmd/rc/glob.c b/sys/src/cmd/rc/glob.c index e52b420ee..00c9f7504 100644 --- a/sys/src/cmd/rc/glob.c +++ b/sys/src/cmd/rc/glob.c @@ -60,9 +60,15 @@ globdir(word *list, char *p, char *name, char *namep) { char *t, *newp; int f; - /* scan the pattern looking for a component with a metacharacter in it */ + + /* append slashes, Readdir() already filtered directories */ + while(*p=='/'){ + *namep++=*p++; + *namep='\0'; + } if(*p=='\0') return newword(name, list); + /* scan the pattern looking for a component with a metacharacter in it */ t = namep; newp = p; while(*newp){ diff --git a/sys/src/cmd/rc/plan9.c b/sys/src/cmd/rc/plan9.c index fd12e666c..4ac9a0bf7 100644 --- a/sys/src/cmd/rc/plan9.c +++ b/sys/src/cmd/rc/plan9.c @@ -345,23 +345,15 @@ struct{ int Opendir(char *name) { - Dir *db; int f; - f = open(name, 0); - if(f==-1) - return f; - db = dirfstat(f); - if(db!=nil && (db->mode&DMDIR)){ - if(f