signal.c revision 1.1.1.3
1/* Implementation of the SIGNAL and ALARM g77 intrinsics 2 Copyright (C) 2005-2022 Free Software Foundation, Inc. 3 Contributed by Fran��ois-Xavier Coudert <coudert@clipper.ens.fr> 4 5This file is part of the GNU Fortran runtime library (libgfortran). 6 7Libgfortran is free software; you can redistribute it and/or 8modify it under the terms of the GNU General Public 9License as published by the Free Software Foundation; either 10version 3 of the License, or (at your option) any later version. 11 12Libgfortran is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17Under Section 7 of GPL version 3, you are granted additional 18permissions described in the GCC Runtime Library Exception, version 193.1, as published by the Free Software Foundation. 20 21You should have received a copy of the GNU General Public License and 22a copy of the GCC Runtime Library Exception along with this program; 23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24<http://www.gnu.org/licenses/>. */ 25 26#include "libgfortran.h" 27 28#ifdef HAVE_UNISTD_H 29#include <unistd.h> 30#endif 31 32#include <signal.h> 33 34#ifdef HAVE_INTTYPES_H 35#include <inttypes.h> 36#endif 37 38#include <errno.h> 39 40/* SIGNAL subroutine with PROCEDURE as handler */ 41extern void signal_sub (int *, void (*)(int), int *); 42iexport_proto(signal_sub); 43 44void 45signal_sub (int *number, void (*handler)(int), int *status) 46{ 47 intptr_t ret; 48 49 if (status != NULL) 50 { 51 ret = (intptr_t) signal (*number, handler); 52 *status = (int) ret; 53 } 54 else 55 signal (*number, handler); 56} 57iexport(signal_sub); 58 59 60/* SIGNAL subroutine with INTEGER as handler */ 61extern void signal_sub_int (int *, int *, int *); 62iexport_proto(signal_sub_int); 63 64void 65signal_sub_int (int *number, int *handler, int *status) 66{ 67 intptr_t ptr = *handler, ret; 68 69 if (status != NULL) 70 { 71 ret = (intptr_t) signal (*number, (void (*)(int)) ptr); 72 *status = (int) ret; 73 } 74 else 75 signal (*number, (void (*)(int)) ptr); 76} 77iexport(signal_sub_int); 78 79 80/* SIGNAL function with PROCEDURE as handler */ 81extern int signal_func (int *, void (*)(int)); 82iexport_proto(signal_func); 83 84int 85signal_func (int *number, void (*handler)(int)) 86{ 87 int status; 88 signal_sub (number, handler, &status); 89 return status; 90} 91iexport(signal_func); 92 93 94/* SIGNAL function with INTEGER as handler */ 95extern int signal_func_int (int *, int *); 96iexport_proto(signal_func_int); 97 98int 99signal_func_int (int *number, int *handler) 100{ 101 int status; 102 signal_sub_int (number, handler, &status); 103 return status; 104} 105iexport(signal_func_int); 106 107 108 109/* ALARM intrinsic with PROCEDURE as handler */ 110extern void alarm_sub_i4 (int *, void (*)(int), GFC_INTEGER_4 *); 111iexport_proto(alarm_sub_i4); 112 113void 114alarm_sub_i4 (int * seconds __attribute__ ((unused)), 115 void (*handler)(int) __attribute__ ((unused)), 116 GFC_INTEGER_4 *status) 117{ 118#if defined (SIGALRM) && defined (HAVE_ALARM) 119 if (status != NULL) 120 { 121 if (signal (SIGALRM, handler) == SIG_ERR) 122 *status = -1; 123 else 124 *status = alarm (*seconds); 125 } 126 else 127 { 128 signal (SIGALRM, handler); 129 alarm (*seconds); 130 } 131#else 132 errno = ENOSYS; 133 if (status != NULL) 134 *status = -1; 135#endif 136} 137iexport(alarm_sub_i4); 138 139 140extern void alarm_sub_i8 (int *, void (*)(int), GFC_INTEGER_8 *); 141iexport_proto(alarm_sub_i8); 142 143void 144alarm_sub_i8 (int *seconds __attribute__ ((unused)), 145 void (*handler)(int) __attribute__ ((unused)), 146 GFC_INTEGER_8 *status) 147{ 148#if defined (SIGALRM) && defined (HAVE_ALARM) 149 if (status != NULL) 150 { 151 if (signal (SIGALRM, handler) == SIG_ERR) 152 *status = -1; 153 else 154 *status = alarm (*seconds); 155 } 156 else 157 { 158 signal (SIGALRM, handler); 159 alarm (*seconds); 160 } 161#else 162 errno = ENOSYS; 163 if (status != NULL) 164 *status = -1; 165#endif 166} 167iexport(alarm_sub_i8); 168 169 170/* ALARM intrinsic with INTEGER as handler */ 171extern void alarm_sub_int_i4 (int *, int *, GFC_INTEGER_4 *); 172iexport_proto(alarm_sub_int_i4); 173 174void 175alarm_sub_int_i4 (int *seconds __attribute__ ((unused)), 176 int *handler __attribute__ ((unused)), 177 GFC_INTEGER_4 *status) 178{ 179#if defined (SIGALRM) && defined (HAVE_ALARM) 180 if (status != NULL) 181 { 182 if (signal (SIGALRM, (void (*)(int)) (intptr_t) *handler) == SIG_ERR) 183 *status = -1; 184 else 185 *status = alarm (*seconds); 186 } 187 else 188 { 189 signal (SIGALRM, (void (*)(int)) (intptr_t) *handler); 190 alarm (*seconds); 191 } 192#else 193 errno = ENOSYS; 194 if (status != NULL) 195 *status = -1; 196#endif 197} 198iexport(alarm_sub_int_i4); 199 200 201extern void alarm_sub_int_i8 (int *, int *, GFC_INTEGER_8 *); 202iexport_proto(alarm_sub_int_i8); 203 204void 205alarm_sub_int_i8 (int *seconds __attribute__ ((unused)), 206 int *handler __attribute__ ((unused)), 207 GFC_INTEGER_8 *status) 208{ 209#if defined (SIGALRM) && defined (HAVE_ALARM) 210 if (status != NULL) 211 { 212 if (signal (SIGALRM, (void (*)(int)) (intptr_t) *handler) == SIG_ERR) 213 *status = -1; 214 else 215 *status = alarm (*seconds); 216 } 217 else 218 { 219 signal (SIGALRM, (void (*)(int)) (intptr_t) *handler); 220 alarm (*seconds); 221 } 222#else 223 errno = ENOSYS; 224 if (status != NULL) 225 *status = -1; 226#endif 227} 228iexport(alarm_sub_int_i8); 229 230