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;
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
* 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
*/
#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)
*/
#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 */
unsigned long refCount; /* reference count */
long cookie; /* value returned to the caller */
struct cm_scache *scp; /* vnode of the dir we're searching */
- unsigned long lastTime; /* last time we used this (osi_Time) */
+ time_t lastTime; /* last time we used this (osi_Time) */
long flags; /* flags (see below);
* locked by smb_globalLock */
unsigned short attribute; /* search attribute
* 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);
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, afs_uint32 searchTime);
-extern void smb_UnixTimeFromSearchTime(time_t *unixTimep, time_t searchTime);
+extern void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, time_t unixTime);
-extern void smb_DosUTimeFromUnixTime(time_t *dosUTimep, time_t unixTime);
+extern void smb_UnixTimeFromDosUTime(time_t *unixTimep, afs_uint32 dosUTime);
-extern void smb_UnixTimeFromDosUTime(time_t *unixTimep, time_t 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_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);
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);