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