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 }