* header alone.
*/
+#define CM_DIR_FFIRST 1
+#define CM_DIR_FNEXT 2
+
typedef struct cm_dirFid {
/* A file identifier. */
afs_int32 vnode; /* file's vnode slot */
unsigned short hashTable[CM_DIR_NHASHENT];
} cm_dirHeader_t;
-/* this represents a directory entry. We use strlen to find out how many bytes are
- * really in the dir entry; it is always a multiple of 32.
+/* this represents a directory entry. We use strlen to find out how
+ * many bytes are really in the dir entry; it is always a multiple of
+ * 32.
*/
typedef struct cm_dirEntry {
/* A directory entry */
} cm_dirPage1_t;
#endif /* UNUSED */
-extern long cm_NameEntries(char *namep, long *lenp);
+#define CM_DIROP_MAXBUFFERS 8
+
+typedef struct cm_dirOpBuffer {
+ int flags;
+ cm_buf_t * bufferp;
+ int refcount;
+} cm_dirOpBuffer_t;
+
+#define CM_DIROPBUFF_INUSE 0x1
+
+/* Used for managing transactional directory operations. Each
+ instance should only be used by one thread. */
+typedef struct cm_dirOp {
+ cm_scache_t * scp;
+ cm_user_t * userp;
+ cm_req_t req;
+
+ osi_hyper_t length; /* scp->length at the time
+ cm_BeginDirOp() was called.*/
+ osi_hyper_t newLength; /* adjusted scp->length */
+ afs_uint32 dataVersion; /* scp->dataVersion when
+ cm_BeginDirOp() was called.*/
+ afs_uint32 newDataVersion; /* scp->dataVersion when
+ cm_CheckDirOpForSingleChange()
+ was called. */
+
+ afs_uint32 dirtyBufCount;
+
+ int nBuffers; /* number of buffers below */
+ cm_dirOpBuffer_t buffers[CM_DIROP_MAXBUFFERS];
+} cm_dirOp_t;
+
+extern long
+cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp,
+ cm_dirOp_t * op);
+
+extern int
+cm_CheckDirOpForSingleChange(cm_dirOp_t * op);
+
+extern long
+cm_EndDirOp(cm_dirOp_t * op);
+
+extern long
+cm_NameEntries(char *namep, long *lenp);
+
+extern long
+cm_DirCreateEntry(cm_dirOp_t * op, char *entry, cm_fid_t * cfid);
+
+extern int
+cm_DirLength(cm_dirOp_t * op);
+
+extern int
+cm_DirDeleteEntry(cm_dirOp_t * op, char *entry);
+
+extern int
+cm_DirMakeDir(cm_dirOp_t * op, cm_fid_t * me, cm_fid_t * parent);
+
+extern int
+cm_DirLookup(cm_dirOp_t * op, char *entry, cm_fid_t * cfid);
+
+extern int
+cm_DirLookupOffset(cm_dirOp_t * op, char *entry, cm_fid_t *cfid, osi_hyper_t *offsetp);
+
+extern int
+cm_DirApply(cm_dirOp_t * op, int (*hookproc) (void *, char *, long, long), void *hook);
+
+extern int
+cm_DirIsEmpty(cm_dirOp_t * op);
+
+extern int
+cm_DirHash(char *string);
+
+/* Directory entry lists */
+typedef struct cm_dirEntryList {
+ struct cm_dirEntryList * nextp;
+ char name[1];
+} cm_dirEntryList_t;
+
+extern void
+cm_DirEntryListAdd(char * namep, cm_dirEntryList_t ** list);
+
+extern void
+cm_DirEntryListFree(cm_dirEntryList_t ** list);
#endif /* __CM_DIR_ENV__ */