]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/intrinsics/signal.c
Update copyright years.
[thirdparty/gcc.git] / libgfortran / intrinsics / signal.c
CommitLineData
247981ce 1/* Implementation of the SIGNAL and ALARM g77 intrinsics
fbd26352 2 Copyright (C) 2005-2019 Free Software Foundation, Inc.
247981ce 3 Contributed by François-Xavier Coudert <coudert@clipper.ens.fr>
4
a1aa1d30 5This file is part of the GNU Fortran runtime library (libgfortran).
247981ce 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
6bc9506f 10version 3 of the License, or (at your option) any later version.
247981ce 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
6bc9506f 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/>. */
247981ce 25
247981ce 26#include "libgfortran.h"
27
28#ifdef HAVE_UNISTD_H
29#include <unistd.h>
30#endif
31
247981ce 32#include <signal.h>
247981ce 33
16af3de2 34#ifdef HAVE_INTTYPES_H
35#include <inttypes.h>
36#endif
37
247981ce 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{
ed3634f6 47 intptr_t ret;
16af3de2 48
247981ce 49 if (status != NULL)
16af3de2 50 {
ed3634f6 51 ret = (intptr_t) signal (*number, handler);
16af3de2 52 *status = (int) ret;
53 }
247981ce 54 else
55 signal (*number, handler);
247981ce 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{
ed3634f6 67 intptr_t ptr = *handler, ret;
16af3de2 68
247981ce 69 if (status != NULL)
16af3de2 70 {
ed3634f6 71 ret = (intptr_t) signal (*number, (void (*)(int)) ptr);
16af3de2 72 *status = (int) ret;
73 }
247981ce 74 else
16af3de2 75 signal (*number, (void (*)(int)) ptr);
247981ce 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 */
40555542 110extern void alarm_sub_i4 (int *, void (*)(int), GFC_INTEGER_4 *);
111iexport_proto(alarm_sub_i4);
247981ce 112
113void
17334fdc 114alarm_sub_i4 (int * seconds __attribute__ ((unused)),
115 void (*handler)(int) __attribute__ ((unused)),
116 GFC_INTEGER_4 *status)
247981ce 117{
a1aa1d30 118#if defined (SIGALRM) && defined (HAVE_ALARM)
247981ce 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}
40555542 137iexport(alarm_sub_i4);
138
139
140extern void alarm_sub_i8 (int *, void (*)(int), GFC_INTEGER_8 *);
141iexport_proto(alarm_sub_i8);
142
143void
17334fdc 144alarm_sub_i8 (int *seconds __attribute__ ((unused)),
145 void (*handler)(int) __attribute__ ((unused)),
146 GFC_INTEGER_8 *status)
40555542 147{
a1aa1d30 148#if defined (SIGALRM) && defined (HAVE_ALARM)
40555542 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);
247981ce 168
169
170/* ALARM intrinsic with INTEGER as handler */
40555542 171extern void alarm_sub_int_i4 (int *, int *, GFC_INTEGER_4 *);
172iexport_proto(alarm_sub_int_i4);
173
174void
17334fdc 175alarm_sub_int_i4 (int *seconds __attribute__ ((unused)),
176 int *handler __attribute__ ((unused)),
177 GFC_INTEGER_4 *status)
40555542 178{
a1aa1d30 179#if defined (SIGALRM) && defined (HAVE_ALARM)
40555542 180 if (status != NULL)
181 {
ed3634f6 182 if (signal (SIGALRM, (void (*)(int)) (intptr_t) *handler) == SIG_ERR)
40555542 183 *status = -1;
184 else
185 *status = alarm (*seconds);
186 }
187 else
188 {
ed3634f6 189 signal (SIGALRM, (void (*)(int)) (intptr_t) *handler);
40555542 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);
247981ce 203
204void
17334fdc 205alarm_sub_int_i8 (int *seconds __attribute__ ((unused)),
206 int *handler __attribute__ ((unused)),
207 GFC_INTEGER_8 *status)
247981ce 208{
a1aa1d30 209#if defined (SIGALRM) && defined (HAVE_ALARM)
247981ce 210 if (status != NULL)
211 {
ed3634f6 212 if (signal (SIGALRM, (void (*)(int)) (intptr_t) *handler) == SIG_ERR)
247981ce 213 *status = -1;
214 else
215 *status = alarm (*seconds);
216 }
217 else
218 {
ed3634f6 219 signal (SIGALRM, (void (*)(int)) (intptr_t) *handler);
247981ce 220 alarm (*seconds);
221 }
222#else
223 errno = ENOSYS;
224 if (status != NULL)
225 *status = -1;
226#endif
227}
40555542 228iexport(alarm_sub_int_i8);
247981ce 229