summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aquarela/client.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aquarela/client.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aquarela/client.c')
-rwxr-xr-xsys/src/cmd/aquarela/client.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/sys/src/cmd/aquarela/client.c b/sys/src/cmd/aquarela/client.c
new file mode 100755
index 000000000..88fac27b4
--- /dev/null
+++ b/sys/src/cmd/aquarela/client.c
@@ -0,0 +1,145 @@
+#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)
+{
+ fprint(2, "usage: %s [-u ipaddr] name\n", argv0);
+ exits("usage");
+}
+
+void
+threadmain(int argc, char **argv)
+{
+ int broadcast = 1, i, listen137thread, rv;
+ char *ip;
+ uchar ipaddr[IPaddrlen], serveripaddr[IPaddrlen];
+ NbName nbname;
+
+ ARGBEGIN {
+ case 'u':
+ broadcast = 0;
+ ip = EARGF(usage());
+ if (parseip(serveripaddr, ip) == -1)
+ sysfatal("bad ip address %s", ip);
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (argc == 0)
+ usage();
+
+ nbmknamefromstring(nbname, argv[0]);
+
+ ipifc = readipifc("/net", nil, 0);
+ if (ipifc == nil || ipifc->lifc == nil)
+ sysfatal("no network interface");
+ 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);
+}