windows-vc-locks-and-more-20060115
[openafs.git] / src / WINNT / afsd / smb.h
index 4774e39..fbfdda8 100644 (file)
@@ -35,6 +35,16 @@ typedef struct smb {
     unsigned char vdata[1];
 } smb_t;
 
+
+/* reb values */
+#define SMB_FLAGS_SUPPORT_LOCKREAD         0x01
+#define SMB_FLAGS_CLIENT_BUF_AVAIL         0x02
+#define SMB_FLAGS_CASELESS_PATHNAMES       0x08
+#define SMB_FLAGS_CANONICAL_PATHNAMES      0x10
+#define SMB_FLAGS_REQUEST_OPLOCK           0x20
+#define SMB_FLAGS_REQUEST_BATCH_OPLOCK     0x40
+#define SMB_FLAGS_SERVER_TO_CLIENT         0x80           
+
 /* flg2 values */
 
 #define SMB_FLAGS2_KNOWS_LONG_NAMES        0x0001
@@ -43,11 +53,14 @@ typedef struct smb {
 #define SMB_FLAGS2_RESERVED1               0x0008
 #define SMB_FLAGS2_IS_LONG_NAME            0x0040
 #define SMB_FLAGS2_EXT_SEC                 0x0800
-#define SMB_FLAGS2_DFS                     0x1000
+#define SMB_FLAGS2_DFS_PATHNAMES           0x1000
 #define SMB_FLAGS2_PAGING_IO               0x2000
-#define SMB_FLAGS2_ERR_STATUS              0x4000
+#define SMB_FLAGS2_32BIT_STATUS            0x4000
 #define SMB_FLAGS2_UNICODE                 0x8000
 
+#define KNOWS_LONG_NAMES(inp) ((((smb_t *)inp)->flg2 & SMB_FLAGS2_KNOWS_LONG_NAMES)?1:0)
+#define WANTS_DFS_PATHNAMES(inp) ((((smb_t *)inp)->flg2 & SMB_FLAGS2_DFS_PATHNAMES)?1:0)
+
 /* Information Levels */
 #define SMB_INFO_STANDARD               1
 #define SMB_INFO_QUERY_EA_SIZE          2
@@ -106,6 +119,9 @@ typedef struct smb {
 #define NTNEGOTIATE_CAPABILITY_NTFIND                  0x00000200L
 #define NTNEGOTIATE_CAPABILITY_DFS                     0x00001000L
 #define NTNEGOTIATE_CAPABILITY_NT_INFO_PASSTHRU                0x00002000L
+#define NTNEGOTIATE_CAPABILITY_LARGE_READX             0x00004000L
+#define NTNEGOTIATE_CAPABILITY_LARGE_WRITEX            0x00008000L
+#define NTNEGOTIATE_CAPABILITY_UNIX                    0x00800000L
 #define NTNEGOTIATE_CAPABILITY_BULK_TRANSFER           0x20000000L
 #define NTNEGOTIATE_CAPABILITY_COMPRESSED              0x40000000L
 #define NTNEGOTIATE_CAPABILITY_EXTENDED_SECURITY       0x80000000L
@@ -214,7 +230,7 @@ typedef struct smb_user {
     unsigned long refCount;            /* ref count */
     long flags;                                /* flags; locked by mx */
     osi_mutex_t mx;
-    long userID;                       /* the session identifier */
+    unsigned short userID;             /* the session identifier */
     struct smb_vc *vcp;                        /* back ptr to virtual circuit */
     struct smb_username *unp;           /* user name struct */
 } smb_user_t;
@@ -299,6 +315,10 @@ typedef struct smb_fid {
     unsigned short fid;                        /* the file ID */
     struct smb_vc *vcp;                        /* back ptr */
     struct cm_scache *scp;             /* scache of open file */
+    struct cm_user *userp;              /* user that opened the file
+                                           originally (used to close
+                                           the file if session is
+                                           terminated) */
     long offset;                       /* our file pointer */
     smb_ioctl_t *ioctlp;               /* ptr to ioctl structure */
                                        /* Under NT, we may need to know the
@@ -322,6 +342,7 @@ typedef struct smb_fid {
                                                 * magic ioctl file */
 #define SMB_FID_OPENDELETE             0x10    /* open for deletion (NT) */
 #define SMB_FID_DELONCLOSE             0x20    /* marked for deletion */
+
 /*
  * Now some special flags to work around a bug in NT Client
  */
@@ -330,6 +351,14 @@ typedef struct smb_fid {
 #define SMB_FID_LOOKSLIKECOPY  (SMB_FID_LENGTHSETDONE | SMB_FID_MTIMESETDONE)
 #define SMB_FID_NTOPEN                 0x100   /* have dscp and pathp */
 
+#define SMB_FID_SHARE_READ              0x1000
+#define SMB_FID_SHARE_WRITE             0x2000
+
+#define SMB_FID_QLOCK_HIGH              0x0fe00000
+#define SMB_FID_QLOCK_LOW               0x00000000
+#define SMB_FID_QLOCK_LENGTH            1
+#define SMB_FID_QLOCK_PID               0
+
 /*
  * SMB file attributes (32-bit)
  */
@@ -342,13 +371,19 @@ typedef struct smb_fid {
 #define SMB_ATTR_DEVICE         0x0040
 #define SMB_ATTR_NORMAL         0x0080 /* normal file. Only valid if used alone */
 #define SMB_ATTR_TEMPORARY      0x0100
-#define SMB_ATTR_SPARSE_FILE    0x0200
+#define SMB_ATTR_SPARSE_FILE    0x0200 /* used with dfs links */
 #define SMB_ATTR_REPARSE_POINT  0x0400
 #define SMB_ATTR_COMPRESSED     0x0800 /* file or dir is compressed */
 #define SMB_ATTR_OFFLINE        0x1000
 #define SMB_ATTR_NOT_CONTENT_INDEXED 0x2000
 #define SMB_ATTR_ENCRYPTED      0x4000
 
+#define LOCKING_ANDX_SHARED_LOCK        0x01 /* Read-only lock */
+#define LOCKING_ANDX_OPLOCK_RELEASE     0x02 /* Oplock break notification */
+#define LOCKING_ANDX_CHANGE_LOCKTYPE    0x04 /* Change lock type */
+#define LOCKING_ANDX_CANCEL_LOCK        0x08 /* Cancel outstanding request */
+#define LOCKING_ANDX_LARGE_FILES        0x10 /* Large file locking format */
+
 /* for tracking in-progress directory searches */
 typedef struct smb_dirSearch {
     osi_queue_t q;                     /* queue of all outstanding cookies */
@@ -356,7 +391,7 @@ typedef struct smb_dirSearch {
     unsigned long refCount;            /* reference count */
     long cookie;                       /* value returned to the caller */
     struct cm_scache *scp;             /* vnode of the dir we're searching */
-    time_t lastTime;                   /* last time we used this */
+    time_t lastTime;                   /* last time we used this (osi_Time) */
     long flags;                                /* flags (see below);
                                         * locked by smb_globalLock */
     unsigned short attribute;          /* search attribute
@@ -384,17 +419,33 @@ typedef struct smb_dirListPatch {
  * Note: will not be set if smb_hideDotFiles is false 
  */
 
-/* waiting lock list elements */
+/* individual lock on a waiting lock request */
 typedef struct smb_waitingLock {
-    osi_queue_t q;
-    smb_vc_t *vcp;
+    osi_queue_t      q;
+    cm_key_t         key;
+    LARGE_INTEGER    LOffset;
+    LARGE_INTEGER    LLength;
+    cm_file_lock_t * lockp;
+    int              state;
+} smb_waitingLock_t;
+
+#define SMB_WAITINGLOCKSTATE_WAITING 0
+#define SMB_WAITINGLOCKSTATE_DONE    1
+#define SMB_WAITINGLOCKSTATE_ERROR   2
+
+/* waiting lock request */
+typedef struct smb_waitingLockRequest {
+    osi_queue_t   q;
+    smb_vc_t *    vcp;
+    cm_scache_t * scp;
     smb_packet_t *inp;
     smb_packet_t *outp;
-    time_t timeRemaining;
-    void *lockp;
-} smb_waitingLock_t;
+    int           lockType;
+    time_t        timeRemaining;
+    smb_waitingLock_t * locks;
+} smb_waitingLockRequest_t;
 
-extern smb_waitingLock_t *smb_allWaitingLocks;
+extern smb_waitingLockRequest_t *smb_allWaitingLocks;
 
 typedef long (smb_proc_t)(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
 
@@ -424,18 +475,24 @@ extern void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTim
 
 extern void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep);
 
-extern void smb_SearchTimeFromUnixTime(time_t *dosTimep, time_t unixTime);
+extern void smb_SearchTimeFromUnixTime(afs_uint32 *searchTimep, time_t unixTime);
 
-extern void smb_UnixTimeFromSearchTime(time_t *unixTimep, time_t searchTime);
+extern void smb_UnixTimeFromSearchTime(time_t *unixTimep, afs_uint32 searchTime);
 
-extern void smb_DosUTimeFromUnixTime(time_t *dosUTimep, time_t unixTime);
+extern void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, time_t unixTime);
 
-extern void smb_UnixTimeFromDosUTime(time_t *unixTimep, time_t dosUTime);
+extern void smb_UnixTimeFromDosUTime(time_t *unixTimep, afs_uint32 dosUTime);
+
+extern void CompensateForSmbClientLastWriteTimeBugs(afs_uint32 *dosTimep);
 
 extern smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana);
 
+extern void smb_CleanupDeadVC(smb_vc_t *vcp);
+
 extern void smb_ReleaseVC(smb_vc_t *vcp);
 
+extern void smb_ReleaseVCNoLock(smb_vc_t *vcp);
+
 extern smb_tid_t *smb_FindTID(smb_vc_t *vcp, unsigned short tid, int flags);
 
 extern void smb_ReleaseTID(smb_tid_t *tidp);
@@ -450,6 +507,8 @@ extern smb_username_t *smb_FindUserByName(char *usern, char *machine, int flags)
 
 extern smb_user_t *smb_FindUserByNameThisSession(smb_vc_t *vcp, char *usern);
 
+extern void smb_ReleaseUsername(smb_username_t *unp);
+
 extern void smb_ReleaseUID(smb_user_t *uidp);
 
 extern cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp);
@@ -460,6 +519,9 @@ extern smb_fid_t *smb_FindFID(smb_vc_t *vcp, unsigned short fid, int flags);
 
 extern void smb_ReleaseFID(smb_fid_t *fidp);
 
+extern long smb_CloseFID(smb_vc_t *vcp, smb_fid_t *fidp, cm_user_t *userp,
+                         afs_uint32 dosTime);
+
 extern int smb_FindShare(smb_vc_t *vcp, smb_user_t *uidp, char *shareName, char **pathNamep);
 
 extern int smb_FindShareCSCPolicy(char *shareName);
@@ -513,6 +575,8 @@ extern void smb_MapNTError(long code, unsigned long *NTStatusp);
 
 extern void smb_HoldVC(smb_vc_t *vcp);
 
+extern void smb_HoldVCNoLock(smb_vc_t *vcp);
+
 /* some globals, too */
 extern char *smb_localNamep;
 extern int loggedOut;
@@ -622,4 +686,18 @@ cm_user_t *smb_FindOrCreateUser(smb_vc_t *vcp, char *usern);
 #ifdef NOTSERVICE
 extern void smb_LogPacket(smb_packet_t *packet);
 #endif /* NOTSERVICE */
+
+#ifndef MSV1_0_OPTION_ALLOW_BLANK_PASSWORD
+#define MSV1_0_OPTION_ALLOW_BLANK_PASSWORD      0x1
+#define MSV1_0_OPTION_DISABLE_ADMIN_LOCKOUT     0x2
+#define MSV1_0_OPTION_DISABLE_FORCE_GUEST       0x4
+#define MSV1_0_OPTION_TRY_CACHE_FIRST           0x10
+
+typedef struct _MSV1_0_SETPROCESSOPTION_REQUEST {
+    MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+    ULONG ProcessOptions;
+    BOOLEAN DisableOptions;
+} MSV1_0_SETPROCESSOPTION_REQUEST, *PMSV1_0_SETPROCESSOPTION_REQUEST; 
+#endif
+
 #endif /* whole file */