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