1 // RUN: %check_clang_tidy %s android-cloexec-accept4 %t
2
3 typedef int socklen_t;
4 struct sockaddr {};
5
6 #define SOCK_NONBLOCK 1
7 #define __O_CLOEXEC 3
8 #define SOCK_CLOEXEC __O_CLOEXEC
9 #define TEMP_FAILURE_RETRY(exp) \
10 ({ \
11 int _rc; \
12 do { \
13 _rc = (exp); \
14 } while (_rc == -1); \
15 })
16 #define NULL 0
17
18 extern "C" int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
19
a()20 void a() {
21 accept4(0, NULL, NULL, SOCK_NONBLOCK);
22 // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: 'accept4' should use SOCK_CLOEXEC where possible [android-cloexec-accept4]
23 // CHECK-FIXES: accept4(0, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC);
24 TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK));
25 // CHECK-MESSAGES: :[[@LINE-1]]:58: warning: 'accept4'
26 // CHECK-FIXES: TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC));
27 }
28
f()29 void f() {
30 accept4(0, NULL, NULL, 3);
31 // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: 'accept4'
32 // CHECK-FIXES: accept4(0, NULL, NULL, 3 | SOCK_CLOEXEC);
33 TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, 3));
34 // CHECK-MESSAGES: :[[@LINE-1]]:46: warning: 'accept4'
35 // CHECK-FIXES: TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, 3 | SOCK_CLOEXEC));
36
37 int flag = SOCK_NONBLOCK;
38 accept4(0, NULL, NULL, flag);
39 TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, flag));
40 }
41
42 namespace i {
43 int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
44
d()45 void d() {
46 accept4(0, NULL, NULL, SOCK_NONBLOCK);
47 TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK));
48 }
49
50 } // namespace i
51
e()52 void e() {
53 accept4(0, NULL, NULL, SOCK_CLOEXEC);
54 TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_CLOEXEC));
55 accept4(0, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC);
56 TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC));
57 }
58
59 class G {
60 public:
61 int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
d()62 void d() {
63 accept4(0, NULL, NULL, SOCK_NONBLOCK);
64 TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK));
65 }
66 };
67