1*3d729aecSJerry Jelinek /* 2*3d729aecSJerry Jelinek * This file and its contents are supplied under the terms of the 3*3d729aecSJerry Jelinek * Common Development and Distribution License ("CDDL"), version 1.0. 4*3d729aecSJerry Jelinek * You may only use this file in accordance with the terms of version 5*3d729aecSJerry Jelinek * 1.0 of the CDDL. 6*3d729aecSJerry Jelinek * 7*3d729aecSJerry Jelinek * A full copy of the text of the CDDL should have accompanied this 8*3d729aecSJerry Jelinek * source. A copy of the CDDL is also available via the Internet at 9*3d729aecSJerry Jelinek * http://www.illumos.org/license/CDDL. 10*3d729aecSJerry Jelinek */ 11*3d729aecSJerry Jelinek 12*3d729aecSJerry Jelinek /* 13*3d729aecSJerry Jelinek * Copyright 2015 Joyent, Inc. 14*3d729aecSJerry Jelinek */ 15*3d729aecSJerry Jelinek 16*3d729aecSJerry Jelinek /* 17*3d729aecSJerry Jelinek * Header file to support the signalfd facility. Note that this facility 18*3d729aecSJerry Jelinek * is designed to be binary compatible with the Linux signalfd facility, modulo 19*3d729aecSJerry Jelinek * the signals themselves; values for constants here should therefore exactly 20*3d729aecSJerry Jelinek * match those found in Linux, and this facility shouldn't be extended 21*3d729aecSJerry Jelinek * independently of Linux. 22*3d729aecSJerry Jelinek */ 23*3d729aecSJerry Jelinek 24*3d729aecSJerry Jelinek #ifndef _SYS_SIGNALFD_H 25*3d729aecSJerry Jelinek #define _SYS_SIGNALFD_H 26*3d729aecSJerry Jelinek 27*3d729aecSJerry Jelinek #include <sys/types.h> 28*3d729aecSJerry Jelinek 29*3d729aecSJerry Jelinek #ifdef __cplusplus 30*3d729aecSJerry Jelinek extern "C" { 31*3d729aecSJerry Jelinek #endif 32*3d729aecSJerry Jelinek 33*3d729aecSJerry Jelinek /* 34*3d729aecSJerry Jelinek * To assure binary compatibility with Linux, these values are fixed at their 35*3d729aecSJerry Jelinek * Linux equivalents, not their native ones. 36*3d729aecSJerry Jelinek */ 37*3d729aecSJerry Jelinek #define SFD_CLOEXEC 02000000 /* LX_O_CLOEXEC */ 38*3d729aecSJerry Jelinek #define SFD_NONBLOCK 04000 /* LX_O_NONBLOCK */ 39*3d729aecSJerry Jelinek 40*3d729aecSJerry Jelinek /* 41*3d729aecSJerry Jelinek * These ioctl values are specific to the native implementation; applications 42*3d729aecSJerry Jelinek * shouldn't be using them directly, and they should therefore be safe to 43*3d729aecSJerry Jelinek * change without breaking apps. 44*3d729aecSJerry Jelinek */ 45*3d729aecSJerry Jelinek #define SIGNALFDIOC (('s' << 24) | ('f' << 16) | ('d' << 8)) 46*3d729aecSJerry Jelinek #define SIGNALFDIOC_MASK (SIGNALFDIOC | 1) /* set mask */ 47*3d729aecSJerry Jelinek 48*3d729aecSJerry Jelinek typedef struct signalfd_siginfo { 49*3d729aecSJerry Jelinek uint32_t ssi_signo; /* signal from signal.h */ 50*3d729aecSJerry Jelinek int32_t ssi_errno; /* error from errno.h */ 51*3d729aecSJerry Jelinek int32_t ssi_code; /* signal code */ 52*3d729aecSJerry Jelinek uint32_t ssi_pid; /* PID of sender */ 53*3d729aecSJerry Jelinek uint32_t ssi_uid; /* real UID of sender */ 54*3d729aecSJerry Jelinek int32_t ssi_fd; /* File descriptor (SIGIO) */ 55*3d729aecSJerry Jelinek uint32_t ssi_tid; /* unused */ 56*3d729aecSJerry Jelinek uint32_t ssi_band; /* band event (SIGIO) */ 57*3d729aecSJerry Jelinek uint32_t ssi_overrun; /* unused */ 58*3d729aecSJerry Jelinek uint32_t ssi_trapno; /* trap number that caused signal */ 59*3d729aecSJerry Jelinek int32_t ssi_status; /* exit status or signal (SIGCHLD) */ 60*3d729aecSJerry Jelinek int32_t ssi_int; /* unused */ 61*3d729aecSJerry Jelinek uint64_t ssi_ptr; /* unused */ 62*3d729aecSJerry Jelinek uint64_t ssi_utime; /* user CPU time consumed (SIGCHLD) */ 63*3d729aecSJerry Jelinek uint64_t ssi_stime; /* system CPU time consumed (SIGCHLD) */ 64*3d729aecSJerry Jelinek uint64_t ssi_addr; /* address that generated signal */ 65*3d729aecSJerry Jelinek uint8_t ssi_pad[48]; /* Pad size to 128 bytes to allow for */ 66*3d729aecSJerry Jelinek /* additional fields in the future. */ 67*3d729aecSJerry Jelinek } signalfd_siginfo_t; 68*3d729aecSJerry Jelinek 69*3d729aecSJerry Jelinek #ifndef _KERNEL 70*3d729aecSJerry Jelinek 71*3d729aecSJerry Jelinek extern int signalfd(int, const sigset_t *, int); 72*3d729aecSJerry Jelinek 73*3d729aecSJerry Jelinek #else 74*3d729aecSJerry Jelinek 75*3d729aecSJerry Jelinek #define SIGNALFDMNRN_SIGNALFD 0 76*3d729aecSJerry Jelinek #define SIGNALFDMNRN_CLONE 1 77*3d729aecSJerry Jelinek 78*3d729aecSJerry Jelinek typedef struct sigfd_wake_list { 79*3d729aecSJerry Jelinek list_node_t sigfd_wl_lst; 80*3d729aecSJerry Jelinek void *sigfd_wl_state; 81*3d729aecSJerry Jelinek } sigfd_wake_list_t; 82*3d729aecSJerry Jelinek 83*3d729aecSJerry Jelinek /* 84*3d729aecSJerry Jelinek * This holds the proc_t state for a process which is using signalfd. 85*3d729aecSJerry Jelinek */ 86*3d729aecSJerry Jelinek typedef struct sigfd_proc_state { 87*3d729aecSJerry Jelinek void (*sigfd_pollwake_cb)(void *, int); 88*3d729aecSJerry Jelinek list_t sigfd_list; 89*3d729aecSJerry Jelinek } sigfd_proc_state_t; 90*3d729aecSJerry Jelinek 91*3d729aecSJerry Jelinek 92*3d729aecSJerry Jelinek extern void (*sigfd_exit_helper)(); 93*3d729aecSJerry Jelinek 94*3d729aecSJerry Jelinek #endif /* _KERNEL */ 95*3d729aecSJerry Jelinek 96*3d729aecSJerry Jelinek #ifdef __cplusplus 97*3d729aecSJerry Jelinek } 98*3d729aecSJerry Jelinek #endif 99*3d729aecSJerry Jelinek 100*3d729aecSJerry Jelinek #endif /* _SYS_SIGNALFD_H */ 101