/* * announce a network service. */ int kannounce(char *addr, char *dir) { int ctl, n, m; char buf[NETPATHLEN]; char buf2[Maxpath]; char netdir[NETPATHLEN]; char naddr[Maxpath]; char *cp; /* * translate the address */ if(nettrans(addr, naddr, sizeof(naddr), netdir, sizeof(netdir)) < 0) return -1; /* * get a control channel */ ctl = kopen(netdir, ORDWR); if(ctl<0) return -1; cp = strrchr(netdir, '/'); *cp = 0; /* * find out which line we have */ n = sprint(buf, "%.*s/", sizeof buf, netdir); m = kread(ctl, &buf[n], sizeof(buf)-n-1); if(m <= 0){ kclose(ctl); return -1; } buf[n+m] = 0; /* * make the call */ n = snprint(buf2, sizeof buf2, "announce %s", naddr); if(kwrite(ctl, buf2, n)!=n){ kclose(ctl); return -1; } /* * return directory etc. */ if(dir) strcpy(dir, buf); return ctl; }
/* * announce a network service. */ int announce(const char *addr, char *dir) { int ctl, n, m; char buf[Maxpath]; char buf2[Maxpath]; char netdir[Maxpath]; char naddr[Maxpath]; char *cp; /* * translate the address */ if(nettrans(addr, naddr, sizeof(naddr), netdir, sizeof(netdir)) < 0) return -1; /* * get a control channel */ ctl = open(netdir, ORDWR); if(ctl<0){ werrstr("announce opening %s: %r", netdir); return -1; } cp = strrchr(netdir, '/'); if(cp == nil){ werrstr("announce arg format %s", netdir); close(ctl); return -1; } *cp = 0; /* * find out which line we have */ n = snprint(buf, sizeof(buf), "%s/", netdir); m = read(ctl, &buf[n], sizeof(buf)-n-1); if(m <= 0){ werrstr("announce reading %s: %r", netdir); close(ctl); return -1; } buf[n+m] = 0; /* * make the call */ n = snprint(buf2, sizeof(buf2), "announce %s", naddr); if(write(ctl, buf2, n)!=n){ werrstr("announce writing %s: %r", netdir); close(ctl); return -1; } /* * return directory etc. */ if(dir){ strncpy(dir, buf, NETPATHLEN); dir[NETPATHLEN-1] = 0; } return ctl; }