unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
@ 2010-10-20 14:22 Ken Brown
  2010-10-20 15:14 ` Andreas Schwab
  2010-10-20 18:59 ` Dan Nicolaescu
  0 siblings, 2 replies; 9+ messages in thread
From: Ken Brown @ 2010-10-20 14:22 UTC (permalink / raw)
  To: emacs-devel

The macro EMACS_GET_TTY_PGRP defined in src/systty.h uses either 
tcgetpgrp or TIOCGPGRP to get the PGID of a terminal's foreground 
process group.  But src/process.c defines and uses its own 
emacs_get_tty_pgrp that only works on systems that have TIOCGPGRP.  Is 
there a good reason for this?  If not, I would like to try to prepare a 
patch to change process.c to use the macro instead.  This would simplify 
the code and would also extend some of the functionality in process.c to 
systems that have tcgetpgrp but not TIOCGPGRP.

Ken



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

* Re: EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
  2010-10-20 14:22 EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp Ken Brown
@ 2010-10-20 15:14 ` Andreas Schwab
  2010-10-20 18:39   ` Ken Brown
  2010-10-20 18:59 ` Dan Nicolaescu
  1 sibling, 1 reply; 9+ messages in thread
From: Andreas Schwab @ 2010-10-20 15:14 UTC (permalink / raw)
  To: Ken Brown; +Cc: emacs-devel

Ken Brown <kbrown@cornell.edu> writes:

> The macro EMACS_GET_TTY_PGRP defined in src/systty.h uses either
> tcgetpgrp or TIOCGPGRP to get the PGID of a terminal's foreground
> process group.  But src/process.c defines and uses its own
> emacs_get_tty_pgrp that only works on systems that have TIOCGPGRP.  Is
> there a good reason for this?

Is "historical accident" a good reason? :-)

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."



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

* Re: EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
  2010-10-20 15:14 ` Andreas Schwab
@ 2010-10-20 18:39   ` Ken Brown
  0 siblings, 0 replies; 9+ messages in thread
From: Ken Brown @ 2010-10-20 18:39 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: emacs-devel

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

On 10/20/2010 11:14 AM, Andreas Schwab wrote:
> Ken Brown<kbrown@cornell.edu>  writes:
>
>> The macro EMACS_GET_TTY_PGRP defined in src/systty.h uses either
>> tcgetpgrp or TIOCGPGRP to get the PGID of a terminal's foreground
>> process group.  But src/process.c defines and uses its own
>> emacs_get_tty_pgrp that only works on systems that have TIOCGPGRP.  Is
>> there a good reason for this?
>
> Is "historical accident" a good reason? :-)

Sure.

It turned out that emacs_get_tty_pgrp has different arguments than its 
uppercase cousin, so I didn't get rid of it.  But I used the macro 
inside the function instead and got rid of all ifdefs involving 
TIOCGPGRP.  Does the attached patch look OK?

Ken

[-- Attachment #2: tty.patch --]
[-- Type: text/plain, Size: 1782 bytes --]

=== modified file 'src/process.c'
--- src/process.c	2010-09-30 04:28:34 +0000
+++ src/process.c	2010-10-20 17:32:57 +0000
@@ -6009,23 +6009,21 @@
 {
   int gid = -1;
 
-#ifdef TIOCGPGRP
-  if (ioctl (p->infd, TIOCGPGRP, &gid) == -1 && ! NILP (p->tty_name))
+  if (EMACS_GET_TTY_PGRP (p->infd, &gid) <= 0 && ! NILP (p->tty_name))
     {
       int fd;
-      /* Some OS:es (Solaris 8/9) does not allow TIOCGPGRP from the
-	 master side.  Try the slave side.  */
+      /* Some OS:es (Solaris 8/9) do not allow TIOCGPGRP/tcgetpgrp
+	 from the master side.  Try the slave side.  */
       fd = emacs_open (SDATA (p->tty_name), O_RDONLY, 0);
 
       if (fd != -1)
 	{
-	  ioctl (fd, TIOCGPGRP, &gid);
+	  EMACS_GET_TTY_PGRP (fd, &gid);
 	  emacs_close (fd);
 	}
     }
-#endif /* defined (TIOCGPGRP ) */
-
-  return gid;
+  /* On some systems EMACS_GET_TTY_PGRP can return 0 if it fails. */
+  return (gid > 0 ? gid : -1);
 }
 
 DEFUN ("process-running-child-p", Fprocess_running_child_p,
@@ -6206,7 +6204,7 @@
 	 handle the signal.  */
 #endif /* defined (SIGNALS_VIA_CHARACTERS) */
 
-#ifdef TIOCGPGRP
+#ifdef EMACS_HAVE_TTY_PGRP
       /* Get the current pgrp using the tty itself, if we have that.
 	 Otherwise, use the pty to get the pgrp.
 	 On pfa systems, saka@pfu.fujitsu.co.JP writes:
@@ -6227,11 +6225,11 @@
 	 Or perhaps this is vestigial.  */
       if (gid == -1)
 	no_pgrp = 1;
-#else  /* ! defined (TIOCGPGRP ) */
+#else  /* ! defined (EMACS_HAVE_TTY_PGRP) */
       /* Can't select pgrps on this system, so we know that
 	 the child itself heads the pgrp.  */
       gid = p->pid;
-#endif /* ! defined (TIOCGPGRP ) */
+#endif /* ! defined (EMACS_HAVE_TTY_PGRP) */
 
       /* If current_group is lambda, and the shell owns the terminal,
 	 don't send any signal.  */


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

* Re: EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
  2010-10-20 14:22 EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp Ken Brown
  2010-10-20 15:14 ` Andreas Schwab
