// RUN: %check_clang_tidy %s android-cloexec-accept4 %t typedef int socklen_t; struct sockaddr {}; #define SOCK_NONBLOCK 1 #define __O_CLOEXEC 3 #define SOCK_CLOEXEC __O_CLOEXEC #define TEMP_FAILURE_RETRY(exp) \ ({ \ int _rc; \ do { \ _rc = (exp); \ } while (_rc == -1); \ }) #define NULL 0 extern "C" int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags); void a() { accept4(0, NULL, NULL, SOCK_NONBLOCK); // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: 'accept4' should use SOCK_CLOEXEC where possible [android-cloexec-accept4] // CHECK-FIXES: accept4(0, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC); TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK)); // CHECK-MESSAGES: :[[@LINE-1]]:58: warning: 'accept4' // CHECK-FIXES: TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC)); } void f() { accept4(0, NULL, NULL, 3); // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: 'accept4' // CHECK-FIXES: accept4(0, NULL, NULL, 3 | SOCK_CLOEXEC); TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, 3)); // CHECK-MESSAGES: :[[@LINE-1]]:46: warning: 'accept4' // CHECK-FIXES: TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, 3 | SOCK_CLOEXEC)); int flag = SOCK_NONBLOCK; accept4(0, NULL, NULL, flag); TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, flag)); } namespace i { int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags); void d() { accept4(0, NULL, NULL, SOCK_NONBLOCK); TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK)); } } // namespace i void e() { accept4(0, NULL, NULL, SOCK_CLOEXEC); TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_CLOEXEC)); accept4(0, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC); TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC)); } class G { public: int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags); void d() { accept4(0, NULL, NULL, SOCK_NONBLOCK); TEMP_FAILURE_RETRY(accept4(0, NULL, NULL, SOCK_NONBLOCK)); } };