all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#73100: Regarding a bug in suspend-emacs
@ 2024-09-07 12:37 Riza Dindir
  2024-09-07 15:20 ` Eli Zaretskii
  0 siblings, 1 reply; 4+ messages in thread
From: Riza Dindir @ 2024-09-07 12:37 UTC (permalink / raw)
  To: 73100, help-gnu-emacs

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

Hello

I am running Linux with kernel 6.6.47 and am running emacs in xterm, using
the -nw command line argument.

I am new to emacs and was experimenting with the suspend-emacs command.
Following the example on
https://www.gnu.org/software/emacs/manual/html_node/elisp/Suspending-Emacs.html
.

When following the example, I added the suspend-resume-hook to my
.emacs.d/init.el file. When I run M-: (suspend-emacs "pwd") it does not
show the current working directory. But when I do fg from the terminal that
I got into, I see the "Resumed!" message.

I asked in the libera chat about that, and also in the gnu-help-emacs list.
I have been talking to wasamasa on libera chat (#emacs-beginners) and we
pinpointed the problem to the stuff_char function (in
https://git.savannah.gnu.org/cgit/emacs.git/tree/src/sysdep.c#n403). We
came to this point from stuff_buffered_input (
https://git.savannah.gnu.org/cgit/emacs.git/tree/src/keyboard.c#n11963),
and from  suspend-emacs function definition (in
https://git.savannah.gnu.org/cgit/emacs.git/tree/src/keyboard.c#n11908).

The stuff_char function is using ioctl with TIOCSTI. TIOCSTI requires
CAP_SYS_ADMIN capability. You can set this capability using sysctl setting
dev.tty.legacy_tiocsti to 1.

Unless I had set "dev.tty.legacy_tiocsti" to 1 I could not run the
suspend-emacs command with an argument string.

Either emacs can check the return value of ioctl in stuff_char and if there
return value is EPERM, then handle this accordingly, with a message
regarding the problem.

Or the information relating to the kernel version and CAP_SYS_ADMIN can be
added to the infor page os suspend_emacs, along with the information on how
to set this capability using sysctl.

Kind Regards
Riza Dindir

[-- Attachment #2: Type: text/html, Size: 2534 bytes --]

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

* bug#73100: Regarding a bug in suspend-emacs
  2024-09-07 12:37 bug#73100: Regarding a bug in suspend-emacs Riza Dindir
@ 2024-09-07 15:20 ` Eli Zaretskii
  2024-09-07 16:11   ` Riza Dindir
  0 siblings, 1 reply; 4+ messages in thread
From: Eli Zaretskii @ 2024-09-07 15:20 UTC (permalink / raw)
  To: Riza Dindir; +Cc: 73100

> From: Riza Dindir <riza.dindir@gmail.com>
> Date: Sat, 7 Sep 2024 15:37:17 +0300
> 
> I am running Linux with kernel 6.6.47 and am running emacs in xterm, using the -nw command line argument.
> 
> I am new to emacs and was experimenting with the suspend-emacs command. Following the example on
> https://www.gnu.org/software/emacs/manual/html_node/elisp/Suspending-Emacs.html.
> 
> When following the example, I added the suspend-resume-hook to my .emacs.d/init.el file. When I run M-:
> (suspend-emacs "pwd") it does not show the current working directory. But when I do fg from the terminal that I
> got into, I see the "Resumed!" message.
> 
> I asked in the libera chat about that, and also in the gnu-help-emacs list. I have been talking to wasamasa on
> libera chat (#emacs-beginners) and we pinpointed the problem to the stuff_char function (in
> https://git.savannah.gnu.org/cgit/emacs.git/tree/src/sysdep.c#n403). We came to this point from
> stuff_buffered_input (https://git.savannah.gnu.org/cgit/emacs.git/tree/src/keyboard.c#n11963), and from 
> suspend-emacs function definition (in https://git.savannah.gnu.org/cgit/emacs.git/tree/src/keyboard.c#n11908).
> 
> The stuff_char function is using ioctl with TIOCSTI. TIOCSTI requires CAP_SYS_ADMIN capability. You can set
> this capability using sysctl setting dev.tty.legacy_tiocsti to 1.
> 
> Unless I had set "dev.tty.legacy_tiocsti" to 1 I could not run the suspend-emacs command with an argument
> string.
> 
> Either emacs can check the return value of ioctl in stuff_char and if there return value is EPERM, then handle
> this accordingly, with a message regarding the problem.

You mean, you want suspend-emacs signal an error if it is called with
STUFFSTRING argument, but fails to stuff the string into the
terminal's input buffer?





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

* bug#73100: Regarding a bug in suspend-emacs
  2024-09-07 15:20 ` Eli Zaretskii