@ 2010-10-20 18:59 ` Dan Nicolaescu
  2010-10-20 20:01   ` Ken Brown
  1 sibling, 1 reply; 9+ messages in thread
From: Dan Nicolaescu @ 2010-10-20 18:59 UTC (permalink / raw)
  To: Ken Brown; +Cc: emacs-devel

Ken Brown <kbrown@cornell.edu> writes:

> The macro EMACS_GET_TTY_PGRP defined in src/systty.h uses either
> tcgetpgrp or TIOCGPGRP to get the PGID of a terminal's foreground

It does not:

#ifndef DOS_NT
#define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp ((fd)))
#define EMACS_SET_TTY_PGRP(fd, pgid) (tcsetpgrp ((fd), *(pgid)))
#endif /* not DOS_NT */

also, I have a patch to remove this, it's only used in two places, so
it's not very useful as an abstraction.


> process group.  But src/process.c defines and uses its own
> emacs_get_tty_pgrp that only works on systems that have TIOCGPGRP.  Is
> there a good reason for this?  If not, I would like to try to prepare
> a patch to change process.c to use the macro instead.  This would
> simplify the code and would also extend some of the functionality in
> process.c to systems that have tcgetpgrp but not TIOCGPGRP.
>
> Ken



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

* Re: EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
  2010-10-20 18:59 ` Dan Nicolaescu
@ 2010-10-20 20:01   ` Ken Brown
  2010-10-20 20:21     ` Eli Zaretskii
  2010-10-20 20:28     ` Dan Nicolaescu
  0 siblings, 2 replies; 9+ messages in thread
From: Ken Brown @ 2010-10-20 20:01 UTC (permalink / raw)
  To: Dan Nicolaescu; +Cc: emacs-devel

On 10/20/2010 2:59 PM, Dan Nicolaescu wrote:
> Ken Brown<kbrown@cornell.edu>  writes:
>
>> The macro EMACS_GET_TTY_PGRP defined in src/systty.h uses either
>> tcgetpgrp or TIOCGPGRP to get the PGID of a terminal's foreground
>
> It does not:
>
> #ifndef DOS_NT
> #define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp ((fd)))
> #define EMACS_SET_TTY_PGRP(fd, pgid) (tcsetpgrp ((fd), *(pgid)))
> #endif /* not DOS_NT */
>
> also, I have a patch to remove this, it's only used in two places, so
> it's not very useful as an abstraction.

