netbios.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. enum {
  2. NbNameLen = 16,
  3. NbnsTimeoutBroadcast = 1000,
  4. NbnsRetryBroadcast = 3,
  5. NbnsPort = 137,
  6. NbDgramMaxLen = 576,
  7. };
  8. typedef struct NbnsHdr {
  9. uchar name_trn_id[2];
  10. uchar ctrl[2];
  11. uchar qdcount[2];
  12. uchar ancount[2];
  13. uchar nscount[2];
  14. uchar arcount[2];
  15. } NbnsHdr;
  16. enum {
  17. NbnsResponse = 1 << 15
  18. };
  19. enum {
  20. NbnsOpShift = 11,
  21. NbnsOpMask = 0xf,
  22. NbnsOpQuery = 0,
  23. NbnsOpRegistration = 5,
  24. NbnsOpRelease = 6,
  25. NbnsOpWack = 7,
  26. NbnsOpRefresh = 8
  27. };
  28. enum {
  29. NbnsFlagBroadcast = (1 << 4),
  30. NbnsFlagRecursionAvailable = (1 << 7),
  31. NbnsFlagRecursionDesired = (1 << 8),
  32. NbnsFlagTruncation = (1 << 9),
  33. NbnsFlagAuthoritativeAnswer = (1 << 10),
  34. };
  35. enum {
  36. NbnsRcodeShift = 0,
  37. NbnsRcodeMask = 0xf,
  38. };
  39. enum {
  40. NbnsQuestionTypeNb = 0x0020,
  41. NbnsQuestionTypeNbStat = 0x0021,
  42. NbnsQuestionClassIn = 0x0001,
  43. };
  44. enum {
  45. NbnsResourceTypeA = 0x0001,
  46. NbnsResourceTypeNs = 0x0002,
  47. NbnsResourceTypeNull = 0x000a,
  48. NbnsResourceTypeNb = 0x0020,
  49. NbnsResourceTypeNbStat = 0x0021,
  50. NbnsResourceClassIn = 0x0001,
  51. };
  52. typedef struct NbnsMessageQuestion NbnsMessageQuestion;
  53. typedef struct NbnsMessageResource NbnsMessageResource;
  54. typedef uchar NbName[NbNameLen];
  55. int nbnamedecode(uchar *base, uchar *p, uchar *ep, NbName name);
  56. int nbnameencode(uchar *p, uchar *ep, NbName name);
  57. int nbnameequal(NbName name1, NbName name2);
  58. void nbnamecpy(NbName n1, NbName n2);
  59. void nbmknamefromstring(NbName nbname, char *string);
  60. void nbmknamefromstringandtype(NbName nbname, char *string, uchar type);
  61. void nbmkstringfromname(char *buf, int buflen, NbName name);
  62. #pragma varargck type "B" uchar *
  63. int nbnamefmt(Fmt *);
  64. struct NbnsMessageQuestion {
  65. NbName name;
  66. ushort type;
  67. ushort class;
  68. NbnsMessageQuestion *next;
  69. };
  70. NbnsMessageQuestion *nbnsmessagequestionnew(NbName name, ushort type, ushort class);
  71. struct NbnsMessageResource {
  72. NbName name;
  73. ushort type;
  74. ushort class;
  75. ulong ttl;
  76. ushort rdlength;
  77. uchar *rdata;
  78. NbnsMessageResource *next;
  79. };
  80. NbnsMessageResource *nbnsmessageresourcenew(NbName name, ushort type, ushort class, ulong ttl, int rdcount, uchar *rdata);
  81. typedef struct NbnsMessage {
  82. ushort id;
  83. int response;
  84. int opcode;
  85. int broadcast;
  86. int recursionavailable;
  87. int recursiondesired;
  88. int truncation;
  89. int authoritativeanswer;
  90. int rcode;
  91. NbnsMessageQuestion *q;
  92. NbnsMessageResource *an;
  93. NbnsMessageResource *ns;
  94. NbnsMessageResource *ar;
  95. } NbnsMessage;
  96. NbnsMessage *nbnsmessagenew(void);
  97. void nbnsmessageaddquestion(NbnsMessage *s, NbnsMessageQuestion *q);
  98. void nbnsmessageaddresource(NbnsMessageResource **rp, NbnsMessageResource *r);
  99. NbnsMessage *nbnsconvM2S(uchar *ap, int nap);
  100. void nbnsmessagefree(NbnsMessage **sp);
  101. void nbnsdumpmessage(NbnsMessage *s);
  102. int nbnsconvS2M(NbnsMessage *s, uchar *ap, int nap);
  103. NbnsMessage *nbnsmessagenamequeryrequestnew(ushort id, int broadcast, NbName name);
  104. NbnsMessage *nbnsmessagenameregistrationrequestnew(ushort id, int broadcast, NbName name, ulong ttl, uchar *ipaddr);
  105. typedef struct NbnsTransaction NbnsTransaction;
  106. struct NbnsTransaction {
  107. ushort id;
  108. Channel *c;
  109. NbnsTransaction *next;
  110. };
  111. ushort nbnsnextid(void);
  112. int nbnsfindname(uchar *serveripaddr, NbName name, uchar *ipaddr, ulong *ttlp);
  113. int nbnsaddname(uchar *serveripaddr, NbName name, ulong ttl, uchar *ipaddr);
  114. NbnsTransaction *nbnstransactionnew(NbnsMessage *request, uchar *ipaddr);
  115. void nbnstransactionfree(NbnsTransaction **tp);
  116. typedef struct NbnsAlarm NbnsAlarm;
  117. struct NbnsAlarm {
  118. Channel *c;
  119. vlong expirems;
  120. NbnsAlarm *next;
  121. };
  122. void nbnsalarmset(NbnsAlarm *a, ulong millisec);
  123. void nbnsalarmcancel(NbnsAlarm *a);
  124. void nbnsalarmfree(NbnsAlarm **ap);
  125. NbnsAlarm *nbnsalarmnew(void);
  126. void nbnsalarmend(void);
  127. typedef struct NbSession NbSession;
  128. typedef int NBSSWRITEFN(NbSession *s, void *buf, long n);
  129. struct NbSession {
  130. int fd;
  131. void *magic;
  132. NbName from;
  133. NbName to;
  134. };
  135. int nbsslisten(NbName to, NbName from, int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **write), void *magic);
  136. NbSession *nbssconnect(NbName to, NbName from);
  137. void nbssfree(NbSession *s);
  138. typedef struct NbScatterGather NbScatterGather;
  139. struct NbScatterGather {
  140. void *p;
  141. long l;
  142. };
  143. int nbssgatherwrite(NbSession *s, NbScatterGather *a);
  144. long nbssscatterread(NbSession *, NbScatterGather *a);
  145. int nbsswrite(NbSession *s, void *buf, long n);
  146. long nbssread(NbSession *s, void *buf, long n);
  147. void *nbemalloc(ulong);
  148. int nbnameresolve(NbName name, uchar *ipaddr);
  149. void nbdumpdata(void *data, long datalen);
  150. typedef struct NbDgram {
  151. uchar type;
  152. uchar flags;
  153. ushort id;
  154. uchar srcip[IPaddrlen];
  155. ushort srcport;
  156. union {
  157. struct {
  158. ushort length;
  159. ushort offset;
  160. NbName srcname;
  161. NbName dstname;
  162. uchar *data;
  163. } datagram;
  164. struct {
  165. uchar code;
  166. } error;
  167. struct {
  168. NbName dstname;
  169. } query;
  170. };
  171. } NbDgram;
  172. enum {
  173. NbDgramDirectUnique = 0x10,
  174. NbDgramDirectGroup,
  175. NbDgramBroadcast,
  176. NbDgramError,
  177. NbDgramQueryRequest,
  178. NbDgramPositiveQueryResponse,
  179. NbDgramNegativeQueryResponse,
  180. NbDgramMore = 1,
  181. NbDgramFirst = 2,
  182. NbDgramPort = 138,
  183. NbDgramErrorDestinationNameNotPresent = 0x82,
  184. NbDgramMaxPacket = 576,
  185. };
  186. typedef struct NbDgramSendParameters {
  187. NbName to;
  188. uchar type;
  189. } NbDgramSendParameters;
  190. int nbdgramconvM2S(NbDgram *s, uchar *p, uchar *ep);
  191. int nbdgramconvS2M(uchar *p, uchar *ep, NbDgram *s);
  192. void nbdgramdump(NbDgram *s);
  193. int nbdgramsendto(uchar *ipaddr, ushort port, NbDgram *s);
  194. int nbdgramsend(NbDgramSendParameters *p, unsigned char *data, long datalen);
  195. char *nbdgramlisten(NbName to, int (*deliver)(void *magic, NbDgram *s), void *magic);
  196. int nbnametablefind(NbName name, int add);
  197. int nbnameisany(NbName name);
  198. int nbremotenametablefind(NbName name, uchar *ipaddr);
  199. int nbremotenametableadd(NbName name, uchar *ipaddr, ulong ttl);
  200. typedef struct NbGlobals {
  201. uchar myipaddr[IPaddrlen];
  202. uchar bcastaddr[IPaddrlen];
  203. NbName myname;
  204. } NbGlobals;
  205. extern NbGlobals nbglobals;
  206. extern NbName nbnameany;
  207. int nbinit(void);
  208. char *nbudpannounce(ushort port, int *fdp);
  209. extern int nbudphdrsize;