On Sun, Jul 11, 2010 at 4:19 PM, Garrett Cooper <yaneg...@gmail.com> wrote: > 2010/7/11 Alexander Kabaev <kab...@gmail.com>: >> On Sun, 11 Jul 2010 15:59:05 -0700 >> Garrett Cooper <yaneg...@gmail.com> wrote: >> >>> > + if (!_SIG_VALID(how)) >>> > + return (-EINVAL); >> >> -EINVAL? Smells too much of Linux, try returning EINVAL instead. > > Wow, I'm batting 1,000 today. Please completely ignore my previous > claim about sigprocmask(2) -- I'm screwing up my function calls.
So after writing more correct tests, everything's fine with sig{add,del}set, as expected: $ cat ~/test_sigaddset.c #include <errno.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #define TEST_SIGADDSET_POS(signo) do { \ printf("signo = %d : ", signo); \ sigemptyset(&set); \ errno = 0; \ rc = sigaddset(&set, signo); \ if (rc != 0) { \ printf("result not sane (%d != 0, errno: %d)\n",\ rc, errno); \ } else \ printf("result sane\n"); \ } while (0) #define TEST_SIGADDSET_NEG(signo) do { \ printf("signo = %d : ", signo); \ sigemptyset(&set); \ errno = 0; \ rc = sigaddset(&set, signo); \ if (rc != -1 || errno != EINVAL) { \ printf("result not sane (%d != -1, " \ "errno: %d != EINVAL)\n", \ rc, errno); \ } else \ printf("result sane\n"); \ } while (0) #define TEST_SIGDELSET_POS(signo) do { \ printf("signo = %d : ", signo); \ sigemptyset(&set); \ errno = 0; \ rc = sigdelset(&set, signo); \ if (rc != 0) { \ printf("result not sane (%d != 0, errno: %d)\n",\ rc, errno); \ } else \ printf("result sane\n"); \ } while (0) #define TEST_SIGDELSET_NEG(signo) do { \ printf("signo = %d : ", signo); \ sigemptyset(&set); \ errno = 0; \ rc = sigdelset(&set, signo); \ if (rc != -1 || errno != EINVAL) { \ printf("result not sane (%d != -1, " \ "errno: %d != EINVAL)\n", \ rc, errno); \ } else \ printf("result sane\n"); \ } while (0) int main(void) { sigset_t set; int rc; TEST_SIGADDSET_NEG(-1); TEST_SIGADDSET_NEG(0); TEST_SIGADDSET_POS(SIGHUP); /* The system quietly disallows SIGKILL or SIGSTOP to be blocked. */ TEST_SIGADDSET_POS(SIGKILL); TEST_SIGADDSET_POS(SIGSTOP); TEST_SIGADDSET_POS(SIGRTMIN-1); TEST_SIGADDSET_POS(SIGRTMIN); TEST_SIGADDSET_POS(SIGRTMIN+1); TEST_SIGADDSET_POS(SIGRTMAX); TEST_SIGDELSET_NEG(-1); TEST_SIGDELSET_NEG(0); TEST_SIGDELSET_POS(SIGHUP); /* The system quietly disallows SIGKILL or SIGSTOP to be blocked. */ TEST_SIGDELSET_POS(SIGKILL); TEST_SIGDELSET_POS(SIGSTOP); TEST_SIGDELSET_POS(SIGRTMIN-1); TEST_SIGDELSET_POS(SIGRTMIN); TEST_SIGDELSET_POS(SIGRTMIN+1); TEST_SIGDELSET_POS(SIGRTMAX); return (0); } $ ~/test_sigadddelset signo = -1 : result sane signo = 0 : result sane signo = 1 : result sane signo = 9 : result sane signo = 17 : result sane signo = 64 : result sane signo = 65 : result sane signo = 66 : result sane signo = 126 : result sane signo = -1 : result sane signo = 0 : result sane signo = 1 : result sane signo = 9 : result sane signo = 17 : result sane signo = 64 : result sane signo = 65 : result sane signo = 66 : result sane signo = 126 : result sane POSIX spec actually says: The range SIGRTMIN through SIGRTMAX inclusive shall include at least {RTSIG_MAX} signal numbers. POSIX is vague on how many numbers RTSIG_MAX is (it's implementation defined and retrievable via sysconf). Thanks, -Garrett _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"