At $WORK, we have recently been reminded that xterm doesn't cope all that well with being invoked in an environment that returns ENOENT on xterm's attempt to open /dev/tty (in main.c).
(The environment in question is a jailed 32-bit FreeBSD running on a FreeBSD/amd64 host. Developers need to build in the jail; apparently they also want to run things like emacs in the jails.) In looking at the xterm sources, I found that there's some code (near main.c:3311 - 3329) to take evasive action if the attempt to open /dev/tty fails. There's even a bit to effectively ignore ENOENT -- if __CYGWIN__ is defined. But that's not our case -- and we don't want to be defining __CYGWIN__ when we're building xterm for FreeBSD. Given that FreeBSD (with devfs) *can* return ENOENT to the attempt to open /dev/tty, it isn't clear to me why that aprticular "error" condition isn't ignored unconditionally (in a FreeBSD environment, at least). Accordingly, I cobbled up a patch (attached), and a colleague has verified that it avoids the issue we were encountering: it allows xterm to run in the jail. Do you think the xterm folks would be receptive to either making the "ignore ENOENT" unconditional or conditioning it on (say) "__CYGWIN_" being defined or "__FREEBSD__" being defined? Failing that (or in the mean time) would you be receptive to a patch to the FreeBSD xterm port to patch xterm in a way similar to the attached patch? (I realize we're approaching 9.0-RELEASE; I'm not asking anyone to make changes before that release date.) Thanks! Peace, david -- David H. Wolfskill [email protected] Depriving a girl or boy of an opportunity for education is evil. See http://www.catwhisker.org/~david/publickey.gpg for my public key.
--- main.c.orig 2011-09-04 11:04:33.000000000 -0700
+++ main.c 2011-11-14 20:12:29.000000000 -0800
@@ -3311,19 +3311,18 @@
* necessary. ENXIO is what is normally returned if there is
* no controlling terminal, but some systems (e.g. SunOS 4.0)
* seem to return EIO. Solaris 2.3 is said to return EINVAL.
- * Cygwin returns ENOENT.
+ * Cygwin returns ENOENT. FreeBSD can return ENOENT, especially
+ * if xterm is run within a jail.
*/
#if USE_NO_DEV_TTY
no_dev_tty = False;
#endif
if (ttyfd < 0) {
if (tty_got_hung || errno == ENXIO || errno == EIO ||
+ errno == ENOENT ||
#ifdef ENODEV
errno == ENODEV ||
#endif
-#ifdef __CYGWIN__
- errno == ENOENT ||
-#endif
errno == EINVAL || errno == ENOTTY || errno == EACCES) {
#if USE_NO_DEV_TTY
no_dev_tty = True;
pgpKnIbgjTetF.pgp
Description: PGP signature
