/* * call up the connection server and get a translation */ static int nettrans(char *addr, char *naddr, int na, char *file, int nf) { int i, fd; char buf[Maxpath]; char netdir[NETPATHLEN]; char *p, *p2; long n; /* * parse, get network directory */ p = strchr(addr, '!'); if (p == 0) { set_errstr("bad dial string: %s", addr); return -1; } if (*addr != '/') { strlcpy(netdir, "/net", sizeof(netdir)); } else { for (p2 = p; *p2 != '/'; p2--) ; i = p2 - addr; if (i == 0 || i >= sizeof(netdir)) { set_errstr("bad dial string: %s", addr); return -1; } strlcpy(netdir, addr, i + 1); addr = p2 + 1; } /* * ask the connection server */ snprintf(buf, sizeof(buf), "%s/cs", netdir); fd = sysopen(buf, O_RDWR); if (fd < 0) return identtrans(netdir, addr, naddr, na, file, nf); if (syswrite(fd, addr, strlen(addr)) < 0) { sysclose(fd); return -1; } sysseek(fd, 0, 0); n = sysread(fd, buf, sizeof(buf) - 1); sysclose(fd); if (n <= 0) return -1; buf[n] = 0; /* * parse the reply */ p = strchr(buf, ' '); if (p == 0) return -1; *p++ = 0; strlcpy(naddr, p, na); strlcpy(file, buf, nf); return 0; }
/* * call up the connection server and get a translation */ static int nettrans(const char *addr, char *naddr, int na, char *file, int nf) { int i, fd; char buf[Maxpath]; char netdir[Maxpath]; char *p, *p2; int32_t n; /* * parse, get network directory */ p = strchr(addr, '!'); if(p == 0){ werrstr("bad dial string: %s", addr); return -1; } if(*addr != '/'){ strncpy(netdir, "/net", sizeof(netdir)); netdir[sizeof(netdir) - 1] = 0; } else { for(p2 = p; *p2 != '/'; p2--) ; i = p2 - addr; if(i == 0 || i >= sizeof(netdir)){ werrstr("bad dial string: %s", addr); return -1; } strncpy(netdir, addr, i); netdir[i] = 0; addr = p2 + 1; } /* * ask the connection server */ snprint(buf, sizeof(buf), "%s/cs", netdir); fd = open(buf, ORDWR); if(fd < 0) return identtrans(netdir, addr, naddr, na, file, nf); if(write(fd, addr, strlen(addr)) < 0){ close(fd); return -1; } seek(fd, 0, 0); n = read(fd, buf, sizeof(buf)-1); close(fd); if(n <= 0) return -1; buf[n] = 0; /* * parse the reply */ p = strchr(buf, ' '); if(p == 0) return -1; *p++ = 0; strncpy(naddr, p, na); naddr[na-1] = 0; if(buf[0] == '/'){ p = strchr(buf+1, '/'); if(p == nil) p = buf; else p++; } snprint(file, nf, "%s/%s", netdir, p); return 0; }