Skip to content

Commit 078d9f7

Browse files
committed
posix: signal: implement sigismember
Implementation and ztest for sigismember. Signed-off-by: Yong Cong Sin <[email protected]>
1 parent c726b14 commit 078d9f7

File tree

5 files changed

+48
-2
lines changed

5 files changed

+48
-2
lines changed

doc/services/portability/posix.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ required for error and event handling.
380380
sigdelset(),yes
381381
sigemptyset(),yes
382382
sigfillset(),yes
383-
igismember(),
383+
sigismember(),yes
384384
signal(),
385385
sigpending(),
386386
sigprocmask(),

include/zephyr/posix/signal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ int sigemptyset(sigset_t *set);
5959
int sigfillset(sigset_t *set);
6060
int sigaddset(sigset_t *set, int signo);
6161
int sigdelset(sigset_t *set, int signo);
62+
int sigismember(const sigset_t *set, int signo);
6263
#endif /* CONFIG_POSIX_SIGNAL */
6364

6465
#ifndef SIGEV_NONE

lib/posix/signal.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,13 @@ int sigdelset(sigset_t *set, int signo)
5858

5959
return 0;
6060
}
61+
62+
int sigismember(const sigset_t *set, int signo)
63+
{
64+
if (!signo_valid(signo)) {
65+
errno = EINVAL;
66+
return -1;
67+
}
68+
69+
return 1 & (set->sig[SIGNO_WORD_IDX(signo)] >> SIGNO_WORD_BIT(signo));
70+
}

tests/posix/common/src/signal.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,38 @@ ZTEST(posix_apis, test_signal_delset)
157157
ARRAY_SIZE(set.sig) - 1, set.sig[i], target.sig[i]);
158158
}
159159
}
160+
161+
ZTEST(posix_apis, test_signal_ismember_oor)
162+
{
163+
sigset_t set = {0};
164+
165+
zassert_equal(sigismember(&set, -1), -1, "rc should be -1");
166+
zassert_equal(errno, EINVAL, "errno should be %s", "EINVAL");
167+
168+
zassert_equal(sigismember(&set, 0), -1, "rc should be -1");
169+
zassert_equal(errno, EINVAL, "errno should be %s", "EINVAL");
170+
171+
zassert_equal(sigismember(&set, _NSIG), -1, "rc should be -1");
172+
zassert_equal(errno, EINVAL, "errno should be %s", "EINVAL");
173+
}
174+
175+
ZTEST(posix_apis, test_signal_ismember)
176+
{
177+
sigset_t set = (sigset_t){0};
178+
179+
#ifdef CONFIG_64BIT
180+
set.sig[0] = BIT(SIGHUP) | BIT(SIGSYS) | BIT(SIGRTMIN);
181+
#else /* 32BIT */
182+
set.sig[0] = BIT(SIGHUP) | BIT(SIGSYS);
183+
set.sig[1] = BIT((SIGRTMIN)-BITS_PER_LONG);
184+
#endif
185+
WRITE_BIT(set.sig[SIGRTMAX / BITS_PER_LONG], SIGRTMAX % BITS_PER_LONG, 1);
186+
187+
zassert_equal(sigismember(&set, SIGHUP), 1, "%s expected to be member", "SIGHUP");
188+
zassert_equal(sigismember(&set, SIGSYS), 1, "%s expected to be member", "SIGSYS");
189+
zassert_equal(sigismember(&set, SIGRTMIN), 1, "%s expected to be member", "SIGRTMIN");
190+
zassert_equal(sigismember(&set, SIGRTMAX), 1, "%s expected to be member", "SIGRTMAX");
191+
192+
zassert_equal(sigismember(&set, SIGKILL), 0, "%s not expected to be member", "SIGKILL");
193+
zassert_equal(sigismember(&set, SIGTERM), 0, "%s not expected to be member", "SIGTERM");
194+
}

tests/posix/headers/src/signal_h.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ ZTEST(posix_headers, test_signal_h)
162162
zassert_not_null(sigfillset);
163163
zassert_not_null(sigaddset);
164164
zassert_not_null(sigdelset);
165+
zassert_not_null(sigismember);
165166
#endif /* CONFIG_POSIX_SIGNAL */
166167

167168
if (IS_ENABLED(CONFIG_POSIX_API)) {
@@ -177,7 +178,6 @@ ZTEST(posix_headers, test_signal_h)
177178
/* zassert_not_null(sighold); */ /* not implemented */
178179
/* zassert_not_null(sigignore); */ /* not implemented */
179180
/* zassert_not_null(siginterrupt); */ /* not implemented */
180-
/* zassert_not_null(sigismember); */ /* not implemented */
181181
/* zassert_not_null(signal); */ /* not implemented */
182182
/* zassert_not_null(sigpause); */ /* not implemented */
183183
/* zassert_not_null(sigpending); */ /* not implemented */

0 commit comments

Comments
 (0)