#include "config.h"
#include "libgfortran.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#include <errno.h>
#ifdef HAVE_INTPTR_T
# define INTPTR_T intptr_t
#else
# define INTPTR_T int
#endif
extern void signal_sub (int *, void (*)(int), int *);
iexport_proto(signal_sub);
void
signal_sub (int *number, void (*handler)(int), int *status)
{
#ifdef HAVE_SIGNAL
INTPTR_T ret;
if (status != NULL)
{
ret = (INTPTR_T) signal (*number, handler);
*status = (int) ret;
}
else
signal (*number, handler);
#else
errno = ENOSYS;
if (status != NULL)
*status = -1;
#endif
}
iexport(signal_sub);
extern void signal_sub_int (int *, int *, int *);
iexport_proto(signal_sub_int);
void
signal_sub_int (int *number, int *handler, int *status)
{
#ifdef HAVE_SIGNAL
INTPTR_T ptr = *handler, ret;
if (status != NULL)
{
ret = (INTPTR_T) signal (*number, (void (*)(int)) ptr);
*status = (int) ret;
}
else
signal (*number, (void (*)(int)) ptr);
#else
errno = ENOSYS;
if (status != NULL)
*status = -1;
#endif
}
iexport(signal_sub_int);
extern int signal_func (int *, void (*)(int));
iexport_proto(signal_func);
int
signal_func (int *number, void (*handler)(int))
{
int status;
signal_sub (number, handler, &status);
return status;
}
iexport(signal_func);
extern int signal_func_int (int *, int *);
iexport_proto(signal_func_int);
int
signal_func_int (int *number, int *handler)
{
int status;
signal_sub_int (number, handler, &status);
return status;
}
iexport(signal_func_int);
extern void alarm_sub (int *, void (*)(int), int *);
iexport_proto(alarm_sub);
void
alarm_sub (int *seconds, void (*handler)(int), int *status)
{
#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
if (status != NULL)
{
if (signal (SIGALRM, handler) == SIG_ERR)
*status = -1;
else
*status = alarm (*seconds);
}
else
{
signal (SIGALRM, handler);
alarm (*seconds);
}
#else
errno = ENOSYS;
if (status != NULL)
*status = -1;
#endif
}
iexport(alarm_sub);
extern void alarm_sub_int (int *, int *, int *);
iexport_proto(alarm_sub_int);
void
alarm_sub_int (int *seconds, int *handler, int *status)
{
#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
if (status != NULL)
{
if (signal (SIGALRM, (void (*)(int)) *handler) == SIG_ERR)
*status = -1;
else
*status = alarm (*seconds);
}
else
{
signal (SIGALRM, (void (*)(int)) *handler);
alarm (*seconds);
}
#else
errno = ENOSYS;
if (status != NULL)
*status = -1;
#endif
}
iexport(alarm_sub_int);