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