Work around MacOSX Finder's behavior by returning ENOENT when the user
[openafs.git] / src / afs / VNOPS / afs_vnop_lookup.c
index e71338d..91184d0 100644 (file)
@@ -1099,6 +1099,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);
@@ -1106,15 +1107,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