diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2012-11-04 19:18:32 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2012-11-04 19:18:32 -0800 |
commit | dd0333b6155c9c3aabdac9418c005e2e5b4796e7 (patch) | |
tree | 6239cffc67b6a7b0e8eb594c22ed92a4cd28b2fc /src | |
parent | 8148369cfba2c982a87fb4eb72d024e26e193a03 (diff) | |
download | emacs-dd0333b6155c9c3aabdac9418c005e2e5b4796e7.tar.gz |
Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid.
This removes code that has been obsolete since around 1990.
* admin/CPP-DEFINES (HAVE_SETPGID, HAVE_SETSID, SETPGRP_RELEASES_CTTY):
Remove; obsolete.
* configure.ac (setpgid, setsid): Assume their existence.
(AC_FUNC_GETPGRP, SETPGRP_RELEASES_CTTY): Remove; obsolete.
* src/callproc.c (Fcall_process):
* src/emacs.c (main):
* src/process.c (create_process):
* src/term.c (dissociate_if_controlling_tty):
Assume setsid exists.
* src/callproc.c (child_setup): Assume setpgid exists and behaves as
per POSIX.1-1988 or later.
* src/conf_post.h (setpgid) [!HAVE_SETPGID]: Remove.
* src/emacs.c (shut_down_emacs):
* src/sysdep.c (sys_suspend, init_foreground_group):
Assume getpgrp behaves as per POSIX.1-1998 or later.
* src/msdos.c (setpgrp): Remove.
(tcgetpgrp, setpgid, setsid): New functions.
* src/systty.h (EMACS_GETPGRP): Remove. All callers now use getpgrp.
* src/term.c (no_controlling_tty): Remove; unused.
* src/w32proc.c (setpgrp): Remove.
(setsid, tcgetpgrp): New functions.
Fixes: debbugs:12800
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 20 | ||||
-rw-r--r-- | src/callproc.c | 10 | ||||
-rw-r--r-- | src/conf_post.h | 8 | ||||
-rw-r--r-- | src/emacs.c | 4 | ||||
-rw-r--r-- | src/msdos.c | 4 | ||||
-rw-r--r-- | src/process.c | 18 | ||||
-rw-r--r-- | src/sysdep.c | 4 | ||||
-rw-r--r-- | src/systty.h | 10 | ||||
-rw-r--r-- | src/term.c | 35 | ||||
-rw-r--r-- | src/w32proc.c | 14 |
10 files changed, 41 insertions, 86 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 29efd9f181c..6c515271594 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,25 @@ 2012-11-05 Paul Eggert <eggert@cs.ucla.edu> + Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid (Bug#12800). + 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. + (tcgetpgrp, setpgid, setsid): New functions. + * systty.h (EMACS_GETPGRP): Remove. All callers now use getpgrp. + * term.c (no_controlling_tty): Remove; unused. + * w32proc.c (setpgrp): Remove. + (setsid, tcgetpgrp): New functions. + Simplify by assuming __fpending. * dispnew.c: Include <fpending.h>, not <stdio_ext.h>. (update_frame_1): Use __fpending, not PENDING_OUTPUT_COUNT. diff --git a/src/callproc.c b/src/callproc.c index c236f22fc86..c7bbe36e605 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -612,11 +612,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) 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 @@ child_setup (int in, int out, int err, char **new_argv, bool set_pgrp, 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 diff --git a/src/conf_post.h b/src/conf_post.h index da3c3bd58b0..66390ddf103 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -121,14 +121,6 @@ You lose; /* Emacs for DOS must be compiled with DJGPP */ #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 diff --git a/src/emacs.c b/src/emacs.c index 061c4b4b131..f12713b9628 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1101,9 +1101,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem 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 @@ shut_down_emacs (int sig, Lisp_Object stuff) /* 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) { diff --git a/src/msdos.c b/src/msdos.c index 79f0be48892..dd05a8b2c5d 100644 --- a/src/msdos.c +++ b/src/msdos.c @@ -3927,8 +3927,10 @@ croak (char *badfunc) /* * A few unimplemented functions that we silently ignore. */ -int setpgrp (void) {return 0; } +pid_t tcgetpgrp (int fd) { 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 diff --git a/src/process.c b/src/process.c index 3c0e53f7784..16600f94ce4 100644 --- a/src/process.c +++ b/src/process.c @@ -1739,7 +1739,6 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) /* 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 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) 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 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) 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) diff --git a/src/sysdep.c b/src/sysdep.c index 63eac5d9e09..aa9d0f38c3c 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -452,7 +452,7 @@ sys_suspend (void) #if defined (SIGTSTP) && !defined (MSDOS) { - pid_t pgrp = EMACS_GETPGRP (0); + pid_t pgrp = getpgrp (); EMACS_KILLPG (pgrp, SIGTSTP); } @@ -709,7 +709,7 @@ static pid_t inherited_pgroup; void init_foreground_group (void) { - pid_t pgrp = EMACS_GETPGRP (0); + pid_t pgrp = getpgrp (); inherited_pgroup = getpid () == pgrp ? 0 : pgrp; } diff --git a/src/systty.h b/src/systty.h index 0611511d901..80bcaedf740 100644 --- a/src/systty.h +++ b/src/systty.h @@ -52,16 +52,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #endif /* not CDEL */ #endif /* not _POSIX_VDISABLE */ -/* 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 diff --git a/src/term.c b/src/term.c index ffc559469e6..578c701858f 100644 --- a/src/term.c +++ b/src/term.c @@ -133,10 +133,6 @@ enum no_color_bit 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 @@ set_tty_hooks (struct terminal *terminal) 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 diff --git a/src/w32proc.c b/src/w32proc.c index adef7651b8c..f35a2da537c 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -230,14 +230,14 @@ sigismember (const sigset_t *set, int signo) return (*set & (1U << signo)) != 0; } -int -setpgrp (int pid, int gid) +pid_t +getpgrp (void) { - return 0; + return getpid (); } pid_t -getpgrp (void) +tcgetpgrp (int fd) { return getpid (); } @@ -248,6 +248,12 @@ setpgid (pid_t pid, pid_t pgid) return 0; } +pid_t +setsid (void) +{ + return getpid (); +} + /* Emulations of interval timers. Limitations: only ITIMER_REAL and ITIMER_PROF are supported. |