xref: /aosp_15_r20/external/ltp/include/safe_macros_fn.h (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker /*
2*49cdfc7eSAndroid Build Coastguard Worker  * Safe macros for commonly used syscalls to reduce code duplication in LTP
3*49cdfc7eSAndroid Build Coastguard Worker  * testcases, and to ensure all errors are caught in said testcases as
4*49cdfc7eSAndroid Build Coastguard Worker  * gracefully as possible.
5*49cdfc7eSAndroid Build Coastguard Worker  *
6*49cdfc7eSAndroid Build Coastguard Worker  * Also satiates some versions of gcc/glibc when the warn_unused_result
7*49cdfc7eSAndroid Build Coastguard Worker  * attribute is applied to the function call.
8*49cdfc7eSAndroid Build Coastguard Worker  *
9*49cdfc7eSAndroid Build Coastguard Worker  * Licensed under the GPLv2.
10*49cdfc7eSAndroid Build Coastguard Worker  */
11*49cdfc7eSAndroid Build Coastguard Worker 
12*49cdfc7eSAndroid Build Coastguard Worker #ifndef SAFE_MACROS_FN_H__
13*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_MACROS_FN_H__
14*49cdfc7eSAndroid Build Coastguard Worker 
15*49cdfc7eSAndroid Build Coastguard Worker #include <sys/mman.h>
16*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
17*49cdfc7eSAndroid Build Coastguard Worker #include <sys/time.h>
18*49cdfc7eSAndroid Build Coastguard Worker #include <sys/resource.h>
19*49cdfc7eSAndroid Build Coastguard Worker #include <sys/stat.h>
20*49cdfc7eSAndroid Build Coastguard Worker #include <sys/ioctl.h>
21*49cdfc7eSAndroid Build Coastguard Worker #include <fcntl.h>
22*49cdfc7eSAndroid Build Coastguard Worker #include <libgen.h>
23*49cdfc7eSAndroid Build Coastguard Worker #include <stdarg.h>
24*49cdfc7eSAndroid Build Coastguard Worker #include <unistd.h>
25*49cdfc7eSAndroid Build Coastguard Worker #include <dirent.h>
26*49cdfc7eSAndroid Build Coastguard Worker 
27*49cdfc7eSAndroid Build Coastguard Worker /* supported values for safe_write() len_strict parameter */
28*49cdfc7eSAndroid Build Coastguard Worker enum safe_write_opts {
29*49cdfc7eSAndroid Build Coastguard Worker 	/* no length strictness, short writes are ok */
30*49cdfc7eSAndroid Build Coastguard Worker 	SAFE_WRITE_ANY = 0,
31*49cdfc7eSAndroid Build Coastguard Worker 
32*49cdfc7eSAndroid Build Coastguard Worker 	/* strict length, short writes raise TBROK */
33*49cdfc7eSAndroid Build Coastguard Worker 	SAFE_WRITE_ALL = 1,
34*49cdfc7eSAndroid Build Coastguard Worker 
35*49cdfc7eSAndroid Build Coastguard Worker 	/* retry/resume after short write */
36*49cdfc7eSAndroid Build Coastguard Worker 	SAFE_WRITE_RETRY = 2,
37*49cdfc7eSAndroid Build Coastguard Worker };
38*49cdfc7eSAndroid Build Coastguard Worker 
39*49cdfc7eSAndroid Build Coastguard Worker char* safe_basename(const char *file, const int lineno,
40*49cdfc7eSAndroid Build Coastguard Worker                     void (*cleanup_fn)(void), char *path);
41*49cdfc7eSAndroid Build Coastguard Worker 
42*49cdfc7eSAndroid Build Coastguard Worker int safe_chdir(const char *file, const int lineno,
43*49cdfc7eSAndroid Build Coastguard Worker                void (*cleanup_fn)(void), const char *path);
44*49cdfc7eSAndroid Build Coastguard Worker 
45*49cdfc7eSAndroid Build Coastguard Worker int safe_close(const char *file, const int lineno,
46*49cdfc7eSAndroid Build Coastguard Worker                void (*cleanup_fn)(void), int fildes);
47*49cdfc7eSAndroid Build Coastguard Worker 
48*49cdfc7eSAndroid Build Coastguard Worker int safe_creat(const char *file, const int lineno,
49*49cdfc7eSAndroid Build Coastguard Worker                void (*cleanup_fn)(void), const char *pathname, mode_t mode);
50*49cdfc7eSAndroid Build Coastguard Worker 
51*49cdfc7eSAndroid Build Coastguard Worker char* safe_dirname(const char *file, const int lineno,
52*49cdfc7eSAndroid Build Coastguard Worker                    void (*cleanup_fn)(void), char *path);
53*49cdfc7eSAndroid Build Coastguard Worker 
54*49cdfc7eSAndroid Build Coastguard Worker char* safe_getcwd(const char *file, const int lineno,
55*49cdfc7eSAndroid Build Coastguard Worker                   void (*cleanup_fn)(void), char *buf, size_t size);
56*49cdfc7eSAndroid Build Coastguard Worker 
57*49cdfc7eSAndroid Build Coastguard Worker struct passwd* safe_getpwnam(const char *file, const int lineno,
58*49cdfc7eSAndroid Build Coastguard Worker                              void (*cleanup_fn)(void), const char *name);
59*49cdfc7eSAndroid Build Coastguard Worker 
60*49cdfc7eSAndroid Build Coastguard Worker int safe_getrusage(const char *file, const int lineno,
61*49cdfc7eSAndroid Build Coastguard Worker                    void (*cleanup_fn)(void), int who, struct rusage *usage);
62*49cdfc7eSAndroid Build Coastguard Worker 
63*49cdfc7eSAndroid Build Coastguard Worker void* safe_malloc(const char *file, const int lineno,
64*49cdfc7eSAndroid Build Coastguard Worker                   void (*cleanup_fn)(void), size_t size);
65*49cdfc7eSAndroid Build Coastguard Worker 
66*49cdfc7eSAndroid Build Coastguard Worker int safe_mkdir(const char *file, const int lineno,
67*49cdfc7eSAndroid Build Coastguard Worker                void (*cleanup_fn)(void), const char *pathname, mode_t mode);
68*49cdfc7eSAndroid Build Coastguard Worker 
69*49cdfc7eSAndroid Build Coastguard Worker int safe_rmdir(const char *file, const int lineno,
70*49cdfc7eSAndroid Build Coastguard Worker                void (*cleanup_fn)(void), const char *pathname);
71*49cdfc7eSAndroid Build Coastguard Worker 
72*49cdfc7eSAndroid Build Coastguard Worker 
73*49cdfc7eSAndroid Build Coastguard Worker int safe_munmap(const char *file, const int lineno,
74*49cdfc7eSAndroid Build Coastguard Worker                 void (*cleanup_fn)(void), void *addr, size_t length);
75*49cdfc7eSAndroid Build Coastguard Worker 
76*49cdfc7eSAndroid Build Coastguard Worker int safe_open(const char *file, const int lineno,
77*49cdfc7eSAndroid Build Coastguard Worker               void (*cleanup_fn)(void), const char *pathname, int oflags, ...);
78*49cdfc7eSAndroid Build Coastguard Worker 
79*49cdfc7eSAndroid Build Coastguard Worker int safe_pipe(const char *file, const int lineno,
80*49cdfc7eSAndroid Build Coastguard Worker               void (*cleanup_fn)(void), int fildes[2]);
81*49cdfc7eSAndroid Build Coastguard Worker 
82*49cdfc7eSAndroid Build Coastguard Worker ssize_t safe_read(const char *file, const int lineno,
83*49cdfc7eSAndroid Build Coastguard Worker                   void (*cleanup_fn)(void), char len_strict, int fildes,
84*49cdfc7eSAndroid Build Coastguard Worker                   void *buf, size_t nbyte);
85*49cdfc7eSAndroid Build Coastguard Worker 
86*49cdfc7eSAndroid Build Coastguard Worker int safe_setegid(const char *file, const int lineno,
87*49cdfc7eSAndroid Build Coastguard Worker                  void (*cleanup_fn)(void), gid_t egid);
88*49cdfc7eSAndroid Build Coastguard Worker 
89*49cdfc7eSAndroid Build Coastguard Worker int safe_seteuid(const char *file, const int lineno,
90*49cdfc7eSAndroid Build Coastguard Worker                  void (*cleanup_fn)(void), uid_t euid);
91*49cdfc7eSAndroid Build Coastguard Worker 
92*49cdfc7eSAndroid Build Coastguard Worker int safe_setgid(const char *file, const int lineno,
93*49cdfc7eSAndroid Build Coastguard Worker                 void (*cleanup_fn)(void), gid_t gid);
94*49cdfc7eSAndroid Build Coastguard Worker 
95*49cdfc7eSAndroid Build Coastguard Worker int safe_setuid(const char *file, const int lineno,
96*49cdfc7eSAndroid Build Coastguard Worker                 void (*cleanup_fn)(void), uid_t uid);
97*49cdfc7eSAndroid Build Coastguard Worker 
98*49cdfc7eSAndroid Build Coastguard Worker int safe_getresuid(const char *file, const int lineno,
99*49cdfc7eSAndroid Build Coastguard Worker                    void (*cleanup_fn)(void),
100*49cdfc7eSAndroid Build Coastguard Worker                    uid_t *ruid, uid_t *euid, uid_t *suid);
101*49cdfc7eSAndroid Build Coastguard Worker 
102*49cdfc7eSAndroid Build Coastguard Worker int safe_getresgid(const char *file, const int lineno,
103*49cdfc7eSAndroid Build Coastguard Worker                    void (*cleanup_fn)(void),
104*49cdfc7eSAndroid Build Coastguard Worker                    gid_t *rgid, gid_t *egid, gid_t *sgid);
105*49cdfc7eSAndroid Build Coastguard Worker 
106*49cdfc7eSAndroid Build Coastguard Worker int safe_unlink(const char *file, const int lineno,
107*49cdfc7eSAndroid Build Coastguard Worker                 void (*cleanup_fn)(void), const char *pathname);
108*49cdfc7eSAndroid Build Coastguard Worker 
109*49cdfc7eSAndroid Build Coastguard Worker int safe_link(const char *file, const int lineno,
110*49cdfc7eSAndroid Build Coastguard Worker               void (cleanup_fn)(void), const char *oldpath,
111*49cdfc7eSAndroid Build Coastguard Worker               const char *newpath);
112*49cdfc7eSAndroid Build Coastguard Worker 
113*49cdfc7eSAndroid Build Coastguard Worker int safe_linkat(const char *file, const int lineno,
114*49cdfc7eSAndroid Build Coastguard Worker 		void (cleanup_fn)(void), int olddirfd, const char *oldpath,
115*49cdfc7eSAndroid Build Coastguard Worker 		int newdirfd, const char *newpath, int flags);
116*49cdfc7eSAndroid Build Coastguard Worker 
117*49cdfc7eSAndroid Build Coastguard Worker ssize_t safe_readlink(const char *file, const int lineno,
118*49cdfc7eSAndroid Build Coastguard Worker 		  void (cleanup_fn)(void), const char *path,
119*49cdfc7eSAndroid Build Coastguard Worker 		  char *buf, size_t bufsize);
120*49cdfc7eSAndroid Build Coastguard Worker 
121*49cdfc7eSAndroid Build Coastguard Worker int safe_symlink(const char *file, const int lineno,
122*49cdfc7eSAndroid Build Coastguard Worker                  void (cleanup_fn)(void), const char *oldpath,
123*49cdfc7eSAndroid Build Coastguard Worker                  const char *newpath);
124*49cdfc7eSAndroid Build Coastguard Worker 
125*49cdfc7eSAndroid Build Coastguard Worker ssize_t safe_write(const char *file, const int lineno,
126*49cdfc7eSAndroid Build Coastguard Worker 		   void (cleanup_fn)(void), enum safe_write_opts len_strict,
127*49cdfc7eSAndroid Build Coastguard Worker 		   int fildes, const void *buf, size_t nbyte);
128*49cdfc7eSAndroid Build Coastguard Worker 
129*49cdfc7eSAndroid Build Coastguard Worker long safe_strtol(const char *file, const int lineno,
130*49cdfc7eSAndroid Build Coastguard Worker                  void (cleanup_fn)(void), char *str, long min, long max);
131*49cdfc7eSAndroid Build Coastguard Worker 
132*49cdfc7eSAndroid Build Coastguard Worker unsigned long safe_strtoul(const char *file, const int lineno,
133*49cdfc7eSAndroid Build Coastguard Worker                            void (cleanup_fn)(void),
134*49cdfc7eSAndroid Build Coastguard Worker                            char *str, unsigned long min, unsigned long max);
135*49cdfc7eSAndroid Build Coastguard Worker 
136*49cdfc7eSAndroid Build Coastguard Worker float safe_strtof(const char *file, const int lineno,
137*49cdfc7eSAndroid Build Coastguard Worker                  void (cleanup_fn)(void), char *str, float min, float max);
138*49cdfc7eSAndroid Build Coastguard Worker 
139*49cdfc7eSAndroid Build Coastguard Worker long safe_sysconf(const char *file, const int lineno,
140*49cdfc7eSAndroid Build Coastguard Worker 		  void (cleanup_fn)(void), int name);
141*49cdfc7eSAndroid Build Coastguard Worker 
142*49cdfc7eSAndroid Build Coastguard Worker int safe_chmod(const char *file, const int lineno, void (cleanup_fn)(void),
143*49cdfc7eSAndroid Build Coastguard Worker 	       const char *path, mode_t mode);
144*49cdfc7eSAndroid Build Coastguard Worker 
145*49cdfc7eSAndroid Build Coastguard Worker int safe_fchmod(const char *file, const int lineno, void (cleanup_fn)(void),
146*49cdfc7eSAndroid Build Coastguard Worker 	        int fd, mode_t mode);
147*49cdfc7eSAndroid Build Coastguard Worker 
148*49cdfc7eSAndroid Build Coastguard Worker int safe_chown(const char *file, const int lineno, void (cleanup_fn)(void),
149*49cdfc7eSAndroid Build Coastguard Worker                const char *path, uid_t owner, gid_t group);
150*49cdfc7eSAndroid Build Coastguard Worker 
151*49cdfc7eSAndroid Build Coastguard Worker int safe_fchown(const char *file, const int lineno, void (cleanup_fn)(void),
152*49cdfc7eSAndroid Build Coastguard Worker                 int fd, uid_t owner, gid_t group);
153*49cdfc7eSAndroid Build Coastguard Worker 
154*49cdfc7eSAndroid Build Coastguard Worker pid_t safe_wait(const char *file, const int lineno, void (cleanup_fn)(void),
155*49cdfc7eSAndroid Build Coastguard Worker                 int *status);
156*49cdfc7eSAndroid Build Coastguard Worker 
157*49cdfc7eSAndroid Build Coastguard Worker pid_t safe_waitpid(const char *file, const int lineno, void (cleanup_fn)(void),
158*49cdfc7eSAndroid Build Coastguard Worker                    pid_t pid, int *status, int opts);
159*49cdfc7eSAndroid Build Coastguard Worker 
160*49cdfc7eSAndroid Build Coastguard Worker int safe_kill(const char *file, const int lineno, void (cleanup_fn)(void),
161*49cdfc7eSAndroid Build Coastguard Worker               pid_t pid, int sig);
162*49cdfc7eSAndroid Build Coastguard Worker 
163*49cdfc7eSAndroid Build Coastguard Worker void *safe_memalign(const char *file, const int lineno,
164*49cdfc7eSAndroid Build Coastguard Worker 		    void (*cleanup_fn)(void), size_t alignment, size_t size);
165*49cdfc7eSAndroid Build Coastguard Worker 
166*49cdfc7eSAndroid Build Coastguard Worker int safe_mkfifo(const char *file, const int lineno,
167*49cdfc7eSAndroid Build Coastguard Worker 		void (*cleanup_fn)(void), const char *pathname, mode_t mode);
168*49cdfc7eSAndroid Build Coastguard Worker 
169*49cdfc7eSAndroid Build Coastguard Worker int safe_rename(const char *file, const int lineno, void (*cleanup_fn)(void),
170*49cdfc7eSAndroid Build Coastguard Worker 		const char *oldpath, const char *newpath);
171*49cdfc7eSAndroid Build Coastguard Worker 
172*49cdfc7eSAndroid Build Coastguard Worker int safe_mount(const char *file, const int lineno, void (*cleanup_fn)(void),
173*49cdfc7eSAndroid Build Coastguard Worker 	       const char *source, const char *target,
174*49cdfc7eSAndroid Build Coastguard Worker 	       const char *filesystemtype, unsigned long mountflags,
175*49cdfc7eSAndroid Build Coastguard Worker 	       const void *data);
176*49cdfc7eSAndroid Build Coastguard Worker 
177*49cdfc7eSAndroid Build Coastguard Worker int safe_umount(const char *file, const int lineno, void (*cleanup_fn)(void),
178*49cdfc7eSAndroid Build Coastguard Worker 		const char *target);
179*49cdfc7eSAndroid Build Coastguard Worker 
180*49cdfc7eSAndroid Build Coastguard Worker DIR* safe_opendir(const char *file, const int lineno, void (cleanup_fn)(void),
181*49cdfc7eSAndroid Build Coastguard Worker                   const char *name);
182*49cdfc7eSAndroid Build Coastguard Worker 
183*49cdfc7eSAndroid Build Coastguard Worker int safe_closedir(const char *file, const int lineno, void (cleanup_fn)(void),
184*49cdfc7eSAndroid Build Coastguard Worker                   DIR *dirp);
185*49cdfc7eSAndroid Build Coastguard Worker 
186*49cdfc7eSAndroid Build Coastguard Worker struct dirent *safe_readdir(const char *file, const int lineno,
187*49cdfc7eSAndroid Build Coastguard Worker                             void (cleanup_fn)(void),
188*49cdfc7eSAndroid Build Coastguard Worker                             DIR *dirp);
189*49cdfc7eSAndroid Build Coastguard Worker 
190*49cdfc7eSAndroid Build Coastguard Worker DIR* safe_opendir(const char *file, const int lineno,
191*49cdfc7eSAndroid Build Coastguard Worker                   void (cleanup_fn)(void),
192*49cdfc7eSAndroid Build Coastguard Worker                   const char *name);
193*49cdfc7eSAndroid Build Coastguard Worker 
194*49cdfc7eSAndroid Build Coastguard Worker struct dirent *safe_readdir(const char *file, const int lineno,
195*49cdfc7eSAndroid Build Coastguard Worker                             void (cleanup_fn)(void),
196*49cdfc7eSAndroid Build Coastguard Worker                             DIR *dirp);
197*49cdfc7eSAndroid Build Coastguard Worker 
198*49cdfc7eSAndroid Build Coastguard Worker int safe_closedir(const char *file, const int lineno,
199*49cdfc7eSAndroid Build Coastguard Worker                   void (cleanup_fn)(void),
200*49cdfc7eSAndroid Build Coastguard Worker                   DIR *dirp);
201*49cdfc7eSAndroid Build Coastguard Worker 
202*49cdfc7eSAndroid Build Coastguard Worker #endif /* SAFE_MACROS_FN_H__ */
203