public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* EXTPROC, telnetd LINEMODE, revisited
@ 2010-06-11 10:18 Howard Chu
  2010-06-11 10:41 ` Andi Kleen
  0 siblings, 1 reply; 10+ messages in thread
From: Howard Chu @ 2010-06-11 10:18 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 4232 bytes --]

It's been over 10 years since I looked at this last

http://lkml.indiana.edu/hypermail/linux/kernel/9911.3/0650.html

and apparently no one else has been interested since then. A random 
conversation got me looking into it again, and now I have it working. However, 
obviously the world has moved on from telnet to ssh, and my goal in posting 
now is to hash out what needs to be done in the kernel so that LINEMODE can be 
fully supported in ssh.

First you'll note that this patch is fairly similar to the one I posted back 
in 1999. The bug I was chasing down back then turned out to be in the telnetd 
source, not in the tty driver, so this patch has only needed minor refreshing 
to bring it up to date.

There are some other issues that need to be addressed though to make this 
feature maximally useful today:

GNU readline and other similar code is prevalent today, and uses many 
additional editing characters that aren't represented in termios. The telnet 
Linemode spec in RFC 1184 accomodates most of these characters but without 
termios support there's no way to communicate these settings between telnetd 
and the readline library (or whatever other app). Most of the editing features 
provided by readline really belong on the local client anyway.

Linemode assumes single-character codes for input functions, but on common 
terminals (e.g. ANSI/VT100 style) a lot of navigation keys send 
multi-character sequences (cursor movement, etc.).

So I'm looking for suggestions on ways to approach this, that will allow as 
much functionality as possible to be handled by a local client.

Despite the fact that most people today have ready access to high speed 
broadband networking today, I think the motivation for local character 
processing is as great now as it was 10 years ago. I regularly use an ssh 
client on an Android phone to keep tabs on my servers when I'm away from my 
home base, and sometimes cellphone connectivity can be extremely lossy, 
networks can be heavily congested, etc... Waiting for character-at-a-time 
packet turnarounds in these conditions can be pretty aggravating. Also, if 
you're unfortunate enough to need to get access to a machine while you're 
roaming away from your home network, the per-byte roaming fees can be murder. 
Both of these pain points can be minimized by using local character processing 
and only sending complete lines to the remote server.

The telnet Linemode spec serves as a pretty good starting point for adapting 
to ssh, but these details still need to be addressed - can/should we add 
additional command characters to the tty driver? The telnet spec defines these 
commands that the tty driver is missing:
    Move cursor one character left, right
    Move cursor one word left, right
    Move cursor to beginning/end of line
    Enter insert/overstrike mode
    Erase character to the right
    Erase word to the right
    Erase to beginning/end of line

Also it would be nice to be able to define other forwarding characters, which 
don't necessarily have an edit function. E.g., <TAB> for word completion.

Another feature with readline is a command history buffer that can be reviewed 
using Cursor Up/Down. Can/should we define this in the tty driver too? Or 
perhaps rely on the client to implement its own command buffer, and never 
mention this aspect on the wire protocol. Again, given the purpose, it makes 
most sense to me to keep this feature on the client side. But some 
coordination with the server would still be useful. E.g., different programs 
can maintain their own persistent command history files. It might be nice to 
have a way for the app to signal to the client which command context to use 
for the current history buffer, and keep them all separate. (Or not, I can see 
other times where you'd just rather have it all as one stack.)

PS: if anyone knows where to send the patches for telnetd, please email me. 
Looks like the upstream source hasn't been touched since 2000.

ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/

-- 
    -- Howard Chu
    CTO, Symas Corp.           http://www.symas.com
    Director, Highland Sun     http://highlandsun.com/hyc/
    Chief Architect, OpenLDAP  http://www.openldap.org/project/


[-- Attachment #2: linemode.txt --]
[-- Type: text/plain, Size: 4518 bytes --]

diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c
index bdae832..bbc42e6 100644
--- a/drivers/char/n_tty.c
+++ b/drivers/char/n_tty.c
@@ -780,6 +780,8 @@ static void echo_erase_tab(unsigned int num_chars, int after_tab,
 
 static void echo_char_raw(unsigned char c, struct tty_struct *tty)
 {
+	if (L_EXTPROC(tty)) return;
+
 	mutex_lock(&tty->echo_lock);
 
 	if (c == ECHO_OP_START) {
@@ -808,6 +810,8 @@ static void echo_char_raw(unsigned char c, struct tty_struct *tty)
 
 static void echo_char(unsigned char c, struct tty_struct *tty)
 {
+	if (L_EXTPROC(tty)) return;
+
 	mutex_lock(&tty->echo_lock);
 
 	if (c == ECHO_OP_START) {
@@ -1767,6 +1771,13 @@ do_it_again:
 				break;
 			}
 			nr--;
+			if (cs & TIOCPKT_IOCTL) {
+				c = sizeof(struct termios);
+				if (c > nr) c = nr;
+				copy_to_user(b, tty->link->termios, c);
+				nr -= c;
+				b += c;
+			}
 			break;
 		}
 		/* This statement must be first before checking for input
diff --git a/drivers/char/pty.c b/drivers/char/pty.c
index d83a431..7485efb 100644
--- a/drivers/char/pty.c
+++ b/drivers/char/pty.c
@@ -315,12 +315,21 @@ free_mem_out:
 	return -ENOMEM;
 }
 
+static int pty_signal(struct tty_struct *tty, int sig)
+{
+	if (tty->link && tty->link->pgrp > 0)
+		kill_pgrp(tty->link->pgrp, sig, 1);
+	return 0;
+}
+
 static int pty_bsd_ioctl(struct tty_struct *tty, struct file *file,
 			 unsigned int cmd, unsigned long arg)
 {
 	switch (cmd) {
 	case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 		return pty_set_lock(tty, (int __user *) arg);
+	case TIOCSIG:    /* Send signal to other side of pty */
+		return pty_signal(tty, (int) arg);
 	}
 	return -ENOIOCTLCMD;
 }
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c
index 6bd5f88..0c18899 100644
--- a/drivers/char/tty_ioctl.c
+++ b/drivers/char/tty_ioctl.c
@@ -517,19 +517,25 @@ static void change_termios(struct tty_struct *tty, struct ktermios *new_termios)
 
 	/* See if packet mode change of state. */
 	if (tty->link && tty->link->packet) {
+		int extproc = (old_termios.c_lflag & EXTPROC) |
+				(tty->termios->c_lflag & EXTPROC);
 		int old_flow = ((old_termios.c_iflag & IXON) &&
 				(old_termios.c_cc[VSTOP] == '\023') &&
 				(old_termios.c_cc[VSTART] == '\021'));
 		int new_flow = (I_IXON(tty) &&
 				STOP_CHAR(tty) == '\023' &&
 				START_CHAR(tty) == '\021');
-		if (old_flow != new_flow) {
+		if ((old_flow != new_flow) || extproc) {
 			spin_lock_irqsave(&tty->ctrl_lock, flags);
-			tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
-			if (new_flow)
-				tty->ctrl_status |= TIOCPKT_DOSTOP;
-			else
-				tty->ctrl_status |= TIOCPKT_NOSTOP;
+			if (old_flow != new_flow) {
+				tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
+				if (new_flow)
+					tty->ctrl_status |= TIOCPKT_DOSTOP;
+				else
+					tty->ctrl_status |= TIOCPKT_NOSTOP;
+			}
+			if (extproc)
+				tty->ctrl_status |= TIOCPKT_IOCTL;
 			spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 			wake_up_interruptible(&tty->link->read_wait);
 		}
diff --git a/include/asm-generic/ioctls.h b/include/asm-generic/ioctls.h
index a799e20..3ac6908 100644
--- a/include/asm-generic/ioctls.h
+++ b/include/asm-generic/ioctls.h
@@ -65,6 +65,7 @@
 #define TIOCSRS485	0x542F
 #define TIOCGPTN	_IOR('T', 0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
 #define TIOCSPTLCK	_IOW('T', 0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IO ('T', 0x32)  /* pty: generate signal */
 #define TCGETX		0x5432 /* SYS5 TCGETX compatibility */
 #define TCSETX		0x5433
 #define TCSETXF		0x5434
@@ -104,6 +105,7 @@
 #define TIOCPKT_START		 8
 #define TIOCPKT_NOSTOP		16
 #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64
 
 #define TIOCSER_TEMT	0x01	/* Transmitter physically empty */
 
diff --git a/include/asm-generic/termbits.h b/include/asm-generic/termbits.h
index 1c9773d..232b478 100644
--- a/include/asm-generic/termbits.h
+++ b/include/asm-generic/termbits.h
@@ -178,6 +178,7 @@ struct ktermios {
 #define FLUSHO	0010000
 #define PENDIN	0040000
 #define IEXTEN	0100000
+#define EXTPROC	0200000
 
 /* tcflow() and TCXONC use these */
 #define	TCOOFF		0
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 4409967..3cfe448 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -178,6 +178,7 @@ struct tty_bufhead {
 #define L_FLUSHO(tty)	_L_FLAG((tty), FLUSHO)
 #define L_PENDIN(tty)	_L_FLAG((tty), PENDIN)
 #define L_IEXTEN(tty)	_L_FLAG((tty), IEXTEN)
+#define L_EXTPROC(tty)	_L_FLAG((tty), EXTPROC)
 
 struct device;
 struct signal_struct;


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: EXTPROC, telnetd LINEMODE, revisited
  2010-06-11 10:18 EXTPROC, telnetd LINEMODE, revisited Howard Chu
@ 2010-06-11 10:41 ` Andi Kleen
  2010-06-11 11:17   ` Howard Chu
  0 siblings, 1 reply; 10+ messages in thread
From: Andi Kleen @ 2010-06-11 10:41 UTC (permalink / raw)
  To: Howard Chu; +Cc: linux-kernel

Howard Chu <hyc@symas.com> writes:

> It's been over 10 years since I looked at this last
>
> http://lkml.indiana.edu/hypermail/linux/kernel/9911.3/0650.html

I would suggest you repost the patch.

>From a quick look it looks straight forward enough.

> Despite the fact that most people today have ready access to high
> speed broadband networking today, I think the motivation for local
> character processing is as great now as it was 10 years ago. I
> regularly use an ssh client on an Android phone to keep tabs on my
> servers when I'm away from my home base, and sometimes cellphone
> connectivity can be extremely lossy, networks can be heavily
> congested, etc... Waiting for character-at-a-time packet turnarounds
> in these conditions can be pretty aggravating. Also, if you're

I agree that it would be sometimes useful, I also had these
problems.

> unfortunate enough to need to get access to a machine while you're
> roaming away from your home network, the per-byte roaming fees can be
> murder. Both of these pain points can be minimized by using local
> character processing and only sending complete lines to the remote
> server.

I have some doubts this really needs to be implemented in the kernel.
Back in the old days it was important to save round trips
to user space because CPUs were so slow, but these days I don't think 
that's an issue anymore for mere typing.

Couldn't you implement it in screen or a similar pty based tool?

>
> Another feature with readline is a command history buffer that can be
> reviewed using Cursor Up/Down. Can/should we define this in the tty
> driver too? Or perhaps rely on the client to implement its own command
> buffer, and never mention this aspect on the wire protocol. Again,
> given the purpose, it makes most sense to me to keep this feature on
> the client side. But some coordination with the server would still be
> useful. E.g., different programs can maintain their own persistent
> command history files. It might be nice to have a way for the app to
> signal to the client which command context to use for the current
> history buffer, and keep them all separate. (Or not, I can see other
> times where you'd just rather have it all as one stack.)

e.g. history management is definitely something that should not
be done in the kernel.

> PS: if anyone knows where to send the patches for telnetd, please
> email me. Looks like the upstream source hasn't been touched since
> 2000.

I think they're defacto maintained by the distributions.

I would submit them to one of the big distributions and let
that maintainer figure it out.

-Andi
-- 
ak@linux.intel.com -- Speaking for myself only.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: EXTPROC, telnetd LINEMODE, revisited
  2010-06-11 10:41 ` Andi Kleen
