• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <sys/signalfd.h>
19 
20 #include "test.h"
21 
22 const int sig = SIGALRM;
23 
24 /**
25  * @tc.name      : signalfd_0100
26  * @tc.desc      : create a file descriptor for accepting signals
27  * @tc.level     : Level 0
28  */
signalfd_0100(void)29 void signalfd_0100(void)
30 {
31     sigset_t mask = {};
32 
33     int result = sigaddset(&mask, sig);
34     if (result != 0) {
35         t_error("%s failed: result = %d\n", __func__, result);
36     }
37 
38     result = sigprocmask(SIG_SETMASK, &mask, NULL);
39     if (result != 0) {
40         t_error("%s failed: result = %d\n", __func__, result);
41     }
42 
43     errno = 0;
44     int fd = signalfd(-1, &mask, SFD_CLOEXEC);
45     if (fd <= 0) {
46         t_error("%s failed: fd = %d\n", __func__, fd);
47     }
48 
49     if (errno != 0) {
50         t_error("%s failed: errno = %d\n", __func__, errno);
51     }
52 
53     raise(sig);
54 
55     struct signalfd_siginfo sfd_si = {0};
56     ssize_t size = read(fd, &sfd_si, sizeof(sfd_si));
57     if (size <= 0) {
58         t_error("%s failed: size = %ld\n", __func__, size);
59     }
60 
61     if (sfd_si.ssi_signo != sig) {
62         t_error("%s failed: sfd_si.ssi_signo = %d\n", __func__, sfd_si.ssi_signo);
63     }
64 
65     close(fd);
66 }
67 
68 /**
69  * @tc.name      : signalfd_0200
70  * @tc.desc      : create a file descriptor for accepting signals with invalid parameters
71  * @tc.level     : Level 2
72  */
signalfd_0200(void)73 void signalfd_0200(void)
74 {
75     errno = 0;
76     int fd = signalfd(-1, NULL, -1);
77     if (fd > 0) {
78         t_error("%s failed: fd = %d\n", __func__, fd);
79     }
80 
81     if (errno == 0) {
82         t_error("%s failed: errno = %d\n", __func__, errno);
83     }
84 }
85 
main(int argc,char * argv[])86 int main(int argc, char *argv[])
87 {
88     signalfd_0100();
89     signalfd_0200();
90 
91     return t_status;
92 }
93