Clean up plumbopen, try to create ports that don't exist. [rsc] --rw-rw-r-- M 374841 glenda sys 7080 Nov 28 07:17 sys/src/libplumb/mesg.c /n/sourcesdump/2005/1128/plan9/sys/src/libplumb/mesg.c:8,37 - /n/sourcesdump/2005/1129/plan9/sys/src/libplumb/mesg.c:8,54 plumbopen(char *name, int omode) { int fd, f; - char *s; - char buf[128]; + char *s, *plumber; + char buf[128], err[ERRMAX]; if(name[0] == '/') return open(name, omode); - snprint(buf, sizeof buf, "/mnt/plumb/%s", name); + + /* find elusive plumber */ + if(access("/mnt/plumb/send", OWRITE) >= 0) + plumber = "/mnt/plumb"; + else if(access("/mnt/term/mnt/plumb/send", OWRITE) >= 0) + plumber = "/mnt/term/mnt/plumb"; + else{ + /* last resort: try mounting service */ + plumber = "/mnt/plumb"; + s = getenv("plumbsrv"); + if(s == nil) + return -1; + f = open(s, ORDWR); + if(f < 0) + return -1; + if(mount(f, -1, "/mnt/plumb", MREPL, "") < 0){ + close(f); + return -1; + } + if(access("/mnt/plumb/send", OWRITE) < 0) + return -1; + } + + snprint(buf, sizeof buf, "%s/%s", plumber, name); fd = open(buf, omode); if(fd >= 0) return fd; - snprint(buf, sizeof buf, "/mnt/term/mnt/plumb/%s", name); - fd = open(buf, omode); + + /* try creating port; used by non-standard plumb implementations */ + rerrstr(err, sizeof err); + fd = create(buf, omode, 0600); if(fd >= 0) return fd; - /* try mounting service */ - s = getenv("plumbsrv"); - if(s == nil) - return -1; - f = open(s, ORDWR); - if(f < 0) - return -1; - if(mount(f, -1, "/mnt/plumb", MREPL, "") < 0) - return -1; - snprint(buf, sizeof buf, "/mnt/plumb/%s", name); - return open(buf, omode); + errstr(err, sizeof err); + + return -1; } static int