1570af302Sopenharmony_ci/* 2570af302Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4570af302Sopenharmony_ci * you may not use this file except in compliance with the License. 5570af302Sopenharmony_ci * You may obtain a copy of the License at 6570af302Sopenharmony_ci * 7570af302Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8570af302Sopenharmony_ci * 9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12570af302Sopenharmony_ci * See the License for the specific language governing permissions and 13570af302Sopenharmony_ci * limitations under the License. 14570af302Sopenharmony_ci */ 15570af302Sopenharmony_ci 16570af302Sopenharmony_ci#include <errno.h> 17570af302Sopenharmony_ci#include <signal.h> 18570af302Sopenharmony_ci#include <string.h> 19570af302Sopenharmony_ci#include <sys/wait.h> 20570af302Sopenharmony_ci#include <sys/select.h> 21570af302Sopenharmony_ci#include <sigchain.h> 22570af302Sopenharmony_ci#include "fortify_test.h" 23570af302Sopenharmony_ci#include "functionalext.h" 24570af302Sopenharmony_ci#include "test.h" 25570af302Sopenharmony_ci 26570af302Sopenharmony_ci/** 27570af302Sopenharmony_ci * @tc.name : fd_set_0010 28570af302Sopenharmony_ci * @tc.desc : test FD_SET with normal fd 29570af302Sopenharmony_ci * @tc.level : Level 1 30570af302Sopenharmony_ci */ 31570af302Sopenharmony_cistatic void fd_set_0010(void) 32570af302Sopenharmony_ci{ 33570af302Sopenharmony_ci fd_set readfds; 34570af302Sopenharmony_ci FD_ZERO(&readfds); 35570af302Sopenharmony_ci int sockfd = 0; 36570af302Sopenharmony_ci FD_SET(sockfd, &readfds); 37570af302Sopenharmony_ci EXPECT_EQ(fd_set_0010, (&readfds)->fds_bits[0], 1); 38570af302Sopenharmony_ci 39570af302Sopenharmony_ci return; 40570af302Sopenharmony_ci} 41570af302Sopenharmony_ci 42570af302Sopenharmony_ci/** 43570af302Sopenharmony_ci * @tc.name : fd_set_0020 44570af302Sopenharmony_ci * @tc.desc : test FD_SET with fd < 0 45570af302Sopenharmony_ci * @tc.level : Level 2 46570af302Sopenharmony_ci */ 47570af302Sopenharmony_cistatic void fd_set_0020(void) 48570af302Sopenharmony_ci{ 49570af302Sopenharmony_ci struct sigaction sigabrt = { 50570af302Sopenharmony_ci .sa_handler = SignalHandler, 51570af302Sopenharmony_ci }; 52570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 53570af302Sopenharmony_ci 54570af302Sopenharmony_ci int status; 55570af302Sopenharmony_ci int pid = fork(); 56570af302Sopenharmony_ci fd_set readfds; 57570af302Sopenharmony_ci int sockfd = -1; 58570af302Sopenharmony_ci switch (pid) { 59570af302Sopenharmony_ci case -1: 60570af302Sopenharmony_ci t_error("fork failed: %s\n", strerror(errno)); 61570af302Sopenharmony_ci break; 62570af302Sopenharmony_ci case 0: 63570af302Sopenharmony_ci FD_ZERO(&readfds); 64570af302Sopenharmony_ci FD_SET(sockfd, &readfds); 65570af302Sopenharmony_ci exit(0); 66570af302Sopenharmony_ci default: 67570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 68570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 69570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 70570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 71570af302Sopenharmony_ci kill(pid, SIGCONT); 72570af302Sopenharmony_ci break; 73570af302Sopenharmony_ci } 74570af302Sopenharmony_ci 75570af302Sopenharmony_ci return; 76570af302Sopenharmony_ci} 77570af302Sopenharmony_ci 78570af302Sopenharmony_ci/** 79570af302Sopenharmony_ci * @tc.name : fd_set_0030 80570af302Sopenharmony_ci * @tc.desc : test FD_SET with fd >= 1024 81570af302Sopenharmony_ci * @tc.level : Level 2 82570af302Sopenharmony_ci */ 83570af302Sopenharmony_cistatic void fd_set_0030(void) 84570af302Sopenharmony_ci{ 85570af302Sopenharmony_ci struct sigaction sigabrt = { 86570af302Sopenharmony_ci .sa_handler = SignalHandler, 87570af302Sopenharmony_ci }; 88570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 89570af302Sopenharmony_ci 90570af302Sopenharmony_ci int status; 91570af302Sopenharmony_ci int pid = fork(); 92570af302Sopenharmony_ci fd_set readfds; 93570af302Sopenharmony_ci int sockfd = 1024; 94570af302Sopenharmony_ci switch (pid) { 95570af302Sopenharmony_ci case -1: 96570af302Sopenharmony_ci t_error("fork failed: %s\n", strerror(errno)); 97570af302Sopenharmony_ci break; 98570af302Sopenharmony_ci case 0: 99570af302Sopenharmony_ci FD_ZERO(&readfds); 100570af302Sopenharmony_ci FD_SET(sockfd, &readfds); 101570af302Sopenharmony_ci exit(0); 102570af302Sopenharmony_ci default: 103570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 104570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 105570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 106570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 107570af302Sopenharmony_ci kill(pid, SIGCONT); 108570af302Sopenharmony_ci break; 109570af302Sopenharmony_ci } 110570af302Sopenharmony_ci 111570af302Sopenharmony_ci return; 112570af302Sopenharmony_ci} 113570af302Sopenharmony_ci 114570af302Sopenharmony_ci/** 115570af302Sopenharmony_ci * @tc.name : fd_clr_0010 116570af302Sopenharmony_ci * @tc.desc : test FD_CLR with normal fd 117570af302Sopenharmony_ci * @tc.level : Level 1 118570af302Sopenharmony_ci */ 119570af302Sopenharmony_cistatic void fd_clr_0010(void) 120570af302Sopenharmony_ci{ 121570af302Sopenharmony_ci fd_set readfds; 122570af302Sopenharmony_ci FD_ZERO(&readfds); 123570af302Sopenharmony_ci int sockfd = 0; 124570af302Sopenharmony_ci FD_SET(sockfd, &readfds); 125570af302Sopenharmony_ci FD_CLR(sockfd, &readfds); 126570af302Sopenharmony_ci EXPECT_EQ(fd_set_0010, (&readfds)->fds_bits[0], 0); 127570af302Sopenharmony_ci 128570af302Sopenharmony_ci return; 129570af302Sopenharmony_ci} 130570af302Sopenharmony_ci 131570af302Sopenharmony_ci/** 132570af302Sopenharmony_ci * @tc.name : fd_clr_0020 133570af302Sopenharmony_ci * @tc.desc : test FD_CLR with fd < 0 134570af302Sopenharmony_ci * @tc.level : Level 2 135570af302Sopenharmony_ci */ 136570af302Sopenharmony_cistatic void fd_clr_0020(void) 137570af302Sopenharmony_ci{ 138570af302Sopenharmony_ci struct sigaction sigabrt = { 139570af302Sopenharmony_ci .sa_handler = SignalHandler, 140570af302Sopenharmony_ci }; 141570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 142570af302Sopenharmony_ci 143570af302Sopenharmony_ci int status; 144570af302Sopenharmony_ci int pid = fork(); 145570af302Sopenharmony_ci fd_set readfds; 146570af302Sopenharmony_ci int sockfd = -1; 147570af302Sopenharmony_ci switch (pid) { 148570af302Sopenharmony_ci case -1: 149570af302Sopenharmony_ci t_error("fork failed: %s\n", strerror(errno)); 150570af302Sopenharmony_ci break; 151570af302Sopenharmony_ci case 0: 152570af302Sopenharmony_ci FD_ZERO(&readfds); 153570af302Sopenharmony_ci FD_CLR(sockfd, &readfds); 154570af302Sopenharmony_ci exit(0); 155570af302Sopenharmony_ci default: 156570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 157570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 158570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 159570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 160570af302Sopenharmony_ci kill(pid, SIGCONT); 161570af302Sopenharmony_ci break; 162570af302Sopenharmony_ci } 163570af302Sopenharmony_ci 164570af302Sopenharmony_ci return; 165570af302Sopenharmony_ci} 166570af302Sopenharmony_ci 167570af302Sopenharmony_ci/** 168570af302Sopenharmony_ci * @tc.name : fd_clr_0030 169570af302Sopenharmony_ci * @tc.desc : test FD_CLR with fd >= 1024 170570af302Sopenharmony_ci * @tc.level : Level 2 171570af302Sopenharmony_ci */ 172570af302Sopenharmony_cistatic void fd_clr_0030(void) 173570af302Sopenharmony_ci{ 174570af302Sopenharmony_ci struct sigaction sigabrt = { 175570af302Sopenharmony_ci .sa_handler = SignalHandler, 176570af302Sopenharmony_ci }; 177570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 178570af302Sopenharmony_ci 179570af302Sopenharmony_ci int status; 180570af302Sopenharmony_ci int pid = fork(); 181570af302Sopenharmony_ci fd_set readfds; 182570af302Sopenharmony_ci int sockfd = 1024; 183570af302Sopenharmony_ci switch (pid) { 184570af302Sopenharmony_ci case -1: 185570af302Sopenharmony_ci t_error("fork failed: %s\n", strerror(errno)); 186570af302Sopenharmony_ci break; 187570af302Sopenharmony_ci case 0: 188570af302Sopenharmony_ci FD_ZERO(&readfds); 189570af302Sopenharmony_ci FD_CLR(sockfd, &readfds); 190570af302Sopenharmony_ci exit(0); 191570af302Sopenharmony_ci default: 192570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 193570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 194570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 195570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 196570af302Sopenharmony_ci kill(pid, SIGCONT); 197570af302Sopenharmony_ci break; 198570af302Sopenharmony_ci } 199570af302Sopenharmony_ci 200570af302Sopenharmony_ci return; 201570af302Sopenharmony_ci} 202570af302Sopenharmony_ci 203570af302Sopenharmony_ci/** 204570af302Sopenharmony_ci * @tc.name : fd_isset_0010 205570af302Sopenharmony_ci * @tc.desc : test FD_ISSET with normal fd 206570af302Sopenharmony_ci * @tc.level : Level 1 207570af302Sopenharmony_ci */ 208570af302Sopenharmony_cistatic void fd_isset_0010(void) 209570af302Sopenharmony_ci{ 210570af302Sopenharmony_ci fd_set readfds; 211570af302Sopenharmony_ci FD_ZERO(&readfds); 212570af302Sopenharmony_ci int sockfd = 0; 213570af302Sopenharmony_ci FD_SET(sockfd, &readfds); 214570af302Sopenharmony_ci int res = FD_ISSET(sockfd, &readfds); 215570af302Sopenharmony_ci EXPECT_EQ(fd_set_0010, res, 1); 216570af302Sopenharmony_ci 217570af302Sopenharmony_ci return; 218570af302Sopenharmony_ci} 219570af302Sopenharmony_ci 220570af302Sopenharmony_ci/** 221570af302Sopenharmony_ci * @tc.name : fd_isset_0020 222570af302Sopenharmony_ci * @tc.desc : test FD_ISSET with fd < 0 223570af302Sopenharmony_ci * @tc.level : Level 2 224570af302Sopenharmony_ci */ 225570af302Sopenharmony_cistatic void fd_isset_0020(void) 226570af302Sopenharmony_ci{ 227570af302Sopenharmony_ci fd_set readfds; 228570af302Sopenharmony_ci FD_ZERO(&readfds); 229570af302Sopenharmony_ci int sockfd = -1; 230570af302Sopenharmony_ci int res = FD_ISSET(sockfd, &readfds); 231570af302Sopenharmony_ci EXPECT_EQ(fd_set_0010, res, 0); 232570af302Sopenharmony_ci 233570af302Sopenharmony_ci return; 234570af302Sopenharmony_ci} 235570af302Sopenharmony_ci 236570af302Sopenharmony_ci/** 237570af302Sopenharmony_ci * @tc.name : fd_isset_0030 238570af302Sopenharmony_ci * @tc.desc : test FD_ISSET with fd >= 1024 239570af302Sopenharmony_ci * @tc.level : Level 2 240570af302Sopenharmony_ci */ 241570af302Sopenharmony_cistatic void fd_isset_0030(void) 242570af302Sopenharmony_ci{ 243570af302Sopenharmony_ci fd_set readfds; 244570af302Sopenharmony_ci FD_ZERO(&readfds); 245570af302Sopenharmony_ci int sockfd = 1024; 246570af302Sopenharmony_ci int res = FD_ISSET(sockfd, &readfds); 247570af302Sopenharmony_ci EXPECT_EQ(fd_set_0010, res, 0); 248570af302Sopenharmony_ci 249570af302Sopenharmony_ci return; 250570af302Sopenharmony_ci} 251570af302Sopenharmony_ci 252570af302Sopenharmony_ciint main(int argc, char *argv[]) 253570af302Sopenharmony_ci{ 254570af302Sopenharmony_ci remove_all_special_handler(SIGABRT); 255570af302Sopenharmony_ci fd_set_0010(); 256570af302Sopenharmony_ci fd_set_0020(); 257570af302Sopenharmony_ci fd_set_0030(); 258570af302Sopenharmony_ci fd_clr_0010(); 259570af302Sopenharmony_ci fd_clr_0020(); 260570af302Sopenharmony_ci fd_clr_0030(); 261570af302Sopenharmony_ci fd_isset_0010(); 262570af302Sopenharmony_ci fd_isset_0020(); 263570af302Sopenharmony_ci fd_isset_0030(); 264570af302Sopenharmony_ci return t_status; 265570af302Sopenharmony_ci}