Skip to content

Commit

Permalink
posix: signal: implement sigismember
Browse files Browse the repository at this point in the history
Implementation and ztest for sigismember.

Signed-off-by: Yong Cong Sin <[email protected]>
  • Loading branch information
ycsin authored and cfriedt committed Jul 18, 2023
1 parent 88cd494 commit ff4b81e
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 2 deletions.
2 changes: 1 addition & 1 deletion doc/services/portability/posix.rst
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ required for error and event handling.
sigdelset(),yes
sigemptyset(),yes
sigfillset(),yes
igismember(),
sigismember(),yes
signal(),
sigpending(),
sigprocmask(),
Expand Down
1 change: 1 addition & 0 deletions include/zephyr/posix/signal.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);
#endif /* CONFIG_POSIX_SIGNAL */

#ifndef SIGEV_NONE
Expand Down
10 changes: 10 additions & 0 deletions lib/posix/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,13 @@ int sigdelset(sigset_t *set, int signo)

return 0;
}

int sigismember(const sigset_t *set, int signo)
{
if (!signo_valid(signo)) {
errno = EINVAL;
return -1;
}

return 1 & (set->sig[SIGNO_WORD_IDX(signo)] >> SIGNO_WORD_BIT(signo));
}
35 changes: 35 additions & 0 deletions tests/posix/common/src/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,3 +157,38 @@ ZTEST(posix_apis, test_signal_delset)
ARRAY_SIZE(set.sig) - 1, set.sig[i], target.sig[i]);
}
}

ZTEST(posix_apis, test_signal_ismember_oor)
{
sigset_t set = {0};

zassert_equal(sigismember(&set, -1), -1, "rc should be -1");
zassert_equal(errno, EINVAL, "errno should be %s", "EINVAL");

zassert_equal(sigismember(&set, 0), -1, "rc should be -1");
zassert_equal(errno, EINVAL, "errno should be %s", "EINVAL");

zassert_equal(sigismember(&set, _NSIG), -1, "rc should be -1");
zassert_equal(errno, EINVAL, "errno should be %s", "EINVAL");
}

ZTEST(posix_apis, test_signal_ismember)
{
sigset_t set = (sigset_t){0};

#ifdef CONFIG_64BIT
set.sig[0] = BIT(SIGHUP) | BIT(SIGSYS) | BIT(SIGRTMIN);
#else /* 32BIT */
set.sig[0] = BIT(SIGHUP) | BIT(SIGSYS);
set.sig[1] = BIT((SIGRTMIN)-BITS_PER_LONG);
#endif
WRITE_BIT(set.sig[SIGRTMAX / BITS_PER_LONG], SIGRTMAX % BITS_PER_LONG, 1);

zassert_equal(sigismember(&set, SIGHUP), 1, "%s expected to be member", "SIGHUP");
zassert_equal(sigismember(&set, SIGSYS), 1, "%s expected to be member", "SIGSYS");
zassert_equal(sigismember(&set, SIGRTMIN), 1, "%s expected to be member", "SIGRTMIN");
zassert_equal(sigismember(&set, SIGRTMAX), 1, "%s expected to be member", "SIGRTMAX");

zassert_equal(sigismember(&set, SIGKILL), 0, "%s not expected to be member", "SIGKILL");
zassert_equal(sigismember(&set, SIGTERM), 0, "%s not expected to be member", "SIGTERM");
}
2 changes: 1 addition & 1 deletion tests/posix/headers/src/signal_h.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ ZTEST(posix_headers, test_signal_h)
zassert_not_null(sigfillset);
zassert_not_null(sigaddset);
zassert_not_null(sigdelset);
zassert_not_null(sigismember);
#endif /* CONFIG_POSIX_SIGNAL */

if (IS_ENABLED(CONFIG_POSIX_API)) {
Expand All @@ -177,7 +178,6 @@ ZTEST(posix_headers, test_signal_h)
/* zassert_not_null(sighold); */ /* not implemented */
/* zassert_not_null(sigignore); */ /* not implemented */
/* zassert_not_null(siginterrupt); */ /* not implemented */
/* zassert_not_null(sigismember); */ /* not implemented */
/* zassert_not_null(signal); */ /* not implemented */
/* zassert_not_null(sigpause); */ /* not implemented */
/* zassert_not_null(sigpending); */ /* not implemented */
Expand Down

0 comments on commit ff4b81e

Please sign in to comment.