From 0e7b2edd364a2662cc1fe9a7dea4b1e18a96c662 Mon Sep 17 00:00:00 2001 From: "Michael I. Bushnell" Date: Wed, 20 Mar 1996 21:12:51 +0000 Subject: (diskfs_lookup): Do permission checking and cache looking here. --- libdiskfs/lookup.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/libdiskfs/lookup.c b/libdiskfs/lookup.c index 59100cef..2e36798b 100644 --- a/libdiskfs/lookup.c +++ b/libdiskfs/lookup.c @@ -73,6 +73,51 @@ diskfs_lookup (struct node *dp, struct dirstat *ds, struct protid *cred) { - return diskfs_lookup_hard (dp, name, type, np, ds, cred); + error_t err; + struct node *ournp, **npp; + + npp = np ? : &ournp; + + if (!S_ISDIR (dp->dn_stat.st_mode)) + { + diskfs_null_dirstat (ds); + return ENOTDIR; + } + err = diskfs_access (dp, S_IEXEC, cred); + if (err) + { + diskfs_null_dirstat (ds); + return err; + } + + if (type == LOOKUP) + { + /* Check the cache first */ + *np = diskfs_check_cache (dp, name); + if (*np == (struct node *)-1) + { + *np = 0; + return ENOENT; + } + else if (*np) + { + diskfs_null_dirstat (ds); + return 0; + } + } + + err = diskfs_lookup_hard (dp, name, type, npp, ds, cred); + if (err && err != ENOENT) + return err; + + if (type == RENAME + || (type == CREATE && err == ENOENT) + || (type == REMOVE && err != ENOENT)) + err = diskfs_checkdirmod (dp, *npp, cred); + + if (*npp && !np) + diskfs_nput (*npp); + + return err; } -- cgit v1.2.3