GNU bug report logs - #12800
Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid.

Previous Next

Package: emacs;

Reported by: Paul Eggert <eggert <at> cs.ucla.edu>

Date: Sun, 4 Nov 2012 19:30:01 UTC

Severity: normal

Tags: patch

Done: Paul Eggert <eggert <at> cs.ucla.edu>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 12800 in the body.
You can then email your comments to 12800 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#12800; Package emacs. (Sun, 04 Nov 2012 19:30:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Paul Eggert <eggert <at> cs.ucla.edu>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Sun, 04 Nov 2012 19:30:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: bug-gnu-emacs <at> gnu.org
Subject: Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid.
Date: Sun, 04 Nov 2012 11:25:55 -0800
Tags: patch

This is a proposed code-cleanup patch that arose from a discussion
with Eli Zaretskii.  Tested on GNU/Linux and on Solaris.

=== modified file 'ChangeLog'
--- ChangeLog	2012-11-03 20:48:03 +0000
+++ ChangeLog	2012-11-04 19:22:04 +0000
@@ -1,3 +1,9 @@
+2012-11-04  Paul Eggert  <eggert <at> cs.ucla.edu>
+
+	Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid.
+	* configure.ac (setpgid, setsid): Assume their existence.
+	(AC_FUNC_GETPGRP, SETPGRP_RELEASES_CTTY): Remove; obsolete.
+
 2012-11-03  Eli Zaretskii  <eliz <at> gnu.org>
 
 	* lib/makefile.w32-in (GNULIBOBJS): Add $(BLD)/fpending.$(O) and

=== modified file 'admin/CPP-DEFINES'
--- admin/CPP-DEFINES	2012-09-16 21:43:55 +0000
+++ admin/CPP-DEFINES	2012-11-04 19:22:04 +0000
@@ -298,9 +298,7 @@
 HAVE_SEQPACKET
 HAVE_SETITIMER
 HAVE_SETLOCALE
-HAVE_SETPGID
 HAVE_SETRLIMIT
-HAVE_SETSID
 HAVE_SHARED_GAME_DIR
 HAVE_SHUTDOWN
 HAVE_SIGNED_${GLTYPE}
@@ -433,7 +431,6 @@
 PTY_TTY_NAME_SPRINTF
 PURESIZE
 RUN_TIME_REMAP
-SETPGRP_RELEASES_CTTY
 SETUP_SLAVE_PTY
 SIGALRM
 SIGCHLD

=== modified file 'admin/ChangeLog'
--- admin/ChangeLog	2012-11-03 19:19:05 +0000
+++ admin/ChangeLog	2012-11-04 19:22:04 +0000
@@ -1,3 +1,9 @@
+2012-11-04  Paul Eggert  <eggert <at> cs.ucla.edu>
+
+	Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid.
+	* CPP-DEFINES (HAVE_SETPGID, HAVE_SETSID, SETPGRP_RELEASES_CTTY):
+	Remove; obsolete.
+
 2012-11-03  Glenn Morris  <rgm <at> gnu.org>
 
 	* admin.el (set-copyright): Add msdos/sed2v2.inp.

=== modified file 'configure.ac'
--- configure.ac	2012-11-02 00:48:12 +0000
+++ configure.ac	2012-11-04 19:22:04 +0000
@@ -2871,9 +2871,9 @@
 
 AC_CHECK_FUNCS(gethostname \
 closedir getrusage get_current_dir_name \
-lrand48 setsid \
+lrand48 \
 fpathconf select euidaccess getpagesize setlocale \
-utimes getrlimit setrlimit setpgid getcwd shutdown getaddrinfo \
+utimes getrlimit setrlimit getcwd shutdown getaddrinfo \
 __fpending strsignal setitimer \
 sendto recvfrom getsockname getpeername getifaddrs freeifaddrs \
 gai_strerror mkstemp getline getdelim fsync sync \
@@ -2916,8 +2916,6 @@
 
 AC_FUNC_FSEEKO
 
-AC_FUNC_GETPGRP
-
 # UNIX98 PTYs.
 AC_CHECK_FUNCS(grantpt)
 
@@ -4058,8 +4056,6 @@
   irix6-5)
     AC_DEFINE(PREFER_VSUSP, 1, [Define if process_send_signal should
       use VSUSP instead of VSWTCH.])
