summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-08-04 16:21:37 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2020-08-04 16:21:37 +0200
commit53800208bd762b1ecf14b60585cb906f22db7de8 (patch)
tree9e6d280180c845375cb878fe5ec0b402e738a1c8
parente9df4c718a902fe6a8f490331092c2f92c194ce4 (diff)
downloadplan9front-53800208bd762b1ecf14b60585cb906f22db7de8.tar.xz
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.
-rw-r--r--sys/src/cmd/rc/glob.c8
-rw-r--r--sys/src/cmd/rc/plan9.c27
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<NFD){
- dir[f].i = 0;
- dir[f].n = 0;
- }
- free(db);
+
+ if((f = open(name, 0)) < 0)
return f;
+ if(f<NFD){
+ dir[f].i = 0;
+ dir[f].n = 0;
}
- free(db);
- close(f);
- return -1;
+ return f;
}
static int
@@ -375,13 +367,6 @@ trimdirs(Dir *d, int nd)
return w;
}
-/*
- * onlydirs is advisory -- it means you only
- * need to return the directories. it's okay to
- * return files too (e.g., on unix where you can't
- * tell during the readdir), but that just makes
- * the globber work harder.
- */
int
Readdir(int f, void *p, int onlydirs)
{