3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek/*
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * This file and its contents are supplied under the terms of the
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * Common Development and Distribution License ("CDDL"), version 1.0.
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * You may only use this file in accordance with the terms of version
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * 1.0 of the CDDL.
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek *
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * A full copy of the text of the CDDL should have accompanied this
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * source. A copy of the CDDL is also available via the Internet at
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * http://www.illumos.org/license/CDDL.
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek/*
abf99a006172ea5aab2246bda23f9d6d935bf1adPatrick Mooney * Copyright 2016 Joyent, Inc.
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek/*
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * Header file to support the signalfd facility. Note that this facility
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * is designed to be binary compatible with the Linux signalfd facility, modulo
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * the signals themselves; values for constants here should therefore exactly
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * match those found in Linux, and this facility shouldn't be extended
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * independently of Linux.
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#ifndef _SYS_SIGNALFD_H
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#define _SYS_SIGNALFD_H
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#include <sys/types.h>
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#ifdef __cplusplus
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinekextern "C" {
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#endif
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek/*
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * To assure binary compatibility with Linux, these values are fixed at their
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * Linux equivalents, not their native ones.
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#define SFD_CLOEXEC 02000000 /* LX_O_CLOEXEC */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#define SFD_NONBLOCK 04000 /* LX_O_NONBLOCK */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek/*
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * These ioctl values are specific to the native implementation; applications
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * shouldn't be using them directly, and they should therefore be safe to
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * change without breaking apps.
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#define SIGNALFDIOC (('s' << 24) | ('f' << 16) | ('d' << 8))
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#define SIGNALFDIOC_MASK (SIGNALFDIOC | 1) /* set mask */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinektypedef struct signalfd_siginfo {
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint32_t ssi_signo; /* signal from signal.h */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek int32_t ssi_errno; /* error from errno.h */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek int32_t ssi_code; /* signal code */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint32_t ssi_pid; /* PID of sender */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint32_t ssi_uid; /* real UID of sender */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek int32_t ssi_fd; /* File descriptor (SIGIO) */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint32_t ssi_tid; /* unused */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint32_t ssi_band; /* band event (SIGIO) */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint32_t ssi_overrun; /* unused */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint32_t ssi_trapno; /* trap number that caused signal */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek int32_t ssi_status; /* exit status or signal (SIGCHLD) */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek int32_t ssi_int; /* unused */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint64_t ssi_ptr; /* unused */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint64_t ssi_utime; /* user CPU time consumed (SIGCHLD) */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint64_t ssi_stime; /* system CPU time consumed (SIGCHLD) */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint64_t ssi_addr; /* address that generated signal */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek uint8_t ssi_pad[48]; /* Pad size to 128 bytes to allow for */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek /* additional fields in the future. */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek} signalfd_siginfo_t;
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#ifndef _KERNEL
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinekextern int signalfd(int, const sigset_t *, int);
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#else
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#define SIGNALFDMNRN_SIGNALFD 0
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#define SIGNALFDMNRN_CLONE 1
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek/*
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek * This holds the proc_t state for a process which is using signalfd.
abf99a006172ea5aab2246bda23f9d6d935bf1adPatrick Mooney * Its presence and contents are protected by p_lock.
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinektypedef struct sigfd_proc_state {
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek void (*sigfd_pollwake_cb)(void *, int);
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek list_t sigfd_list;
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek} sigfd_proc_state_t;
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinekextern void (*sigfd_exit_helper)();
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#endif /* _KERNEL */
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#ifdef __cplusplus
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek}
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#endif
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek
3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41Jerry Jelinek#endif /* _SYS_SIGNALFD_H */