freebsd-almost-working-client-20020216
[openafs.git] / src / afs / VNOPS / afs_vnop_readdir.c
index 9c024a1..71b86fe 100644 (file)
@@ -140,7 +140,7 @@ struct irix5_min_dirent {     /* miniature dirent structure */
 #else
 struct min_direct {    /* miniature direct structure */
                        /* If struct direct changes, this must too */
-#ifdef AFS_DARWIN_ENV
+#if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
     afs_uint32  d_fileno;
     u_short     d_reclen;
     u_char      d_type;
@@ -226,6 +226,45 @@ int        afs_rd_stash_i = 0;
 #endif /* AFS_SUN56_ENV */
 #endif /* AFS_HPUX100_ENV */
 
+#if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
+int afs_readdir_type(avc, ade) 
+struct DirEntry *      ade;
+struct vcache *                avc;
+{
+     struct VenusFid tfid;
+     struct vcache *tvc;
+     int vtype;
+     tfid.Cell=avc->fid.Cell;
+     tfid.Fid.Volume=avc->fid.Fid.Volume;
+     tfid.Fid.Vnode=ntohl(ade->fid.vnode);
+     tfid.Fid.Unique=ntohl(ade->fid.vunique);
+     if ((avc->states & CForeign) == 0 &&
+         (ntohl(ade->fid.vnode) & 1)) {
+          return DT_DIR;
+     } else if ((tvc=afs_FindVCache(&tfid,0,0,0,0))) {
+           if (tvc->mvstat) {
+               afs_PutVCache(tvc, WRITE_LOCK);
+               return DT_DIR;
+          } else if (((tvc->states) & (CStatd|CTruth))) {
+               /* CTruth will be set if the object has
+                *ever* been statd */
+               vtype=vType(tvc);
+               afs_PutVCache(tvc, WRITE_LOCK);
+               if (vtype == VDIR)
+                    return DT_DIR;
+               else if (vtype == VREG)
+                    return DT_REG;
+               /* Don't do this until we're sure it can't be a mtpt */
+               /* else if (vtype == VLNK)
+                  type=DT_LNK; */
+               /* what other types does AFS support? */
+          } else
+               afs_PutVCache(tvc, WRITE_LOCK);
+    }
+    return DT_UNKNOWN;
+}
+#endif
+
 #ifdef AFS_AIX41_ENV
 #define AFS_MOVE_LOCK()   AFS_GLOCK()
 #define AFS_MOVE_UNLOCK() AFS_GUNLOCK()
@@ -233,7 +272,6 @@ int afs_rd_stash_i = 0;
 #define AFS_MOVE_LOCK()
 #define AFS_MOVE_UNLOCK()
 #endif
-
 char bufofzeros[64];   /* gotta fill with something */
 afs_readdir_move (de, vc, auio, slen, rlen, off) 
 struct DirEntry *      de;
@@ -348,8 +386,8 @@ afs_size_t          off;
 #if defined(AFS_SUN_ENV) || defined(AFS_AIX32_ENV) || defined(AFS_SGI_ENV)
     sdirEntry.d_off = off;
 #endif
-#if defined(AFS_DARWIN_ENV)
-    sdirEntry.d_type=DT_UNKNOWN;
+#if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
+    sdirEntry.d_type=afs_readdir_type(vc, de);
 #endif
 
 #if defined(AFS_SGI_ENV)
@@ -423,7 +461,7 @@ void afs_bulkstat_send( avc, req )
  * It has to do with 'offset' (seek locations).
 */
 
-#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV)
+#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
 afs_readdir(OSI_VC_ARG(avc), auio, acred, eofp)
     int *eofp;
 #else
@@ -482,7 +520,7 @@ afs_readdir(OSI_VC_ARG(avc), auio, acred)
 #endif /* AFS_SGI61_ENV */
 #endif /* defined(AFS_SGI53_ENV) */
 
-#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV)
+#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
     /* Not really used by the callee so we ignore it for now */
     if (eofp) *eofp = 0;
 #endif
@@ -615,7 +653,7 @@ tagain:
            } else {
                /* nothin to hand over */
            }
-#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_OSF_ENV)
+#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        if (eofp) *eofp = 1;    /* Set it properly */
 #endif
            if (ode) DRelease(ode, 0);