Oops.  I looked at the emacs-23 branch but not the trunk.  Sorry for the 
confusion.

But then I still think emacs_get_tty_pgrp in process.c should be changed 
so that it works on systems that have tcgetpgrp but not TIOCGPGRP.  How 
would you recommend handling this?  Is it necessary to use conditional 
code as in the emacs-23 definition of EMACS_GET_TTY_PGRP, or is it safe 
to just always use tcgetpgrp as in the trunk's version of 
EMACS_GET_TTY_PGRP?

Ken



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

* Re: EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
  2010-10-20 20:01   ` Ken Brown
@ 2010-10-20 20:21     ` Eli Zaretskii
  2010-10-20 20:28     ` Dan Nicolaescu
  1 sibling, 0 replies; 9+ messages in thread
From: Eli Zaretskii @ 2010-10-20 20:21 UTC (permalink / raw)
  To: Ken Brown; +Cc: dann, emacs-devel

> Date: Wed, 20 Oct 2010 16:01:42 -0400
> From: Ken Brown <kbrown@cornell.edu>
> Cc: emacs-devel <emacs-devel@gnu.org>
> 
> But then I still think emacs_get_tty_pgrp in process.c should be changed 
> so that it works on systems that have tcgetpgrp but not TIOCGPGRP.  How 
> would you recommend handling this?  Is it necessary to use conditional 
> code as in the emacs-23 definition of EMACS_GET_TTY_PGRP, or is it safe 
> to just always use tcgetpgrp as in the trunk's version of 
> EMACS_GET_TTY_PGRP?

I would suggest to use TIOCGPGRP (inside emacs_get_tty_pgrp) if it's
available, because at least on some systems it allows to access file
descriptors of processes other than the current one, while tcgetpgrp
does not.

Please note that emacs_get_tty_pgrp is used elsewhere in process.c,
and also make sure that it does what it does today on systems (w32)
which have neither TIOCGPGRP nor tcgetpgrp.



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

* Re: EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
  2010-10-20 20:01   ` Ken Brown
  2010-10-20 20:21     ` Eli Zaretskii
@ 2010-10-20 20:28     ` Dan Nicolaescu
  2010-10-20 21:28       ` Ken Brown
  2010-10-20 21:36       ` Andreas Schwab
  1 sibling, 2 replies; 9+ messages in thread
From: Dan Nicolaescu @ 2010-10-20 20:28 UTC (permalink / raw)
  To: Ken Brown; +Cc: emacs-devel

Ken Brown <kbrown@cornell.edu> writes:

> On 10/20/2010 2:59 PM, Dan Nicolaescu wrote:
>> Ken Brown<kbrown@cornell.edu>  writes:
>>
>>> The macro EMACS_GET_TTY_PGRP defined in src/systty.h uses either
>>> tcgetpgrp or TIOCGPGRP to get the PGID of a terminal's foreground
>>
>> It does not:
>>
>> #ifndef DOS_NT
>> #define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp ((fd)))
>> #define EMACS_SET_TTY_PGRP(fd, pgid) (tcsetpgrp ((fd), *(pgid)))
>> #endif /* not DOS_NT */
>>
>> also, I have a patch to remove this, it's only used in two places, so
>> it's not very useful as an abstraction.
>
> Oops.  I looked at the emacs-23 branch but not the trunk.  Sorry for
> the confusion.
>
> But then I still think emacs_get_tty_pgrp in process.c should be
> changed so that it works on systems that have tcgetpgrp but not
> TIOCGPGRP.  How would you recommend handling this?  Is it necessary to
> use conditional code as in the emacs-23 definition of
> EMACS_GET_TTY_PGRP, or is it safe to just always use tcgetpgrp as in
> the trunk's version of EMACS_GET_TTY_PGRP?

It think your question compounds two issues.

EMACS_GET/SET_TTY_PGRP should die, they are not useful as abstractions anymore.