-    AC_DEFINE(SETPGRP_RELEASES_CTTY, 1, [Define if process.c:child_setup
-      should not call setpgrp.])
     ;;
 
   sol2-10)

=== modified file 'src/ChangeLog'
--- src/ChangeLog	2012-11-04 17:29:52 +0000
+++ src/ChangeLog	2012-11-04 19:22:04 +0000
@@ -1,5 +1,23 @@
 2012-11-04  Paul Eggert  <eggert <at> cs.ucla.edu>
 
+	Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid.
+	This removes code that has been obsolete since around 1990.
+	* callproc.c (Fcall_process):
+	* emacs.c (main):
+	* process.c (create_process):
+	* term.c (dissociate_if_controlling_tty):
+	Assume setsid exists.
+	* callproc.c (child_setup): Assume setpgid exists and behaves as
+	per POSIX.1-1988 or later.
+	* conf_post.h (setpgid) [!HAVE_SETPGID]: Remove.
+	* emacs.c (shut_down_emacs):
+	* sysdep.c (sys_suspend, init_foreground_group):
+	Assume getpgrp behaves as per POSIX.1-1998 or later.
+	* msdos.c (setpgrp): Remove.
+	(setpgid, setsid): New functions.
+	* systty.h (EMACS_GETPGRP): Remove.  All callers now use getpgrp.
+	* term.c (no_controlling_tty): Remove; unused.
+
 	Fix data-loss with --version (Bug#9574).
 	* emacs.c (close_output_streams): Use strerror, not emacs_strerror,
 	as we can't assume that emacs_strerror is initialized, and strerror

=== modified file 'src/callproc.c'
--- src/callproc.c	2012-10-31 17:27:29 +0000
+++ src/callproc.c	2012-11-04 19:22:04 +0000
@@ -612,11 +612,7 @@
 	if (fd[0] >= 0)
 	  emacs_close (fd[0]);
 
-#ifdef HAVE_SETSID
 	setsid ();
-#else
-	setpgid (0, 0);
-#endif
 
 	/* Emacs ignores SIGPIPE, but the child should not.  */
 	signal (SIGPIPE, SIG_DFL);
@@ -1286,11 +1282,7 @@
   if (err != in && err != out)
     emacs_close (err);
 
-#if defined HAVE_SETPGID || ! (defined USG && defined SETPGRP_RELEASES_CTTY)
-  setpgid (pid, pid);
-#endif
-
-  /* setpgrp_of_tty is incorrect here; it uses input_fd.  */
+  setpgid (0, 0);
   tcsetpgrp (0, pid);
 
   /* execvp does not accept an environment arg so the only way

=== modified file 'src/conf_post.h'
--- src/conf_post.h	2012-11-03 13:48:33 +0000
+++ src/conf_post.h	2012-11-04 19:22:04 +0000
@@ -121,14 +121,6 @@
 
 #define emacs_raise(sig) msdos_fatal_signal (sig)
 
-#ifndef HAVE_SETPGID
-# ifdef USG
-#  define setpgid(pid, pgid) setpgrp ()
-# else
-#  define setpgid(pid, pgid) setpgrp (pid, pgid)
-# endif
-#endif
-
 /* Define one of these for easier conditionals.  */
 #ifdef HAVE_X_WINDOWS
 /* We need a little extra space, see ../../lisp/loadup.el and the

=== modified file 'src/emacs.c'
--- src/emacs.c	2012-11-04 17:29:52 +0000
+++ src/emacs.c	2012-11-04 19:22:04 +0000
@@ -1101,9 +1101,7 @@
 	 that it is not accessible to programs started from .emacs.  */
       fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC);
 
-#ifdef HAVE_SETSID
       setsid ();
-#endif
 #else /* DOS_NT */
       fprintf (stderr, "This platform does not support the -daemon flag.\n");
       exit (1);
