Allow to send SIGQUIT via Ctrl+BREAK (patch included)

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Allow to send SIGQUIT via Ctrl+BREAK (patch included)

Christian Franke
Hi,

unlike Linux & friends, Cygwin cannot send a SIGQUIT via keyboard.
The SIGQUIT key simulated in termios does only work if app reads from
console.
Both console events ^C and ^BREAK are mapped to SIGINT.

Suggest to add some option to send SIGQUIT via ^BREAK.

A simple patch is attached.

It sends SIGQUIT on ^BREAK if both VINTR and VQUIT are set to ^C.
As a positive side effect, this disables any other SIGQUIT key in termios.

Testcase:

$ sleep 1000
[^BREAK]

$ ./stty quit ^C
$ sleep 1000
[^BREAK]
Quit (core dumped)

$ ./stty quit ^X
$ sleep 1000
[^BREAK]

$ echo Thanks for any comment
Thanks for any comment

Christian


--- exceptions.cc.orig 2005-07-01 17:49:40.001000000 +0200
+++ exceptions.cc 2005-11-24 22:41:02.765867700 +0100
@@ -888,8 +888,13 @@
        that we have handled the signal).  At this point, type should be
        a CTRL_C_EVENT or CTRL_BREAK_EVENT. */
     {
+      int sig = SIGINT;
+      /* If intr and quit are both mapped to ^C, send SIGQUIT on ^BREAK */
+      if (type == CTRL_BREAK_EVENT
+          && t->ti.c_cc[VINTR] == 3 && t->ti.c_cc[VQUIT] == 3)
+        sig = SIGQUIT;
       t->last_ctrl_c = GetTickCount ();
-      killsys (-myself->pid, SIGINT);
+      killsys (-myself->pid, sig);
       t->last_ctrl_c = GetTickCount ();
       return TRUE;
     }
Reply | Threaded
Open this post in threaded view
|

Re: Allow to send SIGQUIT via Ctrl+BREAK (patch included)

Christopher Faylor-2
On Thu, Nov 24, 2005 at 11:03:02PM +0100, Christian Franke wrote:

>unlike Linux & friends, Cygwin cannot send a SIGQUIT via keyboard.  The
>SIGQUIT key simulated in termios does only work if app reads from
>console.  Both console events ^C and ^BREAK are mapped to SIGINT.
>
>Suggest to add some option to send SIGQUIT via ^BREAK.
>
>A simple patch is attached.
>
>It sends SIGQUIT on ^BREAK if both VINTR and VQUIT are set to ^C.  As a
>positive side effect, this disables any other SIGQUIT key in termios.

Sorry but the precedent of sending SIGINT when pressing CTRL-BREAK is
long-standing behavior that I am not comfortable changing.

Thank you for the patch, though.

cgf
Reply | Threaded
Open this post in threaded view
|

Re: Allow to send SIGQUIT via Ctrl+BREAK (patch included)

Christian Franke
Christopher Faylor wrote:
>>[...]
>>Suggest to add some option to send SIGQUIT via ^BREAK.
>>
>>A simple patch is attached.
>>
>>It sends SIGQUIT on ^BREAK if both VINTR and VQUIT are set to ^C.  As
a
>>positive side effect, this disables any other SIGQUIT key in termios.
>
>Sorry but the precedent of sending SIGINT when pressing CTRL-BREAK is
>long-standing behavior that I am not comfortable changing.

Agree.

But the patch won't change this long standing-behavior unless the user
opts-in via "stty quit ^C" (see testcase).

So the patch shouldn't BREAK anything ;-)

As an alternative, a new CYGWIN environment setting could be used.
But using some termios setting for such an option is IMO the right thing
to do.

I missed the SIGQUIT via keyboard during the first port of smartd to
Cygwin last year. In smartd's debug mode, SIGINT is used to reload
configuration file, SIGQUIT to exit. This worked on every supported
platform except Cygwin.
The Cygwin-specific workaround ("press ^C twice to quit") added to
smartd.c has more lines than this cygwin1.dll patch ;-)

Christian


Reply | Threaded
Open this post in threaded view
|

Re: Allow to send SIGQUIT via Ctrl+BREAK (patch included)

Christopher Faylor-2
On Fri, Nov 25, 2005 at 08:50:26AM +0100, Christian Franke wrote:

