unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#70519: 30.0.50; Device for Emacs terminal I/O
@ 2024-04-22 20:09 Helmut Eller
  2024-04-23  5:32 ` Eli Zaretskii
  0 siblings, 1 reply; 14+ messages in thread
From: Helmut Eller @ 2024-04-22 20:09 UTC (permalink / raw)
  To: 70519

I'd like to start Emacs under GDB, but so that Emacs doesn't use the
same terminal as GDB.  It seems that the --terminal command line switch
is there for exactly this use case.

However, it doesn't work.  Emacs parses the command line option and
replaces stdin and stdout with the correct device, but then in dispnew.c
it always calls init_tty with 0 as argument for the device name.  That
simply opens the controlling terminal, i.e. /dev/tty and that is usually
the same device as the one that GDB uses.

What would you think of the change below?

Helmut

diff --git a/src/dispnew.c b/src/dispnew.c
index 0f5063c047f..cc5b883c138 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -6710,7 +6710,8 @@ init_display_interactive (void)
     init_foreground_group ();
 
     /* Open a display on the controlling tty. */
-    t = init_tty (0, terminal_type, 1); /* Errors are fatal. */
+    /* Errors are fatal. */
+    t = init_tty (ttyname (STDIN_FILENO), terminal_type, 1);
 
     /* Convert the initial frame to use the new display. */
     if (f->output_method != output_initial)






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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-04-22 20:09 bug#70519: 30.0.50; Device for Emacs terminal I/O Helmut Eller
@ 2024-04-23  5:32 ` Eli Zaretskii
  2024-04-23  6:09   ` Helmut Eller
  2024-05-04 10:34   ` Eli Zaretskii
  0 siblings, 2 replies; 14+ messages in thread
From: Eli Zaretskii @ 2024-04-23  5:32 UTC (permalink / raw)
  To: Helmut Eller, Paul Eggert; +Cc: 70519

> From: Helmut Eller <eller.helmut@gmail.com>
> Date: Mon, 22 Apr 2024 22:09:18 +0200
> 
> I'd like to start Emacs under GDB, but so that Emacs doesn't use the
> same terminal as GDB.

You should be able to do that with GDB features.  These include:

  . the 'set inferior-tty' command
  . the 'set new-console' command

The first sets the terminal of the debuggee to the named terminal, the
latter causes GDB to create a new terminal each time you "run" a
debuggee, and force the debuggee to use that new terminal.  These
commands should work for you without any changes to the Emacs sources.

Alternatively, you could start GDB from a different terminal and
attach it to an already running Emacs, but this does not allow you to
debug the Emacs startup code.

> It seems that the --terminal command line switch is there for
> exactly this use case.
> 
> However, it doesn't work.  Emacs parses the command line option and
> replaces stdin and stdout with the correct device, but then in dispnew.c
> it always calls init_tty with 0 as argument for the device name.  That
> simply opens the controlling terminal, i.e. /dev/tty and that is usually
> the same device as the one that GDB uses.
> 
> What would you think of the change below?

I don't think it's the correct change.  For starters, ttyname is
non-portable: on some supported platforms there's no way of getting at
the name of a non-default terminal.

More importantly, we already know the name of the terminal: we used it
in emacs.c when we processed the --terminal switch.  We just "forgot"
it because we didn't save it anywhere.  So one way of fixing this is
to record that name and reuse it in init_tty.  E.g., make DEV_TTY
non-const, and save the actual name there when we process it in
emacs.c.

