]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Work around MacOSX Finder's behavior by returning ENOENT when the user
authorNickolai Zeldovich <kolya@mit.edu>
Wed, 28 Aug 2002 05:49:18 +0000 (05:49 +0000)
committerGarry Zacheiss <zacheiss@mit.edu>
Wed, 28 Aug 2002 05:49:18 +0000 (05:49 +0000)
tries to look up Contents or .DS_Store in an uncached volume root.

(cherry picked from commit 77b1a76e47948422c7797de2ac27f3a121aa8806)

src/afs/VNOPS/afs_vnop_lookup.c

index 98f13a6a8c23dec66f1baa602959e7d00532733e..c47181c95ac1b18776ed8d16c26f5ec6612e4604 100644 (file)
@@ -1088,6 +1088,7 @@ afs_lookup(adp, aname, avcp, acred)
     struct sysname_info sysState;   /* used only for @sys checking */
     int dynrootRetry = 1;
     struct afs_fakestat_state fakestate;
+    int tryEvalOnly = 0;
 
     AFS_STATCNT(afs_lookup);
     afs_InitFakeStat(&fakestate);
@@ -1095,15 +1096,33 @@ afs_lookup(adp, aname, avcp, acred)
     if (code = afs_InitReq(&treq, acred))
        goto done;
 
-    code = afs_EvalFakeStat(&adp, &fakestate, &treq);
-    if (code)
-       goto done;
 #ifdef AFS_OSF_ENV
     ndp->ni_dvp = AFSTOV(adp);
     memcpy(aname, ndp->ni_ptr, ndp->ni_namelen);
     aname[ndp->ni_namelen] = '\0';
 #endif /* AFS_OSF_ENV */
 
+#if defined(AFS_DARWIN_ENV)
+    /* Workaround for MacOSX Finder, which tries to look for
+     * .DS_Store and Contents under every directory.
+     */
+    if (afs_fakestat_enable && adp->mvstat == 1) {
+       if (strcmp(aname, ".DS_Store") == 0)
+           tryEvalOnly = 1;
+       if (strcmp(aname, "Contents") == 0)
+           tryEvalOnly = 1;
+    }
+#endif
+
+    if (tryEvalOnly)
+       code = afs_TryEvalFakeStat(&adp, &fakestate, &treq);
+    else
+       code = afs_EvalFakeStat(&adp, &fakestate, &treq);
+    if (tryEvalOnly && adp->mvstat == 1)
+       code = ENOENT;
+    if (code)
+       goto done;
+
     *avcp = (struct vcache *) 0;   /* Since some callers don't initialize it */
 
     /* come back to here if we encounter a non-existent object in a read-only