summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/signal.h
diff options
context:
space:
mode:
authorstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
committerstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
commit7c478bd95313f5f23a4c958a745db2134aa03244 (patch)
treec871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/uts/common/sys/signal.h
downloadillumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz
OpenSolaris Launch
Diffstat (limited to 'usr/src/uts/common/sys/signal.h')
-rw-r--r--usr/src/uts/common/sys/signal.h343
1 files changed, 343 insertions, 0 deletions
diff --git a/usr/src/uts/common/sys/signal.h b/usr/src/uts/common/sys/signal.h
new file mode 100644
index 0000000000..50885d1fd5
--- /dev/null
+++ b/usr/src/uts/common/sys/signal.h
@@ -0,0 +1,343 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#ifndef _SYS_SIGNAL_H
+#define _SYS_SIGNAL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/feature_tests.h>
+#include <sys/iso/signal_iso.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(__EXTENSIONS__) || defined(_KERNEL) || !defined(_STRICT_STDC) || \
+ defined(__XOPEN_OR_POSIX)
+
+#if defined(__EXTENSIONS__) || defined(_KERNEL) || \
+ (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
+ (_POSIX_C_SOURCE > 2) || defined(_XPG4_2)
+/*
+ * We need <sys/siginfo.h> for the declaration of siginfo_t.
+ */
+#include <sys/siginfo.h>
+#endif
+
+/* Duplicated in <sys/ucontext.h> as a result of XPG4v2 requirements */
+#ifndef _SIGSET_T
+#define _SIGSET_T
+typedef struct { /* signal set type */
+ unsigned int __sigbits[4];
+} sigset_t;
+
+#if defined(_SYSCALL32)
+
+/* Kernel view of the ILP32 user sigset_t structure */
+
+typedef struct {
+ uint32_t __sigbits[4];
+} sigset32_t;
+
+#endif /* _SYSCALL32 */
+
+#endif /* _SIGSET_T */
+
+typedef struct {
+ unsigned int __sigbits[2];
+} k_sigset_t;
+
+/*
+ * The signal handler routine can have either one or three arguments.
+ * Existing C code has used either form so not specifing the arguments
+ * neatly finesses the problem. C++ doesn't accept this. To C++
+ * "(*sa_handler)()" indicates a routine with no arguments (ANSI C would
+ * specify this as "(*sa_handler)(void)"). One or the other form must be
+ * used for C++ and the only logical choice is "(*sa_handler)(int)" to allow
+ * the SIG_* defines to work. "(*sa_sigaction)(int, siginfo_t *, void *)"
+ * can be used for the three argument form.
+ */
+
+/*
+ * Note: storage overlap by sa_handler and sa_sigaction
+ */
+struct sigaction {
+ int sa_flags;
+ union {
+#ifdef __cplusplus
+ void (*_handler)(int);
+#else
+ void (*_handler)();
+#endif
+#if defined(__EXTENSIONS__) || defined(_KERNEL) || \
+ (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
+ (_POSIX_C_SOURCE > 2) || defined(_XPG4_2)
+ void (*_sigaction)(int, siginfo_t *, void *);
+#endif
+ } _funcptr;
+ sigset_t sa_mask;
+#ifndef _LP64
+ int sa_resv[2];
+#endif
+};
+#define sa_handler _funcptr._handler
+#define sa_sigaction _funcptr._sigaction
+
+#if defined(_SYSCALL32)
+
+/* Kernel view of the ILP32 user sigaction structure */
+
+struct sigaction32 {
+ int32_t sa_flags;
+ union {
+ caddr32_t _handler;
+ caddr32_t _sigaction;
+ } _funcptr;
+ sigset32_t sa_mask;
+ int32_t sa_resv[2];
+};
+
+#endif /* _SYSCALL32 */
+
+/* this is only valid for SIGCLD */
+#define SA_NOCLDSTOP 0x00020000 /* don't send job control SIGCLD's */
+#endif
+
+#if defined(__EXTENSIONS__) || defined(_KERNEL) || \
+ (!defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE)) || \
+ defined(_XPG4_2)
+
+ /* non-conformant ANSI compilation */
+
+/* definitions for the sa_flags field */
+#define SA_ONSTACK 0x00000001
+#define SA_RESETHAND 0x00000002
+#define SA_RESTART 0x00000004
+#endif
+
+#if defined(__EXTENSIONS__) || defined(_KERNEL) || \
+ (!defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE)) || \
+ (_POSIX_C_SOURCE > 2) || defined(_XPG4_2)
+#define SA_SIGINFO 0x00000008
+#endif
+
+#if defined(__EXTENSIONS__) || defined(_KERNEL) || \
+ (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
+ defined(_XPG4_2)
+#define SA_NODEFER 0x00000010
+
+/* this is only valid for SIGCLD */
+#define SA_NOCLDWAIT 0x00010000 /* don't save zombie children */
+
+#if defined(__EXTENSIONS__) || !defined(_XPG4_2)
+/*
+ * use of these symbols by applications is injurious
+ * to binary compatibility
+ */
+#define NSIG 49 /* valid signals range from 1 to NSIG-1 */
+#define MAXSIG 48 /* size of u_signal[], NSIG-1 <= MAXSIG */
+#endif /* defined(__EXTENSIONS__) || !defined(_XPG4_2) */
+
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+
+#define SS_ONSTACK 0x00000001
+#define SS_DISABLE 0x00000002
+
+/* Duplicated in <sys/ucontext.h> as a result of XPG4v2 requirements. */
+#ifndef _STACK_T
+#define _STACK_T
+#if defined(__EXTENSIONS__) || !defined(_XPG4_2)
+typedef struct sigaltstack {
+#else
+typedef struct {
+#endif
+ void *ss_sp;
+ size_t ss_size;
+ int ss_flags;
+} stack_t;
+
+#if defined(_SYSCALL32)
+
+/* Kernel view of the ILP32 user sigaltstack structure */
+
+typedef struct sigaltstack32 {
+ caddr32_t ss_sp;
+ size32_t ss_size;
+ int32_t ss_flags;
+} stack32_t;
+
+#endif /* _SYSCALL32 */
+
+#endif /* _STACK_T */
+
+#endif /* defined(__EXTENSIONS__) || defined(_KERNEL) ... */
+
+#if defined(__EXTENSIONS__) || defined(_KERNEL) || \
+ (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
+
+/* signotify id used only by librt for mq_notify()/aio_notify() */
+typedef struct signotify_id { /* signotify id struct */
+ pid_t sn_pid; /* pid of proc to be notified */
+ int sn_index; /* index in preallocated pool */
+ int sn_pad; /* reserved */
+} signotify_id_t;
+
+#if defined(_SYSCALL32)
+
+/* Kernel view of the ILP32 user signotify_id structure */
+
+typedef struct signotify32_id {
+ pid32_t sn_pid; /* pid of proc to be notified */
+ int32_t sn_index; /* index in preallocated pool */
+ int32_t sn_pad; /* reserved */
+} signotify32_id_t;
+
+#endif /* _SYSCALL32 */
+
+/* Command codes for sig_notify call */
+
+#define SN_PROC 1 /* queue signotify for process */
+#define SN_CANCEL 2 /* cancel the queued signotify */
+#define SN_SEND 3 /* send the notified signal */
+
+#endif /* defined(__EXTENSIONS__) || defined(_KERNEL) ... */
+
+/* Added as per XPG4v2 */
+#if defined(__EXTENSIONS__) || defined(_KERNEL) || \
+ (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
+ defined(_XPG4_2)
+struct sigstack {
+ void *ss_sp;
+ int ss_onstack;
+};
+#endif /* defined(__EXTENSIONS__) || defined(_KERNEL) ... */
+
+/*
+ * For definition of ucontext_t; must follow struct definition
+ * for sigset_t
+ */
+#if defined(_XPG4_2)
+#include <sys/ucontext.h>
+#endif /* defined(_XPG4_2) */
+
+#ifdef _KERNEL
+#include <sys/t_lock.h>
+
+extern k_sigset_t
+ nullsmask, /* a null signal mask */
+ fillset, /* valid signals, guaranteed contiguous */
+ holdvfork, /* held while doing vfork */
+ cantmask, /* cannot be caught or ignored */
+ cantreset, /* cannot be reset after catching */
+ ignoredefault, /* ignored by default */
+ stopdefault, /* stop by default */
+ coredefault; /* dumps core by default */
+
+#define sigmask(n) ((unsigned int)1 << (((n) - 1) & (32 - 1)))
+#define sigword(n) (((unsigned int)((n) - 1))>>5)
+
+#if ((MAXSIG > 32) && (MAXSIG <= 64))
+#define FILLSET0 0xffffffffu
+#define FILLSET1 ((1u << (MAXSIG - 32)) - 1)
+#else
+#error "fix me: MAXSIG out of bounds"
+#endif
+
+#define CANTMASK0 (sigmask(SIGKILL)|sigmask(SIGSTOP))
+#define CANTMASK1 0
+
+#define sigemptyset(s) (*(s) = nullsmask)
+#define sigfillset(s) (*(s) = fillset)
+#define sigaddset(s, n) ((s)->__sigbits[sigword(n)] |= sigmask(n))
+#define sigdelset(s, n) ((s)->__sigbits[sigword(n)] &= ~sigmask(n))
+#define sigismember(s, n) (sigmask(n) & (s)->__sigbits[sigword(n)])
+#define sigisempty(s) (!(((s)->__sigbits[0]) | ((s)->__sigbits[1])))
+#define sigutok(us, ks) \
+ ((ks)->__sigbits[0] = (us)->__sigbits[0] & (FILLSET0 & ~CANTMASK0), \
+ (ks)->__sigbits[1] = (us)->__sigbits[1] & (FILLSET1 & ~CANTMASK1))
+#define sigktou(ks, us) ((us)->__sigbits[0] = (ks)->__sigbits[0], \
+ (us)->__sigbits[1] = (ks)->__sigbits[1], \
+ (us)->__sigbits[2] = 0, \
+ (us)->__sigbits[3] = 0)
+typedef struct {
+ int sig; /* signal no. */
+ int perm; /* flag for EPERM */
+ int checkperm; /* check perm or not */
+ int sicode; /* has siginfo.si_code */
+ union sigval value; /* user specified value */
+} sigsend_t;
+
+typedef struct {
+ sigqueue_t sn_sigq; /* sigq struct for notification */
+ u_longlong_t sn_snid; /* unique id for notification */
+} signotifyq_t;
+
+
+typedef struct sigqhdr { /* sigqueue pool header */
+ sigqueue_t *sqb_free; /* free sigq struct list */
+ uchar_t sqb_count; /* sigq free count */
+ uchar_t sqb_maxcount; /* sigq max free count */
+ ushort_t sqb_size; /* size of header+free structs */
+ uchar_t sqb_pexited; /* process has exited */
+ uchar_t sqb_sent; /* number of sigq sent */
+ kmutex_t sqb_lock; /* lock for sigq pool */
+} sigqhdr_t;
+
+#define _SIGQUEUE_MAX 32
+#define _SIGNOTIFY_MAX 32
+
+extern void setsigact(int, void (*)(int), k_sigset_t, int);
+extern void sigorset(k_sigset_t *, k_sigset_t *);
+extern void sigandset(k_sigset_t *, k_sigset_t *);
+extern void sigdiffset(k_sigset_t *, k_sigset_t *);
+extern void sigintr(k_sigset_t *, int);
+extern void sigunintr(k_sigset_t *);
+extern void sigreplace(k_sigset_t *, k_sigset_t *);
+
+extern int kill(pid_t, int);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SIGNAL_H */