Date: Tue, 15 May 2001 17:40:27 +0100 From: Brian Somers <brian@Awfulhak.org> To: Peter Wemm <peter@wemm.org> Cc: David Wolfskill <david@catwhisker.org>, current@FreeBSD.ORG, phk@FreeBSD.ORG, brian@Awfulhak.org Subject: Re: Huh??!? xterm: Error 14, errno 2: No such file or directory Message-ID: <200105151640.f4FGeR576715@hak.lan.Awfulhak.org> In-Reply-To: Message from Peter Wemm <peter@wemm.org> of "Tue, 15 May 2001 01:34:27 PDT." <20010515083427.A1AAA3811@overcee.netplex.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
This makes xterm work again. Any objections to a commit ? > David Wolfskill wrote: > > > Built -CURRENT & rebooted after mergemaster as usual, and some X > > applications (xbattbar; xlockmore; oclock) work OK, but no xterm. At > > least, not from X (XF86-4.0.3). I tried using Ctl-Alt-F2 to get to > > a non-X login, logged in , set DISPLAY to m147:0.0, issued "xterm &", > > and got an xterm OK. > > Known problem. phk changed the semantics of /dev/tty in the most recent > commits. Traditional behavior for a process *without* a controlling tty > when it opens /dev/tty is to get ENXIO. > > Formerly, ctty_open() returns ENXIO: > cttyopen(dev, flag, mode, p) > { > struct vnode *ttyvp = cttyvp(p); > > if (ttyvp == NULL) > return (ENXIO); > ... > > > and now: > ctty_clone(void *arg, char *name, int namelen, dev_t *dev) > { > struct vnode *vp; > > if (*dev != NODEV) > return; > if (strcmp(name, "tty")) > return; > vp = cttyvp(curproc); > if (vp == NULL) > return; <<< here, leads to ENOENT. > *dev = vp->v_rdev; > } > > There used to be a device for the ctty. We still maintain it for the > non-devfs case. The following hack may work, I have not tested or even > compiled it: > > Index: kern/tty_tty.c > =================================================================== > RCS file: /home/ncvs/src/sys/kern/tty_tty.c,v > retrieving revision 1.34 > diff -u -r1.34 tty_tty.c > --- tty_tty.c 2001/05/14 08:22:56 1.34 > +++ tty_tty.c 2001/05/15 08:30:17 > @@ -177,6 +177,8 @@ > > static void ctty_clone __P((void *arg, char *name, int namelen, dev_t *dev)); > > +static dev_t ctty; > + > static void > ctty_clone(void *arg, char *name, int namelen, dev_t *dev) > { > @@ -187,9 +189,11 @@ > if (strcmp(name, "tty")) > return; > vp = cttyvp(curproc); > - if (vp == NULL) > - return; > - *dev = vp->v_rdev; > + if (vp == NULL) { > + if (ctty) > + *dev = ctty; > + } else > + *dev = vp->v_rdev; > } > > > @@ -201,6 +205,7 @@ > > if (devfs_present) { > EVENTHANDLER_REGISTER(dev_clone, ctty_clone, 0, 1000); > + ctty = make_dev(&ctty_cdevsw, 0, 0, 0, 0666, "ctty"); > } else { > make_dev(&ctty_cdevsw, 0, 0, 0, 0666, "tty"); > } > > This hack recreates a /dev/ctty hook that works the "old way", and makes > /dev/tty switch through to that one instead. This is evil and is probably > even more broken than before, but I think it will work. > > The alternative is to edit the XFree86 xterm source and rebuild it. > look for xc/programs/xterm/main.c where it opens /dev/tty and then > checks an inclusive list of errno's, including ENXIO and ENODEV etc. > Add ENOENT to the list of 'acceptable' errors. > > Incidently, the xterm binary is broken, it does not use libutil/openpty(). > > Cheers, > -Peter > -- > Peter Wemm - peter@FreeBSD.org; peter@yahoo-inc.com; peter@netplex.com.au > "All of this is for nothing if we don't go to the stars" - JMS/B5 > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-current" in the body of the message > -- Brian <brian@Awfulhak.org> <brian@[uk.]FreeBSD.org> <http://www.Awfulhak.org> <brian@[uk.]OpenBSD.org> Don't _EVER_ lose your sense of humour ! To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105151640.f4FGeR576715>