1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <errno.h>
17 #include <signal.h>
18
19 #include "test.h"
20
21 static int handler_count = 0;
22
handler(int sig)23 void handler(int sig)
24 {
25 handler_count++;
26 }
27
28 /**
29 * @tc.name : sighold_0100
30 * @tc.desc : add sig to the signal mask of the calling process
31 * @tc.level : Level 0
32 */
sighold_0100(void)33 void sighold_0100(void)
34 {
35 handler_count = 0;
36
37 int sig = SIGALRM;
38 struct sigaction act = {.sa_flags = 0, .sa_handler = handler};
39 struct sigaction old_act = {0};
40 int result = sigaction(sig, &act, &old_act);
41 if (result != 0) {
42 t_error("%s failed: result = %d\n", __func__, result);
43 return;
44 }
45
46 result = sighold(sig);
47 if (result != 0) {
48 t_error("%s failed: result = %d\n", __func__, result);
49 return;
50 }
51
52 sigset_t set = {0};
53 result = sigprocmask(SIG_SETMASK, NULL, &set);
54 if (result != 0) {
55 t_error("%s failed: result = %d\n", __func__, result);
56 return;
57 }
58
59 result = sigismember(&set, sig);
60 if (result == 0) {
61 t_error("%s failed: result = %d\n", __func__, result);
62 return;
63 }
64
65 result = raise(sig);
66 if (result != 0) {
67 t_error("%s failed: result = %d\n", __func__, result);
68 }
69
70 if (handler_count != 0) {
71 t_error("%s failed: handler_count = %d\n", __func__, handler_count);
72 }
73 }
74
75 /**
76 * @tc.name : sighold_0200
77 * @tc.desc : add an invalid sig to the signal mask of the calling process
78 * @tc.level : Level 2
79 */
sighold_0200(void)80 void sighold_0200(void)
81 {
82 errno = 0;
83 int sig = 99999;
84 int result = sighold(sig);
85 if (result == 0) {
86 t_error("%s failed: result = %d\n", __func__, result);
87 }
88
89 if (errno == 0) {
90 t_error("%s failed: errno = %d\n", __func__, errno);
91 }
92 }
93
main(int argc,char * argv[])94 int main(int argc, char *argv[])
95 {
96 sighold_0100();
97 sighold_0200();
98
99 return t_status;
100 }
101