Adding Paul in case he has comments.





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-04-23  5:32 ` Eli Zaretskii
@ 2024-04-23  6:09   ` Helmut Eller
  2024-05-04 10:34   ` Eli Zaretskii
  1 sibling, 0 replies; 14+ messages in thread
From: Helmut Eller @ 2024-04-23  6:09 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 70519, Paul Eggert

On Tue, Apr 23 2024, Eli Zaretskii wrote:

>> I'd like to start Emacs under GDB, but so that Emacs doesn't use the
>> same terminal as GDB.
>
> You should be able to do that with GDB features.  These include:
>
>   . the 'set inferior-tty' command
>   . the 'set new-console' command
>
> The first sets the terminal of the debuggee to the named terminal, the
> latter causes GDB to create a new terminal each time you "run" a
> debuggee, and force the debuggee to use that new terminal.  These
> commands should work for you without any changes to the Emacs sources.
>
> Alternatively, you could start GDB from a different terminal and
> attach it to an already running Emacs, but this does not allow you to
> debug the Emacs startup code.

Yes, I will use that.  That's much easier than improving a feature that
apparently nobody uses.  You can close this bug.

Helmut





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-04-23  5:32 ` Eli Zaretskii
  2024-04-23  6:09   ` Helmut Eller
@ 2024-05-04 10:34   ` Eli Zaretskii
  2024-05-04 15:47     ` Helmut Eller
  1 sibling, 1 reply; 14+ messages in thread
From: Eli Zaretskii @ 2024-05-04 10:34 UTC (permalink / raw)
  To: eller.helmut; +Cc: 70519

> Cc: 70519@debbugs.gnu.org
> Date: Tue, 23 Apr 2024 08:32:25 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> More importantly, we already know the name of the terminal: we used it
> in emacs.c when we processed the --terminal switch.  We just "forgot"
> it because we didn't save it anywhere.  So one way of fixing this is
> to record that name and reuse it in init_tty.  E.g., make DEV_TTY
> non-const, and save the actual name there when we process it in
> emacs.c.

I attempted to fix this now that way on the master branch.  Would you
mind testing whether it does what you wanted?  If the current master
somehow doesn't do what you wanted, I'd appreciate a recipe for
reproducing the problematic behavior, so I could investigate.

Thanks.





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 10:34   ` Eli Zaretskii
@ 2024-05-04 15:47     ` Helmut Eller
  2024-05-04 16:19       ` Eli Zaretskii
  2024-05-04 18:19       ` Andreas Schwab
  0 siblings, 2 replies; 14+ messages in thread
From: Helmut Eller @ 2024-05-04 15:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 70519

On Sat, May 04 2024, Eli Zaretskii wrote:

>> Cc: 70519@debbugs.gnu.org
>> Date: Tue, 23 Apr 2024 08:32:25 +0300
>> From: Eli Zaretskii <eliz@gnu.org>
>> 
>> More importantly, we already know the name of the terminal: we used it
>> in emacs.c when we processed the --terminal switch.  We just "forgot"
>> it because we didn't save it anywhere.  So one way of fixing this is
>> to record that name and reuse it in init_tty.  E.g., make DEV_TTY
>> non-const, and save the actual name there when we process it in
>> emacs.c.
>
> I attempted to fix this now that way on the master branch.  Would you
> mind testing whether it does what you wanted?  If the current master
> somehow doesn't do what you wanted, I'd appreciate a recipe for
> reproducing the problematic behavior, so I could investigate.

It's much better now.  However, there is still something I would like to
be different.  I basically do this:

1) Start an xterm: xterm -e sh -c 'tty; exec sleep inf'
   This displays /dev/pts/12 and waits.  Let's call this terminal A.

2) Start Emacs in another terminal, let's call it terminal B, start
   Emacs with: emacs -t /dev/pts/12

   This prints "Using /dev/pts/12" and Emacs displays stuff in terminal
   A.  Which is what one would expect.

3) Now when I press C-c in terminal B, I see ^C.  This is not what I
   expect. I would expect that Emacs is interrupted and exits the same
   way a GUI Emacs exits when pressing C-c.





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 15:47     ` Helmut Eller
@ 2024-05-04 16:19       ` Eli Zaretskii
  2024-05-04 16:25         ` Helmut Eller
  2024-05-04 16:36         ` Paul Eggert
  2024-05-04 18:19       ` Andreas Schwab
  1 sibling, 2 replies; 14+ messages in thread
From: Eli Zaretskii @ 2024-05-04 16:19 UTC (permalink / raw)
  To: Helmut Eller, Paul Eggert; +Cc: 70519