@ 2024-09-07 16:11   ` Riza Dindir
  2024-09-07 16:29     ` Eli Zaretskii
  0 siblings, 1 reply; 4+ messages in thread
From: Riza Dindir @ 2024-09-07 16:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 73100

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

Hello Eli,

I am new to the code base, and it was just a suggestion to check for the
ioctl call for any failures and take precautions, maybe inform the user of
the issue that the suspend-emacs command did not run correctly. Since the
command was not printing out anything when called with 'M-: (suspend-emacs
"pwd")' I was not sure what was happening.

For users that use the linux kernel 6.2+ the ioctl command does not work
correctly. When the STUFFSTRING is passed to the suspend-emacs command, it
does nothing. The problem with kernel 6.2+ is that it requires CAP_SYS_ADMIN
capability (https://www.man7.org/linux/man-pages/man2/TIOCSTI.2const.html).

In the code at some point suspend-emacs command calls stuff_char, which
uses ioctl (code snippet below, from
https://git.savannah.gnu.org/cgit/emacs.git/tree/src/sysdep.c#n403). The
ioctl call fails. But in the code there is no check for that, that might
confuse people that use linux kernel 6.2+. I wanted to use suspend-emacs
with "pwd" as the string (as shown in the example in the documentation in
https://www.gnu.org/software/emacs/manual/html_node/elisp/Suspending-Emacs.html).
But the "pwd" command was not displaying anything. Because it was not being
sent/stuffed to the superior process.

/* Should perhaps error if in batch mode */#ifdef TIOCSTI
  ioctl (fileno (CURTTY()->input), TIOCSTI, &c);#else /* no TIOCSTI */
  error ("Cannot stuff terminal input characters in this version of
Unix");#endif /* no TIOCSTI */


I have downloaded the code for emacs 29.4 and compiled it with a simple
error check and the ioctl call failed on my system silently (with kernel
6.6.47).

To add a check is of course for the people who develop emacs to decide. I
have seen the code today, and am not in a position to suggest anything at
this stage. Maybe there would be a better way of handling this error.

Adding an error check would be one of the solutions.

The other solution might be to add a piece of information to the
documentation for suspend-emacs, (and maybe to the documentation string for
suspend-emacs) regarding this problem. So that people that use linux kernel
6.2+ would be aware of this issue.

The issue is fixable by just setting the dev.tty.legacy_tiocsti sysctl
variable to 1. This variable was set to 0 on my system. Hence the ioctl
call for TIOCSTI was failing, and no indication of the error was given.
After I have read the man page for TIOCSTI, and set the sysctl
variable dev.tty.legacy_tiocsti to 1 was I able to call suspend-emacs with
a STUFFSTRING and it worked. It was displaying the output of the "pwd"
command.

Regards
Riza


On Sat, Sep 7, 2024, 18:20 Eli Zaretskii <eliz@gnu.org> wrote:

> > From: Riza Dindir <riza.dindir@gmail.com>
> > Date: Sat, 7 Sep 2024 15:37:17 +0300
> >
> > I am running Linux with kernel 6.6.47 and am running emacs in xterm,
> using the -nw command line argument.
> >
> > I am new to emacs and was experimenting with the suspend-emacs command.
> Following the example on
> >
> https://www.gnu.org/software/emacs/manual/html_node/elisp/Suspending-Emacs.html
> .
> >
> > When following the example, I added the suspend-resume-hook to my
> .emacs.d/init.el file. When I run M-:
> > (suspend-emacs "pwd") it does not show the current working directory.
> But when I do fg from the terminal that I
> > got into, I see the "Resumed!" message.
> >
> > I asked in the libera chat about that, and also in the gnu-help-emacs
> list. I have been talking to wasamasa on
> > libera chat (#emacs-beginners) and we pinpointed the problem to the
> stuff_char function (in
> > https://git.savannah.gnu.org/cgit/emacs.git/tree/src/sysdep.c#n403). We
> came to this point from
> > stuff_buffered_input (
> https://git.savannah.gnu.org/cgit/emacs.git/tree/src/keyboard.c#n11963),
> and from
> > suspend-emacs function definition (in
> https://git.savannah.gnu.org/cgit/emacs.git/tree/src/keyboard.c#n11908).
> >
> > The stuff_char function is using ioctl with TIOCSTI. TIOCSTI requires
> CAP_SYS_ADMIN capability. You can set
> > this capability using sysctl setting dev.tty.legacy_tiocsti to 1.
> >
> > Unless I had set "dev.tty.legacy_tiocsti" to 1 I could not run the
> suspend-emacs command with an argument
> > string.
> >
> > Either emacs can check the return value of ioctl in stuff_char and if
> there return value is EPERM, then handle
> > this accordingly, with a message regarding the problem.
>
> You mean, you want suspend-emacs signal an error if it is called with
> STUFFSTRING argument, but fails to stuff the string into the
> terminal's input buffer?
>

[-- Attachment #2: Type: text/html, Size: 7172 bytes --]

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

* bug#73100: Regarding a bug in suspend-emacs
  2024-09-07 16:11   ` Riza Dindir
@ 2024-09-07 16:29     ` Eli Zaretskii
  0 siblings, 0 replies; 4+ messages in thread
From: Eli Zaretskii @ 2024-09-07 16:29 UTC (permalink / raw)
  To: Riza Dindir; +Cc: 73100

> From: Riza Dindir <riza.dindir@gmail.com>
> Date: Sat, 7 Sep 2024 19:11:02 +0300
> Cc: 73100@debbugs.gnu.org
> 
> I am new to the code base, and it was just a suggestion to check for the ioctl call for any failures and take
> precautions, maybe inform the user of the issue that the suspend-emacs command did not run correctly. Since
> the command was not printing out anything when called with 'M-: (suspend-emacs "pwd")' I was not sure what
> was happening.

I was asking for your user's expectations, not how to do that in the
code.

> For users that use the linux kernel 6.2+ the ioctl command does not work correctly. When the STUFFSTRING is
> passed to the suspend-emacs command, it does nothing. The problem with kernel 6.2+ is that it requires
> CAP_SYS_ADMIN capability (https://www.man7.org/linux/man-pages/man2/TIOCSTI.2const.html).
> 
> In the code at some point suspend-emacs command calls stuff_char, which uses ioctl (code snippet below, from
> https://git.savannah.gnu.org/cgit/emacs.git/tree/src/sysdep.c#n403). The ioctl call fails. But in the code there is
> no check for that, that might confuse people that use linux kernel 6.2+. I wanted to use suspend-emacs with
> "pwd" as the string (as shown in the example in the documentation in
> https://www.gnu.org/software/emacs/manual/html_node/elisp/Suspending-Emacs.html). But the "pwd" command
> was not displaying anything. Because it was not being sent/stuffed to the superior process.

Does ioctl return -1 in that case?  (I don't have access to a system
where it fails, it works for me on GNU/Linux.)

> Adding an error check would be one of the solutions.

Assuming we can check that (see above), the question is what to do if
we do detect a failure.

> The other solution might be to add a piece of information to the documentation for suspend-emacs, (and
> maybe to the documentation string for suspend-emacs) regarding this problem. So that people that use linux
> kernel 6.2+ would be aware of this issue.

That is already done, except that the documentation cannot be too
specific regarding when and under what conditions it could happen.





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

end of thread, other threads:[~2024-09-07 16:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-07 12:37 bug#73100: Regarding a bug in suspend-emacs Riza Dindir
2024-09-07 15:20 ` Eli Zaretskii
2024-09-07 16:11   ` Riza Dindir
2024-09-07 16:29     ` Eli Zaretskii

Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.