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"

Reply via email to