The comment in emacs_get_tty_pgrp looks scary, it does not look
obvious that the code in the function can be replaced with tcgetpgrp.
Maybe it can, but, IMHO, it needs testing on a few platforms.



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

* Re: EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
  2010-10-20 20:28     ` Dan Nicolaescu
@ 2010-10-20 21:28       ` Ken Brown
  2010-10-20 21:36       ` Andreas Schwab
  1 sibling, 0 replies; 9+ messages in thread
From: Ken Brown @ 2010-10-20 21:28 UTC (permalink / raw)
  To: Dan Nicolaescu; +Cc: Eli Zaretskii, emacs-devel

On 10/20/2010 4:28 PM, Dan Nicolaescu wrote:
> Ken Brown<kbrown@cornell.edu>  writes:
>
>> On 10/20/2010 2:59 PM, Dan Nicolaescu wrote:
>>> Ken Brown<kbrown@cornell.edu>   writes:
>>>
>>>> The macro EMACS_GET_TTY_PGRP defined in src/systty.h uses either
>>>> tcgetpgrp or TIOCGPGRP to get the PGID of a terminal's foreground
>>>
>>> It does not:
>>>
>>> #ifndef DOS_NT
>>> #define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp ((fd)))
>>> #define EMACS_SET_TTY_PGRP(fd, pgid) (tcsetpgrp ((fd), *(pgid)))
>>> #endif /* not DOS_NT */
>>>
>>> also, I have a patch to remove this, it's only used in two places, so
>>> it's not very useful as an abstraction.
>>
>> Oops.  I looked at the emacs-23 branch but not the trunk.  Sorry for
>> the confusion.
>>
>> But then I still think emacs_get_tty_pgrp in process.c should be
>> changed so that it works on systems that have tcgetpgrp but not
>> TIOCGPGRP.  How would you recommend handling this?  Is it necessary to
>> use conditional code as in the emacs-23 definition of
>> EMACS_GET_TTY_PGRP, or is it safe to just always use tcgetpgrp as in
>> the trunk's version of EMACS_GET_TTY_PGRP?
>
> It think your question compounds two issues.
>
> EMACS_GET/SET_TTY_PGRP should die, they are not useful as abstractions anymore.
>
> The comment in emacs_get_tty_pgrp looks scary, it does not look
> obvious that the code in the function can be replaced with tcgetpgrp.
> Maybe it can, but, IMHO, it needs testing on a few platforms.

I think I'm just going to let this drop.  I had thought I could simplify 
the code, but it looks like it would just get more complicated, and it's 
not worth the trouble.



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

* Re: EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp
  2010-10-20 20:28     ` Dan Nicolaescu
  2010-10-20 21:28       ` Ken Brown
@ 2010-10-20 21:36       ` Andreas Schwab
  1 sibling, 0 replies; 9+ messages in thread
From: Andreas Schwab @ 2010-10-20 21:36 UTC (permalink / raw)
  To: Dan Nicolaescu; +Cc: Ken Brown, emacs-devel

Dan Nicolaescu <dann@gnu.org> writes:

> The comment in emacs_get_tty_pgrp looks scary, it does not look
> obvious that the code in the function can be replaced with tcgetpgrp.
> Maybe it can, but, IMHO, it needs testing on a few platforms.

In all Unix systems that define both they should be identical
(ie. tcgetpgrp just calls the TIOCGPGRP ioctl).

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."



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

end of thread, other threads:[~2010-10-20 21:36 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-20 14:22 EMACS_GET_TTY_PGRP vs. emacs_get_tty_pgrp Ken Brown
2010-10-20 15:14 ` Andreas Schwab
2010-10-20 18:39   ` Ken Brown
2010-10-20 18:59 ` Dan Nicolaescu
2010-10-20 20:01   ` Ken Brown
2010-10-20 20:21     ` Eli Zaretskii
2010-10-20 20:28     ` Dan Nicolaescu
2010-10-20 21:28       ` Ken Brown
2010-10-20 21:36       ` 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).