191d6742f731f05f627473cb64513988bdcff618cZeng Linggang#define _GNU_SOURCE 2dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <sys/types.h> 3ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <sys/mman.h> 4817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang#include <sys/resource.h> 5dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <sys/stat.h> 6f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis#include <sys/wait.h> 78e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka#include <sys/mount.h> 810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic#include <sys/xattr.h> 99af0bd7b9415ded75fd3f23e727b6115c12aee23Vinson Lee#include <errno.h> 10dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <fcntl.h> 11dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <libgen.h> 12d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang#include <limits.h> 13ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <pwd.h> 14dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <stdarg.h> 15ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <stdlib.h> 16dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <unistd.h> 175ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang#include <malloc.h> 18dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include "test.h" 19ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include "safe_macros.h" 20dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 21354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_basename(const char *file, const int lineno, 22354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (*cleanup_fn) (void), char *path) 23dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 24dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper char *rval; 25dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 26dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = basename(path); 2749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 2849e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 2949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: basename(%s) failed", 3049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, path); 3149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 32dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 3349e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 34dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 35dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 36dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooperint 37354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_chdir(const char *file, const int lineno, void (*cleanup_fn) (void), 38354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao const char *path) 394a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper{ 404a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper int rval; 414a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 424a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper rval = chdir(path); 4349e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 4449e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 4549e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: chdir(%s) failed", 4649e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, path); 4749e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 484a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 4949e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 504a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper} 514a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 524a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooperint 53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_close(const char *file, const int lineno, void (*cleanup_fn) (void), 54354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int fildes) 55dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 56dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 57dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 58dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = close(fildes); 5949e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 6049e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 6149e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: close(%d) failed", 6249e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fildes); 6349e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 64dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 6549e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 66dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 67dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 68dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooperint 69354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_creat(const char *file, const int lineno, void (*cleanup_fn) (void), 705071db5f55b5558bde144a25f2703c9045ebf13bAlexey Kodanev const char *pathname, mode_t mode) 71dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 72dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 73dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 74dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = creat(pathname, mode); 7549e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 7649e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 7749e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: creat(%s,0%o) failed", 7849e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, pathname, mode); 7949e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 80dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 8149e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 82dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 83dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_dirname(const char *file, const int lineno, 85354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (*cleanup_fn) (void), char *path) 86dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 87dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper char *rval; 88dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 89dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = dirname(path); 9049e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 9149e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 9249e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: dirname(%s) failed", 9349e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, path); 9449e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 95dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 9649e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 97dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 98dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_getcwd(const char *file, const int lineno, void (*cleanup_fn) (void), 100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *buf, size_t size) 101ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 102ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper char *rval; 103ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 104ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = getcwd(buf, size); 10549e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 10649e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 10749e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: getcwd(%p,%zu) failed", 10849e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, buf, size); 10949e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 110ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 11149e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 112ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 113ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostruct passwd *safe_getpwnam(const char *file, const int lineno, 115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (*cleanup_fn) (void), const char *name) 116ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 117ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper struct passwd *rval; 118ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 119ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = getpwnam(name); 12049e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 12149e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 12249e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: getpwnam(%s) failed", 12349e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, name); 12449e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 125ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 12649e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 127ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 128ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 129817c7822c72e4601021f612ef1a47849077c6980Caspar Zhangint 130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_getrusage(const char *file, const int lineno, void (*cleanup_fn) (void), 131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int who, struct rusage *usage) 132817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang{ 133817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang int rval; 134817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang 135817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang rval = getrusage(who, usage); 13649e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup_fn, 13849e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: getrusage(%d,%p) failed", 13949e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, who, usage); 14049e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 141817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang 142817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang return rval; 143817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang} 144817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang 145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid *safe_malloc(const char *file, const int lineno, void (*cleanup_fn) (void), 146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao size_t size) 147ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 148ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper void *rval; 149ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 150ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = malloc(size); 15149e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 15249e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 15349e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: malloc(%zu) failed", 15449e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, size); 15549e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 156ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 15749e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 158ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 159ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 16049e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_mkdir(const char *file, const int lineno, void (*cleanup_fn) (void), 16149e8615fd07b150891182e202d356384c8c98416Mats Liljegren const char *pathname, mode_t mode) 1624a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper{ 1634a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper int rval; 1644a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 1654a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper rval = mkdir(pathname, mode); 16649e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 16749e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 16849e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: mkdir(%s,0%o) failed", 16949e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, pathname, mode); 17049e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 1714a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 1724a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper return (rval); 1734a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper} 1744a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 17597499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubisint safe_rmdir(const char *file, const int lineno, void (*cleanup_fn) (void), 17697499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis const char *pathname) 17797499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis{ 17897499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis int rval; 17997499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis 18097499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis rval = rmdir(pathname); 18197499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis if (rval == -1) { 18297499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 18397499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis "%s:%d: rmdir(%s) failed", 18497499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis file, lineno, pathname); 18597499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis } 18697499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis 18797499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis return (rval); 18897499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis} 18997499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis 19049e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_munmap(const char *file, const int lineno, void (*cleanup_fn) (void), 19149e8615fd07b150891182e202d356384c8c98416Mats Liljegren void *addr, size_t length) 192ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 193ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper int rval; 194ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 195ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = munmap(addr, length); 19649e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 19749e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 19849e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: munmap(%p,%zu) failed", 19949e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, addr, length); 20049e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 201ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 20249e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 203ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 204ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 20549e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_open(const char *file, const int lineno, void (*cleanup_fn) (void), 20649e8615fd07b150891182e202d356384c8c98416Mats Liljegren const char *pathname, int oflags, ...) 207dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 208dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper va_list ap; 209dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 210dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper mode_t mode; 211dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 212dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper va_start(ap, oflags); 2131750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson 2141750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson /* Android's NDK's mode_t is smaller than an int, which results in 2151750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson * SIGILL here when passing the mode_t type. 2161750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson */ 2171750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson mode = va_arg(ap, int); 2181750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson 219dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper va_end(ap); 220dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 221dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = open(pathname, oflags, mode); 22249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 22349e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 22449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: open(%s,%d,0%o) failed", 22549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, pathname, oflags, mode); 22649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 227dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 22849e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 229dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 230dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 23149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_pipe(const char *file, const int lineno, void (*cleanup_fn) (void), 23249e8615fd07b150891182e202d356384c8c98416Mats Liljegren int fildes[2]) 233dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 234dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 235dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 236dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = pipe(fildes); 23749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 23849e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 23949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: pipe({%d,%d}) failed", 24049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fildes[0], fildes[1]); 24149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 242dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 24349e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 244dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 245dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 24649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenssize_t safe_read(const char *file, const int lineno, void (*cleanup_fn) (void), 24749e8615fd07b150891182e202d356384c8c98416Mats Liljegren char len_strict, int fildes, void *buf, size_t nbyte) 248dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 249dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper ssize_t rval; 250dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 251dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = read(fildes, buf, nbyte); 25249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1 || (len_strict && (size_t)rval != nbyte)) { 25349e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 25449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: read(%d,%p,%zu) failed, returned %zd", 25549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fildes, buf, nbyte, rval); 25649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 257dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 25849e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 259dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 260dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 26149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setegid(const char *file, const int lineno, void (*cleanup_fn) (void), 26249e8615fd07b150891182e202d356384c8c98416Mats Liljegren gid_t egid) 263400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper{ 264400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper int rval; 265400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 266400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper rval = setegid(egid); 26749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 26849e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 26949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: setegid(%u) failed", 27049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, (unsigned) egid); 27149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 272400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 27349e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 274400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper} 275400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 27649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_seteuid(const char *file, const int lineno, void (*cleanup_fn) (void), 27749e8615fd07b150891182e202d356384c8c98416Mats Liljegren uid_t euid) 278400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper{ 279400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper int rval; 280400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 281400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper rval = seteuid(euid); 28249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 28349e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 28449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: seteuid(%u) failed", 28549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, (unsigned) euid); 28649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 287400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 28849e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 289400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper} 290400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 29149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setgid(const char *file, const int lineno, void (*cleanup_fn) (void), 29249e8615fd07b150891182e202d356384c8c98416Mats Liljegren gid_t gid) 293ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 294ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper int rval; 295ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 296ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = setgid(gid); 29749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 29849e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 29949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: setgid(%u) failed", 30049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, (unsigned) gid); 30149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 302ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 30349e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 304ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 305ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 30649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setuid(const char *file, const int lineno, void (*cleanup_fn) (void), 30749e8615fd07b150891182e202d356384c8c98416Mats Liljegren uid_t uid) 308ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 309ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper int rval; 310ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 311ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = setuid(uid); 31249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 31349e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 31449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: setuid(%u) failed", 31549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, (unsigned) uid); 31649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 317ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 31849e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 319ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 320ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 32191d6742f731f05f627473cb64513988bdcff618cZeng Linggangint safe_getresuid(const char *file, const int lineno, void (*cleanup_fn)(void), 32291d6742f731f05f627473cb64513988bdcff618cZeng Linggang uid_t *ruid, uid_t *euid, uid_t *suid) 32391d6742f731f05f627473cb64513988bdcff618cZeng Linggang{ 32491d6742f731f05f627473cb64513988bdcff618cZeng Linggang int rval; 32591d6742f731f05f627473cb64513988bdcff618cZeng Linggang 32691d6742f731f05f627473cb64513988bdcff618cZeng Linggang rval = getresuid(ruid, euid, suid); 32791d6742f731f05f627473cb64513988bdcff618cZeng Linggang if (rval == -1) { 32891d6742f731f05f627473cb64513988bdcff618cZeng Linggang tst_brkm(TBROK | TERRNO, cleanup_fn, 32991d6742f731f05f627473cb64513988bdcff618cZeng Linggang "%s:%d: getresuid(%p, %p, %p) failed", 33091d6742f731f05f627473cb64513988bdcff618cZeng Linggang file, lineno, ruid, euid, suid); 33191d6742f731f05f627473cb64513988bdcff618cZeng Linggang } 33291d6742f731f05f627473cb64513988bdcff618cZeng Linggang 33391d6742f731f05f627473cb64513988bdcff618cZeng Linggang return rval; 33491d6742f731f05f627473cb64513988bdcff618cZeng Linggang} 33591d6742f731f05f627473cb64513988bdcff618cZeng Linggang 33691d6742f731f05f627473cb64513988bdcff618cZeng Linggangint safe_getresgid(const char *file, const int lineno, void (*cleanup_fn)(void), 33791d6742f731f05f627473cb64513988bdcff618cZeng Linggang gid_t *rgid, gid_t *egid, gid_t *sgid) 33891d6742f731f05f627473cb64513988bdcff618cZeng Linggang{ 33991d6742f731f05f627473cb64513988bdcff618cZeng Linggang int rval; 34091d6742f731f05f627473cb64513988bdcff618cZeng Linggang 34191d6742f731f05f627473cb64513988bdcff618cZeng Linggang rval = getresgid(rgid, egid, sgid); 34291d6742f731f05f627473cb64513988bdcff618cZeng Linggang if (rval == -1) { 34391d6742f731f05f627473cb64513988bdcff618cZeng Linggang tst_brkm(TBROK | TERRNO, cleanup_fn, 34491d6742f731f05f627473cb64513988bdcff618cZeng Linggang "%s:%d: getresgid(%p, %p, %p) failed", 34591d6742f731f05f627473cb64513988bdcff618cZeng Linggang file, lineno, rgid, egid, sgid); 34691d6742f731f05f627473cb64513988bdcff618cZeng Linggang } 34791d6742f731f05f627473cb64513988bdcff618cZeng Linggang 34891d6742f731f05f627473cb64513988bdcff618cZeng Linggang return rval; 34991d6742f731f05f627473cb64513988bdcff618cZeng Linggang} 35091d6742f731f05f627473cb64513988bdcff618cZeng Linggang 35149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_unlink(const char *file, const int lineno, void (*cleanup_fn) (void), 35249e8615fd07b150891182e202d356384c8c98416Mats Liljegren const char *pathname) 353dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 354dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 355dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 356dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = unlink(pathname); 35749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 35849e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 35949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: unlink(%s) failed", 36049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, pathname); 36149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 362dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 36349e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 364dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 365dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 366aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 367aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubisint safe_link(const char *file, const int lineno, 368aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis void (cleanup_fn)(void), const char *oldpath, 369aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis const char *newpath) 370aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis{ 371aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis int rval; 372aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 373aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis rval = link(oldpath, newpath); 374aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 375aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis if (rval == -1) { 376aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 37749e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: link(%s,%s) failed", 37849e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, oldpath, newpath); 379aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis } 380aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 381aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis return rval; 382aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis} 383aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 384f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanevint safe_linkat(const char *file, const int lineno, 385f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev void (cleanup_fn)(void), int olddirfd, const char *oldpath, 386f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev int newdirfd, const char *newpath, int flags) 387f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev{ 388f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev int rval; 389f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev 390f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev rval = linkat(olddirfd, oldpath, newdirfd, newpath, flags); 391f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev 392f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev if (rval == -1) { 393f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev tst_brkm(TBROK | TERRNO, cleanup_fn, 394f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev "%s:%d: linkat(%d,%s,%d,%s,%d) failed", 395f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev file, lineno, olddirfd, oldpath, newdirfd, 396f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev newpath, flags); 397f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev } 398f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev 399f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev return rval; 400f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev} 401f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev 4028bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanevssize_t safe_readlink(const char *file, const int lineno, 4038bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev void (cleanup_fn)(void), const char *path, 4048bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev char *buf, size_t bufsize) 4058bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev{ 4068bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev ssize_t rval; 4078bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev 4088bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev rval = readlink(path, buf, bufsize); 4098bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev 4108bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev if (rval == -1) { 4118bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev tst_brkm(TBROK | TERRNO, cleanup_fn, 4128bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev "%s:%d: readlink(%s,%p,%zu) failed", 4138bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev file, lineno, path, buf, bufsize); 414bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller } else { 415bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller /* readlink does not append a NUL byte to the buffer. 416bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller * Add it now. */ 417bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller if ((size_t) rval < bufsize) 418bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller buf[rval] = '\0'; 419bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller else 420bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller buf[bufsize-1] = '\0'; 4218bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev } 4228bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev 4238bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev return rval; 4248bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev} 4258bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev 426aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubisint safe_symlink(const char *file, const int lineno, 427aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis void (cleanup_fn)(void), const char *oldpath, 428aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis const char *newpath) 429aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis{ 430aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis int rval; 431aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 432aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis rval = symlink(oldpath, newpath); 433aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 434aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis if (rval == -1) { 435aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 43649e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: symlink(%s,%s) failed", 43749e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, oldpath, newpath); 438aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis } 439aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 440aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis return rval; 441aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis} 442aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 44349e8615fd07b150891182e202d356384c8c98416Mats Liljegrenssize_t safe_write(const char *file, const int lineno, void (cleanup_fn) (void), 44449e8615fd07b150891182e202d356384c8c98416Mats Liljegren char len_strict, int fildes, const void *buf, size_t nbyte) 445dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 446dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper ssize_t rval; 447dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 448dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = write(fildes, buf, nbyte); 449f3f10e027a28a941575802980faacd31aa8edf86Guangwen Feng if (rval == -1 || (len_strict && (size_t)rval != nbyte)) { 45049e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 45149e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: write(%d,%p,%zu) failed", 45249e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fildes, buf, rval); 45349e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 454dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 45549e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 456dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 4573f75fe43de08028ae130bce108103e888ade839bCyril Hrubis 458d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhanglong safe_strtol(const char *file, const int lineno, 459354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (cleanup_fn) (void), char *str, long min, long max) 460d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang{ 461d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang long rval; 462d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang char *endptr; 463d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang 464d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang errno = 0; 465d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang rval = strtol(str, &endptr, 10); 46649e8615fd07b150891182e202d356384c8c98416Mats Liljegren 467d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang if ((errno == ERANGE && (rval == LONG_MAX || rval == LONG_MIN)) 46849e8615fd07b150891182e202d356384c8c98416Mats Liljegren || (errno != 0 && rval == 0)) { 469354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup_fn, 47049e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtol(%s) failed", file, lineno, str); 471d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis return rval; 47249e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 47349e8615fd07b150891182e202d356384c8c98416Mats Liljegren 47449e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (endptr == str || (*endptr != '\0' && *endptr != '\n')) { 475d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang tst_brkm(TBROK, cleanup_fn, 47649e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtol(%s): Invalid value", file, lineno, str); 477d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis return 0; 47849e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 47949e8615fd07b150891182e202d356384c8c98416Mats Liljegren 48049e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval > max || rval < min) { 481d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang tst_brkm(TBROK, cleanup_fn, 48249e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtol(%s): %ld is out of range %ld - %ld", 48349e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, str, rval, min, max); 484d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis return 0; 48549e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 486d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang 487d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang return rval; 488d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang} 4892b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu 490354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaounsigned long safe_strtoul(const char *file, const int lineno, 491354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (cleanup_fn) (void), char *str, 492354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao unsigned long min, unsigned long max) 4932b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu{ 4942b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu unsigned long rval; 4952b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu char *endptr; 4962b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu 4972b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu errno = 0; 4982b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu rval = strtoul(str, &endptr, 10); 49949e8615fd07b150891182e202d356384c8c98416Mats Liljegren 5002b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu if ((errno == ERANGE && rval == ULONG_MAX) 50149e8615fd07b150891182e202d356384c8c98416Mats Liljegren || (errno != 0 && rval == 0)) { 502354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup_fn, 50349e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtoul(%s) failed", file, lineno, str); 504d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis return rval; 50549e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 50649e8615fd07b150891182e202d356384c8c98416Mats Liljegren 50749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval > max || rval < min) { 5082b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu tst_brkm(TBROK, cleanup_fn, 50949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtoul(%s): %lu is out of range %lu - %lu", 51049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, str, rval, min, max); 511d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis return 0; 51249e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 51349e8615fd07b150891182e202d356384c8c98416Mats Liljegren 51449e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (endptr == str || (*endptr != '\0' && *endptr != '\n')) { 5152b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu tst_brkm(TBROK, cleanup_fn, 516354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Invalid value: '%s' at %s:%d", str, file, lineno); 517d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis return 0; 51849e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 5192b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu 5202b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu return rval; 5212b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu} 5223b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao 5233b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gaolong safe_sysconf(const char *file, const int lineno, 524354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (cleanup_fn) (void), int name) 5253b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao{ 5263b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao long rval; 5273b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao errno = 0; 5283b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao 5293b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao rval = sysconf(name); 5303b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao 5313b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao if (rval == -1) { 53249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (errno) { 533354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup_fn, 53449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: sysconf(%d) failed", 53549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, name); 53649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } else { 53749e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_resm(TINFO, "%s:%d: sysconf(%d): " 53849e8615fd07b150891182e202d356384c8c98416Mats Liljegren "queried option is not available" 53949e8615fd07b150891182e202d356384c8c98416Mats Liljegren " or there is no definite limit", 54049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, name); 54149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 5423b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao } 5433b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao 5443b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao return rval; 5453b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao} 5461030c9d2c5264e6b1422e8c58ed92f89c66dc51aZeng Linggang 547c45923544542e125a89e420c5ed40388bb20751eCyril Hrubisint safe_chmod(const char *file, const int lineno, 548c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis void (cleanup_fn)(void), const char *path, mode_t mode) 549c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis{ 550c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis int rval; 551c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 552c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis rval = chmod(path, mode); 553c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 554c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis if (rval == -1) { 555c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 55649e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: chmod(%s,0%o) failed", 55749e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, path, mode); 558c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis } 559c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 560c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis return rval; 561c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis} 562c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 563c45923544542e125a89e420c5ed40388bb20751eCyril Hrubisint safe_fchmod(const char *file, const int lineno, 564c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis void (cleanup_fn)(void), int fd, mode_t mode) 565c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis{ 566c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis int rval; 567c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 568c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis rval = fchmod(fd, mode); 569c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 570c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis if (rval == -1) { 571c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 57249e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: fchmod(%d,0%o) failed", 57349e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fd, mode); 574c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis } 575c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 576c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis return rval; 577c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis} 578f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 57992a14596c5e157dfbcb610393d4abba4757d9f90Xing Guint safe_chown(const char *file, const int lineno, void (cleanup_fn)(void), 58092a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu const char *path, uid_t owner, gid_t group) 58192a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu{ 58292a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu int rval; 58392a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu 58492a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu rval = chown(path, owner, group); 58592a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu 58692a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu if (rval == -1) { 58792a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu tst_brkm(TBROK | TERRNO, cleanup_fn, 58892a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu "%s:%d: chown(%s,%d,%d) failed", 58992a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu file, lineno, path, owner, group); 59092a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu } 59192a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu 59292a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu return rval; 59392a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu} 59434ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 59534ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubisint safe_fchown(const char *file, const int lineno, void (cleanup_fn)(void), 59634ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis int fd, uid_t owner, gid_t group) 59734ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis{ 59834ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis int rval; 59934ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 60034ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis rval = fchown(fd, owner, group); 60134ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 60234ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis if (rval == -1) { 60334ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 60434ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis "%s:%d: fchown(%d,%d,%d) failed", 60534ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis file, lineno, fd, owner, group); 60634ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis } 60734ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 60834ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis return rval; 60934ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis} 61034ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 611f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubispid_t safe_wait(const char *file, const int lineno, void (cleanup_fn)(void), 612f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis int *status) 613f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis{ 614f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis pid_t rval; 615f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 616f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis rval = wait(status); 617f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis if (rval == -1) { 618f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 619f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis "%s:%d: wait(%p) failed", 620f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis file, lineno, status); 621f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis } 622f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 623f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis return rval; 624f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis} 625f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 626f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubispid_t safe_waitpid(const char *file, const int lineno, void (cleanup_fn)(void), 627f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis pid_t pid, int *status, int opts) 628f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis{ 629f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis pid_t rval; 630f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 631f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis rval = waitpid(pid, status, opts); 632f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis if (rval == -1) { 633f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 634f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis "%s:%d: waitpid(%d,%p,%d) failed", 635f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis file, lineno, pid, status, opts); 636f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis } 637f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 638f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis return rval; 639f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis} 6405ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang 6415ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggangvoid *safe_memalign(const char *file, const int lineno, 6425ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang void (*cleanup_fn) (void), size_t alignment, size_t size) 6435ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang{ 6445ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang void *rval; 6455ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang 6465ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang rval = memalign(alignment, size); 6475ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang if (rval == NULL) 6485ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang tst_brkm(TBROK | TERRNO, cleanup_fn, "memalign failed at %s:%d", 6495ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang file, lineno); 6505ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang 6515ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang return rval; 6525ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang} 6536deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang 6546deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wangint safe_kill(const char *file, const int lineno, void (cleanup_fn)(void), 6556deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang pid_t pid, int sig) 6566deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang{ 6576deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang int rval; 6586deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang 6596deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang rval = kill(pid, sig); 6606deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang 6616deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang if (rval == -1) { 6626deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang tst_brkm(TBROK | TERRNO, cleanup_fn, 6636deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang "%s:%d: kill(%d,%s) failed", 6646deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang file, lineno, pid, tst_strsig(sig)); 6656deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang } 6666deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang 6676deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang return rval; 6686deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang} 6693a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis 6703a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubisint safe_mkfifo(const char *file, const int lineno, 6713a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis void (*cleanup_fn)(void), const char *pathname, mode_t mode) 6723a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis{ 6733a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis int rval; 6743a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis 6753a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis rval = mkfifo(pathname, mode); 6763a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis 6773a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis if (rval == -1) { 6783a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 6793a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis "%s:%d: mkfifo(%s, 0%o) failed", 6803a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis file, lineno, pathname, mode); 6813a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis } 6823a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis 6833a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis return rval; 6843a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis} 685f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang 686f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wangint safe_rename(const char *file, const int lineno, void (*cleanup_fn)(void), 687f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang const char *oldpath, const char *newpath) 688f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang{ 689f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang int rval; 690f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang 691f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang rval = rename(oldpath, newpath); 692f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang 693f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang if (rval == -1) { 694f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang tst_brkm(TBROK | TERRNO, cleanup_fn, 695f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang "%s:%d: rename(%s, %s) failed", 696f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang file, lineno, oldpath, newpath); 697f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang } 698f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang 699f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang return rval; 700f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang} 7018e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7028e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefkaint safe_mount(const char *file, const int lineno, void (*cleanup_fn)(void), 7038e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka const char *source, const char *target, 7048e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka const char *filesystemtype, unsigned long mountflags, 7058e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka const void *data) 7068e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka{ 7078e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka int rval; 7088e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7098e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka rval = mount(source, target, filesystemtype, mountflags, data); 7108e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7118e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka if (rval == -1) { 7128e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka tst_brkm(TBROK | TERRNO, cleanup_fn, 7138e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka "%s:%d: mount(%s, %s, %s, %lu, %p) failed", 7148e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka file, lineno, source, target, filesystemtype, 7158e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka mountflags, data); 7168e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka } 7178e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7188e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka return rval; 7198e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka} 7208e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7218e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefkaint safe_umount(const char *file, const int lineno, void (*cleanup_fn)(void), 7228e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka const char *target) 7238e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka{ 7248e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka int rval; 7258e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7268e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka rval = umount(target); 7278e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7288e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka if (rval == -1) { 7298e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka tst_brkm(TBROK | TERRNO, cleanup_fn, 7308e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka "%s:%d: umount(%s) failed", 7318e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka file, lineno, target); 7328e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka } 7338e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7348e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka return rval; 7358e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka} 7369138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7379138a0184105389aad4aeae89dc1331829d7d2cbCyril HrubisDIR* safe_opendir(const char *file, const int lineno, void (cleanup_fn)(void), 7389138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis const char *name) 7399138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{ 7409138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis DIR *rval; 7419138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7429138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis rval = opendir(name); 7439138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7449138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis if (!rval) { 7459138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 7469138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis "%s:%d: opendir(%s) failed", file, lineno, name); 7479138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis } 7489138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7499138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis return rval; 7509138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis} 7519138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7529138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubisint safe_closedir(const char *file, const int lineno, void (cleanup_fn)(void), 7539138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis DIR *dirp) 7549138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{ 7559138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis int rval; 7569138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7579138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis rval = closedir(dirp); 7589138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7599138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis if (rval) { 7609138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 7619138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis "%s:%d: closedir(%p) failed", file, lineno, dirp); 7629138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis } 7639138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7649138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis return rval; 7659138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis} 7669138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7679138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubisstruct dirent *safe_readdir(const char *file, const int lineno, void (cleanup_fn)(void), 7689138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis DIR *dirp) 7699138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{ 7709138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis struct dirent *rval; 7719138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis int err = errno; 7729138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7739138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis errno = 0; 7749138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis rval = readdir(dirp); 7759138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7769138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis if (!rval && errno) { 7779138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 7789138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis "%s:%d: readdir(%p) failed", file, lineno, dirp); 7799138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis } 7809138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7819138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis errno = err; 7829138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis return rval; 7839138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis} 784af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis 785af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubisint safe_getpriority(const char *file, const int lineno, int which, id_t who) 786af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis{ 787af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis int rval, err = errno; 788af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis 789af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis errno = 0; 790af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis rval = getpriority(which, who); 791af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis if (errno) { 792af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis tst_brkm(TBROK | TERRNO, NULL, 793af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis "%s:%d getpriority(%i, %i) failed", 794af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis file, lineno, which, who); 795af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis } 796af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis 797af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis errno = err; 798af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis return rval; 799af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis} 80010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 80110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevicint safe_setxattr(const char *file, const int lineno, const char *path, 80210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic const char *name, const void *value, size_t size, int flags) 80310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic{ 80410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic int rval; 80510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 80610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic rval = setxattr(path, name, value, size, flags); 80710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 80810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic if (rval) { 80910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic if (errno == ENOTSUP) { 81010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic tst_brkm(TCONF, NULL, 81110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic "%s:%d: no xattr support in fs or mounted " 81210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic "without user_xattr option", file, lineno); 81310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic } 81410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 81510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic tst_brkm(TBROK | TERRNO, NULL, "%s:%d: setxattr() failed", 81610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic file, lineno); 81710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic } 81810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 81910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic return rval; 82010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic} 82110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 82210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevicint safe_lsetxattr(const char *file, const int lineno, const char *path, 82310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic const char *name, const void *value, size_t size, int flags) 82410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic{ 82510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic int rval; 82610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 82710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic rval = lsetxattr(path, name, value, size, flags); 82810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 82910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic if (rval) { 83010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic if (errno == ENOTSUP) { 83110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic tst_brkm(TCONF, NULL, 83210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic "%s:%d: no xattr support in fs or mounted " 83310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic "without user_xattr option", file, lineno); 83410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic } 83510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 83610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic tst_brkm(TBROK | TERRNO, NULL, "%s:%d: lsetxattr() failed", 83710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic file, lineno); 83810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic } 83910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 84010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic return rval; 84110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic} 84210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 84310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevicint safe_fsetxattr(const char *file, const int lineno, int fd, const char *name, 84410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic const void *value, size_t size, int flags) 84510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic{ 84610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic int rval; 84710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 84810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic rval = fsetxattr(fd, name, value, size, flags); 84910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 85010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic if (rval) { 85110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic if (errno == ENOTSUP) { 85210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic tst_brkm(TCONF, NULL, 85310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic "%s:%d: no xattr support in fs or mounted " 85410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic "without user_xattr option", file, lineno); 85510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic } 85610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 85710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic tst_brkm(TBROK | TERRNO, NULL, "%s:%d: fsetxattr() failed", 85810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic file, lineno); 85910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic } 86010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic 86110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic return rval; 86210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic} 863c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang 864c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yangint safe_removexattr(const char *file, const int lineno, const char *path, 865c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang const char *name) 866c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang{ 867c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang int rval; 868c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang 869c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang rval = removexattr(path, name); 870c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang 871c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang if (rval) { 872c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang if (errno == ENOTSUP) { 873c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang tst_brkm(TCONF, NULL, 874c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang "%s:%d: no xattr support in fs or mounted " 875c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang "without user_xattr option", file, lineno); 876c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang } 877c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang 878c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang tst_brkm(TBROK | TERRNO, NULL, "%s:%d: removexattr() failed", 879c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang file, lineno); 880c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang } 881c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang 882c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang return rval; 883c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang} 88415d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang 88515d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yangint safe_fsync(const char *file, const int lineno, int fd) 88615d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang{ 88715d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang int rval; 88815d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang 88915d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang rval = fsync(fd); 89015d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang 89115d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang if (rval) { 89215d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang tst_brkm(TBROK | TERRNO, NULL, 89315d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang "%s:%d: fsync(%i) failed", file, lineno, fd); 89415d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang } 89515d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang 89615d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang return rval; 89715d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang} 898