/* side effect: sets network & target */ static int isv4name(char *name) { int r = 1; char *root, *ip, *pr; DS ds; _dial_string_parse(name, &ds); /* cope with leading /net.alt/icmp! and the like */ root = NULL; if (ds.netdir != NULL) { pr = strrchr(ds.netdir, '/'); if (pr == NULL) pr = ds.netdir; else { *pr++ = '\0'; root = ds.netdir; network = strdup(root); } if (strcmp(pr, v4pr.net) == 0) return 1; if (strcmp(pr, v6pr.net) == 0) return 0; } /* if it's a literal, it's obvious from syntax which proto it is */ free(target); target = strdup(ds.rem); if (isdottedquad(ds.rem)) return 1; else if (isv6lit(ds.rem)) return 0; /*we don't have cs.*/ /* map name to ip and look at its syntax */ ip = csgetvalue(root, "sys", ds.rem, "ip", NULL); if (ip == NULL) ip = csgetvalue(root, "dom", ds.rem, "ip", NULL); if (ip == NULL) ip = csgetvalue(root, "sys", ds.rem, "ipv6", NULL); if (ip == NULL) ip = csgetvalue(root, "dom", ds.rem, "ipv6", NULL); if (ip != NULL) r = isv4name(ip); free(ip); return r; }
/* * 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' */ Chan* chandial(char *dest, char *local, char *dir, Chan **ctlp) { DS ds; char clone[Maxpath]; ds.local = local; ds.dir = dir; ds.ctlp = ctlp; _dial_string_parse(dest, &ds); if(ds.netdir == 0) ds.netdir = "/net"; /* no connection server, don't translate */ snprint(clone, sizeof(clone), "%s/%s/clone", ds.netdir, ds.proto); return call(clone, ds.rem, &ds); }
/* * 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; }