Subject: bug#13026: Assume POSIX 1003.1-1988 or later for signal.h.

From: Eli Zaretskii <[email-masked]>
Date: Thu, 29 Nov 2012 19:33:56 +0200

> Date: Wed, 28 Nov 2012 22:52:31 -0800
> From: Paul Eggert <[email-masked]>
> 
> Attached is a proposed patch to simplify Emacs by assuming
> POSIX 1003.1-1988 or later for signal.h, which I'd
> like to install soon.  This patch is relative to
> trunk bzr 111026.  Tested on Fedora 17.

This will break the Windows build in more than one way, unless
accompanied by suitable Windows-only changes.  Is this the entire
changeset, or did you omit some more changes?

Here are the problems I found:

> === modified file 'lib-src/emacsclient.c'
> --- lib-src/emacsclient.c	2012-11-21 21:06:52 +0000
> +++ lib-src/emacsclient.c	2012-11-29 06:46:35 +0000
> @@ -1801,7 +1801,6 @@
>                needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
>                exit_status = EXIT_FAILURE;
>              }
> -#ifdef SIGSTOP
>  	  else if (strprefix ("-suspend ", p))
>  	    {
>  	      /* -suspend: Suspend this terminal, i.e., stop the process. */
> @@ -1810,7 +1809,6 @@
>  	      needlf = 0;
>  	      kill (0, SIGSTOP);
>  	    }
> -#endif
>  	  else
>  	    {
>  	      /* Unknown command. */

This will break compilation of emacsclient.c, because SIGSTOP is not
defined on MS-Windows, and therefore the -suspend option cannot be
supported.  And even if we define SIGSTOP to some value, having
"-suspend" pretend to work, but do nothing is not a good idea.  (We
could emulate this option, but that would be a non-trivial change,
certainly not belonging in this changeset.)

Also, there's no 'kill' on Windows, and the emulation in w32proc.c is
only compiled into Emacs itself, not into lib-src programs.

> --- src/keyboard.c	2012-11-27 05:17:07 +0000
> +++ src/keyboard.c	2012-11-29 06:46:35 +0000
> @@ -10552,8 +10552,7 @@
>  void
>  stuff_buffered_input (Lisp_Object stuffstring)
>  {
> -#ifdef SIGTSTP  /* stuff_char is defined if SIGTSTP.  */
> -  register unsigned char *p;
> +  unsigned char *p;
>  
>    if (STRINGP (stuffstring))
>      {
> @@ -10584,7 +10583,6 @@
>      }
>  
>    input_pending = 0;
> -#endif /* SIGTSTP */
>  }

This will break suspend-emacs on MS-Windows (which does work now by
launching a sub-shell), because stuff_char, called by
stuff_buffered_input, will now signal an error.

> -#ifdef SIGTSTP			/* Support possible in later USG versions */
>  /*
> - * On systems which can suspend the current process and return to the original
> - * shell, this command causes the user to end up back at the shell.
> + * Cause the user to end up back at the shell.
>   * The "Auto-save" and "Abort" questions are not asked until
>   * the user elects to return to emacs, at which point he can save the current
>   * job and either dump core or continue.
>   */
>        sys_suspend ();
> -#else
> -      /* Perhaps should really fork an inferior shell?
> -	 But that would not provide any way to get back
> -	 to the original shell, ever.  */
> -      printf ("No support for stopping a process on this operating system;\n");
> -      printf ("you can continue or abort.\n");
> -#endif /* not SIGTSTP */
>  #ifdef MSDOS
>        /* We must remain inside the screen area when the internal terminal
>  	 is used.  Note that [Enter] is not echoed by dos.  */

This will also break Windows, because it cannot_suspend, so calling
sys_suspend for it does nothing useful (the Windows 'kill' emulation
only works on processes other than Emacs, and again SIGTSTP is not
going to suspend anything).

> @@ -5791,7 +5777,6 @@
>  
>    switch (signo)
>      {
> -#ifdef SIGCONT
>      case SIGCONT:
>        p->raw_status_new = 0;
>        pset_status (p, Qrun);
> @@ -5802,7 +5787,7 @@
>  	  redisplay_preserve_echo_area (13);
>  	}
>        break;
> -#endif /* ! defined (SIGCONT) */

This won't compile, since SIGCONT is not defined on Windows.

> @@ -5929,11 +5911,8 @@
>        pset_command (p, Qnil);
>        return process;
>      }
> -#ifdef SIGCONT
> -    process_send_signal (process, SIGCONT, current_group, 0);
> -#else
> -    error ("No SIGCONT support");
> -#endif
> +
> +  process_send_signal (process, SIGCONT, current_group, 0);
>    return process;
>  }

