client.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. #include <thread.h>
  5. #include "netbios.h"
  6. static char *hmsg = "headers";
  7. int chatty = 1;
  8. void
  9. warning(char *fmt, ...)
  10. {
  11. char err[128];
  12. va_list arg;
  13. va_start(arg, fmt);
  14. vseprint(err, err+sizeof(err), fmt, arg);
  15. va_end(arg);
  16. syslog(1, "netbios-ns", err);
  17. if (chatty)
  18. print("%s\n", err);
  19. }
  20. static int
  21. udpannounce(void)
  22. {
  23. int data, ctl;
  24. char dir[64];
  25. char datafile[64+6];
  26. /* get a udp port */
  27. ctl = announce("udp!*!netbios-ns", dir);
  28. if(ctl < 0){
  29. warning("can't announce on netbios-ns udp port");
  30. return -1;
  31. }
  32. snprint(datafile, sizeof(datafile), "%s/data", dir);
  33. /* turn on header style interface */
  34. if(write(ctl, hmsg, strlen(hmsg)) , 0)
  35. abort(); /* hmsg */;
  36. data = open(datafile, ORDWR);
  37. if(data < 0){
  38. close(ctl);
  39. warning("can't announce on dns udp port");
  40. return -1;
  41. }
  42. close(ctl);
  43. return data;
  44. }
  45. #define BROADCAST 1
  46. void
  47. listen137(void *)
  48. {
  49. for (;;) {
  50. uchar msg[Udphdrsize + 576];
  51. int len = read(fd137, msg, sizeof(msg));
  52. if (len < 0)
  53. break;
  54. if (len >= Udphdrsize) {
  55. NbnsMessage *s;
  56. Udphdr *uh;
  57. uchar *p;
  58. uh = (Udphdr*)msg;
  59. p = msg + Udphdrsize;
  60. len -= Udphdrsize;
  61. s = nbnsconvM2S(p, len);
  62. if (s) {
  63. print("%I:%d -> %I:%d\n", uh->raddr, nhgets(uh->rport), uh->laddr, nhgets(uh->lport));
  64. nbnsdumpmessage(s);
  65. if (s->response) {
  66. NbnsTransaction *t;
  67. qlock(&transactionlist);
  68. for (t = transactionlist.head; t; t = t->next)
  69. if (t->id == s->id)
  70. break;
  71. if (t) {
  72. sendp(t->c, s);
  73. }
  74. else
  75. nbnsmessagefree(&s);
  76. qunlock(&transactionlist);
  77. }
  78. else
  79. nbnsmessagefree(&s);
  80. }
  81. }
  82. }
  83. }
  84. void
  85. usage(void)
  86. {
  87. print("usage: client [-u ipaddr] name\n");
  88. }
  89. void
  90. threadmain(int argc, char **argv)
  91. {
  92. int i;
  93. NbName nbname;
  94. int listen137thread;
  95. uchar ipaddr[IPaddrlen];
  96. int rv;
  97. int broadcast = 1;
  98. uchar serveripaddr[IPaddrlen];
  99. ARGBEGIN {
  100. case 'u':
  101. broadcast = 0;
  102. parseip(serveripaddr, ARGF());
  103. break;
  104. default:
  105. usage();
  106. } ARGEND;
  107. if (argc == 0)
  108. exits("");
  109. nbmknamefromstring(nbname, argv[0]);
  110. ipifc = readipifc("/net", nil, 0);
  111. if (ipifc == nil || ipifc->lifc == nil) {
  112. print("no network interface");
  113. exits("");
  114. }
  115. fmtinstall('I', eipfmt);
  116. ipmove(bcastaddr, ipifc->lifc->ip);
  117. for (i = 0; i < IPaddrlen; i++)
  118. bcastaddr[i] |= ~ipifc->lifc->mask[i];
  119. print("broadcasting to %I\n", bcastaddr);
  120. // setnetmtpt("/net");
  121. fd137 = udpannounce();
  122. listen137thread = proccreate(listen137, nil, 16384);
  123. rv = nbnsaddname(broadcast ? nil : serveripaddr, nbname, 3000, ipifc->lifc->ip);
  124. if (rv != 0)
  125. print("error code %d\n", rv);
  126. else
  127. print("%I\n", ipaddr);
  128. nbnsalarmend();
  129. threadint(listen137thread);
  130. }