@ 2010-06-11 11:17   ` Howard Chu
  2010-06-11 20:22     ` Howard Chu
  2010-06-12  1:36     ` [PATCH] " Howard Chu
  0 siblings, 2 replies; 10+ messages in thread
From: Howard Chu @ 2010-06-11 11:17 UTC (permalink / raw)
  To: Andi Kleen; +Cc: linux-kernel

Andi Kleen wrote:
> Howard Chu<hyc@symas.com>  writes:
>
>> It's been over 10 years since I looked at this last
>>
>> http://lkml.indiana.edu/hypermail/linux/kernel/9911.3/0650.html
>
> I would suggest you repost the patch.

Looks like my email got posted twice already (oops). The updated patch was 
attached each time, you didn't get it?

>> From a quick look it looks straight forward enough.

The patch I posted still isn't quite right; it lets all of the input fall thru 
the regular tty input code. If ICANON is set then the tty driver will parse 
and act on any control characters in the input, but since the input was 
already fully processed on the client, any control characters remaining in the 
input should just be passed through literally. That should be an easy thing to 
fix though.

>> Despite the fact that most people today have ready access to high
>> speed broadband networking today, I think the motivation for local
>> character processing is as great now as it was 10 years ago. I
>> regularly use an ssh client on an Android phone to keep tabs on my
>> servers when I'm away from my home base, and sometimes cellphone
>> connectivity can be extremely lossy, networks can be heavily
>> congested, etc... Waiting for character-at-a-time packet turnarounds
>> in these conditions can be pretty aggravating. Also, if you're
>
> I agree that it would be sometimes useful, I also had these
> problems.
>
>> unfortunate enough to need to get access to a machine while you're
>> roaming away from your home network, the per-byte roaming fees can be
>> murder. Both of these pain points can be minimized by using local
>> character processing and only sending complete lines to the remote
>> server.
>
> I have some doubts this really needs to be implemented in the kernel.
> Back in the old days it was important to save round trips
> to user space because CPUs were so slow, but these days I don't think
> that's an issue anymore for mere typing.
>
> Couldn't you implement it in screen or a similar pty based tool?

 From how I see it at the moment, everything still depends on the tty driver. 
Even if you devise some other mechanism, you still have to be able to 
intercept any ioctl's issued on the pty slave and Do The Right Thing with them 
in the daemon on the pty master. I guess, alternatively, you could set an 
environment variable in the child process that inherits the pty slave, that 
tells applications how to send commands out of band to the master, but that 
will require a lot more app-level coordination.

>> Another feature with readline is a command history buffer that can be
>> reviewed using Cursor Up/Down. Can/should we define this in the tty
>> driver too? Or perhaps rely on the client to implement its own command
>> buffer, and never mention this aspect on the wire protocol. Again,
>> given the purpose, it makes most sense to me to keep this feature on
>> the client side. But some coordination with the server would still be
>> useful. E.g., different programs can maintain their own persistent
>> command history files. It might be nice to have a way for the app to
>> signal to the client which command context to use for the current
>> history buffer, and keep them all separate. (Or not, I can see other
>> times where you'd just rather have it all as one stack.)
>
> e.g. history management is definitely something that should not
> be done in the kernel.

I definitely wasn't trying to suggest that the management occur in the kernel. 
Only that some mechanism for telling the client to toggle the feature on or 
off would be useful.

>> PS: if anyone knows where to send the patches for telnetd, please
>> email me. Looks like the upstream source hasn't been touched since
>> 2000.
>
> I think they're defacto maintained by the distributions.
>
> I would submit them to one of the big distributions and let
> that maintainer figure it out.

OK. Since it looks like the source code I'm working with came from Debian I'll 
start there, thanks.

> -Andi

-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: EXTPROC, telnetd LINEMODE, revisited
  2010-06-11 11:17   ` Howard Chu
