From dd0333b6155c9c3aabdac9418c005e2e5b4796e7 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 4 Nov 2012 19:18:32 -0800 Subject: [PATCH] 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 --- ChangeLog | 4 ++++ admin/CPP-DEFINES | 3 --- admin/ChangeLog | 4 ++++ configure.ac | 8 ++------ src/ChangeLog | 20 ++++++++++++++++++++ src/callproc.c | 10 +--------- src/conf_post.h | 8 -------- src/emacs.c | 4 +--- src/msdos.c | 4 +++- src/process.c | 18 ++---------------- src/sysdep.c | 4 ++-- src/systty.h | 10 ---------- src/term.c | 35 ++--------------------------------- src/w32proc.c | 14 ++++++++++---- 14 files changed, 51 insertions(+), 95 deletions(-) diff --git a/ChangeLog b/ChangeLog index 83026bc506..e8bff20d56 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2012-11-05 Paul Eggert + Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid (Bug#12800). + * configure.ac (setpgid, setsid): Assume their existence. + (AC_FUNC_GETPGRP, SETPGRP_RELEASES_CTTY): Remove; obsolete. + Simplify by assuming __fpending. Now that Emacs is using the gnulib fpending module, there's no need for Emacs to have a separate implementation. diff --git a/admin/CPP-DEFINES b/admin/CPP-DEFINES index fb217fc22e..0a4c14cb95 100644 --- a/admin/CPP-DEFINES +++ b/admin/CPP-DEFINES @@ -298,9 +298,7 @@ HAVE_SENDTO HAVE_SEQPACKET HAVE_SETITIMER HAVE_SETLOCALE -HAVE_SETPGID HAVE_SETRLIMIT -HAVE_SETSID HAVE_SHARED_GAME_DIR HAVE_SHUTDOWN HAVE_SIGNED_${GLTYPE} @@ -432,7 +430,6 @@ PTY_OPEN PTY_TTY_NAME_SPRINTF PURESIZE RUN_TIME_REMAP -SETPGRP_RELEASES_CTTY SETUP_SLAVE_PTY SIGALRM SIGCHLD diff --git a/admin/ChangeLog b/admin/ChangeLog index c48faadab1..496e1c1bb6 100644 --- a/admin/ChangeLog +++ b/admin/ChangeLog @@ -1,5 +1,9 @@ 2012-11-05 Paul Eggert + Assume at least POSIX.1-1988 for getpgrp, setpgid, setsid (Bug#12800). + * CPP-DEFINES (HAVE_SETPGID, HAVE_SETSID, SETPGRP_RELEASES_CTTY): + Remove; obsolete. + Simplify by assuming __fpending. * CPP-DEFINES (PENDING_OUTPUT_COUNT): Remove. diff --git a/configure.ac b/configure.ac index 9a562a37a8..9146c66909 100644 --- a/configure.ac +++ b/configure.ac @@ -2871,9 +2871,9 @@ AC_SUBST(BLESSMAIL_TARGET) 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 \ strsignal setitimer \ sendto recvfrom getsockname getpeername getifaddrs freeifaddrs \ gai_strerror mkstemp getline getdelim fsync sync \ @@ -2916,8 +2916,6 @@ AC_CHECK_HEADERS_ONCE(sys/un.h) AC_FUNC_FSEEKO -AC_FUNC_GETPGRP - # UNIX98 PTYs. AC_CHECK_FUNCS(grantpt) @@ -3964,8 +3962,6 @@ case $opsys in 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) diff --git a/src/ChangeLog b/src/ChangeLog index 29efd9f181..6c51527159 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,25 @@ 2012-11-05 Paul Eggert + 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 , not . (update_frame_1): Use __fpending, not PENDING_OUTPUT_COUNT. diff --git a/src/callproc.c b/src/callproc.c index c236f22fc8..c7bbe36e60 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 da3c3bd58b..66390ddf10 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 061c4b4b13..f12713b962 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 79f0be4889..dd05a8b2c5 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 3c0e53f778..16600f94ce 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 63eac5d9e0..aa9d0f38c3 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 0611511d90..80bcaedf74 100644 --- a/src/systty.h +++ b/src/systty.h @@ -52,16 +52,6 @@ along with GNU Emacs. If not, see . */ #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 ffc559469e..578c701858 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 adef7651b8..f35a2da537 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. -- 2.20.1