cdrtools/include/schily/wait.h

284 lines
6.3 KiB
C
Raw Permalink Normal View History

2025-06-15 04:19:58 +08:00
/* @(#)wait.h 1.26 16/04/02 Copyright 1995-2016 J. Schilling */
/*
* Definitions to deal with various kinds of wait flavour
*
* Copyright (c) 1995-2016 J. Schilling
*/
/*
* 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.
*
* See the file CDDL.Schily.txt in this distribution for details.
* A copy of the CDDL is also available via the Internet at
* http://www.opensource.org/licenses/cddl1.txt
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file CDDL.Schily.txt from this distribution.
*/
#ifndef _SCHILY_WAIT_H
#define _SCHILY_WAIT_H
#ifndef _SCHILY_MCONFIG_H
#include <schily/mconfig.h>
#endif
/*
* Needed for SysVr4
*/
#ifndef _SCHILY_TYPES_H
#include <schily/types.h>
#endif
#if defined(HAVE_WAIT_H)
# ifndef _INCL_WAIT_H
# include <wait.h>
# define _INCL_WAIT_H
# endif
#else
/*
* K&R Compiler doesn't like #elif
*/
# if defined(HAVE_SYS_WAIT_H) /* POSIX.1 compl. sys/wait.h */
# undef HAVE_UNION_WAIT /* POSIX.1 doesn't use U_W */
# ifndef _INCL_SYS_WAIT_H
# include <sys/wait.h>
# define _INCL_SYS_WAIT_H
# endif
# else
# if defined(HAVE_UNION_WAIT) /* Pure BSD U_W / sys/wait.h */
# ifndef _INCL_SYS_WAIT_H
# include <sys/wait.h>
# define _INCL_SYS_WAIT_H
# endif
# endif
# endif
#endif
#ifdef JOS
# ifndef _INCL_SYS_EXIT_H
# include <sys/exit.h>
# define _INCL_SYS_EXIT_H
# endif
#endif
#if defined(__EMX__) || defined(__DJGPP__)
# ifndef _INCL_PROCESS_H
# include <process.h>
# define _INCL_PROCESS_H
# endif
#endif
#if !defined(HAVE_TYPE_SIGINFO_T) && defined(HAVE_SIGINFO_T)
#ifndef _SCHILY_SIGNAL_H
#include <schily/signal.h>
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*
* waitid() idtype_t definition, define when missing or broken.
* NetBSD-5 has an idtype_t that is in conflict with POSIX.
*/
#ifndef HAVE_TYPE_IDTYPE_T
#undef HAVE_WAITID /* Can't have waitid() with broken idtype_t */
#undef P_PID
#undef P_PPID
#undef P_PGID
#undef P_SID
#undef P_CID
#undef P_UID
#undef P_GID
#undef P_ALL
#define P_PID MY_P_PID
#define P_PPID MY_P_PPID
#define P_PGID MY_P_PGID
#define P_SID MY_P_SID
#define P_CID MY_P_CID
#define P_UID MY_P_UID
#define P_GID MY_P_GID
#define P_ALL MY_P_ALL
typedef enum {
P_PID, /* A process identifier. */
P_PPID, /* A parent process identifier. */
P_PGID, /* A process group (job control group) */
/* identifier. */
P_SID, /* A session identifier. */
P_CID, /* A scheduling class identifier. */
P_UID, /* A user identifier. */
P_GID, /* A group identifier. */
P_ALL, /* All processes. */
} my_idtype_t;
#undef idtype_t
#define idtype_t my_idtype_t
#endif /* HAVE_TYPE_IDTYPE_T */
#ifndef WCOREFLG
#ifdef WCOREFLAG
#define WCOREFLG WCOREFLAG
#else
#define WCOREFLG 0x80
#endif
#define NO_WCOREFLG
#endif
#ifndef WSTOPFLG
#ifdef _WSTOPPED
#define WSTOPFLG _WSTOPPED
#else
#define WSTOPFLG 0x7F
#endif
#define NO_WSTOPFLG
#endif
#ifndef WCONTFLG
#define WCONTFLG 0xFFFF
#define NO_WCONTFLG
#endif
/*
* Work around a NetBSD bug that has been imported from BSD.
* There is a #define WSTOPPED _WSTOPPED that is in conflict with the
* AT&T waitid() flags definition that is part of the POSIX standard.
*/
#if defined(WSTOPPED) && defined(_WSTOPPED) && WSTOPPED == _WSTOPPED
#undef WSTOPPED
#define WSTOPPED WUNTRACED
#endif
/*
* waitid() option flags:
*/
#ifndef WCONTINUED
#define WCONTINUED 0
#define NO_WCONTINUED
#endif
#ifndef WEXITED
#define WEXITED 0
#define NO_WEXITED
#endif
#ifndef WNOHANG
#define WNOHANG 0
#define NO_WNOHANG
#endif
#ifndef WNOWAIT
#define WNOWAIT 0
#define NO_WNOWAIT
#endif
#ifndef WSTOPPED
#ifdef WUNTRACED
#define WSTOPPED WUNTRACED
#else
#define WSTOPPED 0
#endif
#define NO_WSTOPPED
#endif
#ifndef WTRAPPED
#define WTRAPPED 0
#define NO_WTRAPPED
#endif
/*
* waitid() code values, #define them when they are missing:
*/
#ifndef CLD_EXITED /* Assume all is missing then */
#define CLD_EXITED 1 /* child has exited */
#define CLD_KILLED 2 /* child was killed */
#define CLD_DUMPED 3 /* child has coredumped */
#define CLD_TRAPPED 4 /* traced child has stopped */
#define CLD_STOPPED 5 /* child has stopped on signal */
#define CLD_CONTINUED 6 /* stopped child has continued */
#define NO_CLD_EXITED
#endif /* CLD_EXITED */
#if defined(HAVE_UNION_WAIT) && defined(USE_UNION_WAIT)
# define WAIT_T union wait
# define _W_U(w) ((union wait *)&(w))
# ifndef WTERMSIG
# define WTERMSIG(status) (_W_U(status)->w_termsig)
# endif
# ifndef WCOREDUMP
# define WCOREDUMP(status) (_W_U(status)->w_coredump)
# endif
# ifndef WEXITSTATUS
# define WEXITSTATUS(status) (_W_U(status)->w_retcode)
# endif
# ifndef WSTOPSIG
# define WSTOPSIG(status) (_W_U(status)->w_stopsig)
# endif
# ifndef WIFCONTINUED
# define WIFCONTINUED(status) (0)
# endif
# ifndef WIFSTOPPED
# define WIFSTOPPED(status) (_W_U(status)->w_stopval == \
WSTOPFLG)
# endif
# ifndef WIFSIGNALED
# define WIFSIGNALED(status) (_W_U(status)->w_stopval != \
WSTOPFLG && \
_W_U(status)->w_termsig != 0)
# endif
# ifndef WIFEXITED
# define WIFEXITED(status) (_W_U(status)->w_stopval != \
WSTOPFLG && \
_W_U(status)->w_termsig == 0)
# endif
#else
# define WAIT_T int
# define _W_I(w) (*(int *)&(w))
# ifndef WTERMSIG
# define WTERMSIG(status) (_W_I(status) & 0x7F)
# endif
# ifndef WCOREDUMP
# ifdef WIFCORED /* Haiku */
# define WCOREDUMP(status) (WIFCORED(_W_I(status)))
# else
# define WCOREDUMP(status) (_W_I(status) & 0x80)
# endif
# endif
# ifndef WEXITSTATUS
# define WEXITSTATUS(status) ((_W_I(status) >> 8) & 0xFF)
# endif
# ifndef WSTOPSIG
# define WSTOPSIG(status) ((_W_I(status) >> 8) & 0xFF)
# endif
/*
* WIFSTOPPED and WIFSIGNALED match the definitions on older UNIX versions
* e.g. SunOS-4.x or HP-UX
*/
# ifndef WIFCONTINUED
# ifdef NO_WCONTINUED
# define WIFCONTINUED(status) (0)
# else
# define WIFCONTINUED(status) ((_W_I(status) & 0xFFFF) == \
WCONTFLG)
# endif
# endif
# ifndef WIFSTOPPED
# define WIFSTOPPED(status) ((_W_I(status) & 0xFF) == 0x7F)
# endif
# ifndef WIFSIGNALED
# define WIFSIGNALED(status) ((_W_I(status) & 0xFF) != 0x7F && \
WTERMSIG(status) != 0)
# endif
# ifndef WIFEXITED
# define WIFEXITED(status) ((_W_I(status) & 0xFF) == 0)
# endif
#endif
#ifdef __cplusplus
}
#endif
#endif /* _SCHILY_WAIT_H */