>Christopher Faylor wrote:
>>>[...]
>>>Suggest to add some option to send SIGQUIT via ^BREAK.
>>>
>>>A simple patch is attached.
>>>
>>>It sends SIGQUIT on ^BREAK if both VINTR and VQUIT are set to ^C.  As
>a
>>>positive side effect, this disables any other SIGQUIT key in termios.
>>
>>Sorry but the precedent of sending SIGINT when pressing CTRL-BREAK is
>>long-standing behavior that I am not comfortable changing.
>
>Agree.
>
>But the patch won't change this long standing-behavior unless the user
>opts-in via "stty quit ^C" (see testcase).
>
>So the patch shouldn't BREAK anything ;-)
>
>As an alternative, a new CYGWIN environment setting could be used.
>But using some termios setting for such an option is IMO the right thing
>to do.
>
>I missed the SIGQUIT via keyboard during the first port of smartd to
>Cygwin last year. In smartd's debug mode, SIGINT is used to reload
>configuration file, SIGQUIT to exit. This worked on every supported
>platform except Cygwin.

It is (or should be, since I haven't checked it recently) supported if you
set CYGWIN=tty, though.  There is a lot of functionality that isn't available
with the normal windows console that is available with CYGWIN=tty.  Since
the only precedent for the behavior of CTRL-BREAK is MSVCRT, I am very
reluctant to change it.

cgf
Reply | Threaded
Open this post in threaded view
|

Re: Allow to send SIGQUIT via Ctrl+BREAK (patch included)

Christian Franke
Christopher Faylor wrote:

>[...]
>It is (or should be, since I haven't checked it recently) supported if you
>set CYGWIN=tty, though.  There is a lot of functionality that isn't available
>with the normal windows console that is available with CYGWIN=tty.
>

Oh, Yes.

I tested this some time ago and it didn't work as expected, but now it
works.
Hmm... must have missed something during first test, sorry.


>Since
>the only precedent for the behavior of CTRL-BREAK is MSVCRT, I am very
>reluctant to change it.
>  
>

OK, let's forget the patch ;-)


Christian

Reply | Threaded
Open this post in threaded view
|

Re: Allow to send SIGQUIT via Ctrl+BREAK (patch included)

Christopher Faylor-2
On Fri, Nov 25, 2005 at 08:43:43PM +0100, Christian Franke wrote:
>OK, let's forget the patch ;-)

Actually, I have done some more testing myself and Windows doesn't work
the way that I remembered.  It seems like CTRL-BREAK isn't handled by
signal(SIGINT, ...).  So, I was wrong about this.  I really should have
tested how it worked before rejecting your patch out of hand.

So, this code is probably just reflecting my misperceptions of what
Windows was doing.  I'll add your patch as it improves Cygwin's
functionality.

Thanks again for providing it.

cgf
Reply | Threaded
Open this post in threaded view
|

Re: Allow to send SIGQUIT via Ctrl+BREAK (patch included)

Christian Franke
Christopher Faylor wrote:

>On Fri, Nov 25, 2005 at 08:43:43PM +0100, Christian Franke wrote:
>  
>
>>OK, let's forget the patch ;-)
>>    
>>
>
>Actually, I have done some more testing myself and Windows doesn't work
>the way that I remembered.  It seems like CTRL-BREAK isn't handled by
>signal(SIGINT, ...).  So, I was wrong about this.
>

MSVCRT maps CTRL-C to SIGINT, CTRL-BREAK to an extra SIGBREAK.
So it is possible to map this to SIGQUIT with a simple hack:

#ifdef SIGBREAK
#undef SIGQUIT
#define SIGQUIT SIGBREAK
#endif

This isn't possible with Cygwin (in notty mode), because CTRL-C and
CTRL-BREAK cannot be distinguished.

>I really should have
>tested how it worked before rejecting your patch out of hand.
>  
>

N.P. ;-)


>So, this code is probably just reflecting my misperceptions of what
>Windows was doing.  I'll add your patch as it improves Cygwin's
>functionality.
>  
>

Thanks!

Christian

Reply | Threaded
Open this post in threaded view
|

Re: Allow to send SIGQUIT via Ctrl+BREAK (patch included)

Christopher Faylor-2
On Fri, Nov 25, 2005 at 09:34:24PM +0100, Christian Franke wrote:

>Christopher Faylor wrote:
>>On Fri, Nov 25, 2005 at 08:43:43PM +0100, Christian Franke wrote:
>>>OK, let's forget the patch ;-)
>>
>>Actually, I have done some more testing myself and Windows doesn't work
>>the way that I remembered.  It seems like CTRL-BREAK isn't handled by
>>signal(SIGINT, ...).  So, I was wrong about this.
>
>MSVCRT maps CTRL-C to SIGINT, CTRL-BREAK to an extra SIGBREAK.  So it
>is possible to map this to SIGQUIT with a simple hack:
>
>#ifdef SIGBREAK
>#undef SIGQUIT
>#define SIGQUIT SIGBREAK
>#endif
>
>This isn't possible with Cygwin (in notty mode), because CTRL-C and
>CTRL-BREAK cannot be distinguished.

I'm not sure why you're reexplaining this after I said I'd incorporate
the patch but I'm not concerned about making no-cygwin programs work.  I
just didn't want to veer from what I thought was standard Windows
behavior in absence of any other standard.

cgf