smbdat.h 6.5 KB

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