windows-local-directory-updates-20070802
[openafs.git] / src / WINNT / afsd / cm_dir.h
index d53a14a..3a720ef 100644 (file)
@@ -31,6 +31,9 @@
                                                 * 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 */
@@ -56,8 +59,9 @@ typedef struct cm_dirHeader {
        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 */
@@ -87,6 +91,88 @@ typedef struct cm_dirPage1 {
 } 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__ */