> From: Helmut Eller <eller.helmut@gmail.com>
> Cc: 70519@debbugs.gnu.org
> Date: Sat, 04 May 2024 17:47:00 +0200
> 
> On Sat, May 04 2024, Eli Zaretskii wrote:
> 
> > I attempted to fix this now that way on the master branch.  Would you
> > mind testing whether it does what you wanted?  If the current master
> > somehow doesn't do what you wanted, I'd appreciate a recipe for
> > reproducing the problematic behavior, so I could investigate.
> 
> It's much better now.  However, there is still something I would like to
> be different.  I basically do this:
> 
> 1) Start an xterm: xterm -e sh -c 'tty; exec sleep inf'
>    This displays /dev/pts/12 and waits.  Let's call this terminal A.
> 
> 2) Start Emacs in another terminal, let's call it terminal B, start
>    Emacs with: emacs -t /dev/pts/12
> 
>    This prints "Using /dev/pts/12" and Emacs displays stuff in terminal
>    A.  Which is what one would expect.
> 
> 3) Now when I press C-c in terminal B, I see ^C.  This is not what I
>    expect. I would expect that Emacs is interrupted and exits the same
>    way a GUI Emacs exits when pressing C-c.

Thanks for testing.  I'm not sure about item 3, I guess it has
something to do with the controlling terminal and how signals are
delivered depending on that.  AFAIU, the --terminal option causes
Emacs to close its original stdin, so Ctrl-C does not send SIGINT to
Emacs.  But I'm nowhere near being an expert on that.  Paul, can you
please comment on that?

In any case, does this allow you to do what you originally wanted,
i.e. debug a -nw session of Emacs without mixing GDB I/O and Emacs
I/O?





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 16:19       ` Eli Zaretskii
@ 2024-05-04 16:25         ` Helmut Eller
  2024-05-04 17:03           ` Eli Zaretskii
  2024-05-04 16:36         ` Paul Eggert
  1 sibling, 1 reply; 14+ messages in thread
From: Helmut Eller @ 2024-05-04 16:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 70519, Paul Eggert

On Sat, May 04 2024, Eli Zaretskii wrote:

> In any case, does this allow you to do what you originally wanted,
> i.e. debug a -nw session of Emacs without mixing GDB I/O and Emacs
> I/O?

Yes. Though, at the moment I'm testing mostly GUI stuff.





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 16:19       ` Eli Zaretskii
  2024-05-04 16:25         ` Helmut Eller
@ 2024-05-04 16:36         ` Paul Eggert
  2024-05-04 17:19           ` Eli Zaretskii
  1 sibling, 1 reply; 14+ messages in thread
From: Paul Eggert @ 2024-05-04 16:36 UTC (permalink / raw)
  To: Eli Zaretskii, Helmut Eller; +Cc: 70519

On 2024-05-04 09:19, Eli Zaretskii wrote:
> AFAIU, the --terminal option causes
> Emacs to close its original stdin, so Ctrl-C does not send SIGINT to
> Emacs.  But I'm nowhere near being an expert on that.  Paul, can you
> please comment on that?

Closing stdin doesn't change a process's controlling terminal. On 
GNU/Linux you need to use ioctl with TIOCSCTTY and there are a bunch of 
other preconditions. See how emacs_spawn uses TIOCSCTTY:

        /* We ignore the return value
           because faith@cs.unc.edu says that is necessary on Linux.  */
        ioctl (std_in, TIOCSCTTY, 0);

