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
#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
#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
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_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 */
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
* 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, 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);
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);
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;
#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 */