@@ -1915,7 +1913,7 @@
   /* If we are controlling the terminal, reset terminal modes.  */
 #ifndef DOS_NT
   {
-    pid_t pgrp = EMACS_GETPGRP (0);
+    pid_t pgrp = getpgrp ();
     pid_t tpgrp = tcgetpgrp (0);
     if ((tpgrp != -1) && tpgrp == pgrp)
       {

=== modified file 'src/msdos.c'
--- src/msdos.c	2012-11-03 13:48:33 +0000
+++ src/msdos.c	2012-11-04 19:22:04 +0000
@@ -3927,8 +3927,9 @@
 /*
  * A few unimplemented functions that we silently ignore.
  */
-int setpgrp (void) {return 0; }
+int setpgid (int pid, int pgid) { return 0; }
 int setpriority (int x, int y, int z) { return 0; }
+pid_t setsid (void) { return 0; }
 
 #if __DJGPP__ == 2 && __DJGPP_MINOR__ < 4
 ssize_t

=== modified file 'src/process.c'
--- src/process.c	2012-11-03 18:32:41 +0000
+++ src/process.c	2012-11-04 19:22:04 +0000
@@ -1739,7 +1739,6 @@
       /* Make the pty be the controlling terminal of the process.  */
 #ifdef HAVE_PTYS
       /* First, disconnect its current controlling terminal.  */
-#ifdef HAVE_SETSID
       /* We tried doing setsid only if pty_flag, but it caused
 	 process_set_signal to fail on SGI when using a pipe.  */
       setsid ();
@@ -1752,12 +1751,6 @@
 	  ioctl (xforkin, TIOCSCTTY, 0);
 #endif
 	}
-#else /* not HAVE_SETSID */
-      /* It's very important to call setpgid here and no time
-	 afterwards.  Otherwise, we lose our controlling tty which
-	 is set when we open the pty. */
-      setpgid (0, 0);
-#endif /* not HAVE_SETSID */
 #if defined (LDISC1)
       if (pty_flag && xforkin >= 0)
 	{
@@ -1790,22 +1783,15 @@
 	      ioctl (j, TIOCNOTTY, 0);
 	      emacs_close (j);
 	    }
-#ifndef USG
-	  /* In order to get a controlling terminal on some versions
-	     of BSD, it is necessary to put the process in pgrp 0
-	     before it opens the terminal.  */
-	  setpgid (0, 0);
-#endif
 	}
 #endif /* TIOCNOTTY */
 
 #if !defined (DONT_REOPEN_PTY)
 /*** There is a suggestion that this ought to be a
-     conditional on TIOCSPGRP,
-     or !(defined (HAVE_SETSID) && defined (TIOCSCTTY)).
+     conditional on TIOCSPGRP, or !defined TIOCSCTTY.
      Trying the latter gave the wrong results on Debian GNU/Linux 1.1;
      that system does seem to need this code, even though
-     both HAVE_SETSID and TIOCSCTTY are defined.  */
+     both TIOCSCTTY is defined.  */
 	/* Now close the pty (if we had it open) and reopen it.
 	   This makes the pty the controlling terminal of the subprocess.  */
       if (pty_flag)

=== modified file 'src/sysdep.c'
--- src/sysdep.c	2012-10-31 17:27:29 +0000
+++ src/sysdep.c	2012-11-04 19:22:04 +0000
@@ -452,7 +452,7 @@
 #if defined (SIGTSTP) && !defined (MSDOS)
 
   {
-    pid_t pgrp = EMACS_GETPGRP (0);
+    pid_t pgrp = getpgrp ();
     EMACS_KILLPG (pgrp, SIGTSTP);
   }
 
@@ -709,7 +709,7 @@
 void
 init_foreground_group (void)
 {
-  pid_t pgrp = EMACS_GETPGRP (0);
+  pid_t pgrp = getpgrp ();
   inherited_pgroup = getpid () == pgrp ? 0 : pgrp;
 }
 

=== modified file 'src/systty.h'
--- src/systty.h	2012-09-13 02:21:28 +0000
+++ src/systty.h	2012-11-04 19:22:04 +0000
@@ -63,16 +63,6 @@
 #endif
 
 
-/* Manipulate a terminal's current process group.  */
-
-/* EMACS_GETPGRP (arg) returns the process group of the process.  */
-
-#if defined (GETPGRP_VOID)
-#  define EMACS_GETPGRP(x) getpgrp()
-#else /* !GETPGRP_VOID */
-#  define EMACS_GETPGRP(x) getpgrp(x)
-#endif /* !GETPGRP_VOID */
-
 /* Manipulate a TTY's input/output processing parameters.  */
 
 /* struct emacs_tty is a structure used to hold the current tty

=== modified file 'src/term.c'
--- src/term.c	2012-11-03 05:59:17 +0000
+++ src/term.c	2012-11-04 19:22:04 +0000
@@ -133,10 +133,6 @@
 
 static int max_frame_cols;
 
-/* Non-zero if we have dropped our controlling tty and therefore
-   should not open a frame on stdout. */
-static int no_controlling_tty;
-
 
 
 #ifdef HAVE_GPM