@ 2010-06-11 20:22     ` Howard Chu
  2010-06-12  1:36     ` [PATCH] " Howard Chu
  1 sibling, 0 replies; 10+ messages in thread
From: Howard Chu @ 2010-06-11 20:22 UTC (permalink / raw)
  To: Andi Kleen; +Cc: linux-kernel

Howard Chu wrote:
> Andi Kleen wrote:
>> e.g. history management is definitely something that should not
>> be done in the kernel.

I must be going senile or something. You're absolutely right of course. I just 
dug up my old telnet patches from 1989 that implemented the command history in 
the client. All that we need today is a patch for GNU readline that makes it 
mostly do nothing when EXTPROC mode is set on the tty.

We still need to be able to forward on <TAB> of course. We can define 
additional forwarding characters using VEOL or VEOL2, but I think they also 
have the semantic of terminating the input line, which is not what we want 
here. Since they are so rarely used for their original purpose, would it be a 
terrible thing to subvert them to this purpose, or can we just add a new VFWD 
character to the tty driver?

> I definitely wasn't trying to suggest that the management occur in the kernel.
> Only that some mechanism for telling the client to toggle the feature on or
> off would be useful.

-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH] EXTPROC, telnetd LINEMODE, revisited
  2010-06-11 11:17   ` Howard Chu
  2010-06-11 20:22     ` Howard Chu
@ 2010-06-12  1:36     ` Howard Chu
  2010-06-15 18:08       ` [PATCH 0/2] tty: add EXTPROC support for LINEMODE Howard Chu
  1 sibling, 1 reply; 10+ messages in thread
From: Howard Chu @ 2010-06-12  1:36 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2614 bytes --]

Howard Chu wrote:
> Andi Kleen wrote:
>> Howard Chu<hyc@symas.com>   writes:
>>
>>> It's been over 10 years since I looked at this last
>>>
>>> http://lkml.indiana.edu/hypermail/linux/kernel/9911.3/0650.html
>>
>> I would suggest you repost the patch.
>
> Looks like my email got posted twice already (oops). The updated patch was
> attached each time, you didn't get it?
>
>>>  From a quick look it looks straight forward enough.
>
> The patch I posted still isn't quite right; it lets all of the input fall thru
> the regular tty input code. If ICANON is set then the tty driver will parse
> and act on any control characters in the input, but since the input was
> already fully processed on the client, any control characters remaining in the
> input should just be passed through literally. That should be an easy thing to
> fix though.

This one works on all aspects. My previous patch had a collision in the 
TIOCSIG ioctl command number, obviously other ioctls had gotten added in the 
intervening years. The ioctl definition will need to be added to the other 
arch-specific asm header files as well, but I figured that can be taken care 
of easily assuming the overall patch is OK.

The patched telnetd will generate signals for interrupt commands instead 
inserting their characters into the input buffer, so the input routines don't 
need to check for those control characters explicitly. Unfortunately there's 
no signal for the EOF command, so it still gets inserted as an EOF character. 
To preserve its functionality, I note that it can only have its command 
significance if it is the last character in the buffer. Otherwise, if it was 
input using LiteralNext, it will always be followed by some other character.

So this is now working well for telnet/telnetd. I'm moving on now to look at 
patching support into ssh and sshd. The approach will be to incorporate 
readline into the ssh client so that it can manage the command history buffer 
locally, and to patch readline to check for EXTPROC on the tty. If it's set 
then readline will just pass-thru instead of trying to set any editing modes.

For anyone interested, the telnet/telnetd patches are in debian bug#585527
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=585527

You will need to patch some headers in /usr/include to get the ioctl and 
termios bits for telnetd to compile. Those definitions are in the patch 
attached to this email.
-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

