diff options
Diffstat (limited to 'mdk-stage1/slang/slsignal.c')
-rw-r--r-- | mdk-stage1/slang/slsignal.c | 336 |
1 files changed, 0 insertions, 336 deletions
diff --git a/mdk-stage1/slang/slsignal.c b/mdk-stage1/slang/slsignal.c deleted file mode 100644 index 30707dea5..000000000 --- a/mdk-stage1/slang/slsignal.c +++ /dev/null @@ -1,336 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include <signal.h> - -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#ifdef HAVE_SYS_WAIT_H -# include <sys/wait.h> -#endif - -#include <errno.h> - -#include "slang.h" -#include "_slang.h" - -/* Do not trust these environments */ -#if defined(__CYGWIN32__) || defined(__MINGW32__) || defined(AMIGA) -# ifdef SLANG_POSIX_SIGNALS -# undef SLANG_POSIX_SIGNALS -# endif -#endif - -/* This function will cause system calls to be restarted after signal if possible */ -SLSig_Fun_Type *SLsignal (int sig, SLSig_Fun_Type *f) -{ -#if defined(SLANG_POSIX_SIGNALS) - struct sigaction old_sa, new_sa; - -# ifdef SIGALRM - /* We want system calls to be interrupted by SIGALRM. */ - if (sig == SIGALRM) return SLsignal_intr (sig, f); -# endif - - sigemptyset (&new_sa.sa_mask); - new_sa.sa_handler = f; - - new_sa.sa_flags = 0; -# ifdef SA_RESTART - new_sa.sa_flags |= SA_RESTART; -# endif - - if (-1 == sigaction (sig, &new_sa, &old_sa)) - return (SLSig_Fun_Type *) SIG_ERR; - - return old_sa.sa_handler; -#else - /* Not POSIX. */ - return signal (sig, f); -#endif -} - -/* This function will NOT cause system calls to be restarted after - * signal if possible - */ -SLSig_Fun_Type *SLsignal_intr (int sig, SLSig_Fun_Type *f) -{ -#ifdef SLANG_POSIX_SIGNALS - struct sigaction old_sa, new_sa; - - sigemptyset (&new_sa.sa_mask); - new_sa.sa_handler = f; - - new_sa.sa_flags = 0; -# ifdef SA_INTERRUPT - new_sa.sa_flags |= SA_INTERRUPT; -# endif - - if (-1 == sigaction (sig, &new_sa, &old_sa)) - return (SLSig_Fun_Type *) SIG_ERR; - - return old_sa.sa_handler; -#else - /* Not POSIX. */ - return signal (sig, f); -#endif -} - -/* We are primarily interested in blocking signals that would cause the - * application to reset the tty. These include suspend signals and - * possibly interrupt signals. - */ -#ifdef SLANG_POSIX_SIGNALS -static sigset_t Old_Signal_Mask; -#endif - -static volatile unsigned int Blocked_Depth; - -int SLsig_block_signals (void) -{ -#ifdef SLANG_POSIX_SIGNALS - sigset_t new_mask; -#endif - - Blocked_Depth++; - if (Blocked_Depth != 1) - { - return 0; - } - -#ifdef SLANG_POSIX_SIGNALS - sigemptyset (&new_mask); -# ifdef SIGQUIT - sigaddset (&new_mask, SIGQUIT); -# endif -# ifdef SIGTSTP - sigaddset (&new_mask, SIGTSTP); -# endif -# ifdef SIGINT - sigaddset (&new_mask, SIGINT); -# endif -# ifdef SIGTTIN - sigaddset (&new_mask, SIGTTIN); -# endif -# ifdef SIGTTOU - sigaddset (&new_mask, SIGTTOU); -# endif -# ifdef SIGWINCH - sigaddset (&new_mask, SIGWINCH); -# endif - - (void) sigprocmask (SIG_BLOCK, &new_mask, &Old_Signal_Mask); - return 0; -#else - /* Not implemented. */ - return -1; -#endif -} - -int SLsig_unblock_signals (void) -{ - if (Blocked_Depth == 0) - return -1; - - Blocked_Depth--; - - if (Blocked_Depth != 0) - return 0; - -#ifdef SLANG_POSIX_SIGNALS - (void) sigprocmask (SIG_SETMASK, &Old_Signal_Mask, NULL); - return 0; -#else - return -1; -#endif -} - -#ifdef MSWINDOWS -int SLsystem (char *cmd) -{ - SLang_verror (SL_NOT_IMPLEMENTED, "system not implemented"); - return -1; -} - -#else -int SLsystem (char *cmd) -{ -#ifdef SLANG_POSIX_SIGNALS - pid_t pid; - int status; - struct sigaction ignore; -# ifdef SIGINT - struct sigaction save_intr; -# endif -# ifdef SIGQUIT - struct sigaction save_quit; -# endif -# ifdef SIGCHLD - sigset_t child_mask, save_mask; -# endif - - if (cmd == NULL) return 1; - - ignore.sa_handler = SIG_IGN; - sigemptyset (&ignore.sa_mask); - ignore.sa_flags = 0; - -# ifdef SIGINT - if (-1 == sigaction (SIGINT, &ignore, &save_intr)) - return -1; -# endif - -# ifdef SIGQUIT - if (-1 == sigaction (SIGQUIT, &ignore, &save_quit)) - { - (void) sigaction (SIGINT, &save_intr, NULL); - return -1; - } -# endif - -# ifdef SIGCHLD - sigemptyset (&child_mask); - sigaddset (&child_mask, SIGCHLD); - if (-1 == sigprocmask (SIG_BLOCK, &child_mask, &save_mask)) - { -# ifdef SIGINT - (void) sigaction (SIGINT, &save_intr, NULL); -# endif -# ifdef SIGQUIT - (void) sigaction (SIGQUIT, &save_quit, NULL); -# endif - return -1; - } -# endif - - pid = fork(); - - if (pid == -1) - status = -1; - else if (pid == 0) - { - /* Child */ -# ifdef SIGINT - (void) sigaction (SIGINT, &save_intr, NULL); -# endif -# ifdef SIGQUIT - (void) sigaction (SIGQUIT, &save_quit, NULL); -# endif -# ifdef SIGCHLD - (void) sigprocmask (SIG_SETMASK, &save_mask, NULL); -# endif - - execl ("/bin/sh", "sh", "-c", cmd, NULL); - _exit (127); - } - else - { - /* parent */ - while (-1 == waitpid (pid, &status, 0)) - { -# ifdef EINTR - if (errno == EINTR) - continue; -# endif -# ifdef ERESTARTSYS - if (errno == ERESTARTSYS) - continue; -# endif - status = -1; - break; - } - } -# ifdef SIGINT - if (-1 == sigaction (SIGINT, &save_intr, NULL)) - status = -1; -# endif -# ifdef SIGQUIT - if (-1 == sigaction (SIGQUIT, &save_quit, NULL)) - status = -1; -# endif -# ifdef SIGCHLD - if (-1 == sigprocmask (SIG_SETMASK, &save_mask, NULL)) - status = -1; -# endif - - return status; - -#else /* No POSIX Signals */ -# ifdef SIGINT - void (*sint)(int); -# endif -# ifdef SIGQUIT - void (*squit)(int); -# endif - int status; - -# ifdef SIGQUIT - squit = SLsignal (SIGQUIT, SIG_IGN); -# endif -# ifdef SIGINT - sint = SLsignal (SIGINT, SIG_IGN); -# endif - status = system (cmd); -# ifdef SIGINT - SLsignal (SIGINT, sint); -# endif -# ifdef SIGQUIT - SLsignal (SIGQUIT, squit); -# endif - return status; -#endif /* POSIX_SIGNALS */ -} -#endif - -#if 0 -#include <windows.h> -static int msw_system (char *cmd) -{ - STARTUPINFO startup_info; - PROCESS_INFORMATION process_info; - int status; - - if (cmd == NULL) return -1; - - memset ((char *) &startup_info, 0, sizeof (STARTUPINFO)); - startup_info.cb = sizeof(STARTUPINFO); - startup_info.dwFlags = STARTF_USESHOWWINDOW; - startup_info.wShowWindow = SW_SHOWDEFAULT; - - if (FALSE == CreateProcess (NULL, - cmd, - NULL, - NULL, - FALSE, - NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE, - NULL, - NULL, - &startup_info, - &process_info)) - { - SLang_verror (0, "%s: CreateProcess failed.", cmd); - return -1; - } - - status = -1; - - if (0xFFFFFFFFUL != WaitForSingleObject (process_info.hProcess, INFINITE)) - { - DWORD exit_code; - - if (TRUE == GetExitCodeProcess (process_info.hProcess, &exit_code)) - status = (int) exit_code; - } - - CloseHandle (process_info.hThread); - CloseHandle (process_info.hProcess); - - return status; -} -#endif |