123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #include <u.h>
- #include <libc.h>
- #include <ip.h>
- #include <thread.h>
- #include "netbios.h"
- static char *hmsg = "headers";
- int chatty = 1;
- void
- warning(char *fmt, ...)
- {
- char err[128];
- va_list arg;
- va_start(arg, fmt);
- vseprint(err, err+sizeof(err), fmt, arg);
- va_end(arg);
- syslog(1, "netbios-ns", err);
- if (chatty)
- print("%s\n", err);
- }
- static int
- udpannounce(void)
- {
- int data, ctl;
- char dir[64];
- char datafile[64+6];
- /* get a udp port */
- ctl = announce("udp!*!netbios-ns", dir);
- if(ctl < 0){
- warning("can't announce on netbios-ns udp port");
- return -1;
- }
- snprint(datafile, sizeof(datafile), "%s/data", dir);
- /* turn on header style interface */
- if(write(ctl, hmsg, strlen(hmsg)) , 0)
- abort(); /* hmsg */;
- data = open(datafile, ORDWR);
- if(data < 0){
- close(ctl);
- warning("can't announce on dns udp port");
- return -1;
- }
- close(ctl);
- return data;
- }
- #define BROADCAST 1
- void
- listen137(void *)
- {
- for (;;) {
- uchar msg[Udphdrsize + 576];
- int len = read(fd137, msg, sizeof(msg));
- if (len < 0)
- break;
- if (len >= Udphdrsize) {
- NbnsMessage *s;
- Udphdr *uh;
- uchar *p;
- uh = (Udphdr*)msg;
- p = msg + Udphdrsize;
- len -= Udphdrsize;
- s = nbnsconvM2S(p, len);
- if (s) {
- print("%I:%d -> %I:%d\n", uh->raddr, nhgets(uh->rport), uh->laddr, nhgets(uh->lport));
- nbnsdumpmessage(s);
- if (s->response) {
- NbnsTransaction *t;
- qlock(&transactionlist);
- for (t = transactionlist.head; t; t = t->next)
- if (t->id == s->id)
- break;
- if (t) {
- sendp(t->c, s);
- }
- else
- nbnsmessagefree(&s);
- qunlock(&transactionlist);
- }
- else
- nbnsmessagefree(&s);
- }
- }
- }
- }
- void
- usage(void)
- {
- print("usage: client [-u ipaddr] name\n");
- }
- void
- threadmain(int argc, char **argv)
- {
- int i;
- NbName nbname;
- int listen137thread;
- uchar ipaddr[IPaddrlen];
- int rv;
- int broadcast = 1;
- uchar serveripaddr[IPaddrlen];
- ARGBEGIN {
- case 'u':
- broadcast = 0;
- parseip(serveripaddr, ARGF());
- break;
- default:
- usage();
- } ARGEND;
- if (argc == 0)
- exits("");
- nbmknamefromstring(nbname, argv[0]);
- ipifc = readipifc("/net", nil, 0);
- if (ipifc == nil || ipifc->lifc == nil) {
- print("no network interface");
- exits("");
- }
- fmtinstall('I', eipfmt);
- ipmove(bcastaddr, ipifc->lifc->ip);
- for (i = 0; i < IPaddrlen; i++)
- bcastaddr[i] |= ~ipifc->lifc->mask[i];
- print("broadcasting to %I\n", bcastaddr);
- // setnetmtpt("/net");
- fd137 = udpannounce();
- listen137thread = proccreate(listen137, nil, 16384);
- rv = nbnsaddname(broadcast ? nil : serveripaddr, nbname, 3000, ipifc->lifc->ip);
- if (rv != 0)
- print("error code %d\n", rv);
- else
- print("%I\n", ipaddr);
- nbnsalarmend();
- threadint(listen137thread);
- }
|