#include #include #include #include #define SIG(s) [SIG##s] = #s static const char signames[][8] = { SIG(HUP), SIG(INT), SIG(QUIT), SIG(ILL), SIG(TRAP), SIG(ABRT), SIG(BUS), SIG(FPE), SIG(KILL), SIG(USR1), SIG(SEGV), SIG(USR2), SIG(PIPE), SIG(ALRM), SIG(TERM), SIG(STKFLT), SIG(CHLD), SIG(CONT), SIG(STOP), SIG(TSTP), SIG(TTIN), SIG(TTOU), SIG(URG), SIG(XCPU), SIG(XFSZ), SIG(VTALRM), SIG(PROF), SIG(WINCH), SIG(POLL), SIG(PWR), SIG(SYS), [32] = "TIMER", [33] = "CANCEL", [34] = "SYNCCALL", [35] = "RTMIN", #define RTMIN 35 #define RTMAX SIGRTMAX }; int sig2str(int sig, char *str) { const char *name; int i, num; if (sig < sizeof signames/sizeof *signames) { for (i = 0; i < sizeof *signames; i++) str[i] = signames[sig][i]; str[sizeof *signames] = 0; return 0; } if (sig == RTMAX) { for (i = 0; i < 6; i++) str[i] = "RTMAX"[i]; return 0; } if (sig > RTMIN && sig <= RTMAX) { if (sig <= (RTMIN+RTMAX)/2) { name = "RTMIN+"; num = sig-RTMIN; } else { name = sig==RTMAX?"RTMAX":"RTMAX-"; num = RTMAX-sig; } for (i = 0; i < 6; i++) str[i] = name[i]; if (num > 10) str[i++] = '0'+num/10; if (num > 0) str[i++] = '0'+num%10; str[i] = 0; return 0; } errno = EINVAL; return -1; } int str2sig(const char *restrict str, int *restrict sig) { int i, num; if (strnlen(str, sizeof *signames) <= sizeof *signames) for (i = 0; i < sizeof signames/sizeof *signames; i++) if (strncmp(str, signames[i], sizeof *signames) == 0) return (*sig = i, 0); if (strcmp(str, "IO") == 0) return (*sig = SIGIO, 0); if (strcmp(str, "IOT") == 0) return (*sig = SIGIOT, 0); if (strcmp(str, "UNUSED") == 0) return (*sig = SIGUNUSED, 0); if (strcmp(str, "RTMAX") == 0) return (*sig = RTMAX, 0); if (strncmp(str, "RTMIN+", 6) == 0 || strncmp(str, "RTMAX-", 6) == 0) i = 6; else if (isdigit(*str)) i = 0; else return -1; if (str[i] < '1' || str[i] > '9') return -1; num = str[i++]-'0'; if (isdigit(str[i])) num = num*10+str[i++]-'0'; if (str[i]) return -1; if (*str != 'R') return num<=RTMAX?(*sig = num, 0):-1; else if (num < RTMAX-RTMIN) return (*sig = str[5]=='+'?RTMIN+num:RTMAX-num, 0); else return -1; }