static int call(char *clone, char *dest, DS *ds) { int fd, cfd, n; char name[Maxpath], data[Maxpath], err[ERRMAX], *p; cfd = kopen(clone, ORDWR); if(cfd < 0){ kerrstr(err, sizeof err); kwerrstr("%s (%s)", err, clone); return -1; } /* get directory name */ n = kread(cfd, name, sizeof(name)-1); if(n < 0){ kerrstr(err, sizeof err); kclose(cfd); kwerrstr("read %s: %s", clone, err); return -1; } name[n] = 0; for(p = name; *p == ' '; p++) ; sprint(name, "%ld", strtoul(p, 0, 0)); p = strrchr(clone, '/'); *p = 0; if(ds->dir) snprint(ds->dir, NETPATHLEN, "%s/%s", clone, name); snprint(data, sizeof(data), "%s/%s/data", clone, name); /* connect */ if(ds->local) snprint(name, sizeof(name), "connect %s %s", dest, ds->local); else snprint(name, sizeof(name), "connect %s", dest); if(kwrite(cfd, name, strlen(name)) < 0){ err[0] = 0; kerrstr(err, sizeof err); kclose(cfd); kwerrstr("%s (%s)", err, name); return -1; } /* open data connection */ fd = kopen(data, ORDWR); if(fd < 0){ err[0] = 0; kerrstr(err, sizeof err); kwerrstr("%s (%s)", err, data); kclose(cfd); return -1; } if(ds->cfdp) *ds->cfdp = cfd; else kclose(cfd); return fd; }
static int csdial(DS *ds) { int n, fd, rv; char *p, buf[Maxstring], clone[Maxpath], err[ERRMAX], besterr[ERRMAX]; /* * open connection server */ snprint(buf, sizeof(buf), "%s/cs", ds->netdir); fd = kopen(buf, ORDWR); if(fd < 0){ /* no connection server, don't translate */ snprint(clone, sizeof(clone), "%s/%s/clone", ds->netdir, ds->proto); return call(clone, ds->rem, ds); } /* * ask connection server to translate */ sprint(buf, "%s!%s", ds->proto, ds->rem); if(kwrite(fd, buf, strlen(buf)) < 0){ kerrstr(err, sizeof err); kclose(fd); kwerrstr("%s (%s)", err, buf); return -1; } /* * loop through each address from the connection server till * we get one that works. */ *besterr = 0; strcpy(err, Egreg); rv = -1; kseek(fd, 0, 0); while((n = kread(fd, buf, sizeof(buf) - 1)) > 0){ buf[n] = 0; p = strchr(buf, ' '); if(p == 0) continue; *p++ = 0; rv = call(buf, p, ds); if(rv >= 0) break; err[0] = 0; kerrstr(err, sizeof err); if(strstr(err, "does not exist") == 0) memmove(besterr, err, sizeof besterr); } kclose(fd); if(rv < 0 && *besterr) kerrstr(besterr, sizeof besterr); else kerrstr(err, sizeof err); return rv; }
/* * the dialstring is of the form '[/net/]proto!dest' */ int kdial(char *dest, char *local, char *dir, int *cfdp) { DS ds; int rv; char *err, *alterr; err = kmalloc(ERRMAX, KMALLOC_WAIT); alterr = kmalloc(ERRMAX, KMALLOC_WAIT); ds.local = local; ds.dir = dir; ds.cfdp = cfdp; _dial_string_parse(dest, &ds); if (ds.netdir) { rv = csdial(&ds); goto out; } ds.netdir = "/net"; rv = csdial(&ds); if (rv >= 0) goto out; err[0] = 0; strlcpy(err, current_errstr(), ERRMAX); if (strstr(err, "refused") != 0) { goto out; } ds.netdir = "/net.alt"; rv = csdial(&ds); if (rv >= 0) goto out; alterr[0] = 0; kerrstr(alterr, ERRMAX); if (strstr(alterr, "translate") || strstr(alterr, "does not exist")) kerrstr(err, ERRMAX); else kerrstr(alterr, ERRMAX); out: kfree(err); kfree(alterr); return rv; }
/* * the dialstring is of the form '[/net/]proto!dest' */ int kdial(char *dest, char *local, char *dir, int *cfdp) { DS ds; int rv; char err[ERRMAX], alterr[ERRMAX]; ds.local = local; ds.dir = dir; ds.cfdp = cfdp; _dial_string_parse(dest, &ds); if(ds.netdir) return csdial(&ds); ds.netdir = "/net"; rv = csdial(&ds); if(rv >= 0) return rv; err[0] = 0; kerrstr(err, sizeof err); if(strstr(err, "refused") != 0){ kerrstr(err, sizeof err); return rv; } ds.netdir = "/net.alt"; rv = csdial(&ds); if(rv >= 0) return rv; alterr[0] = 0; kerrstr(alterr, sizeof err); if(strstr(alterr, "translate") || strstr(alterr, "does not exist")) kerrstr(err, sizeof err); else kerrstr(alterr, sizeof alterr); return rv; }
/*ARGSUSED0*/ int main(int argc, char *argv[]) { int pid ; FILE *pidfile = fopen(SYSLOG_PIDFILE, "r") ; if(pidfile == NULL) { fprintf(stderr, "%s: couldn't open %s: %s\n", argv[0], SYSLOG_PIDFILE, strerror(errno)) ; exit(1) ; } if(fscanf(pidfile, "%d", &pid) < 1) exit(2) ; if(kill(pid, SIGHUP) < 0) { fprintf(stderr, "%s: kill -HUP %d: %s\n", argv[0], pid, kerrstr(errno) ) ; exit(3) ; } return 0; }
static int call(char *clone, char *dest, DS * ds) { int fd, cfd, n, retval; char *name, *data, *err, *p; name = kmalloc(Maxpath, KMALLOC_WAIT); data = kmalloc(Maxpath, KMALLOC_WAIT); err = kmalloc(ERRMAX, KMALLOC_WAIT); cfd = sysopen(clone, O_RDWR); if (cfd < 0) { kerrstr(err, ERRMAX); set_errstr("%s (%s)", err, clone); retval = -1; goto out; } /* get directory name */ n = sysread(cfd, name, Maxpath - 1); if (n < 0) { kerrstr(err, ERRMAX); sysclose(cfd); set_errstr("read %s: %s", clone, err); retval = -1; goto out; } name[n] = 0; for (p = name; *p == ' '; p++) ; snprintf(name, Maxpath, "%ld", strtoul(p, 0, 0)); p = strrchr(clone, '/'); *p = 0; if (ds->dir) snprintf(ds->dir, NETPATHLEN, "%s/%s", clone, name); snprintf(data, Maxpath, "%s/%s/data", clone, name); /* connect */ if (ds->local) snprintf(name, Maxpath, "connect %s %s", dest, ds->local); else snprintf(name, Maxpath, "connect %s", dest); if (syswrite(cfd, name, strlen(name)) < 0) { err[0] = 0; kerrstr(err, ERRMAX); sysclose(cfd); set_errstr("%s (%s)", err, name); retval = -1; goto out; } /* open data connection */ fd = sysopen(data, O_RDWR); if (fd < 0) { err[0] = 0; kerrstr(err, ERRMAX); set_errstr("%s (%s)", err, data); sysclose(cfd); retval = -1; goto out; } if (ds->cfdp) *ds->cfdp = cfd; else sysclose(cfd); retval = fd; out: kfree(name); kfree(data); kfree(err); return retval; }
static int csdial(DS * ds) { int n, fd, rv = -1; char *p, *buf, *clone, *err, *besterr; buf = kmalloc(Maxstring, KMALLOC_WAIT); clone = kmalloc(Maxpath, KMALLOC_WAIT); err = kmalloc(ERRMAX, KMALLOC_WAIT); besterr = kmalloc(ERRMAX, KMALLOC_WAIT); /* * open connection server */ snprintf(buf, Maxstring, "%s/cs", ds->netdir); fd = sysopen(buf, O_RDWR); if (fd < 0) { /* no connection server, don't translate */ snprintf(clone, Maxpath, "%s/%s/clone", ds->netdir, ds->proto); rv = call(clone, ds->rem, ds); goto out; } /* * ask connection server to translate */ snprintf(buf, Maxstring, "%s!%s", ds->proto, ds->rem); if (syswrite(fd, buf, strlen(buf)) < 0) { kerrstr(err, ERRMAX); sysclose(fd); set_errstr("%s (%s)", err, buf); goto out; } /* * loop through each address from the connection server till * we get one that works. */ *besterr = 0; strlcpy(err, errno_to_string(ECONNRESET), ERRMAX); sysseek(fd, 0, 0); while ((n = sysread(fd, buf, Maxstring - 1)) > 0) { buf[n] = 0; p = strchr(buf, ' '); if (p == 0) continue; *p++ = 0; rv = call(buf, p, ds); if (rv >= 0) break; err[0] = 0; kerrstr(err, ERRMAX); if (strstr(err, "does not exist") == 0) memmove(besterr, err, ERRMAX); } sysclose(fd); if (rv < 0 && *besterr) kerrstr(besterr, ERRMAX); else kerrstr(err, ERRMAX); out: kfree(buf); kfree(clone); kfree(err); kfree(besterr); return rv; }