[-- Attachment #2: linemode.txt --]
[-- Type: text/plain, Size: 6506 bytes --]

diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c
index bdae832..3bc496a 100644
--- a/drivers/char/n_tty.c
+++ b/drivers/char/n_tty.c
@@ -1102,6 +1102,11 @@ static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
 	if (I_IUCLC(tty) && L_IEXTEN(tty))
 		c = tolower(c);
 
+	if (L_EXTPROC(tty)) {
+		put_tty_queue(c, tty);
+		return;
+	}
+
 	if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
 	    I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
 	    c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
@@ -1409,7 +1414,7 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
 
 	n_tty_set_room(tty);
 
-	if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) {
+	if ((!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) || L_EXTPROC(tty)) {
 		kill_fasync(&tty->fasync, SIGIO, POLL_IN);
 		if (waitqueue_active(&tty->read_wait))
 			wake_up_interruptible(&tty->read_wait);
@@ -1585,7 +1590,7 @@ static int n_tty_open(struct tty_struct *tty)
 static inline int input_available_p(struct tty_struct *tty, int amt)
 {
 	tty_flush_to_ldisc(tty);
-	if (tty->icanon) {
+	if (tty->icanon && !L_EXTPROC(tty)) {
 		if (tty->canon_data)
 			return 1;
 	} else if (tty->read_cnt >= (amt ? amt : 1))
@@ -1632,6 +1637,11 @@ static int copy_from_read_buf(struct tty_struct *tty,
 		spin_lock_irqsave(&tty->read_lock, flags);
 		tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
 		tty->read_cnt -= n;
+		/* Check if last character is EOF */
+		if (L_EXTPROC(tty) && tty->icanon) {
+			if (!tty->read_cnt && *b[n-1] == EOF_CHAR(tty))
+				n--;
+		}
 		spin_unlock_irqrestore(&tty->read_lock, flags);
 		*b += n;
 		*nr -= n;
@@ -1767,6 +1777,13 @@ do_it_again:
 				break;
 			}
 			nr--;
+			if (cs & TIOCPKT_IOCTL) {
+				c = sizeof(struct termios);
+				if (c > nr) c = nr;
+				copy_to_user(b, tty->link->termios, c);
+				nr -= c;
+				b += c;
+			}
 			break;
 		}
 		/* This statement must be first before checking for input
@@ -1812,7 +1829,7 @@ do_it_again:
 			nr--;
 		}
 
-		if (tty->icanon) {
+		if (tty->icanon && !L_EXTPROC(tty)) {
 			/* N.B. avoid overrun if nr == 0 */
 			while (nr && tty->read_cnt) {
 				int eol;
diff --git a/drivers/char/pty.c b/drivers/char/pty.c
index d83a431..c429e9f 100644
--- a/drivers/char/pty.c
+++ b/drivers/char/pty.c
@@ -171,6 +171,15 @@ static int pty_set_lock(struct tty_struct *tty, int __user *arg)
 	return 0;
 }
 
+/* Send a signal to the slave */
+static int pty_signal(struct tty_struct *tty, int sig)
+{
+	if (tty->link) {
+		kill_pgrp(tty->link->pgrp, sig, 1);
+	}
+	return 0;
+}
+
 static void pty_flush_buffer(struct tty_struct *tty)
 {
 	struct tty_struct *to = tty->link;
@@ -321,6 +330,8 @@ static int pty_bsd_ioctl(struct tty_struct *tty, struct file *file,
 	switch (cmd) {
 	case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 		return pty_set_lock(tty, (int __user *) arg);
+	case TIOCSIG:    /* Send signal to other side of pty */
+		return pty_signal(tty, (int) arg);
 	}
 	return -ENOIOCTLCMD;
 }
@@ -476,6 +487,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty, struct file *file,
 		return pty_set_lock(tty, (int __user *)arg);
 	case TIOCGPTN: /* Get PT Number */
 		return put_user(tty->index, (unsigned int __user *)arg);
+	case TIOCSIG:    /* Send signal to other side of pty */
+		return pty_signal(tty, (int) arg);
 	}
 
 	return -ENOIOCTLCMD;
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c
index 6bd5f88..0c18899 100644
--- a/drivers/char/tty_ioctl.c
+++ b/drivers/char/tty_ioctl.c
@@ -517,19 +517,25 @@ static void change_termios(struct tty_struct *tty, struct ktermios *new_termios)
 
 	/* See if packet mode change of state. */
 	if (tty->link && tty->link->packet) {
+		int extproc = (old_termios.c_lflag & EXTPROC) |
+				(tty->termios->c_lflag & EXTPROC);
 		int old_flow = ((old_termios.c_iflag & IXON) &&
 				(old_termios.c_cc[VSTOP] == '\023') &&
 				(old_termios.c_cc[VSTART] == '\021'));
 		int new_flow = (I_IXON(tty) &&
 				STOP_CHAR(tty) == '\023' &&
 				START_CHAR(tty) == '\021');
-		if (old_flow != new_flow) {
+		if ((old_flow != new_flow) || extproc) {
 			spin_lock_irqsave(&tty->ctrl_lock, flags);
-			tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
-			if (new_flow)
-				tty->ctrl_status |= TIOCPKT_DOSTOP;
-			else
-				tty->ctrl_status |= TIOCPKT_NOSTOP;
+			if (old_flow != new_flow) {
+				tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
+				if (new_flow)
+					tty->ctrl_status |= TIOCPKT_DOSTOP;
+				else
+					tty->ctrl_status |= TIOCPKT_NOSTOP;
+			}
+			if (extproc)
+				tty->ctrl_status |= TIOCPKT_IOCTL;
 			spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 			wake_up_interruptible(&tty->link->read_wait);
 		}
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index 641640d..766636d 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -966,6 +966,7 @@ COMPATIBLE_IOCTL(TIOCGPGRP)
 COMPATIBLE_IOCTL(TIOCGPTN)
 COMPATIBLE_IOCTL(TIOCSPTLCK)
 COMPATIBLE_IOCTL(TIOCSERGETLSR)
+COMPATIBLE_IOCTL(TIOCSIG)
 #ifdef TCGETS2
 COMPATIBLE_IOCTL(TCGETS2)
 COMPATIBLE_IOCTL(TCSETS2)
diff --git a/include/asm-generic/ioctls.h b/include/asm-generic/ioctls.h
index a799e20..87661c8 100644
--- a/include/asm-generic/ioctls.h
+++ b/include/asm-generic/ioctls.h
@@ -69,6 +69,7 @@
 #define TCSETX		0x5433
 #define TCSETXF		0x5434
 #define TCSETXW		0x5435
+#define TIOCSIG		_IOW('T', 0x36, int)  /* pty: generate signal */
 
 #define FIONCLEX	0x5450
 #define FIOCLEX		0x5451
@@ -104,6 +105,7 @@
 #define TIOCPKT_START		 8
 #define TIOCPKT_NOSTOP		16
 #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64
 
 #define TIOCSER_TEMT	0x01	/* Transmitter physically empty */
 
diff --git a/include/asm-generic/termbits.h b/include/asm-generic/termbits.h
index 1c9773d..232b478 100644
--- a/include/asm-generic/termbits.h
+++ b/include/asm-generic/termbits.h
@@ -178,6 +178,7 @@ struct ktermios {
 #define FLUSHO	0010000
 #define PENDIN	0040000
 #define IEXTEN	0100000
+#define EXTPROC	0200000
 
 /* tcflow() and TCXONC use these */
 #define	TCOOFF		0
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 4409967..3cfe448 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -178,6 +178,7 @@ struct tty_bufhead {
 #define L_FLUSHO(tty)	_L_FLAG((tty), FLUSHO)
 #define L_PENDIN(tty)	_L_FLAG((tty), PENDIN)
 #define L_IEXTEN(tty)	_L_FLAG((tty), IEXTEN)
+#define L_EXTPROC(tty)	_L_FLAG((tty), EXTPROC)
 
 struct device;
 struct signal_struct;

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 0/2] tty: add EXTPROC support for LINEMODE
  2010-06-12  1:36     ` [PATCH] " Howard Chu
@ 2010-06-15 18:08       ` Howard Chu
  2010-06-15 18:10         ` [PATCH 1/2] " Howard Chu
  2010-06-15 18:35         ` [PATCH 0/2] tty: add EXTPROC support for LINEMODE Greg KH
  0 siblings, 2 replies; 10+ messages in thread
From: Howard Chu @ 2010-06-15 18:08 UTC (permalink / raw)
  To: linux-kernel, Greg KH, Alan Cox

Paraphrased from the 1989 BSD patch by David Borman @ cray.com:

     These are the changes needed for the kernel to support
     LINEMODE in the server.

     There is a new bit in the termios local flag word, EXTPROC.
     When this bit is set, several aspects of the terminal driver
     are disabled.  Input line editing, character echo, and mapping
     of signals are all disabled.  This allows the telnetd to turn
     off these functions when in linemode, but still keep track of
     what state the user wants the terminal to be in.

     New ioctl:
         TIOCSIG         Generate a signal to processes in the
                         current process group of the pty.

     There is a new mode for packet driver, the TIOCPKT_IOCTL bit.
     When packet mode is turned on in the pty, and the EXTPROC bit
     is set, then whenever the state of the pty is changed, the
     next read on the master side of the pty will have the TIOCPKT_IOCTL
     bit set, and the data will be the contents of a struct termios.
     This allows the process on the server side of the pty to know
     when the state of the terminal has changed, and what the new
     state is.

Since the original BSD patches accompanied the source code for telnet I've 
left that reference here, but obviously the feature is useful for any remote 
terminal protocol, including ssh.

The corresponding feature has existed in the BSD tty driver since 1989. For 
historical reference, a good copy of the relevant files can be found here:

http://anonsvn.mit.edu/viewvc/krb5/trunk/src/appl/telnet/?pathrev=17741

Signed-off-by: Howard Chu <hyc@symas.com>

---
Howard Chu (2):
   Add EXTPROC tty support for Telnet LINEMODE
   Add arch-specific EXTPROC definitions

  arch/alpha/include/asm/ioctls.h     |    2 ++
  arch/alpha/include/asm/termbits.h   |    1 +
  arch/arm/include/asm/ioctls.h       |    2 ++
  arch/arm/include/asm/termbits.h     |    1 +
  arch/avr32/include/asm/ioctls.h     |    2 ++
  arch/avr32/include/asm/termbits.h   |    1 +
  arch/cris/include/asm/ioctls.h      |    2 ++
  arch/cris/include/asm/termbits.h    |    1 +
  arch/frv/include/asm/ioctls.h       |    2 ++
  arch/frv/include/asm/termbits.h     |    1 +
  arch/h8300/include/asm/ioctls.h     |    2 ++
  arch/h8300/include/asm/termbits.h   |    1 +
  arch/ia64/include/asm/ioctls.h      |    2 ++
  arch/ia64/include/asm/termbits.h    |    1 +
  arch/m32r/include/asm/ioctls.h      |    2 ++
  arch/m32r/include/asm/termbits.h    |    1 +
  arch/m68k/include/asm/ioctls.h      |    2 ++
  arch/m68k/include/asm/termbits.h    |    1 +
  arch/mips/include/asm/ioctls.h      |    3 ++-
  arch/mips/include/asm/termbits.h    |    1 +
  arch/mn10300/include/asm/ioctls.h   |    2 ++
  arch/mn10300/include/asm/termbits.h |    1 +
  arch/parisc/include/asm/ioctls.h    |    2 ++
  arch/parisc/include/asm/termbits.h  |    1 +
  arch/powerpc/include/asm/ioctls.h   |    2 ++
  arch/powerpc/include/asm/termbits.h |    1 +
  arch/s390/include/asm/ioctls.h      |    2 ++
  arch/sh/include/asm/ioctls.h        |    2 ++
  arch/sparc/include/asm/ioctls.h     |    2 ++
  arch/sparc/include/asm/termbits.h   |    1 +
  arch/xtensa/include/asm/ioctls.h    |    2 ++
  arch/xtensa/include/asm/termbits.h  |    1 +
  drivers/char/n_tty.c                |   25 ++++++++++++++++++++++---
  drivers/char/pty.c                  |   13 +++++++++++++
  drivers/char/tty_ioctl.c            |   18 ++++++++++++------
  fs/compat_ioctl.c                   |    1 +
  include/asm-generic/ioctls.h        |    2 ++
  include/asm-generic/termbits.h      |    1 +
  include/linux/tty.h                 |    1 +
  39 files changed, 101 insertions(+), 10 deletions(-)

-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/2] tty: add EXTPROC support for LINEMODE
  2010-06-15 18:08       ` [PATCH 0/2] tty: add EXTPROC support for LINEMODE Howard Chu
@ 2010-06-15 18:10         ` Howard Chu
  2010-06-15 18:13           ` [PATCH 2/2] tty: Add arch-specific EXTPROC definitions Howard Chu
  2010-06-15 18:35         ` [PATCH 0/2] tty: add EXTPROC support for LINEMODE Greg KH
  1 sibling, 1 reply; 10+ messages in thread
From: Howard Chu @ 2010-06-15 18:10 UTC (permalink / raw)
  To: linux-kernel, Greg KH, Alan Cox

This adds the basic driver support. Tested on x86 and x86-64.

Signed-off-by: Howard Chu <hyc@symas.com>
---
  drivers/char/n_tty.c           |   25 ++++++++++++++++++++++---
  drivers/char/pty.c             |   13 +++++++++++++
  drivers/char/tty_ioctl.c       |   18 ++++++++++++------
  fs/compat_ioctl.c              |    1 +
  include/asm-generic/ioctls.h   |    2 ++
  include/asm-generic/termbits.h |    1 +
  include/linux/tty.h            |    1 +
  7 files changed, 52 insertions(+), 9 deletions(-)

diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c
index bdae832..67caa01 100644
--- a/drivers/char/n_tty.c
+++ b/drivers/char/n_tty.c
@@ -1102,6 +1102,11 @@ static inline void n_tty_receive_char(struct tty_struct 
*tty, unsigned char c)
  	if (I_IUCLC(tty) && L_IEXTEN(tty))
  		c = tolower(c);

+	if (L_EXTPROC(tty)) {
+		put_tty_queue(c, tty);
+		return;
+	}
+
  	if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
  	    I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
  	    c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
@@ -1409,7 +1414,8 @@ static void n_tty_receive_buf(struct tty_struct *tty, 
const unsigned char *cp,

  	n_tty_set_room(tty);

-	if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) {
+	if ((!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) ||
+		L_EXTPROC(tty)) {
  		kill_fasync(&tty->fasync, SIGIO, POLL_IN);
  		if (waitqueue_active(&tty->read_wait))
  			wake_up_interruptible(&tty->read_wait);
@@ -1585,7 +1591,7 @@ static int n_tty_open(struct tty_struct *tty)
  static inline int input_available_p(struct tty_struct *tty, int amt)
  {
  	tty_flush_to_ldisc(tty);
-	if (tty->icanon) {
+	if (tty->icanon && !L_EXTPROC(tty)) {
  		if (tty->canon_data)
  			return 1;
  	} else if (tty->read_cnt >= (amt ? amt : 1))
@@ -1632,6 +1638,11 @@ static int copy_from_read_buf(struct tty_struct *tty,
  		spin_lock_irqsave(&tty->read_lock, flags);
  		tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
  		tty->read_cnt -= n;
+		/* Check if last character is EOF */
+		if (L_EXTPROC(tty) && tty->icanon) {
+			if (!tty->read_cnt && *b[n-1] == EOF_CHAR(tty))
+				n--;
+		}
  		spin_unlock_irqrestore(&tty->read_lock, flags);
  		*b += n;
  		*nr -= n;
@@ -1767,6 +1778,14 @@ do_it_again:
  				break;
  			}
  			nr--;
+			if (cs & TIOCPKT_IOCTL) {
+				c = sizeof(struct termios);
+				if (c > nr)
+					c = nr;
+				copy_to_user(b, tty->link->termios, c);
+				nr -= c;
+				b += c;
+			}
  			break;
  		}
  		/* This statement must be first before checking for input
@@ -1812,7 +1831,7 @@ do_it_again:
  			nr--;
  		}

-		if (tty->icanon) {
+		if (tty->icanon && !L_EXTPROC(tty)) {
  			/* N.B. avoid overrun if nr == 0 */
  			while (nr && tty->read_cnt) {
  				int eol;
diff --git a/drivers/char/pty.c b/drivers/char/pty.c
index d83a431..c429e9f 100644
--- a/drivers/char/pty.c
+++ b/drivers/char/pty.c
@@ -171,6 +171,15 @@ static int pty_set_lock(struct tty_struct *tty, int 
__user *arg)
  	return 0;
  }

+/* Send a signal to the slave */
+static int pty_signal(struct tty_struct *tty, int sig)
+{
+	if (tty->link) {
+		kill_pgrp(tty->link->pgrp, sig, 1);
+	}
+	return 0;
+}
+
  static void pty_flush_buffer(struct tty_struct *tty)
  {
  	struct tty_struct *to = tty->link;
@@ -321,6 +330,8 @@ static int pty_bsd_ioctl(struct tty_struct *tty, struct 
file *file,
  	switch (cmd) {
  	case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
  		return pty_set_lock(tty, (int __user *) arg);
+	case TIOCSIG:    /* Send signal to other side of pty */
+		return pty_signal(tty, (int) arg);
  	}
  	return -ENOIOCTLCMD;
  }
@@ -476,6 +487,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty, struct 
file *file,
  		return pty_set_lock(tty, (int __user *)arg);
  	case TIOCGPTN: /* Get PT Number */
  		return put_user(tty->index, (unsigned int __user *)arg);
+	case TIOCSIG:    /* Send signal to other side of pty */
+		return pty_signal(tty, (int) arg);
  	}

  	return -ENOIOCTLCMD;
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c
index 6bd5f88..0c18899 100644
--- a/drivers/char/tty_ioctl.c
+++ b/drivers/char/tty_ioctl.c
@@ -517,19 +517,25 @@ static void change_termios(struct tty_struct *tty, 
struct ktermios *new_termios)

  	/* See if packet mode change of state. */
  	if (tty->link && tty->link->packet) {
+		int extproc = (old_termios.c_lflag & EXTPROC) |
+				(tty->termios->c_lflag & EXTPROC);
  		int old_flow = ((old_termios.c_iflag & IXON) &&
  				(old_termios.c_cc[VSTOP] == '\023') &&
  				(old_termios.c_cc[VSTART] == '\021'));
  		int new_flow = (I_IXON(tty) &&
  				STOP_CHAR(tty) == '\023' &&
  				START_CHAR(tty) == '\021');
-		if (old_flow != new_flow) {
+		if ((old_flow != new_flow) || extproc) {
  			spin_lock_irqsave(&tty->ctrl_lock, flags);
-			tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
-			if (new_flow)
-				tty->ctrl_status |= TIOCPKT_DOSTOP;
-			else
-				tty->ctrl_status |= TIOCPKT_NOSTOP;
+			if (old_flow != new_flow) {
+				tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
+				if (new_flow)
+					tty->ctrl_status |= TIOCPKT_DOSTOP;
+				else
+					tty->ctrl_status |= TIOCPKT_NOSTOP;
+			}
+			if (extproc)
+				tty->ctrl_status |= TIOCPKT_IOCTL;
  			spin_unlock_irqrestore(&tty->ctrl_lock, flags);
  			wake_up_interruptible(&tty->link->read_wait);
  		}
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index 641640d..766636d 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -966,6 +966,7 @@ COMPATIBLE_IOCTL(TIOCGPGRP)
  COMPATIBLE_IOCTL(TIOCGPTN)
  COMPATIBLE_IOCTL(TIOCSPTLCK)
  COMPATIBLE_IOCTL(TIOCSERGETLSR)
+COMPATIBLE_IOCTL(TIOCSIG)
  #ifdef TCGETS2
  COMPATIBLE_IOCTL(TCGETS2)
  COMPATIBLE_IOCTL(TCSETS2)
diff --git a/include/asm-generic/ioctls.h b/include/asm-generic/ioctls.h
index a799e20..87661c8 100644
--- a/include/asm-generic/ioctls.h
+++ b/include/asm-generic/ioctls.h
@@ -69,6 +69,7 @@
  #define TCSETX		0x5433
  #define TCSETXF		0x5434
  #define TCSETXW		0x5435
+#define TIOCSIG		_IOW('T', 0x36, int)  /* pty: generate signal */

  #define FIONCLEX	0x5450
  #define FIOCLEX		0x5451
@@ -104,6 +105,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT	0x01	/* Transmitter physically empty */

diff --git a/include/asm-generic/termbits.h b/include/asm-generic/termbits.h
index 1c9773d..232b478 100644
--- a/include/asm-generic/termbits.h
+++ b/include/asm-generic/termbits.h
@@ -178,6 +178,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */
  #define	TCOOFF		0
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 4409967..3cfe448 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -178,6 +178,7 @@ struct tty_bufhead {
  #define L_FLUSHO(tty)	_L_FLAG((tty), FLUSHO)
  #define L_PENDIN(tty)	_L_FLAG((tty), PENDIN)
  #define L_IEXTEN(tty)	_L_FLAG((tty), IEXTEN)
+#define L_EXTPROC(tty)	_L_FLAG((tty), EXTPROC)

  struct device;
  struct signal_struct;
-- 1.7.0.4


-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/2] tty: Add arch-specific EXTPROC definitions
  2010-06-15 18:10         ` [PATCH 1/2] " Howard Chu
@ 2010-06-15 18:13           ` Howard Chu
  0 siblings, 0 replies; 10+ messages in thread
From: Howard Chu @ 2010-06-15 18:13 UTC (permalink / raw)
  To: linux-kernel, Greg KH, Alan Cox

Add the TIOCSIG, TIOCPKT_IOCTL, and EXTPROC definitions to the arch-specific 
headers.

Signed-off-by: Howard Chu <hyc@symas.com>
---
  arch/alpha/include/asm/ioctls.h     |    2 ++
  arch/alpha/include/asm/termbits.h   |    1 +
  arch/arm/include/asm/ioctls.h       |    2 ++
  arch/arm/include/asm/termbits.h     |    1 +
  arch/avr32/include/asm/ioctls.h     |    2 ++
  arch/avr32/include/asm/termbits.h   |    1 +
  arch/cris/include/asm/ioctls.h      |    2 ++
  arch/cris/include/asm/termbits.h    |    1 +
  arch/frv/include/asm/ioctls.h       |    2 ++
  arch/frv/include/asm/termbits.h     |    1 +
  arch/h8300/include/asm/ioctls.h     |    2 ++
  arch/h8300/include/asm/termbits.h   |    1 +
  arch/ia64/include/asm/ioctls.h      |    2 ++
  arch/ia64/include/asm/termbits.h    |    1 +
  arch/m32r/include/asm/ioctls.h      |    2 ++
  arch/m32r/include/asm/termbits.h    |    1 +
  arch/m68k/include/asm/ioctls.h      |    2 ++
  arch/m68k/include/asm/termbits.h    |    1 +
  arch/mips/include/asm/ioctls.h      |    3 ++-
  arch/mips/include/asm/termbits.h    |    1 +
  arch/mn10300/include/asm/ioctls.h   |    2 ++
  arch/mn10300/include/asm/termbits.h |    1 +
  arch/parisc/include/asm/ioctls.h    |    2 ++
  arch/parisc/include/asm/termbits.h  |    1 +
  arch/powerpc/include/asm/ioctls.h   |    2 ++
  arch/powerpc/include/asm/termbits.h |    1 +
  arch/s390/include/asm/ioctls.h      |    2 ++
  arch/sh/include/asm/ioctls.h        |    2 ++
  arch/sparc/include/asm/ioctls.h     |    2 ++
  arch/sparc/include/asm/termbits.h   |    1 +
  arch/xtensa/include/asm/ioctls.h    |    2 ++
  arch/xtensa/include/asm/termbits.h  |    1 +
  32 files changed, 49 insertions(+), 1 deletions(-)

diff --git a/arch/alpha/include/asm/ioctls.h b/arch/alpha/include/asm/ioctls.h
index 67bb9f6..8af5ee5 100644
--- a/arch/alpha/include/asm/ioctls.h
+++ b/arch/alpha/include/asm/ioctls.h
@@ -80,6 +80,7 @@
  # define TIOCPKT_START		 8
  # define TIOCPKT_NOSTOP		16
  # define TIOCPKT_DOSTOP		32
+# define TIOCPKT_IOCTL		64


  #define TIOCNOTTY	0x5422
@@ -91,6 +92,7 @@
  #define TIOCGSID	0x5429  /* Return the session ID of FD */
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define TIOCSERCONFIG	0x5453
  #define TIOCSERGWILD	0x5454
diff --git a/arch/alpha/include/asm/termbits.h b/arch/alpha/include/asm/termbits.h
index ad854a4..879dd35 100644
--- a/arch/alpha/include/asm/termbits.h
+++ b/arch/alpha/include/asm/termbits.h
@@ -180,6 +180,7 @@ struct ktermios {
  #define FLUSHO	0x00800000
  #define PENDIN	0x20000000
  #define IEXTEN	0x00000400
+#define EXTPROC	0x10000000

  /* Values for the ACTION argument to `tcflow'.  */
  #define	TCOOFF		0
diff --git a/arch/arm/include/asm/ioctls.h b/arch/arm/include/asm/ioctls.h
index a91d8a1..e5e22cf 100644
--- a/arch/arm/include/asm/ioctls.h
+++ b/arch/arm/include/asm/ioctls.h
@@ -52,6 +52,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
  #define FIOCLEX		0x5451
@@ -78,6 +79,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT	0x01	/* Transmitter physically empty */

diff --git a/arch/arm/include/asm/termbits.h b/arch/arm/include/asm/termbits.h
index f784d11..704135d 100644
--- a/arch/arm/include/asm/termbits.h
+++ b/arch/arm/include/asm/termbits.h
@@ -177,6 +177,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */
  #define	TCOOFF		0
diff --git a/arch/avr32/include/asm/ioctls.h b/arch/avr32/include/asm/ioctls.h
index 0cf2c0a..f947622 100644
--- a/arch/avr32/include/asm/ioctls.h
+++ b/arch/avr32/include/asm/ioctls.h
@@ -53,6 +53,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450
  #define FIOCLEX		0x5451
@@ -81,6 +82,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/avr32/include/asm/termbits.h b/arch/avr32/include/asm/termbits.h
index db2daab..366adc5 100644
--- a/arch/avr32/include/asm/termbits.h
+++ b/arch/avr32/include/asm/termbits.h
@@ -175,6 +175,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */
  #define	TCOOFF		0
diff --git a/arch/cris/include/asm/ioctls.h b/arch/cris/include/asm/ioctls.h
index 35bbc18..2569665 100644
--- a/arch/cris/include/asm/ioctls.h
+++ b/arch/cris/include/asm/ioctls.h
@@ -54,6 +54,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
  #define FIOCLEX		0x5451
@@ -86,6 +87,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/cris/include/asm/termbits.h b/arch/cris/include/asm/termbits.h
index 66e1a74..1c43bc8 100644
--- a/arch/cris/include/asm/termbits.h
+++ b/arch/cris/include/asm/termbits.h
@@ -214,6 +214,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */
  #define	TCOOFF		0
diff --git a/arch/frv/include/asm/ioctls.h b/arch/frv/include/asm/ioctls.h
index d0c30e3..a993e37 100644
--- a/arch/frv/include/asm/ioctls.h
+++ b/arch/frv/include/asm/ioctls.h
@@ -53,6 +53,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
  #define FIOCLEX		0x5451
@@ -79,6 +80,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/frv/include/asm/termbits.h b/arch/frv/include/asm/termbits.h
index 5568492..7722e19 100644
--- a/arch/frv/include/asm/termbits.h
+++ b/arch/frv/include/asm/termbits.h
@@ -180,6 +180,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000


  /* tcflow() and TCXONC use these */
diff --git a/arch/h8300/include/asm/ioctls.h b/arch/h8300/include/asm/ioctls.h
index 98a53d0..b6b249f 100644
--- a/arch/h8300/include/asm/ioctls.h
+++ b/arch/h8300/include/asm/ioctls.h
@@ -53,6 +53,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
  #define FIOCLEX		0x5451
@@ -79,6 +80,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/h8300/include/asm/termbits.h b/arch/h8300/include/asm/termbits.h
index 31eca81..3287a62 100644
--- a/arch/h8300/include/asm/termbits.h
+++ b/arch/h8300/include/asm/termbits.h
@@ -179,6 +179,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000


  /* tcflow() and TCXONC use these */
diff --git a/arch/ia64/include/asm/ioctls.h b/arch/ia64/include/asm/ioctls.h
index f41b636..a11af01 100644
--- a/arch/ia64/include/asm/ioctls.h
+++ b/arch/ia64/include/asm/ioctls.h
@@ -59,6 +59,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
  #define FIOCLEX		0x5451
@@ -87,6 +88,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/ia64/include/asm/termbits.h b/arch/ia64/include/asm/termbits.h
index 9f162e0..c009b94 100644
--- a/arch/ia64/include/asm/termbits.h
+++ b/arch/ia64/include/asm/termbits.h
@@ -187,6 +187,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */
  #define	TCOOFF		0
diff --git a/arch/m32r/include/asm/ioctls.h b/arch/m32r/include/asm/ioctls.h
index b9f54bb..366db76 100644
--- a/arch/m32r/include/asm/ioctls.h
+++ b/arch/m32r/include/asm/ioctls.h
@@ -53,6 +53,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450
  #define FIOCLEX		0x5451
@@ -81,6 +82,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/m32r/include/asm/termbits.h b/arch/m32r/include/asm/termbits.h
index bc10400..957a3c6 100644
--- a/arch/m32r/include/asm/termbits.h
+++ b/arch/m32r/include/asm/termbits.h
@@ -179,6 +179,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */
  #define	TCOOFF		0
diff --git a/arch/m68k/include/asm/ioctls.h b/arch/m68k/include/asm/ioctls.h
index b8d2f4b..91a57d6 100644
--- a/arch/m68k/include/asm/ioctls.h
+++ b/arch/m68k/include/asm/ioctls.h
@@ -52,6 +52,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
  #define FIOCLEX		0x5451
@@ -78,6 +79,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/m68k/include/asm/termbits.h b/arch/m68k/include/asm/termbits.h
index 8c14170..aea1e37 100644
--- a/arch/m68k/include/asm/termbits.h
+++ b/arch/m68k/include/asm/termbits.h
@@ -179,6 +179,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000


  /* tcflow() and TCXONC use these */
diff --git a/arch/mips/include/asm/ioctls.h b/arch/mips/include/asm/ioctls.h
index 3f04a99..767d196 100644
--- a/arch/mips/include/asm/ioctls.h
+++ b/arch/mips/include/asm/ioctls.h
@@ -41,7 +41,7 @@
  #define	 TIOCPKT_START		0x08	/* start output */
  #define	 TIOCPKT_NOSTOP		0x10	/* no more ^S, ^Q */
  #define	 TIOCPKT_DOSTOP		0x20	/* now do ^S ^Q */
-/* #define  TIOCPKT_IOCTL		0x40	state change of pty driver */
+#define  TIOCPKT_IOCTL		0x40	/* state change of pty driver */
  #define TIOCSWINSZ	_IOW('t', 103, struct winsize)	/* set window size */
  #define TIOCGWINSZ	_IOR('t', 104, struct winsize)	/* get window size */
  #define TIOCNOTTY	0x5471		/* void tty association */
@@ -83,6 +83,7 @@
  #define TCSETSF2	_IOW('T', 0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T', 0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T', 0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T', 0x36, int)  /* Generate signal on Pty slave */

  /* I hope the range from 0x5480 on is free ... */
  #define TIOCSCTTY	0x5480		/* become controlling tty */
diff --git a/arch/mips/include/asm/termbits.h b/arch/mips/include/asm/termbits.h
index c83c684..76630b3 100644
--- a/arch/mips/include/asm/termbits.h
+++ b/arch/mips/include/asm/termbits.h
@@ -203,6 +203,7 @@ struct ktermios {
  #define PENDIN	0040000		/* Retype pending input (state).  */
  #define TOSTOP	0100000		/* Send SIGTTOU for background output.  */
  #define ITOSTOP	TOSTOP
+#define EXTPROC	0200000		/* External processing on pty */

  /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */
diff --git a/arch/mn10300/include/asm/ioctls.h b/arch/mn10300/include/asm/ioctls.h
index dcbfb45..c149fe1 100644
--- a/arch/mn10300/include/asm/ioctls.h
+++ b/arch/mn10300/include/asm/ioctls.h
@@ -54,6 +54,7 @@
  #define TIOCGPTN	_IOR('T', 0x30, unsigned int) /* Get Pty Number
  						       * (of pty-mux device) */
  #define TIOCSPTLCK	_IOW('T', 0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T', 0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450
  #define FIOCLEX		0x5451
@@ -82,6 +83,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/mn10300/include/asm/termbits.h 
b/arch/mn10300/include/asm/termbits.h
index eb2b0dc..130d424 100644
--- a/arch/mn10300/include/asm/termbits.h
+++ b/arch/mn10300/include/asm/termbits.h
@@ -180,6 +180,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */
  #define	TCOOFF		0
diff --git a/arch/parisc/include/asm/ioctls.h b/arch/parisc/include/asm/ioctls.h
index 6747fad..bf73dbb 100644
--- a/arch/parisc/include/asm/ioctls.h
+++ b/arch/parisc/include/asm/ioctls.h
@@ -52,6 +52,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
  #define FIOCLEX		0x5451
@@ -84,6 +85,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/parisc/include/asm/termbits.h 
b/arch/parisc/include/asm/termbits.h
index d8bbc73..d1ab921 100644
--- a/arch/parisc/include/asm/termbits.h
+++ b/arch/parisc/include/asm/termbits.h
@@ -180,6 +180,7 @@ struct ktermios {
  #define FLUSHO  0010000
  #define PENDIN  0040000
  #define IEXTEN  0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */
  #define	TCOOFF		0
diff --git a/arch/powerpc/include/asm/ioctls.h b/arch/powerpc/include/asm/ioctls.h
index 1842186..8519200 100644
--- a/arch/powerpc/include/asm/ioctls.h
+++ b/arch/powerpc/include/asm/ioctls.h
@@ -80,6 +80,7 @@
  # define TIOCPKT_START		 8
  # define TIOCPKT_NOSTOP		16
  # define TIOCPKT_DOSTOP		32
+# define TIOCPKT_IOCTL		64


  #define TIOCNOTTY	0x5422
@@ -93,6 +94,7 @@
  #define TIOCSRS485	0x542f
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define TIOCSERCONFIG	0x5453
  #define TIOCSERGWILD	0x5454
diff --git a/arch/powerpc/include/asm/termbits.h 
b/arch/powerpc/include/asm/termbits.h
index 6698188..549d700 100644
--- a/arch/powerpc/include/asm/termbits.h
+++ b/arch/powerpc/include/asm/termbits.h
@@ -189,6 +189,7 @@ struct ktermios {
  #define FLUSHO	0x00800000
  #define PENDIN	0x20000000
  #define IEXTEN	0x00000400
+#define EXTPROC	0x10000000

  /* Values for the ACTION argument to `tcflow'.  */
  #define	TCOOFF		0
diff --git a/arch/s390/include/asm/ioctls.h b/arch/s390/include/asm/ioctls.h
index 40e481b..2f3d873 100644
--- a/arch/s390/include/asm/ioctls.h
+++ b/arch/s390/include/asm/ioctls.h
@@ -60,6 +60,7 @@
  #define TCSETSF2	_IOW('T',0x2D, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
  #define FIOCLEX		0x5451
@@ -86,6 +87,7 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #define TIOCSER_TEMT    0x01	/* Transmitter physically empty */

diff --git a/arch/sh/include/asm/ioctls.h b/arch/sh/include/asm/ioctls.h
index c212c37..eb6c4c6 100644
--- a/arch/sh/include/asm/ioctls.h
+++ b/arch/sh/include/asm/ioctls.h
@@ -69,6 +69,7 @@
  # define TIOCPKT_START		 8
  # define TIOCPKT_NOSTOP		16
  # define TIOCPKT_DOSTOP		32
+# define TIOCPKT_IOCTL		64


  #define TIOCNOTTY	_IO('T', 34) /* 0x5422 */
@@ -84,6 +85,7 @@
  #define TCSETSF2	_IOW('T', 45, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define TIOCSERCONFIG	_IO('T', 83) /* 0x5453 */
  #define TIOCSERGWILD	_IOR('T', 84,  int) /* 0x5454 */
diff --git a/arch/sparc/include/asm/ioctls.h b/arch/sparc/include/asm/ioctls.h
index 1fe6855..53f4ee0 100644
--- a/arch/sparc/include/asm/ioctls.h
+++ b/arch/sparc/include/asm/ioctls.h
@@ -80,6 +80,7 @@
  /* Get minor device of a pty master's FD -- Solaris equiv is ISPTM */
  #define TIOCGPTN	_IOR('t', 134, unsigned int) /* Get Pty Number */
  #define TIOCSPTLCK	_IOW('t', 135, int) /* Lock/unlock PTY */
+#define TIOCSIG		_IOW('t', 136, int) /* Generate signal on Pty slave */

  /* Little f */
  #define FIOCLEX		_IO('f', 1)
@@ -132,5 +133,6 @@
  #define TIOCPKT_START		 8
  #define TIOCPKT_NOSTOP		16
  #define TIOCPKT_DOSTOP		32
+#define TIOCPKT_IOCTL		64

  #endif /* !(_ASM_SPARC_IOCTLS_H) */
diff --git a/arch/sparc/include/asm/termbits.h b/arch/sparc/include/asm/termbits.h
index d72dfed..23b10ff 100644
--- a/arch/sparc/include/asm/termbits.h
+++ b/arch/sparc/include/asm/termbits.h
@@ -225,6 +225,7 @@ struct ktermios {
  #define FLUSHO	0x00002000
  #define PENDIN	0x00004000
  #define IEXTEN	0x00008000
+#define EXTPROC	0x00010000

  /* modem lines */
  #define TIOCM_LE	0x001
diff --git a/arch/xtensa/include/asm/ioctls.h b/arch/xtensa/include/asm/ioctls.h
index 0ffa942..ab18000 100644
--- a/arch/xtensa/include/asm/ioctls.h
+++ b/arch/xtensa/include/asm/ioctls.h
@@ -81,6 +81,7 @@
  # define TIOCPKT_START		 8
  # define TIOCPKT_NOSTOP		16
  # define TIOCPKT_DOSTOP		32
+# define TIOCPKT_IOCTL		64


  #define TIOCNOTTY	_IO('T', 34)
@@ -97,6 +98,7 @@
  #define TCSETSF2	_IOW('T', 45, struct termios2)
  #define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux 
device) */
  #define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */

  #define TIOCSERCONFIG	_IO('T', 83)
  #define TIOCSERGWILD	_IOR('T', 84,  int)
diff --git a/arch/xtensa/include/asm/termbits.h 
b/arch/xtensa/include/asm/termbits.h
index 85aa6a3..0d6c871 100644
--- a/arch/xtensa/include/asm/termbits.h
+++ b/arch/xtensa/include/asm/termbits.h
@@ -196,6 +196,7 @@ struct ktermios {
  #define FLUSHO	0010000
  #define PENDIN	0040000
  #define IEXTEN	0100000
+#define EXTPROC	0200000

  /* tcflow() and TCXONC use these */

-- 1.7.0.4

-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/2] tty: add EXTPROC support for LINEMODE
  2010-06-15 18:08       ` [PATCH 0/2] tty: add EXTPROC support for LINEMODE Howard Chu
  2010-06-15 18:10         ` [PATCH 1/2] " Howard Chu
@ 2010-06-15 18:35         ` Greg KH
  2010-06-15 18:46           ` Howard Chu
  1 sibling, 1 reply; 10+ messages in thread
From: Greg KH @ 2010-06-15 18:35 UTC (permalink / raw)
  To: Howard Chu; +Cc: linux-kernel, Alan Cox

On Tue, Jun 15, 2010 at 11:08:16AM -0700, Howard Chu wrote:
> Paraphrased from the 1989 BSD patch by David Borman @ cray.com:

<snip>

This is the stuff you need in the 1/2 patch, otherwise it will be lost.

Does the build break if you don't apply the second patch?  Or is that
just needed to hook everything up for all of the arches?  We can't break
things inbetween each patch.

Care to resend?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/2] tty: add EXTPROC support for LINEMODE
  2010-06-15 18:35         ` [PATCH 0/2] tty: add EXTPROC support for LINEMODE Greg KH
@ 2010-06-15 18:46           ` Howard Chu
  0 siblings, 0 replies; 10+ messages in thread
From: Howard Chu @ 2010-06-15 18:46 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel, Alan Cox

Greg KH wrote:
> On Tue, Jun 15, 2010 at 11:08:16AM -0700, Howard Chu wrote:
>> Paraphrased from the 1989 BSD patch by David Borman @ cray.com:
>
> <snip>
>
> This is the stuff you need in the 1/2 patch, otherwise it will be lost.
>
> Does the build break if you don't apply the second patch?  Or is that
> just needed to hook everything up for all of the arches?  We can't break
> things inbetween each patch.
>
> Care to resend?

Yeah, since it's not ifdef'd I imagine it will break all of the other arches 
if applied separately.

And it looks like my mail client butchered the patches so I was going to have 
to resend anyway. Coming up...
-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2010-06-15 18:46 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-11 10:18 EXTPROC, telnetd LINEMODE, revisited Howard Chu
2010-06-11 10:41 ` Andi Kleen
2010-06-11 11:17   ` Howard Chu
2010-06-11 20:22     ` Howard Chu
2010-06-12  1:36     ` [PATCH] " Howard Chu
2010-06-15 18:08       ` [PATCH 0/2] tty: add EXTPROC support for LINEMODE Howard Chu
2010-06-15 18:10         ` [PATCH 1/2] " Howard Chu
2010-06-15 18:13           ` [PATCH 2/2] tty: Add arch-specific EXTPROC definitions Howard Chu
2010-06-15 18:35         ` [PATCH 0/2] tty: add EXTPROC support for LINEMODE Greg KH
2010-06-15 18:46           ` Howard Chu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox