1*8ccd4a63SDavid du Colombier typedef struct SmbSession SmbSession; 2*8ccd4a63SDavid du Colombier typedef struct SmbTree SmbTree; 3*8ccd4a63SDavid du Colombier typedef struct SmbService SmbService; 4*8ccd4a63SDavid du Colombier typedef struct SmbPeerInfo SmbPeerInfo; 5*8ccd4a63SDavid du Colombier typedef struct SmbTransaction SmbTransaction; 6*8ccd4a63SDavid du Colombier typedef struct SmbBuffer SmbBuffer; 7*8ccd4a63SDavid du Colombier typedef struct SmbIdMap SmbIdMap; 8*8ccd4a63SDavid du Colombier typedef struct SmbSearch SmbSearch; 9*8ccd4a63SDavid du Colombier typedef struct SmbDirCache SmbDirCache; 10*8ccd4a63SDavid du Colombier typedef struct SmbFile SmbFile; 11*8ccd4a63SDavid du Colombier typedef struct SmbSharedFile SmbSharedFile; 12*8ccd4a63SDavid du Colombier typedef struct SmbCifsSession SmbCifsSession; 13*8ccd4a63SDavid du Colombier typedef struct SmbServerInfo SmbServerInfo; 14*8ccd4a63SDavid du Colombier typedef struct SmbRapServerInfo1 SmbRapServerInfo1; 15*8ccd4a63SDavid du Colombier typedef struct SmbFindFileBothDirectoryInfo SmbFindFileBothDirectoryInfo; 16*8ccd4a63SDavid du Colombier typedef struct SmbLock SmbLock; 17*8ccd4a63SDavid du Colombier typedef struct SmbLockList SmbLockList; 18*8ccd4a63SDavid du Colombier typedef struct SmbSlut SmbSlut; 19*8ccd4a63SDavid du Colombier 20*8ccd4a63SDavid du Colombier #pragma incomplete SmbIdMap 21*8ccd4a63SDavid du Colombier #pragma incomplete SmbBuffer 22*8ccd4a63SDavid du Colombier #pragma incomplete SmbLockList 23*8ccd4a63SDavid du Colombier 24*8ccd4a63SDavid du Colombier typedef int SMBCIFSWRITEFN(SmbCifsSession *cifs, void *buf, long n); 25*8ccd4a63SDavid du Colombier typedef int SMBCIFSACCEPTFN(SmbCifsSession *cifs, SMBCIFSWRITEFN **fnp); 26*8ccd4a63SDavid du Colombier typedef void SMBIDMAPAPPLYFN(void *magic, void *p); 27*8ccd4a63SDavid du Colombier 28*8ccd4a63SDavid du Colombier struct SmbPeerInfo { 29*8ccd4a63SDavid du Colombier ulong capabilities; 30*8ccd4a63SDavid du Colombier ushort maxlen; 31*8ccd4a63SDavid du Colombier uchar securitymode; 32*8ccd4a63SDavid du Colombier ushort maxmpxcount; 33*8ccd4a63SDavid du Colombier ushort maxnumbervcs; 34*8ccd4a63SDavid du Colombier ulong maxbuffersize; 35*8ccd4a63SDavid du Colombier ulong maxrawsize; 36*8ccd4a63SDavid du Colombier ulong sessionkey; 37*8ccd4a63SDavid du Colombier vlong utc; 38*8ccd4a63SDavid du Colombier short tzoff; 39*8ccd4a63SDavid du Colombier uchar encryptionkeylength; 40*8ccd4a63SDavid du Colombier uchar *encryptionkey; 41*8ccd4a63SDavid du Colombier char *oemdomainname; 42*8ccd4a63SDavid du Colombier }; 43*8ccd4a63SDavid du Colombier 44*8ccd4a63SDavid du Colombier struct SmbTransaction { 45*8ccd4a63SDavid du Colombier struct { 46*8ccd4a63SDavid du Colombier char *name; 47*8ccd4a63SDavid du Colombier ulong tpcount; 48*8ccd4a63SDavid du Colombier uchar *parameters; 49*8ccd4a63SDavid du Colombier ulong pcount; 50*8ccd4a63SDavid du Colombier ulong tdcount; 51*8ccd4a63SDavid du Colombier uchar *data; 52*8ccd4a63SDavid du Colombier ulong maxpcount; 53*8ccd4a63SDavid du Colombier ulong maxdcount; 54*8ccd4a63SDavid du Colombier ulong maxscount; 55*8ccd4a63SDavid du Colombier ulong dcount; 56*8ccd4a63SDavid du Colombier ushort scount; 57*8ccd4a63SDavid du Colombier ushort *setup; 58*8ccd4a63SDavid du Colombier ushort flags; 59*8ccd4a63SDavid du Colombier } in; 60*8ccd4a63SDavid du Colombier struct { 61*8ccd4a63SDavid du Colombier ulong tpcount; 62*8ccd4a63SDavid du Colombier ulong tdcount; 63*8ccd4a63SDavid du Colombier SmbBuffer *parameters; 64*8ccd4a63SDavid du Colombier SmbBuffer *data; 65*8ccd4a63SDavid du Colombier ushort *setup; 66*8ccd4a63SDavid du Colombier } out; 67*8ccd4a63SDavid du Colombier }; 68*8ccd4a63SDavid du Colombier 69*8ccd4a63SDavid du Colombier enum { 70*8ccd4a63SDavid du Colombier SmbSessionNeedNegotiate, 71*8ccd4a63SDavid du Colombier SmbSessionNeedSetup, 72*8ccd4a63SDavid du Colombier SmbSessionEstablished, 73*8ccd4a63SDavid du Colombier }; 74*8ccd4a63SDavid du Colombier 75*8ccd4a63SDavid du Colombier struct SmbSession { 76*8ccd4a63SDavid du Colombier NbSession *nbss; 77*8ccd4a63SDavid du Colombier SmbCifsSession *cifss; 78*8ccd4a63SDavid du Colombier uchar nextcommand; 79*8ccd4a63SDavid du Colombier SmbBuffer *response; 80*8ccd4a63SDavid du Colombier SmbPeerInfo peerinfo; 81*8ccd4a63SDavid du Colombier Chalstate *cs; 82*8ccd4a63SDavid du Colombier struct { 83*8ccd4a63SDavid du Colombier char *accountname; 84*8ccd4a63SDavid du Colombier char *primarydomain; 85*8ccd4a63SDavid du Colombier char *nativeos; 86*8ccd4a63SDavid du Colombier char *nativelanman; 87*8ccd4a63SDavid du Colombier ushort maxmpxcount; 88*8ccd4a63SDavid du Colombier MSchapreply mschapreply; 89*8ccd4a63SDavid du Colombier } client; 90*8ccd4a63SDavid du Colombier SmbTransaction transaction; 91*8ccd4a63SDavid du Colombier SmbIdMap *fidmap; 92*8ccd4a63SDavid du Colombier SmbIdMap *tidmap; 93*8ccd4a63SDavid du Colombier SmbIdMap *sidmap; 94*8ccd4a63SDavid du Colombier int state; 95*8ccd4a63SDavid du Colombier uchar errclass; 96*8ccd4a63SDavid du Colombier ushort error; 97*8ccd4a63SDavid du Colombier int tzoff; // as passed to client during negotiation 98*8ccd4a63SDavid du Colombier SmbService *serv; 99*8ccd4a63SDavid du Colombier }; 100*8ccd4a63SDavid du Colombier 101*8ccd4a63SDavid du Colombier typedef struct SmbHeader { 102*8ccd4a63SDavid du Colombier uchar command; 103*8ccd4a63SDavid du Colombier union { 104*8ccd4a63SDavid du Colombier struct { 105*8ccd4a63SDavid du Colombier uchar errclass; 106*8ccd4a63SDavid du Colombier ushort error; 107*8ccd4a63SDavid du Colombier }; 108*8ccd4a63SDavid du Colombier ulong status; 109*8ccd4a63SDavid du Colombier }; 110*8ccd4a63SDavid du Colombier uchar flags; 111*8ccd4a63SDavid du Colombier ushort flags2; 112*8ccd4a63SDavid du Colombier union { 113*8ccd4a63SDavid du Colombier struct { 114*8ccd4a63SDavid du Colombier ushort pidhigh; 115*8ccd4a63SDavid du Colombier uchar securitysignature[8]; 116*8ccd4a63SDavid du Colombier }; 117*8ccd4a63SDavid du Colombier }; 118*8ccd4a63SDavid du Colombier ushort tid; 119*8ccd4a63SDavid du Colombier ushort pid; 120*8ccd4a63SDavid du Colombier ushort uid; 121*8ccd4a63SDavid du Colombier ushort mid; 122*8ccd4a63SDavid du Colombier uchar wordcount; 123*8ccd4a63SDavid du Colombier } SmbHeader; 124*8ccd4a63SDavid du Colombier 125*8ccd4a63SDavid du Colombier typedef enum SmbProcessResult { 126*8ccd4a63SDavid du Colombier SmbProcessResultOk, 127*8ccd4a63SDavid du Colombier SmbProcessResultUnimp, 128*8ccd4a63SDavid du Colombier SmbProcessResultFormat, 129*8ccd4a63SDavid du Colombier SmbProcessResultMisc, 130*8ccd4a63SDavid du Colombier SmbProcessResultError, 131*8ccd4a63SDavid du Colombier SmbProcessResultReply, 132*8ccd4a63SDavid du Colombier SmbProcessResultDie, 133*8ccd4a63SDavid du Colombier } SmbProcessResult; 134*8ccd4a63SDavid du Colombier 135*8ccd4a63SDavid du Colombier typedef SmbProcessResult SMBPROCESSFN(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *); 136*8ccd4a63SDavid du Colombier typedef struct SmbOpTableEntry SmbOpTableEntry; 137*8ccd4a63SDavid du Colombier struct SmbOpTableEntry { 138*8ccd4a63SDavid du Colombier char *name; 139*8ccd4a63SDavid du Colombier SMBPROCESSFN *process; 140*8ccd4a63SDavid du Colombier int debug; 141*8ccd4a63SDavid du Colombier }; 142*8ccd4a63SDavid du Colombier 143*8ccd4a63SDavid du Colombier extern SmbOpTableEntry smboptable[256]; 144*8ccd4a63SDavid du Colombier 145*8ccd4a63SDavid du Colombier typedef struct SmbGlobals SmbGlobals; 146*8ccd4a63SDavid du Colombier 147*8ccd4a63SDavid du Colombier extern SmbGlobals smbglobals; 148*8ccd4a63SDavid du Colombier 149*8ccd4a63SDavid du Colombier struct SmbServerInfo { 150*8ccd4a63SDavid du Colombier char *name; 151*8ccd4a63SDavid du Colombier char *nativelanman; 152*8ccd4a63SDavid du Colombier uchar vmaj, vmin; 153*8ccd4a63SDavid du Colombier ulong stype; 154*8ccd4a63SDavid du Colombier char *remark; 155*8ccd4a63SDavid du Colombier }; 156*8ccd4a63SDavid du Colombier 157*8ccd4a63SDavid du Colombier struct SmbGlobals { 158*8ccd4a63SDavid du Colombier int maxreceive; 159*8ccd4a63SDavid du Colombier int unicode; 160*8ccd4a63SDavid du Colombier SmbServerInfo serverinfo; 161*8ccd4a63SDavid du Colombier char *nativeos; 162*8ccd4a63SDavid du Colombier char *primarydomain; 163*8ccd4a63SDavid du Colombier NbName nbname; 164*8ccd4a63SDavid du Colombier char *accountname; 165*8ccd4a63SDavid du Colombier char *mailslotbrowse; 166*8ccd4a63SDavid du Colombier char *pipelanman; 167*8ccd4a63SDavid du Colombier int l2sectorsize; 168*8ccd4a63SDavid du Colombier int l2allocationsize; 169*8ccd4a63SDavid du Colombier int convertspace; 170*8ccd4a63SDavid du Colombier struct { 171*8ccd4a63SDavid du Colombier int fd; 172*8ccd4a63SDavid du Colombier int print; 173*8ccd4a63SDavid du Colombier int tids; 174*8ccd4a63SDavid du Colombier int sids; 175*8ccd4a63SDavid du Colombier int fids; 176*8ccd4a63SDavid du Colombier int rap2; 177*8ccd4a63SDavid du Colombier int find; 178*8ccd4a63SDavid du Colombier int query; 179*8ccd4a63SDavid du Colombier int sharedfiles; 180*8ccd4a63SDavid du Colombier int sessions; 181*8ccd4a63SDavid du Colombier int rep; 182*8ccd4a63SDavid du Colombier int poolparanoia; 183*8ccd4a63SDavid du Colombier int locks; 184*8ccd4a63SDavid du Colombier } log; 185*8ccd4a63SDavid du Colombier }; 186*8ccd4a63SDavid du Colombier 187*8ccd4a63SDavid du Colombier struct SmbTree { 188*8ccd4a63SDavid du Colombier long id; 189*8ccd4a63SDavid du Colombier SmbService *serv; 190*8ccd4a63SDavid du Colombier }; 191*8ccd4a63SDavid du Colombier 192*8ccd4a63SDavid du Colombier struct SmbService { 193*8ccd4a63SDavid du Colombier Ref; 194*8ccd4a63SDavid du Colombier char *name; 195*8ccd4a63SDavid du Colombier char *type; 196*8ccd4a63SDavid du Colombier ushort stype; 197*8ccd4a63SDavid du Colombier char *path; 198*8ccd4a63SDavid du Colombier char *remark; 199*8ccd4a63SDavid du Colombier SmbService *next; 200*8ccd4a63SDavid du Colombier }; 201*8ccd4a63SDavid du Colombier 202*8ccd4a63SDavid du Colombier extern SmbService *smbservices; 203*8ccd4a63SDavid du Colombier 204*8ccd4a63SDavid du Colombier typedef struct SmbClient SmbClient; 205*8ccd4a63SDavid du Colombier 206*8ccd4a63SDavid du Colombier 207*8ccd4a63SDavid du Colombier typedef struct SmbTransactionMethod { 208*8ccd4a63SDavid du Colombier int (*encodeprimary)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, 209*8ccd4a63SDavid du Colombier SmbBuffer *ob, uchar *wordcount, ushort *bytecount, char **errmsgp); 210*8ccd4a63SDavid du Colombier int (*encodesecondary)(SmbTransaction *t, SmbHeader *h, SmbBuffer *ob, char **errmsgp); 211*8ccd4a63SDavid du Colombier int (*sendrequest)(void *magic, SmbBuffer *ob, char **errmsgp); 212*8ccd4a63SDavid du Colombier int (*receiveintermediate)(void *magic, uchar *wordcountp, ushort *bytecountp, char **errmsgp); 213*8ccd4a63SDavid du Colombier int (*receiveresponse)(void *magic, SmbBuffer *ib, char **errmsgp); 214*8ccd4a63SDavid du Colombier int (*decoderesponse)(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp); 215*8ccd4a63SDavid du Colombier int (*encoderesponse)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, 216*8ccd4a63SDavid du Colombier SmbBuffer *ob, char **errmsgp); 217*8ccd4a63SDavid du Colombier int (*sendresponse)(void *magic, SmbBuffer *ob, char **errmsgp); 218*8ccd4a63SDavid du Colombier } SmbTransactionMethod; 219*8ccd4a63SDavid du Colombier 220*8ccd4a63SDavid du Colombier extern SmbTransactionMethod smbtransactionmethoddgram; 221*8ccd4a63SDavid du Colombier 222*8ccd4a63SDavid du Colombier struct SmbSearch { 223*8ccd4a63SDavid du Colombier long id; 224*8ccd4a63SDavid du Colombier SmbTree *t; 225*8ccd4a63SDavid du Colombier SmbDirCache *dc; 226*8ccd4a63SDavid du Colombier Reprog *rep; 227*8ccd4a63SDavid du Colombier ushort tid; 228*8ccd4a63SDavid du Colombier }; 229*8ccd4a63SDavid du Colombier 230*8ccd4a63SDavid du Colombier struct SmbFile { 231*8ccd4a63SDavid du Colombier long id; 232*8ccd4a63SDavid du Colombier SmbTree *t; // tree this belongs to 233*8ccd4a63SDavid du Colombier int fd; 234*8ccd4a63SDavid du Colombier char *name; 235*8ccd4a63SDavid du Colombier int p9mode; // how it was opened 236*8ccd4a63SDavid du Colombier int share; // additional sharing restictions added by this fid 237*8ccd4a63SDavid du Colombier int ioallowed; 238*8ccd4a63SDavid du Colombier SmbSharedFile *sf; 239*8ccd4a63SDavid du Colombier }; 240*8ccd4a63SDavid du Colombier 241*8ccd4a63SDavid du Colombier struct SmbSharedFile { 242*8ccd4a63SDavid du Colombier ushort type; 243*8ccd4a63SDavid du Colombier ulong dev; 244*8ccd4a63SDavid du Colombier vlong path; 245*8ccd4a63SDavid du Colombier // char *name; 246*8ccd4a63SDavid du Colombier int share; // current share level 247*8ccd4a63SDavid du Colombier int deleteonclose; 248*8ccd4a63SDavid du Colombier SmbLockList *locklist; 249*8ccd4a63SDavid du Colombier }; 250*8ccd4a63SDavid du Colombier 251*8ccd4a63SDavid du Colombier struct SmbLock { 252*8ccd4a63SDavid du Colombier vlong base; 253*8ccd4a63SDavid du Colombier vlong limit; 254*8ccd4a63SDavid du Colombier SmbSession *s; // owning session 255*8ccd4a63SDavid du Colombier ushort pid; // owning pid 256*8ccd4a63SDavid du Colombier }; 257*8ccd4a63SDavid du Colombier 258*8ccd4a63SDavid du Colombier struct SmbCifsSession { 259*8ccd4a63SDavid du Colombier int fd; 260*8ccd4a63SDavid du Colombier void *magic; 261*8ccd4a63SDavid du Colombier }; 262*8ccd4a63SDavid du Colombier 263*8ccd4a63SDavid du Colombier struct SmbClient { 264*8ccd4a63SDavid du Colombier SmbPeerInfo peerinfo; 265*8ccd4a63SDavid du Colombier NbSession *nbss; 266*8ccd4a63SDavid du Colombier SmbBuffer *b; 267*8ccd4a63SDavid du Colombier ushort ipctid; 268*8ccd4a63SDavid du Colombier ushort sharetid; 269*8ccd4a63SDavid du Colombier SmbHeader protoh; 270*8ccd4a63SDavid du Colombier }; 271*8ccd4a63SDavid du Colombier 272*8ccd4a63SDavid du Colombier struct SmbRapServerInfo1 { 273*8ccd4a63SDavid du Colombier char name[16]; 274*8ccd4a63SDavid du Colombier uchar vmaj; 275*8ccd4a63SDavid du Colombier uchar vmin; 276*8ccd4a63SDavid du Colombier ulong type; 277*8ccd4a63SDavid du Colombier char *remark; 278*8ccd4a63SDavid du Colombier }; 279*8ccd4a63SDavid du Colombier 280*8ccd4a63SDavid du Colombier struct SmbFindFileBothDirectoryInfo { 281*8ccd4a63SDavid du Colombier ulong fileindex; 282*8ccd4a63SDavid du Colombier vlong creationtime; 283*8ccd4a63SDavid du Colombier vlong lastaccesstime; 284*8ccd4a63SDavid du Colombier vlong lastwritetime; 285*8ccd4a63SDavid du Colombier vlong changetime; 286*8ccd4a63SDavid du Colombier vlong endoffile; 287*8ccd4a63SDavid du Colombier vlong allocationsize; 288*8ccd4a63SDavid du Colombier ulong extfileattributes; 289*8ccd4a63SDavid du Colombier char *filename; 290*8ccd4a63SDavid du Colombier }; 291*8ccd4a63SDavid du Colombier 292*8ccd4a63SDavid du Colombier enum { 293*8ccd4a63SDavid du Colombier SMB_STRING_UNALIGNED = 1, 294*8ccd4a63SDavid du Colombier SMB_STRING_UPCASE = 2, 295*8ccd4a63SDavid du Colombier SMB_STRING_UNTERMINATED = 4, 296*8ccd4a63SDavid du Colombier SMB_STRING_UNICODE = 8, 297*8ccd4a63SDavid du Colombier SMB_STRING_ASCII = 16, 298*8ccd4a63SDavid du Colombier SMB_STRING_REVPATH = 32, 299*8ccd4a63SDavid du Colombier SMB_STRING_PATH = 64, 300*8ccd4a63SDavid du Colombier SMB_STRING_CONVERT_MASK = SMB_STRING_PATH | SMB_STRING_REVPATH | SMB_STRING_UPCASE, 301*8ccd4a63SDavid du Colombier }; 302*8ccd4a63SDavid du Colombier 303*8ccd4a63SDavid du Colombier struct SmbDirCache { 304*8ccd4a63SDavid du Colombier Dir *buf; 305*8ccd4a63SDavid du Colombier long n; 306*8ccd4a63SDavid du Colombier long i; 307*8ccd4a63SDavid du Colombier }; 308*8ccd4a63SDavid du Colombier 309*8ccd4a63SDavid du Colombier typedef struct SmbTrans2OpTableEntry SmbTrans2OpTableEntry; 310*8ccd4a63SDavid du Colombier typedef SmbProcessResult SMBTRANS2PROCESSFN(SmbSession *s, SmbHeader *h); 311*8ccd4a63SDavid du Colombier struct SmbTrans2OpTableEntry { 312*8ccd4a63SDavid du Colombier char *name; 313*8ccd4a63SDavid du Colombier SMBTRANS2PROCESSFN *process; 314*8ccd4a63SDavid du Colombier int debug; 315*8ccd4a63SDavid du Colombier }; 316*8ccd4a63SDavid du Colombier extern SmbTrans2OpTableEntry smbtrans2optable[]; 317*8ccd4a63SDavid du Colombier extern int smbtrans2optablesize; 318*8ccd4a63SDavid du Colombier 319*8ccd4a63SDavid du Colombier struct SmbSlut { 320*8ccd4a63SDavid du Colombier char *name; 321*8ccd4a63SDavid du Colombier int val; 322*8ccd4a63SDavid du Colombier }; 323*8ccd4a63SDavid du Colombier 324*8ccd4a63SDavid du Colombier extern SmbSlut smbopenmodeslut[]; 325*8ccd4a63SDavid du Colombier extern SmbSlut smbsharemodeslut[]; 326