@@ -2918,36 +2914,9 @@
 static void
 dissociate_if_controlling_tty (int fd)
 {
-#ifndef DOS_NT
   pid_t pgid = tcgetpgrp (fd); /* If tcgetpgrp succeeds, fd is the ctty. */
-  if (pgid != -1)
-    {
-#if defined (USG5)
-      setpgrp ();
-      no_controlling_tty = 1;
-#elif defined (CYGWIN)
-      setsid ();
-      no_controlling_tty = 1;
-#else
-#ifdef TIOCNOTTY                /* Try BSD ioctls. */
-      sigset_t blocked;
-      sigemptyset (&blocked);
-      sigaddset (&blocked, SIGTTOU);
-      pthread_sigmask (SIG_BLOCK, &blocked, 0);
-      fd = emacs_open (DEV_TTY, O_RDWR, 0);
-      if (fd != -1 && ioctl (fd, TIOCNOTTY, 0) != -1)
-        {
-          no_controlling_tty = 1;
-        }
-      if (fd != -1)
-        emacs_close (fd);
-      pthread_sigmask (SIG_UNBLOCK, &blocked, 0);
-#else
-# error "Unknown system."
-#endif  /* ! TIOCNOTTY */
-#endif  /* ! USG */
-    }
-#endif	/* !DOS_NT */
+  if (0 <= pgid)
+    setsid ();
 }
 
 /* Create a termcap display on the tty device with the given name and

=== modified file 'src/w32proc.c'
--- src/w32proc.c	2012-11-01 14:21:45 +0000
+++ src/w32proc.c	2012-11-04 19:22:04 +0000
@@ -230,12 +230,6 @@
   return (*set & (1U << signo)) != 0;
 }
 
-int
-setpgrp (int pid, int gid)
-{
-  return 0;
-}
-
 pid_t
 getpgrp (void)
 {
@@ -248,6 +242,12 @@
   return 0;
 }
 
+pid_t
+setsid (void)
+{
+  return getpid ();
+}
+
 /* Emulations of interval timers.
 
    Limitations: only ITIMER_REAL and ITIMER_PROF are supported.





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#12800; Package emacs. (Sun, 04 Nov 2012 19:53:02 GMT) Full text and rfc822 format available.

Message #8 received at 12800 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 12800 <at> debbugs.gnu.org
Subject: Re: bug#12800: Assume at least POSIX.1-1988 for getpgrp, setpgid,
	setsid.
Date: Sun, 04 Nov 2012 21:48:59 +0200
> Date: Sun, 04 Nov 2012 11:25:55 -0800
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> 
> @@ -2918,36 +2914,9 @@
>  static void
>  dissociate_if_controlling_tty (int fd)
>  {
> -#ifndef DOS_NT
>    pid_t pgid = tcgetpgrp (fd); /* If tcgetpgrp succeeds, fd is the ctty. */

The removal of the #ifndef will need a tcgetpgrp emulation for DOS_NT
platforms, I think.

Otherwise, I see no problems with this.

Thanks.




Reply sent to Paul Eggert <eggert <at> cs.ucla.edu>:
You have taken responsibility. (Mon, 05 Nov 2012 03:25:02 GMT) Full text and rfc822 format available.

Notification sent to Paul Eggert <eggert <at> cs.ucla.edu>:
bug acknowledged by developer. (Mon, 05 Nov 2012 03:25:02 GMT) Full text and rfc822 format available.

Message #13 received at 12800-done <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 12800-done <at> debbugs.gnu.org
Subject: Re: bug#12800: Assume at least POSIX.1-1988 for getpgrp, setpgid,
	setsid.
Date: Sun, 04 Nov 2012 19:21:32 -0800
On 11/04/2012 11:48 AM, Eli Zaretskii wrote:

> The removal of the #ifndef will need a tcgetpgrp emulation for DOS_NT
> platforms, I think.
> 
> Otherwise, I see no problems with this.

Thanks, I made that change, installed the patch as
trunk bzr 110801, and am marking this as done.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Mon, 03 Dec 2012 12:24:02 GMT) Full text and rfc822 format available.

This bug report was last modified 11 years and 169 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.