00001
00002
00003
00004
00005
00006
00007 #include "signaux.h"
00008
00009
00010
00011
00012
00013
00014
00015
00016 void add_sig (int pid, signal_t *sig) {
00017 signal_t *p_sig;
00018 signal_t *p_tmp;
00019
00020
00021 p_sig = rechercher_sig(pid, sig->signal);
00022 if (p_sig != NULL) {
00023 p_sig->cp = sig->cp;
00024 free (sig);
00025 }
00026 else {
00027
00028 if (table_capture[pid] == NULL) {
00029
00030 table_capture[pid] = p_sig;
00031 }
00032 else {
00033 p_tmp = table_capture[pid];
00034 while (p_tmp->next) {
00035 p_tmp = p_tmp->next;
00036 }
00037 p_tmp->next = sig;
00038 }
00039 }
00040 }
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 signal_t* rechercher_sig (int pid, int sig) {
00051 signal_t *p_tmp;
00052
00053
00054 if (table_capture[pid] == NULL) {
00055 return NULL;
00056 }
00057 p_tmp = table_capture[pid];
00058 while (p_tmp) {
00059 if (p_tmp->signal == sig) {
00060 return p_tmp;
00061 }
00062 p_tmp = p_tmp->next;
00063 }
00064 return NULL;
00065 }
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 int supp_sig (int pid, int sig) {
00077 signal_t *p_tmp;
00078 signal_t *p_clr;
00079
00080
00081 if (table_capture[pid] == NULL) {
00082 fprintf(stderr,"Impossible de supprimer un signal a une liste vide\n");
00083 return -1;
00084 }
00085 else {
00086 if (table_capture[pid]->signal == sig) {
00087 p_clr = table_capture[pid];
00088 table_capture[pid] = table_capture[pid]->next;
00089 free (p_clr);
00090 return 0;
00091 }
00092 p_tmp = table_capture[pid];
00093 while (p_tmp->next) {
00094 if (p_tmp->next->signal == sig) {
00095 p_clr = p_tmp->next;
00096 p_tmp->next = p_tmp->next->next;
00097 free(p_clr);
00098 return 0;
00099 }
00100 p_tmp = p_tmp->next;
00101 }
00102 return -2;
00103 }
00104
00105 }
00106
00107
00108
00109
00110
00111
00112 void supp_all_sig (int pid) {
00113 signal_t *p_tmp;
00114 signal_t *p_clr;
00115
00116 p_tmp = table_capture[pid];
00117 p_clr = p_tmp;
00118 while (p_tmp) {
00119 p_tmp = p_tmp->next;
00120 free(p_clr);
00121 p_clr = p_tmp;
00122 }
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 int sig_ksinu2lib (int k_sig) {
00135 int sig;
00136
00137 switch (k_sig) {
00138 case 2:
00139 sig = S_KILL;
00140 break;
00141 case 3:
00142 sig = S_MEM;
00143 break;
00144 case 4:
00145 sig = S_SUSP;
00146 break;
00147 case 5:
00148 sig = S_REP;
00149 break;
00150 case 6:
00151 sig = S_USR1;
00152 break;
00153 case 7:
00154 sig = S_USR2;
00155 break;
00156 case 8:
00157 sig = S_INSTI;
00158 break;
00159 default:
00160 return -1;
00161 }
00162 return sig;
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 int sig_lib2ksinu (int l_sig) {
00175 int sig;
00176
00177 switch (l_sig) {
00178 case S_KILL:
00179 sig = 2;
00180 break;
00181 case S_MEM:
00182 sig = 3;
00183 break;
00184 case S_SUSP:
00185 sig = 4;
00186 break;
00187 case S_REP:
00188 sig = 5;
00189 break;
00190 case S_USR1:
00191 sig = 6;
00192 break;
00193 case S_USR2:
00194 sig = 7;
00195 break;
00196 case S_INSTI:
00197 sig = 8;
00198 break;
00199 default:
00200 return -1;
00201 }
00202 return sig;
00203 }