Skip to content

Commit b47a5b4

Browse files
committed
posix: signal: implement addset
Implement POSIX signal API: sigaddset Added ztest. SIgned-off-by: Yong Cong Sin <[email protected]>
1 parent 7888d0c commit b47a5b4

File tree

4 files changed

+63
-0
lines changed

4 files changed

+63
-0
lines changed

include/zephyr/posix/signal.h

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ typedef struct sigset {
102102
uint32_t _elem[_SIGSET_NELEM];
103103
} sigset_t;
104104

105+
int sigaddset(sigset_t *set, int signo);
105106
int sigemptyset(sigset_t *set);
106107
int sigfillset(sigset_t *set);
107108
#endif /* CONFIG_POSIX_SIGNAL */

lib/posix/signal/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# SPDX-License-Identifier: Apache-2.0
22

33
zephyr_library_sources(
4+
addset.c
45
emptyset.c
56
fillset.c
67
)

lib/posix/signal/addset.c

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright (c) 2023 Meta
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <signal.h>
8+
#include <errno.h>
9+
10+
int sigaddset(sigset_t *set, int signo)
11+
{
12+
if ((set == NULL) || (signo <= 0) || (signo >= NSIG)) {
13+
errno = EINVAL;
14+
return -1;
15+
}
16+
17+
set->_elem[_SIGSET_NDX(signo)] |= _SIGNO2SET(signo);
18+
19+
return 0;
20+
}

tests/posix/signal/src/addset.c

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2023 Meta
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <signal.h>
8+
#include <errno.h>
9+
10+
#include <zephyr/ztest.h>
11+
#include <zephyr/sys/util.h>
12+
#include <zephyr/sys/util_macro.h>
13+
14+
ZTEST(posix_signal_apis, test_posix_signal_addset)
15+
{
16+
sigset_t set;
17+
int signo;
18+
int rc;
19+
20+
for (int i = 0; i < ARRAY_SIZE(set._elem); i++) {
21+
set._elem[i] = 0u;
22+
}
23+
24+
signo = 21;
25+
zassert_ok(sigaddset(&set, signo));
26+
zassert_equal(set._elem[signo >> 5], BIT(signo), "Signal %d is not set", signo);
27+
28+
signo = 42;
29+
zassert_ok(sigaddset(&set, signo));
30+
zassert_equal(set._elem[21 >> 5], BIT(21), "Signal %d is not set", 21);
31+
zassert_equal(set._elem[signo >> 5], BIT(signo % (8 * sizeof(set._elem[0]))),
32+
"Signal %d is not set", signo);
33+
34+
rc = sigaddset(&set, 0);
35+
zassert_equal(rc, -1, "rc should be -1, not %d", rc);
36+
zassert_equal(errno, EINVAL, "errno should be EINVAL, not %d", errno);
37+
38+
rc = sigaddset(&set, NSIG);
39+
zassert_equal(rc, -1, "rc should be -1, not %d", rc);
40+
zassert_equal(errno, EINVAL, "errno should be EINVAL, not %d", errno);
41+
}

0 commit comments

Comments
 (0)