Likewise.

> @@ -5994,28 +5973,18 @@
>  
>        if (0)
>  	;
> -#ifdef SIGUSR1
>        parse_signal ("usr1", SIGUSR1);
> -#endif
> -#ifdef SIGUSR2
>        parse_signal ("usr2", SIGUSR2);
> -#endif

Likewise: SIGUSR1 and SIGUSR2 are not defined.

> -#ifdef SIGSTOP
>        parse_signal ("stop", SIGSTOP);
> -#endif
> -#ifdef SIGTSTP
>        parse_signal ("tstp", SIGTSTP);
> -#endif
> -#ifdef SIGCONT
>        parse_signal ("cont", SIGCONT);
> -#endif
> -#ifdef SIGCHLD
>        parse_signal ("chld", SIGCHLD);
> -#endif
> -#ifdef SIGTTIN
>        parse_signal ("ttin", SIGTTIN);
> -#endif
> -#ifdef SIGTTOU
>        parse_signal ("ttou", SIGTTOU);
> -#endif

And the same for all these, except SIGCHLD.

> --- src/sysdep.c	2012-11-27 03:10:32 +0000
> +++ src/sysdep.c	2012-11-29 06:46:35 +0000
> @@ -213,8 +213,6 @@
>  }
>  
>  
> -#ifdef SIGTSTP
> -
>  /* Arrange for character C to be read as the next input from
>     the terminal.
>     XXX What if we have multiple ttys?
> @@ -233,8 +231,6 @@
>    error ("Cannot stuff terminal input characters in this version of Unix");
>  #endif /* no TIOCSTI */
>  }
> -
> -#endif /* SIGTSTP */

See above: this will now signal an error on Windows.

> @@ -428,20 +424,15 @@
>  void
>  sys_suspend (void)
>  {
> -#if defined (SIGTSTP) && !defined (MSDOS)
> -
> -  {
> -    pid_t pgrp = getpgrp ();
> -    EMACS_KILLPG (pgrp, SIGTSTP);
> -  }
> -
> -#else /* No SIGTSTP */
> +#ifndef MSDOS
> +  kill (0, SIGTSTP);
> +#else
>  /* On a system where suspending is not implemented,
>     instead fork a subshell and let it talk directly to the terminal
>     while we wait.  */
>    sys_subshell ();
>  
> -#endif /* no SIGTSTP */
> +#endif
>  }

Windows should also call sys_subshell here.

> @@ -702,14 +693,12 @@
>  static void
>  tcsetpgrp_without_stopping (int fd, pid_t pgid)
>  {
> -#ifdef SIGTTOU
>    signal_handler_t handler;
>    block_input ();
>    handler = signal (SIGTTOU, SIG_IGN);
>    tcsetpgrp (fd, pgid);
>    signal (SIGTTOU, handler);
>    unblock_input ();
> -#endif
>  }

This won't compile because SIGTTOU is not defined.  Also, there's no
tcsetpgrp on Windows, so this won't link unless we provide an
emulation.

> -# ifdef SIGCONT
>        sys_siglist[SIGCONT] = "Continued";
> -# endif

Won't compile.

> -# ifdef SIGSTOP
>        sys_siglist[SIGSTOP] = "Stopped (signal)";
> -# endif

Likewise.

> -# ifdef SIGTSTP
>        sys_siglist[SIGTSTP] = "Stopped (user)";
> -# endif
> -# ifdef SIGTTIN
>        sys_siglist[SIGTTIN] = "Stopped (tty input)";
> -# endif
> -# ifdef SIGTTOU
>        sys_siglist[SIGTTOU] = "Stopped (tty output)";
> -# endif

Likewise.

> -# ifdef SIGUSR1
>        sys_siglist[SIGUSR1] = "User defined signal 1";
> -# endif
> -# ifdef SIGUSR2
>        sys_siglist[SIGUSR2] = "User defined signal 2";
> -# endif

Likewise.

Please also note that NSIG is 23 on Windows, so the sys_siglist array
cannot be much larger than it already is (I think most of the 23 slots
are already used up).

> @@ -1861,12 +1819,8 @@
>        sigaction (SIGFPE, &action, 0);
>      }
>  
> -#ifdef SIGUSR1
>    add_user_signal (SIGUSR1, "sigusr1");
> -#endif
> -#ifdef SIGUSR2
>    add_user_signal (SIGUSR2, "sigusr2");
> -#endif

Won't compile.