[PATCH v2 RFC] char/tty_io: fix legacy pty name when more than 256pty devices are requested

From: Mauro Carvalho Chehab
Date: Tue Sep 08 2009 - 14:59:43 EST


With kernel 2.6, the number of minors is not 255 anymore. So, it is
possible to have more than 255 pty devices.

However, the pty_line_name() only provides device names for the first
256 tty/pty devices.

This is a bug, since there's no limits for the maximum number of legacy
pty devices at Kconfig or at pty.legacy_count.

This patch preserves the old nomenclature for tty/pty devices for the
first 256 devices. After that, it names the next devices as:
ttyf0000-ttfpffff (pty slave)
ptyf0000-ttyfffff (pty master)

This way, the existing udev rules for legacy pty devices to not
break. Only after minor 255, it will start to use the new nomenclature.

Signed-off-by: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>

---

Version 2: devices.txt namespace doc were updated accordingly.

diff --git a/Documentation/devices.txt b/Documentation/devices.txt
index 53d64d3..cfd3e20 100644
--- a/Documentation/devices.txt
+++ b/Documentation/devices.txt
@@ -114,18 +114,27 @@ Your cooperation is appreciated.
the initrd.

2 char Pseudo-TTY masters
- 0 = /dev/ptyp0 First PTY master
- 1 = /dev/ptyp1 Second PTY master
+ 0 = /dev/ptyp0 First PTY master
+ 1 = /dev/ptyp1 Second PTY master
...
- 255 = /dev/ptyef 256th PTY master
+ 255 = /dev/ptyef 256th PTY master
+ 256 = /dev/ptyf0000 257th PTY slave
+ 257 = /dev/ptyf0001 258th PTY slave
+ ...
+ 65791 = /dev/ptyfffff 65791 PTY slave

- Pseudo-tty's are named as follows:
+ Pseudo-tty's up to 256 are named as follows:
* Masters are "pty", slaves are "tty";
* the fourth letter is one of pqrstuvwxyzabcde indicating
the 1st through 16th series of 16 pseudo-ttys each, and
* the fifth letter is one of 0123456789abcdef indicating
the position within the series.

+ Pseudo-tty's above 256 are named as follows:
+ * Masters are "ptyf", slaves are "ttyf";
+ * the fifth to eighth letters are hexadecimal digits
+ indicating the position within the series.
+
These are the old-style (BSD) PTY devices; Unix98
devices are on major 128 and above and use the PTY
master multiplex (/dev/ptmx) to acquire a PTY on
@@ -189,10 +198,14 @@ Your cooperation is appreciated.
the drive type is insignificant for these devices.

3 char Pseudo-TTY slaves
- 0 = /dev/ttyp0 First PTY slave
- 1 = /dev/ttyp1 Second PTY slave
- ...
- 255 = /dev/ttyef 256th PTY slave
+ 0 = /dev/ttyp0 First PTY slave
+ 1 = /dev/ttyp1 Second PTY slave
+ ...
+ 255 = /dev/ttyef 256th PTY slave
+ 256 = /dev/ttyf0000 257th PTY slave
+ 257 = /dev/ttyf0001 258th PTY slave
+ ...
+ 65791 = /dev/ttyfffff 65791 PTY slave

These are the old-style (BSD) PTY devices; Unix98
devices are on major 136 and above.
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index a3afa0c..fdea89b 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -1110,9 +1110,15 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p)
{
int i = index + driver->name_base;
/* ->name is initialized to "ttyp", but "tty" is expected */
- sprintf(p, "%s%c%x",
- driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
- ptychar[i >> 4 & 0xf], i & 0xf);
+ if (i < 256) {
+ sprintf(p, "%s%c%x",
+ driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
+ ptychar[i >> 4 & 0xf], i & 0xf);
+ } else { /* Up to 4096 */
+ sprintf(p, "%sf%04x",
+ driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
+ i - 256);
+ }
}

/**







Cheers,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/