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