Home | History | Annotate | Download | only in lpadmin
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
     23 /*	  All Rights Reserved  	*/
     24 
     25 
     26 #ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.5	*/
     27 
     28 #include "signal.h"
     29 
     30 #include "lpadmin.h"
     31 
     32 static int		trapping	= -1;	/* -1 means first time */
     33 
     34 static
     35 #ifdef	SIGPOLL
     36 	void
     37 #else
     38 	int
     39 #endif
     40 			(*old_sighup)(),
     41 			(*old_sigint)(),
     42 			(*old_sigquit)(),
     43 			(*old_sigterm)();
     44 
     45 /**
     46  ** catch() - CLEAN UP AFTER SIGNAL
     47  **/
     48 
     49 static void
     50 catch (sig)
     51 {
     52 	(void)signal (SIGHUP, SIG_IGN);
     53 	(void)signal (SIGINT, SIG_IGN);
     54 	(void)signal (SIGQUIT, SIG_IGN);
     55 	(void)signal (SIGTERM, SIG_IGN);
     56 	done (1);
     57 }
     58 
     59 /**
     60  ** trap_signals() - SET SIGNALS TO BE CAUGHT FOR CLEAN EXIT
     61  **/
     62 
     63 void			trap_signals ()
     64 {
     65 	switch (trapping) {
     66 
     67 	case -1:	/* first time */
     68 
     69 #define	SETSIG(SIG) \
     70 		if (signal(SIG, SIG_IGN) != SIG_IGN) \
     71 			signal (SIG, catch);
     72 
     73 		SETSIG (SIGHUP);
     74 		SETSIG (SIGINT);
     75 		SETSIG (SIGQUIT);
     76 		SETSIG (SIGTERM);
     77 		break;
     78 
     79 	case 0:		/* currently ignoring */
     80 		signal (SIGHUP, old_sighup);
     81 		signal (SIGINT, old_sigint);
     82 		signal (SIGQUIT, old_sigquit);
     83 		signal (SIGTERM, old_sigterm);
     84 		trapping = 1;
     85 		break;
     86 
     87 	case 1:		/* already trapping */
     88 		break;
     89 
     90 	}
     91 	return;
     92 }
     93 
     94 /**
     95  ** ignore_signals() - SET SIGNALS TO BE IGNORED FOR CRITICAL SECTIONS
     96  **/
     97 
     98 void			ignore_signals ()
     99 {
    100 	switch (trapping) {
    101 
    102 	case -1:	/* first time */
    103 		trap_signals ();
    104 		/*fall through*/
    105 
    106 	case 1:		/* currently trapping */
    107 		old_sighup = signal(SIGHUP, SIG_IGN);
    108 		old_sigint = signal(SIGINT, SIG_IGN);
    109 		old_sigquit = signal(SIGQUIT, SIG_IGN);
    110 		old_sigterm = signal(SIGTERM, SIG_IGN);
    111 		trapping = 0;
    112 		break;
    113 
    114 	case 0:		/* already ignoring */
    115 		break;
    116 
    117 	}
    118 	return;
    119 }
    120