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.
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.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.