diff -ur linux-2.6.5-virgin/drivers/char/tty_io.c linux-2.6.5-eviltron/drivers/char/tty_io.c --- linux-2.6.5-virgin/drivers/char/tty_io.c 2004-05-07 03:39:25.085624064 -0600 +++ linux-2.6.5-eviltron/drivers/char/tty_io.c 2004-05-07 03:37:51.697821168 -0600 @@ -1362,14 +1362,25 @@ #ifdef CONFIG_UNIX98_PTYS if (device == MKDEV(TTYAUX_MAJOR,2)) { /* find a device that is not in use. */ - static int next_ptmx_dev = 0; + static int next_ptmx_dev = MAX_PREFERRED_PTY; retval = -1; driver = ptm_driver; - while (driver->refcount < pty_limit) { - index = next_ptmx_dev; - next_ptmx_dev = (next_ptmx_dev+1) % driver->num; - if (!init_dev(driver, index, &tty)) - goto ptmx_found; /* ok! */ + /* first, try and allocate a pty < 256 for old glibc */ + for (index = 0; index < MAX_PREFERRED_PTY && driver->refcount < pty_limit && index < driver->num; index++) { + if (!init_dev(driver, index, &tty)) + goto ptmx_found; + } + /* nothing below MAX_PREFERRED_PTY, try something higher, unless + * we've already run out of options */ + if (index != driver->num) { + while (driver->refcount < pty_limit) { + index = next_ptmx_dev; + next_ptmx_dev = (next_ptmx_dev+1) % driver->num; + if (!next_ptmx_dev) + next_ptmx_dev = MAX_PREFERRED_PTY; + if (!init_dev(driver, index, &tty)) + goto ptmx_found; /* ok! */ + } } return -EIO; /* no free ptys */ ptmx_found: diff -ur linux-2.6.5-virgin/include/linux/tty.h linux-2.6.5-eviltron/include/linux/tty.h --- linux-2.6.5-virgin/include/linux/tty.h 2004-05-07 03:39:26.953340128 -0600 +++ linux-2.6.5-eviltron/include/linux/tty.h 2004-05-07 01:43:55.000000000 -0600 @@ -35,6 +35,7 @@ #define NR_UNIX98_PTY_DEFAULT 4096 /* Default maximum for Unix98 ptys */ #define NR_UNIX98_PTY_MAX (1 << MINORBITS) /* Absolute limit */ #define NR_LDISCS 16 +#define MAX_PREFERRED_PTY 256 /* we prefer to allocate ptys beneath this number */ /* * These are set up by the setup-routine at boot-time: