#ifndef CYGONCE_LIBC_SIGNAL_H
#define CYGONCE_LIBC_SIGNAL_H
//========================================================================
//
//      signal.h
//
//      Definitions for ISO C and POSIX 1003.1 signals
//
//========================================================================
//####COPYRIGHTBEGIN####
//
// -------------------------------------------
// The contents of this file are subject to the Cygnus eCos Public License
// Version 1.0 (the "License"); you may not use this file except in
// compliance with the License.  You may obtain a copy of the License at
// http://sourceware.cygnus.com/ecos
// 
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
// License for the specific language governing rights and limitations under
// the License.
// 
// The Original Code is eCos - Embedded Cygnus Operating System, released
// September 30, 1998.
// 
// The Initial Developer of the Original Code is Cygnus.  Portions created
// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.
// -------------------------------------------
//
//####COPYRIGHTEND####
//========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s):     jlarmour
// Contributors:  jlarmour
// Date:          1999-02-03
// Purpose:       Provides description of interface to ISO C and POSIX 1003.1
//                signal functionality
// Description:   
// Usage:         #include <signal.h>
//
//####DESCRIPTIONEND####
//
//========================================================================

// CONFIGURATION

#include <pkgconf/libc.h>          // C library configuration

#ifdef CYGPKG_LIBC_SIGNALS

// INCLUDES

#include <cyg/infra/cyg_type.h>    // Common type definitions and support

#ifdef CYGSEM_LIBC_SIGNALS_POSIX
# include <unistd.h>               // _POSIX_* macros
#endif


// TYPE DEFINITIONS

// Integral type that can be accessed atomically - from ISO C 7.7
typedef cyg_atomic sig_atomic_t;

// Type of signal handler functions
typedef void (*__sighandler_t)(int);

#ifdef CYGSEM_LIBC_SIGNALS_POSIX

// Signal sets from POSIX 1003.1 chap 3.3.3 and other chaps
typedef cyg_uint32 sigset_t;

// POSIX 1003.1 chap 3.3.1.2
union sigval {
    int   sival_int;    // used when application-defined value is an int
    void *sival_ptr;    // used when application-defined value is a pointer
};

// Signal information structure passed to a __siginfoaction_t style handler
// from POSIX 1003.1 chap 3.3.1.3
typedef struct {
    int si_signo;           // signal number
    int si_code;            // cause of signal
    union sigval si_value;  // signal value
} siginfo_t;


// Type of signal handler used if SA_SIGINFO is set in flags to sigaction
// from POSIX 1003.1 chap 3.3.1.3
typedef void (*__siginfoaction_t)(int __signo, siginfo_t *__info,
                                  void *__context);

// struct sigaction describes the action to be taken when we get a signal
// From POSIX 1003.1 chap. 3.3.4.2
struct sigaction {
    sigset_t sa_mask;                   // Additional signals to be blocked
    int sa_flags;                       // Special flags
    union {
        __sighandler_t sa_handler;      // signal handler
        __siginfoaction_t sa_sigaction; // Function to call instead of
                                        // sa_handler if SA_SIGINFO is
                                        // set in sa_flags
    } __sigactionhandler;
#define sa_handler   __sigactionhandler.sa_handler
#define sa_sigaction __sigactionhandler.sa_sigaction
};


#endif // ifdef CYGSEM_LIBC_SIGNALS_POSIX


// CONSTANTS

// Signal handlers for use with signal(). We avoid 0 because in an embedded
// system this may be e.g. start of ROM and thus a possible function pointer
// for reset!

#define SIG_DFL ((__sighandler_t) 1)      // Default action
#define SIG_IGN ((__sighandler_t) 2)      // Ignore action
#define SIG_ERR ((__sighandler_t)-1)      // Error return

// NB. We do not need to restrict SIG* definitions (e.g. by eliminating
// POSIX signals) when using strict ISO C (permitted in 7.7)

#define SIGNULL   0    // Reserved signal - do not use (POSIX 3.3.1.1)
#define SIGHUP    1    // Hangup on controlling terminal (POSIX)
#define SIGINT    2    // Interactive attention (ISO C)
#define SIGQUIT   3    // Interactive termination (POSIX)
#define SIGILL    4    // Illegal instruction (not reset when caught) (ISO C)
#define SIGTRAP   5    // Trace trap (not reset when caught)
#define SIGIOT    6    // IOT instruction
#define SIGABRT   6    // Abnormal termination - used by abort() (ISO C)
#define SIGEMT    7    // EMT instruction
#define SIGFPE    8    // Floating Point Exception e.g. div by 0 (ISO C)
#define SIGKILL   9    // Kill (cannot be caught or ignored) (POSIX)
#if 1 // FIXME - should be #ifdef _POSIX_MEMORY_PROTECTION?
# define SIGBUS   10   // Bus error (POSIX)
#endif
#define SIGSEGV   11   // Invalid memory reference (ISO C)
#define SIGSYS    12   // Bad argument to system call (used by anything?)
#define SIGPIPE   13   // Write on a pipe with no one to read it (POSIX)
#define SIGALRM   14   // Alarm timeout (POSIX)
#define SIGTERM   15   // Software termination request (ISO C)
#define SIGUSR1   16   // Application-defined signal 1 (POSIX)
#define SIGUSR2   17   // Application-defined signal 2 (POSIX)

#define CYGNUM_LIBC_SIGNALS 18  // Maximum signal number + 1

#ifdef _POSIX_JOB_CONTROL
# define SIGCHLD  18   // Child process terminated or stopped (POSIX)
# define SIGCONT  19   // Continue if stopped (POSIX)
# define SIGSTOP  20   // Stop (cannot be caught or ignored) (POSIX)
# define SIGTSTP  21   // Interactive stop (POSIX)
# define SIGTTIN  22   // Terminal read attempted by backgrounded
                       // process (POSIX)
# define SIGTTOU  23   // Terminal write attempted by backgrounded
                       // process (POSIX)
#undef CYGNUM_LIBC_SIGNALS
#define CYGNUM_LIBC_SIGNALS 24
#endif

// FIXME - strictly by POSIX in 3.3.1.1 we should define SIGRTMIN/SIGRTMAX
// But if so, to what value if it _isn't_ supported?!

#ifdef CYGSEM_LIBC_SIGNALS_POSIX
// sa_flag bits in struct sigaction
#define SA_NOCLDSTOP 1   // Don't generate SIGCHLD when children stop
#define SA_SIGINFO   2   // Use the __siginfoaction_t style signal
                         // handler, instead of the single argument handler
#endif // ifdef CYGSEM_LIBC_SIGNALS_POSIX


// FUNCTION PROTOTYPES

#ifdef __cplusplus
extern "C" {
#endif

//===========================================================================

// ISO C functions

//////////////////////////////
// signal() - ISO C 7.7.1   //
//////////////////////////////
//
// Installs a new signal handler for the specified signal, and returns
// the old handler
//

extern __sighandler_t
signal(int __sig, __sighandler_t __handler);

///////////////////////////
// raise() - ISO C 7.7.2 //
///////////////////////////
//
// Raises the signal, which will cause the current signal handler for
// that signal to be called
//

extern int
raise(int __sig);


#ifdef __cplusplus
} // extern "C"
#endif 

#include <signal.inl>

#endif // ifdef CYGPKG_LIBC_SIGNALS

#endif // CYGONCE_LIBC_SIGNAL_H multiple inclusion protection

// EOF signal.h
