00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
#include <config.h>
00036
00037
#include <stdio.h>
00038
#include <stdlib.h>
00039
#include <string.h>
00040
#include <errno.h>
00041
#include <signal.h>
00042
00043
#include "avrerror.h"
00044
#include "sig.h"
00045
00046
static volatile int global_got_sigint = 0;
00047
00048
00049
00050
00051
00052
00053
static void
00054 signal_handle_sigint (
int signo)
00055 {
00056 global_got_sigint = 1;
00057 }
00058
00059
00060
00061
00062
00063
00064
00065
00066
void
00067 signal_watch_start (
int signo)
00068 {
00069
struct sigaction act, oact;
00070
00071 sigemptyset (&act.sa_mask);
00072 act.sa_flags = 0;
00073
00074
switch (signo)
00075 {
00076
case SIGINT:
00077 global_got_sigint = 0;
00078 act.sa_handler = signal_handle_sigint;
00079
break;
00080
default:
00081
avr_warning (
"Invalid signal: %d\n", signo);
00082
return;
00083 }
00084
00085
if (sigaction (signo, &act, &oact) < 0)
00086
avr_warning (
"Failed to install signal handler: sig=%d: %s\n", signo,
00087 strerror (errno));
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
void
00097 signal_watch_stop (
int signo)
00098 {
00099
struct sigaction act, oact;
00100
00101 sigemptyset (&act.sa_mask);
00102 act.sa_flags = 0;
00103 act.sa_handler = SIG_DFL;
00104
00105
signal_reset (signo);
00106
00107
if (sigaction (signo, &act, &oact) < 0)
00108
avr_warning (
"Failed to restore default signal handler: sig=%d: %s\n",
00109 signo, strerror (errno));
00110 }
00111
00112
00113
00114
00115
00116
00117
00118
int
00119 signal_has_occurred (
int signo)
00120 {
00121
int res = 0;
00122
00123
switch (signo)
00124 {
00125
case SIGINT:
00126 res = global_got_sigint;
00127 global_got_sigint = 0;
00128
break;
00129
default:
00130
avr_warning (
"Invalid signal: %d", signo);
00131 }
00132
00133
return res;
00134 }
00135
00136
00137
00138
00139
00140
00141
void
00142 signal_reset (
int signo)
00143 {
00144
signal_has_occurred (signo);
00145 }