This comment (and ignoring ioctl's return value) was added by rms in 
commit 084fd64ac9daee2a89d393f07ce87ec8df543330 dated 1993. I'm 
skeptical that the comment is true now. You might try adding code to 
check the return value and report any errors, though Emacs shouldn't 
abort (as it did before that 1993 change) if the ioctl fails.





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 16:25         ` Helmut Eller
@ 2024-05-04 17:03           ` Eli Zaretskii
  0 siblings, 0 replies; 14+ messages in thread
From: Eli Zaretskii @ 2024-05-04 17:03 UTC (permalink / raw)
  To: Helmut Eller; +Cc: 70519, eggert

> From: Helmut Eller <eller.helmut@gmail.com>
> Cc: Paul Eggert <eggert@cs.ucla.edu>,  70519@debbugs.gnu.org
> Date: Sat, 04 May 2024 18:25:32 +0200
> 
> On Sat, May 04 2024, Eli Zaretskii wrote:
> 
> > In any case, does this allow you to do what you originally wanted,
> > i.e. debug a -nw session of Emacs without mixing GDB I/O and Emacs
> > I/O?
> 
> Yes. Though, at the moment I'm testing mostly GUI stuff.

Good, thanks.





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 16:36         ` Paul Eggert
@ 2024-05-04 17:19           ` Eli Zaretskii
  2024-05-04 17:39             ` Paul Eggert
  0 siblings, 1 reply; 14+ messages in thread
From: Eli Zaretskii @ 2024-05-04 17:19 UTC (permalink / raw)
  To: Paul Eggert; +Cc: 70519, eller.helmut

> Date: Sat, 4 May 2024 09:36:23 -0700
> Cc: 70519@debbugs.gnu.org
> From: Paul Eggert <eggert@cs.ucla.edu>
> 
> On 2024-05-04 09:19, Eli Zaretskii wrote:
> > AFAIU, the --terminal option causes
> > Emacs to close its original stdin, so Ctrl-C does not send SIGINT to
> > Emacs.  But I'm nowhere near being an expert on that.  Paul, can you
> > please comment on that?
> 
> Closing stdin doesn't change a process's controlling terminal. On 
> GNU/Linux you need to use ioctl with TIOCSCTTY and there are a bunch of 
> other preconditions. See how emacs_spawn uses TIOCSCTTY:
> 
>         /* We ignore the return value
>            because faith@cs.unc.edu says that is necessary on Linux.  */
>         ioctl (std_in, TIOCSCTTY, 0);

So you are saying that the handling of --terminal in emacs.c is
incomplete, in that it doesn't call that ioctl on the new stdin?
because according to these comments in term.c, we do want the new
terminal to become our controlling terminal:

  /* Create a termcap display on the tty device with the given name and
     type.

     If NAME is NULL, then use the controlling tty, i.e., dev_tty.
     Otherwise NAME should be a path to the tty device file,
     e.g. "/dev/pts/7".
  [...]
  #ifndef DOS_NT
    if (!strcmp (name, dev_tty))
      ctty = 1;
  #endif
  [...]
      /* Open the terminal device.  */

      /* If !ctty, don't recognize it as our controlling terminal, and
	 don't make it the controlling tty if we don't have one now.

	 Alas, O_IGNORE_CTTY is a GNU extension that seems to be only
	 defined on Hurd.  On other systems, we need to explicitly
	 dissociate ourselves from the controlling tty when we want to
	 open a frame on the same terminal.  */
      int flags = O_RDWR | O_NOCTTY | (ctty ? 0 : O_IGNORE_CTTY);
      int fd = emacs_open (name, flags, 0);
      tty->input = tty->output
	= ((fd < 0 || ! isatty (fd))
	   ? NULL
	   : emacs_fdopen (fd, "w+"));
  [...]
      if (!O_IGNORE_CTTY && !ctty)
	dissociate_if_controlling_tty (fd);

In any case, is the result Helmut reports after typing Ctrl-C
expected, or does it mean we have a bug when using --terminal?

> This comment (and ignoring ioctl's return value) was added by rms in 
> commit 084fd64ac9daee2a89d393f07ce87ec8df543330 dated 1993. I'm 
> skeptical that the comment is true now. You might try adding code to 
> check the return value and report any errors, though Emacs shouldn't 
> abort (as it did before that 1993 change) if the ioctl fails.

But emacs_spawn is about starting a sub-process, which is something
different from what I'm talking about.  Here, the issue is the Emacs's
own terminal.

Thanks.





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 17:19           ` Eli Zaretskii
@ 2024-05-04 17:39             ` Paul Eggert
  0 siblings, 0 replies; 14+ messages in thread
From: Paul Eggert @ 2024-05-04 17:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Philipp Stephani, 70519, eller.helmut

On 2024-05-04 10:19, Eli Zaretskii wrote:

> So you are saying that the handling of --terminal in emacs.c is
> incomplete, in that it doesn't call that ioctl on the new stdin?

Sounds like that may be so, if that's what Helmut needs.


> In any case, is the result Helmut reports after typing Ctrl-C
> expected, or does it mean we have a bug when using --terminal?

I don't know. I don't use --terminal. Perhaps others who use it could 
weigh in.


> emacs_spawn is about starting a sub-process, which is something
> different from what I'm talking about.  Here, the issue is the Emacs's
> own terminal.

This stuff used to be in different and somewhat-duplicated sections of 
code, but Philipp refactored and coalesced this in 2020. Perhaps a bit 
of the controlling terminal business got lost in the shuffle? I'll cc 
this to Philipp to see whether he has insight on the issue. Philipp, the 
details are here:

https://bugs.gnu.org/70519





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 15:47     ` Helmut Eller
  2024-05-04 16:19       ` Eli Zaretskii
@ 2024-05-04 18:19       ` Andreas Schwab
  2024-05-04 18:27         ` Helmut Eller
  1 sibling, 1 reply; 14+ messages in thread
From: Andreas Schwab @ 2024-05-04 18:19 UTC (permalink / raw)
  To: Helmut Eller; +Cc: Eli Zaretskii, 70519

On Mai 04 2024, Helmut Eller wrote:

> 3) Now when I press C-c in terminal B, I see ^C.  This is not what I
>    expect. I would expect that Emacs is interrupted and exits the same
>    way a GUI Emacs exits when pressing C-c.

Why do you expect that?  You have told Emacs to use a different
terminal, and a process can only have a single controlling terminal.  It
is unusual for GUI processes to have controlling terminals.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 18:19       ` Andreas Schwab
@ 2024-05-04 18:27         ` Helmut Eller
  2024-05-04 18:40           ` Andreas Schwab
  0 siblings, 1 reply; 14+ messages in thread
From: Helmut Eller @ 2024-05-04 18:27 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Eli Zaretskii, 70519

> On Mai 04 2024, Helmut Eller wrote:
>
>> 3) Now when I press C-c in terminal B, I see ^C.  This is not what I
>>    expect. I would expect that Emacs is interrupted and exits the same
>>    way a GUI Emacs exits when pressing C-c.
>
> Why do you expect that?  You have told Emacs to use a different
> terminal, and a process can only have a single controlling terminal.  It
> is unusual for GUI processes to have controlling terminals.

