Blame clients/mwm/WmSignal.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * Motif Release 1.2
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: WmSignal.c /main/6 1996/10/17 16:20:07 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * (c) Copyright 1987, 1988, 1989, 1990 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Included Files:
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmGlobal.h" /* This should be the first include */
Packit b099d7
#include <sys/types.h>
Packit b099d7
#include <sys/wait.h>
Packit b099d7
#include <signal.h>
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * include extern functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmFeedback.h"
Packit b099d7
#include "WmFunction.h"
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function Declarations:
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmSignal.h" 
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Global Variables:
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  AbortWmSignalHandler ()
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function is called on receipt of a fatal signal. We reset
Packit b099d7
 *  the keyboard focus to pointer root before aborting.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void
Packit b099d7
AbortWmSignalHandler (int sig)
Packit b099d7
{
Packit b099d7
    struct sigaction sa;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set input focus back to pointer root
Packit b099d7
     */
Packit b099d7
    XSetInputFocus(DISPLAY, PointerRoot, RevertToPointerRoot, CurrentTime);
Packit b099d7
    XSync (DISPLAY, False);
Packit b099d7
    XCloseDisplay (DISPLAY);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Invoke the default handler
Packit b099d7
     */
Packit b099d7
    (void) sigemptyset(&sa.sa_mask);
Packit b099d7
    sa.sa_flags = 0;
Packit b099d7
    sa.sa_handler = SIG_DFL;
Packit b099d7
    (void) sigaction (sig, &sa, (struct sigaction *) 0);
Packit b099d7
Packit b099d7
    kill (getpid(), sig);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION AbortSignalHandler */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  RestoreDefaultSignalHandlers ()
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the signal handlers for the window manager.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void
Packit b099d7
RestoreDefaultSignalHandlers (void)
Packit b099d7
{
Packit b099d7
    struct sigaction sa;
Packit b099d7
    struct sigaction osa;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Restore default action for signals we're interested in.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    (void) sigemptyset(&sa.sa_mask);
Packit b099d7
    sa.sa_flags = 0;
Packit b099d7
    sa.sa_handler = SIG_DFL;
Packit b099d7
Packit b099d7
    if ((sigaction (SIGINT, (struct sigaction *) 0, &osa) != 0) ||
Packit b099d7
	(osa.sa_handler != SIG_IGN))
Packit b099d7
    {
Packit b099d7
	(void) sigaction (SIGINT, &sa, (struct sigaction *) 0);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((sigaction (SIGHUP, (struct sigaction *) 0, &osa) != 0) ||
Packit b099d7
	(osa.sa_handler != SIG_IGN))
Packit b099d7
    {
Packit b099d7
	(void) sigaction (SIGHUP, &sa, (struct sigaction *) 0);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    (void) sigaction (SIGQUIT, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGTERM, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGPIPE, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGCHLD, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGILL, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGFPE, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGBUS, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGSEGV, &sa, (struct sigaction *) 0);
Packit b099d7
#ifdef SIGSYS
Packit b099d7
    (void) sigaction (SIGSYS, &sa, (struct sigaction *) 0);
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetupWmSignalHandlers ()
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the signal handlers for the window manager.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetupWmSignalHandlers (int dummy)
Packit b099d7
{
Packit b099d7
    void (*signalHandler) ();
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
    struct sigaction 	sa;
Packit b099d7
    struct sigaction 	osa;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Catch software signals that we ask the user about
Packit b099d7
     * before quitting.
Packit b099d7
     */
Packit b099d7
    (void) sigemptyset(&sa.sa_mask);
Packit b099d7
    sa.sa_flags = 0;
Packit b099d7
    sa.sa_handler = QuitWmSignalHandler;
Packit b099d7
Packit b099d7
    if ((sigaction (SIGINT, (struct sigaction *) 0, &osa) != 0) ||
Packit b099d7
	(osa.sa_handler != SIG_IGN))
Packit b099d7
    {
Packit b099d7
	(void) sigaction (SIGINT, &sa, (struct sigaction *) 0);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((sigaction (SIGHUP, (struct sigaction *) 0, &osa) != 0) ||
Packit b099d7
	(osa.sa_handler != SIG_IGN))
Packit b099d7
    {
Packit b099d7
	(void) sigaction (SIGHUP, &sa, (struct sigaction *) 0);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    (void) sigaction (SIGQUIT, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGTERM, &sa, (struct sigaction *) 0);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Ignore child death
Packit b099d7
     */
Packit b099d7
Packit b099d7
#ifdef SA_NOCLDWAIT
Packit b099d7
    sa.sa_flags = SA_NOCLDWAIT;  /* Don't create zombies */
Packit b099d7
#else
Packit b099d7
    sa.sa_flags = 0;
Packit b099d7
#endif
Packit b099d7
    sa.sa_handler = SIG_IGN;
Packit b099d7
    (void) sigaction (SIGCHLD, &sa, (struct sigaction *) 0);
Packit b099d7
    sa.sa_flags = 0;
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     * Catch other fatal signals so we can reset the 
Packit b099d7
     * keyboard focus to pointer root before aborting
Packit b099d7
     */
Packit b099d7
    sa.sa_handler = AbortWmSignalHandler;
Packit b099d7
Packit b099d7
    (void) sigaction (SIGILL, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGFPE, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGBUS, &sa, (struct sigaction *) 0);
Packit b099d7
    (void) sigaction (SIGSEGV, &sa, (struct sigaction *) 0);
Packit b099d7
#ifdef SIGSYS
Packit b099d7
    (void) sigaction (SIGSYS, &sa, (struct sigaction *) 0);
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#else /* not WSM - original mwm code*/
Packit b099d7
Packit b099d7
    signalHandler = (void (*)())signal (SIGINT, SIG_IGN);
Packit b099d7
    if (signalHandler != (void (*)())SIG_IGN)
Packit b099d7
    {
Packit b099d7
	signal (SIGINT, QuitWmSignalHandler);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    signalHandler = (void (*)())signal (SIGHUP, SIG_IGN);
Packit b099d7
    if (signalHandler != (void (*)())SIG_IGN)
Packit b099d7
    {
Packit b099d7
	signal (SIGHUP, QuitWmSignalHandler);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    signal (SIGQUIT, QuitWmSignalHandler);
Packit b099d7
Packit b099d7
    signal (SIGTERM, QuitWmSignalHandler);
Packit b099d7
Packit b099d7
    signal (SIGCHLD, ChildProcSignalHandler);
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetupWmSignalHandlers */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  QuitWmSignalHandler ()
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function is called on receipt of a signal that is to terminate the
Packit b099d7
 *  window manager.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void QuitWmSignalHandler (int dummy)
Packit b099d7
{
Packit b099d7
    if (wmGD.showFeedback & WM_SHOW_FB_KILL)
Packit b099d7
    {
Packit b099d7
	ConfirmAction (ACTIVE_PSD, QUIT_MWM_ACTION);
Packit b099d7
	XFlush(DISPLAY);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	Do_Quit_Mwm(False);
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION QuitWmSignalHandler */
Packit b099d7
Packit b099d7
Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ChildProcSignalHandler ()
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function is called on receipt of a signal that the child of the 
Packit b099d7
 *  window manager has terminated.
Packit b099d7
 *  This child signal handler is primarily used to wait() for child
Packit b099d7
 *  processes that were inherited from the user's .xsession if the last
Packit b099d7
 *  command in the .xsession is a "exec mwm".  These inherited child
Packit b099d7
 *  processes were not spawned the WmFunction.c:F_Exec() routine and
Packit b099d7
 *  therefore would not be reaped by the wait() in that routine until
Packit b099d7
 *  a menu item using F_Exec() was invoked by the user.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void ChildProcSignalHandler (int dummy)
Packit b099d7
{
Packit b099d7
   pid_t pid;
Packit b099d7
   int status;
Packit b099d7
   void (*intStat) ();
Packit b099d7
   void (*quitStat) ();
Packit b099d7
   
Packit b099d7
   intStat = (void (*)())signal (SIGINT, SIG_IGN);
Packit b099d7
   quitStat = (void (*)())signal (SIGQUIT, SIG_IGN);
Packit b099d7
Packit b099d7
   pid = wait(&status);
Packit b099d7
   signal(SIGCHLD, ChildProcSignalHandler); 
Packit b099d7
Packit b099d7
   signal (SIGINT, intStat);
Packit b099d7
   signal (SIGQUIT, quitStat);
Packit b099d7
}