typedef struct SmbSession SmbSession;
typedef struct SmbTree SmbTree;
typedef struct SmbService SmbService;
typedef struct SmbPeerInfo SmbPeerInfo;
typedef struct SmbTransaction SmbTransaction;
typedef struct SmbBuffer SmbBuffer;
typedef struct SmbIdMap SmbIdMap;
typedef struct SmbSearch SmbSearch;
typedef struct SmbDirCache SmbDirCache;
typedef struct SmbFile SmbFile;
typedef struct SmbSharedFile SmbSharedFile;
typedef struct SmbCifsSession SmbCifsSession;
typedef struct SmbServerInfo SmbServerInfo;
typedef struct SmbRapServerInfo1 SmbRapServerInfo1;
typedef struct SmbFindFileBothDirectoryInfo SmbFindFileBothDirectoryInfo;
typedef struct SmbLock SmbLock;
typedef struct SmbLockList SmbLockList;
typedef struct SmbSlut SmbSlut;
#pragma incomplete SmbIdMap
#pragma incomplete SmbBuffer
#pragma incomplete SmbLockList
typedef int SMBCIFSWRITEFN(SmbCifsSession *cifs, void *buf, long n);
typedef int SMBCIFSACCEPTFN(SmbCifsSession *cifs, SMBCIFSWRITEFN **fnp);
typedef void SMBIDMAPAPPLYFN(void *magic, void *p);
struct SmbPeerInfo {
ulong capabilities;
ushort maxlen;
uchar securitymode;
ushort maxmpxcount;
ushort maxnumbervcs;
ulong maxbuffersize;
ulong maxrawsize;
ulong sessionkey;
vlong utc;
short tzoff;
uchar encryptionkeylength;
uchar *encryptionkey;
char *oemdomainname;
};
struct SmbTransaction {
struct {
char *name;
ulong tpcount;
uchar *parameters;
ulong pcount;
ulong tdcount;
uchar *data;
ulong maxpcount;
ulong maxdcount;
ulong maxscount;
ulong dcount;
ushort scount;
ushort *setup;
ushort flags;
} in;
struct {
ulong tpcount;
ulong tdcount;
SmbBuffer *parameters;
SmbBuffer *data;
ushort *setup;
} out;
};
enum {
SmbSessionNeedNegotiate,
SmbSessionNeedSetup,
SmbSessionEstablished,
};
struct SmbSession {
NbSession *nbss;
SmbCifsSession *cifss;
uchar nextcommand;
SmbBuffer *response;
SmbPeerInfo peerinfo;
Chalstate *cs;
struct {
char *accountname;
char *primarydomain;
char *nativeos;
char *nativelanman;
ushort maxmpxcount;
MSchapreply mschapreply;
} client;
SmbTransaction transaction;
SmbIdMap *fidmap;
SmbIdMap *tidmap;
SmbIdMap *sidmap;
int state;
uchar errclass;
ushort error;
int tzoff; // as passed to client during negotiation
SmbService *serv;
};
typedef struct SmbHeader {
uchar command;
union {
struct {
uchar errclass;
ushort error;
};
ulong status;
};
uchar flags;
ushort flags2;
union {
struct {
ushort pidhigh;
uchar securitysignature[8];
};
};
ushort tid;
ushort pid;
ushort uid;
ushort mid;
uchar wordcount;
} SmbHeader;
typedef enum SmbProcessResult {
SmbProcessResultOk,
SmbProcessResultUnimp,
SmbProcessResultFormat,
SmbProcessResultMisc,
SmbProcessResultError,
SmbProcessResultReply,
SmbProcessResultDie,
} SmbProcessResult;
typedef SmbProcessResult SMBPROCESSFN(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *);
typedef struct SmbOpTableEntry SmbOpTableEntry;
struct SmbOpTableEntry {
char *name;
SMBPROCESSFN *process;
int debug;
};
extern SmbOpTableEntry smboptable[256];
typedef struct SmbGlobals SmbGlobals;
extern SmbGlobals smbglobals;
struct SmbServerInfo {
char *name;
char *nativelanman;
uchar vmaj, vmin;
ulong stype;
char *remark;
};
struct SmbGlobals {
int maxreceive;
int unicode;
SmbServerInfo serverinfo;
char *nativeos;
char *primarydomain;
NbName nbname;
char *accountname;
char *mailslotbrowse;
char *pipelanman;
int l2sectorsize;
int l2allocationsize;
int convertspace;
struct {
int fd;
int print;
int tids;
int sids;
int fids;
int rap2;
int find;
int query;
int sharedfiles;
int sessions;
int rep;
int poolparanoia;
int locks;
} log;
};
struct SmbTree {
long id;
SmbService *serv;
};
struct SmbService {
Ref;
char *name;
char *type;
ushort stype;
char *path;
char *remark;
SmbService *next;
};
extern SmbService *smbservices;
typedef struct SmbClient SmbClient;
typedef struct SmbTransactionMethod {
int (*encodeprimary)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
SmbBuffer *ob, uchar *wordcount, ushort *bytecount, char **errmsgp);
int (*encodesecondary)(SmbTransaction *t, SmbHeader *h, SmbBuffer *ob, char **errmsgp);
int (*sendrequest)(void *magic, SmbBuffer *ob, char **errmsgp);
int (*receiveintermediate)(void *magic, uchar *wordcountp, ushort *bytecountp, char **errmsgp);
int (*receiveresponse)(void *magic, SmbBuffer *ib, char **errmsgp);
int (*decoderesponse)(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp);
int (*encoderesponse)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
SmbBuffer *ob, char **errmsgp);
int (*sendresponse)(void *magic, SmbBuffer *ob, char **errmsgp);
} SmbTransactionMethod;
extern SmbTransactionMethod smbtransactionmethoddgram;
struct SmbSearch {
long id;
SmbTree *t;
SmbDirCache *dc;
Reprog *rep;
ushort tid;
};
struct SmbFile {
long id;
SmbTree *t; // tree this belongs to
int fd;
char *name;
int p9mode; // how it was opened
int share; // additional sharing restictions added by this fid
int ioallowed;
SmbSharedFile *sf;
};
struct SmbSharedFile {
ushort type;
ulong dev;
vlong path;
// char *name;
int share; // current share level
int deleteonclose;
SmbLockList *locklist;
};
struct SmbLock {
vlong base;
vlong limit;
SmbSession *s; // owning session
ushort pid; // owning pid
};
struct SmbCifsSession {
int fd;
void *magic;
};
struct SmbClient {
SmbPeerInfo peerinfo;
NbSession *nbss;
SmbBuffer *b;
ushort ipctid;
ushort sharetid;
SmbHeader protoh;
};
struct SmbRapServerInfo1 {
char name[16];
uchar vmaj;
uchar vmin;
ulong type;
char *remark;
};
struct SmbFindFileBothDirectoryInfo {
ulong fileindex;
vlong creationtime;
vlong lastaccesstime;
vlong lastwritetime;
vlong changetime;
vlong endoffile;
vlong allocationsize;
ulong extfileattributes;
char *filename;
};
enum {
SMB_STRING_UNALIGNED = 1,
SMB_STRING_UPCASE = 2,
SMB_STRING_UNTERMINATED = 4,
SMB_STRING_UNICODE = 8,
SMB_STRING_ASCII = 16,
SMB_STRING_REVPATH = 32,
SMB_STRING_PATH = 64,
SMB_STRING_CONVERT_MASK = SMB_STRING_PATH | SMB_STRING_REVPATH | SMB_STRING_UPCASE,
};
struct SmbDirCache {
Dir *buf;
long n;
long i;
};
typedef struct SmbTrans2OpTableEntry SmbTrans2OpTableEntry;
typedef SmbProcessResult SMBTRANS2PROCESSFN(SmbSession *s, SmbHeader *h);
struct SmbTrans2OpTableEntry {
char *name;
SMBTRANS2PROCESSFN *process;
int debug;
};
extern SmbTrans2OpTableEntry smbtrans2optable[];
extern int smbtrans2optablesize;
struct SmbSlut {
char *name;
int val;
};
extern SmbSlut smbopenmodeslut[];
extern SmbSlut smbsharemodeslut[];
|