I expect that so that I can press C-c in terminal B to interrupt and
exit Emacs like in GUI mode.






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

* bug#70519: 30.0.50; Device for Emacs terminal I/O
  2024-05-04 18:27         ` Helmut Eller
@ 2024-05-04 18:40           ` Andreas Schwab
  0 siblings, 0 replies; 14+ messages in thread
From: Andreas Schwab @ 2024-05-04 18:40 UTC (permalink / raw)
  To: Helmut Eller; +Cc: Eli Zaretskii, 70519

On Mai 04 2024, Helmut Eller wrote:

>> On Mai 04 2024, Helmut Eller wrote:
>>
>>> 3) Now when I press C-c in terminal B, I see ^C.  This is not what I
>>>    expect. I would expect that Emacs is interrupted and exits the same
>>>    way a GUI Emacs exits when pressing C-c.
>>
>> Why do you expect that?  You have told Emacs to use a different
>> terminal, and a process can only have a single controlling terminal.  It
>> is unusual for GUI processes to have controlling terminals.
>
> I expect that so that I can press C-c in terminal B to interrupt and
> exit Emacs like in GUI mode.

Why do you expect that?  You have told Emacs to use a different
terminal, and a process can only have a single controlling terminal.  It
is unusual for GUI processes to have controlling terminals.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





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

end of thread, other threads:[~2024-05-04 18:40 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-22 20:09 bug#70519: 30.0.50; Device for Emacs terminal I/O Helmut Eller
2024-04-23  5:32 ` Eli Zaretskii
2024-04-23  6:09   ` Helmut Eller
2024-05-04 10:34   ` Eli Zaretskii
2024-05-04 15:47     ` Helmut Eller
2024-05-04 16:19       ` Eli Zaretskii
2024-05-04 16:25         ` Helmut Eller
2024-05-04 17:03           ` Eli Zaretskii
2024-05-04 16:36         ` Paul Eggert
2024-05-04 17:19           ` Eli Zaretskii
2024-05-04 17:39             ` Paul Eggert
2024-05-04 18:19       ` Andreas Schwab
2024-05-04 18:27         ` Helmut Eller
2024-05-04 18:40           ` Andreas Schwab

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).