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> 89af0bd7b9415ded75fd3f23e727b6115c12aee23Vinson Lee#include <errno.h> 9dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <fcntl.h> 10dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <libgen.h> 11d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang#include <limits.h> 12ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <pwd.h> 13dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <stdarg.h> 14ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <stdlib.h> 15dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <unistd.h> 165ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang#include <malloc.h> 17dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include "test.h" 18ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include "safe_macros.h" 19dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 20354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_basename(const char *file, const int lineno, 21354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (*cleanup_fn) (void), char *path) 22dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 23dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper char *rval; 24dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 25dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = basename(path); 2649e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 2749e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 2849e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: basename(%s) failed", 2949e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, path); 3049e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 31dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 3249e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 33dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 34dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 35dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooperint 36354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_chdir(const char *file, const int lineno, void (*cleanup_fn) (void), 37354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao const char *path) 384a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper{ 394a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper int rval; 404a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 414a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper rval = chdir(path); 4249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 4349e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 4449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: chdir(%s) failed", 4549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, path); 4649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 474a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 4849e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 494a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper} 504a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 514a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooperint 52354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_close(const char *file, const int lineno, void (*cleanup_fn) (void), 53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int fildes) 54dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 55dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 56dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 57dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = close(fildes); 5849e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 5949e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 6049e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: close(%d) failed", 6149e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fildes); 6249e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 63dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 6449e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 65dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 66dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 67dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooperint 68354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_creat(const char *file, const int lineno, void (*cleanup_fn) (void), 695071db5f55b5558bde144a25f2703c9045ebf13bAlexey Kodanev const char *pathname, mode_t mode) 70dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 71dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 72dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 73dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = creat(pathname, mode); 7449e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 7549e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 7649e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: creat(%s,0%o) failed", 7749e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, pathname, mode); 7849e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 79dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 8049e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 81dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 82dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_dirname(const char *file, const int lineno, 84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (*cleanup_fn) (void), char *path) 85dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 86dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper char *rval; 87dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 88dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = dirname(path); 8949e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 9049e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 9149e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: dirname(%s) failed", 9249e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, path); 9349e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 94dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 9549e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 96dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 97dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_getcwd(const char *file, const int lineno, void (*cleanup_fn) (void), 99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *buf, size_t size) 100ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 101ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper char *rval; 102ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 103ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = getcwd(buf, size); 10449e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 10549e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 10649e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: getcwd(%p,%zu) failed", 10749e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, buf, size); 10849e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 109ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 11049e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 111ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 112ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostruct passwd *safe_getpwnam(const char *file, const int lineno, 114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (*cleanup_fn) (void), const char *name) 115ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 116ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper struct passwd *rval; 117ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 118ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = getpwnam(name); 11949e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 12049e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 12149e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: getpwnam(%s) failed", 12249e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, name); 12349e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 124ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 12549e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 126ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 127ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 128817c7822c72e4601021f612ef1a47849077c6980Caspar Zhangint 129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_getrusage(const char *file, const int lineno, void (*cleanup_fn) (void), 130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int who, struct rusage *usage) 131817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang{ 132817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang int rval; 133817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang 134817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang rval = getrusage(who, usage); 13549e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup_fn, 13749e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: getrusage(%d,%p) failed", 13849e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, who, usage); 13949e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 140817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang 141817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang return rval; 142817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang} 143817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang 144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid *safe_malloc(const char *file, const int lineno, void (*cleanup_fn) (void), 145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao size_t size) 146ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 147ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper void *rval; 148ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 149ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = malloc(size); 15049e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == NULL) { 15149e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 15249e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: malloc(%zu) failed", 15349e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, size); 15449e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 155ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 15649e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 157ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 158ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 15949e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_mkdir(const char *file, const int lineno, void (*cleanup_fn) (void), 16049e8615fd07b150891182e202d356384c8c98416Mats Liljegren const char *pathname, mode_t mode) 1614a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper{ 1624a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper int rval; 1634a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 1644a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper rval = mkdir(pathname, mode); 16549e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 16649e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 16749e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: mkdir(%s,0%o) failed", 16849e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, pathname, mode); 16949e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 1704a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 1714a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper return (rval); 1724a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper} 1734a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper 17497499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubisint safe_rmdir(const char *file, const int lineno, void (*cleanup_fn) (void), 17597499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis const char *pathname) 17697499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis{ 17797499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis int rval; 17897499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis 17997499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis rval = rmdir(pathname); 18097499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis if (rval == -1) { 18197499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 18297499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis "%s:%d: rmdir(%s) failed", 18397499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis file, lineno, pathname); 18497499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis } 18597499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis 18697499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis return (rval); 18797499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis} 18897499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis 18949e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_munmap(const char *file, const int lineno, void (*cleanup_fn) (void), 19049e8615fd07b150891182e202d356384c8c98416Mats Liljegren void *addr, size_t length) 191ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 192ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper int rval; 193ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 194ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = munmap(addr, length); 19549e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 19649e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 19749e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: munmap(%p,%zu) failed", 19849e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, addr, length); 19949e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 200ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 20149e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 202ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 203ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 20449e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_open(const char *file, const int lineno, void (*cleanup_fn) (void), 20549e8615fd07b150891182e202d356384c8c98416Mats Liljegren const char *pathname, int oflags, ...) 206dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 207dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper va_list ap; 208dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 209dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper mode_t mode; 210dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 211dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper va_start(ap, oflags); 212dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper mode = va_arg(ap, mode_t); 213dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper va_end(ap); 214dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 215dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = open(pathname, oflags, mode); 21649e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 21749e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 21849e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: open(%s,%d,0%o) failed", 21949e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, pathname, oflags, mode); 22049e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 221dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 22249e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 223dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 224dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 22549e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_pipe(const char *file, const int lineno, void (*cleanup_fn) (void), 22649e8615fd07b150891182e202d356384c8c98416Mats Liljegren int fildes[2]) 227dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 228dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 229dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 230dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = pipe(fildes); 23149e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 23249e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 23349e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: pipe({%d,%d}) failed", 23449e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fildes[0], fildes[1]); 23549e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 236dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 23749e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 238dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 239dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 24049e8615fd07b150891182e202d356384c8c98416Mats Liljegrenssize_t safe_read(const char *file, const int lineno, void (*cleanup_fn) (void), 24149e8615fd07b150891182e202d356384c8c98416Mats Liljegren char len_strict, int fildes, void *buf, size_t nbyte) 242dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 243dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper ssize_t rval; 244dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 245dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = read(fildes, buf, nbyte); 24649e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1 || (len_strict && (size_t)rval != nbyte)) { 24749e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 24849e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: read(%d,%p,%zu) failed, returned %zd", 24949e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fildes, buf, nbyte, rval); 25049e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 251dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 25249e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 253dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 254dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 25534e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wangssize_t safe_pread(const char *file, const int lineno, void (*cleanup_fn)(void), 25634e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang char len_strict, int fildes, void *buf, size_t nbyte, 25734e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang off_t offset) 25834e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang{ 25934e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang ssize_t rval; 26034e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang 26134e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang rval = pread(fildes, buf, nbyte, offset); 26234e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang if (rval == -1 || (len_strict && (size_t)rval != nbyte)) { 26334e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang tst_brkm(TBROK | TERRNO, cleanup_fn, 26434e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang "%s:%d: read(%d,%p,%zu,%ld) failed, returned %zd", 26534e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang file, lineno, fildes, buf, nbyte, offset, rval); 26634e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang } 26734e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang 26834e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang return rval; 26934e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang} 27034e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang 27149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setegid(const char *file, const int lineno, void (*cleanup_fn) (void), 27249e8615fd07b150891182e202d356384c8c98416Mats Liljegren gid_t egid) 273400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper{ 274400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper int rval; 275400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 276400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper rval = setegid(egid); 27749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 27849e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 27949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: setegid(%u) failed", 28049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, (unsigned) egid); 28149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 282400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 28349e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 284400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper} 285400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 28649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_seteuid(const char *file, const int lineno, void (*cleanup_fn) (void), 28749e8615fd07b150891182e202d356384c8c98416Mats Liljegren uid_t euid) 288400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper{ 289400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper int rval; 290400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 291400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper rval = seteuid(euid); 29249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 29349e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 29449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: seteuid(%u) failed", 29549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, (unsigned) euid); 29649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 297400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 29849e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 299400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper} 300400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper 30149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setgid(const char *file, const int lineno, void (*cleanup_fn) (void), 30249e8615fd07b150891182e202d356384c8c98416Mats Liljegren gid_t gid) 303ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 304ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper int rval; 305ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 306ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = setgid(gid); 30749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 30849e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 30949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: setgid(%u) failed", 31049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, (unsigned) gid); 31149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 312ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 31349e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 314ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 315ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 31649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setuid(const char *file, const int lineno, void (*cleanup_fn) (void), 31749e8615fd07b150891182e202d356384c8c98416Mats Liljegren uid_t uid) 318ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{ 319ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper int rval; 320ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 321ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper rval = setuid(uid); 32249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 32349e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 32449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: setuid(%u) failed", 32549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, (unsigned) uid); 32649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 327ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 32849e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 329ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper} 330ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper 33191d6742f731f05f627473cb64513988bdcff618cZeng Linggangint safe_getresuid(const char *file, const int lineno, void (*cleanup_fn)(void), 33291d6742f731f05f627473cb64513988bdcff618cZeng Linggang uid_t *ruid, uid_t *euid, uid_t *suid) 33391d6742f731f05f627473cb64513988bdcff618cZeng Linggang{ 33491d6742f731f05f627473cb64513988bdcff618cZeng Linggang int rval; 33591d6742f731f05f627473cb64513988bdcff618cZeng Linggang 33691d6742f731f05f627473cb64513988bdcff618cZeng Linggang rval = getresuid(ruid, euid, suid); 33791d6742f731f05f627473cb64513988bdcff618cZeng Linggang if (rval == -1) { 33891d6742f731f05f627473cb64513988bdcff618cZeng Linggang tst_brkm(TBROK | TERRNO, cleanup_fn, 33991d6742f731f05f627473cb64513988bdcff618cZeng Linggang "%s:%d: getresuid(%p, %p, %p) failed", 34091d6742f731f05f627473cb64513988bdcff618cZeng Linggang file, lineno, ruid, euid, suid); 34191d6742f731f05f627473cb64513988bdcff618cZeng Linggang } 34291d6742f731f05f627473cb64513988bdcff618cZeng Linggang 34391d6742f731f05f627473cb64513988bdcff618cZeng Linggang return rval; 34491d6742f731f05f627473cb64513988bdcff618cZeng Linggang} 34591d6742f731f05f627473cb64513988bdcff618cZeng Linggang 34691d6742f731f05f627473cb64513988bdcff618cZeng Linggangint safe_getresgid(const char *file, const int lineno, void (*cleanup_fn)(void), 34791d6742f731f05f627473cb64513988bdcff618cZeng Linggang gid_t *rgid, gid_t *egid, gid_t *sgid) 34891d6742f731f05f627473cb64513988bdcff618cZeng Linggang{ 34991d6742f731f05f627473cb64513988bdcff618cZeng Linggang int rval; 35091d6742f731f05f627473cb64513988bdcff618cZeng Linggang 35191d6742f731f05f627473cb64513988bdcff618cZeng Linggang rval = getresgid(rgid, egid, sgid); 35291d6742f731f05f627473cb64513988bdcff618cZeng Linggang if (rval == -1) { 35391d6742f731f05f627473cb64513988bdcff618cZeng Linggang tst_brkm(TBROK | TERRNO, cleanup_fn, 35491d6742f731f05f627473cb64513988bdcff618cZeng Linggang "%s:%d: getresgid(%p, %p, %p) failed", 35591d6742f731f05f627473cb64513988bdcff618cZeng Linggang file, lineno, rgid, egid, sgid); 35691d6742f731f05f627473cb64513988bdcff618cZeng Linggang } 35791d6742f731f05f627473cb64513988bdcff618cZeng Linggang 35891d6742f731f05f627473cb64513988bdcff618cZeng Linggang return rval; 35991d6742f731f05f627473cb64513988bdcff618cZeng Linggang} 36091d6742f731f05f627473cb64513988bdcff618cZeng Linggang 36149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_unlink(const char *file, const int lineno, void (*cleanup_fn) (void), 36249e8615fd07b150891182e202d356384c8c98416Mats Liljegren const char *pathname) 363dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 364dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper int rval; 365dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 366dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = unlink(pathname); 36749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval == -1) { 36849e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 36949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: unlink(%s) failed", 37049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, pathname); 37149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 372dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 37349e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 374dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 375dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 376aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 377aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubisint safe_link(const char *file, const int lineno, 378aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis void (cleanup_fn)(void), const char *oldpath, 379aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis const char *newpath) 380aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis{ 381aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis int rval; 382aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 383aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis rval = link(oldpath, newpath); 384aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 385aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis if (rval == -1) { 386aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 38749e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: link(%s,%s) failed", 38849e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, oldpath, newpath); 389aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis } 390aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 391aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis return rval; 392aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis} 393aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 394f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanevint safe_linkat(const char *file, const int lineno, 395f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev void (cleanup_fn)(void), int olddirfd, const char *oldpath, 396f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev int newdirfd, const char *newpath, int flags) 397f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev{ 398f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev int rval; 399f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev 400f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev rval = linkat(olddirfd, oldpath, newdirfd, newpath, flags); 401f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev 402f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev if (rval == -1) { 403f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev tst_brkm(TBROK | TERRNO, cleanup_fn, 404f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev "%s:%d: linkat(%d,%s,%d,%s,%d) failed", 405f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev file, lineno, olddirfd, oldpath, newdirfd, 406f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev newpath, flags); 407f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev } 408f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev 409f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev return rval; 410f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev} 411f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev 4128bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanevssize_t safe_readlink(const char *file, const int lineno, 4138bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev void (cleanup_fn)(void), const char *path, 4148bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev char *buf, size_t bufsize) 4158bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev{ 4168bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev ssize_t rval; 4178bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev 4188bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev rval = readlink(path, buf, bufsize); 4198bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev 4208bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev if (rval == -1) { 4218bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev tst_brkm(TBROK | TERRNO, cleanup_fn, 4228bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev "%s:%d: readlink(%s,%p,%zu) failed", 4238bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev file, lineno, path, buf, bufsize); 4248bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev } 4258bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev 4268bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev return rval; 4278bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev} 4288bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev 429aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubisint safe_symlink(const char *file, const int lineno, 430aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis void (cleanup_fn)(void), const char *oldpath, 431aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis const char *newpath) 432aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis{ 433aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis int rval; 434aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 435aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis rval = symlink(oldpath, newpath); 436aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 437aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis if (rval == -1) { 438aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 43949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: symlink(%s,%s) failed", 44049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, oldpath, newpath); 441aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis } 442aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 443aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis return rval; 444aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis} 445aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis 44649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenssize_t safe_write(const char *file, const int lineno, void (cleanup_fn) (void), 44749e8615fd07b150891182e202d356384c8c98416Mats Liljegren char len_strict, int fildes, const void *buf, size_t nbyte) 448dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{ 449dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper ssize_t rval; 450dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 451dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper rval = write(fildes, buf, nbyte); 452f3f10e027a28a941575802980faacd31aa8edf86Guangwen Feng if (rval == -1 || (len_strict && (size_t)rval != nbyte)) { 45349e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_brkm(TBROK | TERRNO, cleanup_fn, 45449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: write(%d,%p,%zu) failed", 45549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fildes, buf, rval); 45649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 457dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper 45849e8615fd07b150891182e202d356384c8c98416Mats Liljegren return rval; 459dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper} 4603f75fe43de08028ae130bce108103e888ade839bCyril Hrubis 46134e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wangssize_t safe_pwrite(const char *file, const int lineno, 46234e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang void (cleanup_fn) (void), char len_strict, int fildes, 46334e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang const void *buf, size_t nbyte, off_t offset) 46434e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang{ 46534e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang ssize_t rval; 46634e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang 46734e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang rval = pwrite(fildes, buf, nbyte, offset); 468f3f10e027a28a941575802980faacd31aa8edf86Guangwen Feng if (rval == -1 || (len_strict && (size_t)rval != nbyte)) { 46934e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang tst_brkm(TBROK | TERRNO, cleanup_fn, 47034e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang "%s:%d: pwrite(%d,%p,%zu,%ld) failed", 47134e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang file, lineno, fildes, buf, rval, offset); 47234e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang } 47334e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang 47434e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang return rval; 47534e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang} 47634e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang 477d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhanglong safe_strtol(const char *file, const int lineno, 478354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (cleanup_fn) (void), char *str, long min, long max) 479d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang{ 480d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang long rval; 481d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang char *endptr; 482d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang 483d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang errno = 0; 484d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang rval = strtol(str, &endptr, 10); 48549e8615fd07b150891182e202d356384c8c98416Mats Liljegren 486d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang if ((errno == ERANGE && (rval == LONG_MAX || rval == LONG_MIN)) 48749e8615fd07b150891182e202d356384c8c98416Mats Liljegren || (errno != 0 && rval == 0)) { 488354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup_fn, 48949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtol(%s) failed", file, lineno, str); 49049e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 49149e8615fd07b150891182e202d356384c8c98416Mats Liljegren 49249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (endptr == str || (*endptr != '\0' && *endptr != '\n')) { 493d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang tst_brkm(TBROK, cleanup_fn, 49449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtol(%s): Invalid value", file, lineno, str); 49549e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 49649e8615fd07b150891182e202d356384c8c98416Mats Liljegren 49749e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval > max || rval < min) { 498d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang tst_brkm(TBROK, cleanup_fn, 49949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtol(%s): %ld is out of range %ld - %ld", 50049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, str, rval, min, max); 50149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 502d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang 503d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang return rval; 504d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang} 5052b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu 506354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaounsigned long safe_strtoul(const char *file, const int lineno, 507354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (cleanup_fn) (void), char *str, 508354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao unsigned long min, unsigned long max) 5092b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu{ 5102b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu unsigned long rval; 5112b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu char *endptr; 5122b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu 5132b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu errno = 0; 5142b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu rval = strtoul(str, &endptr, 10); 51549e8615fd07b150891182e202d356384c8c98416Mats Liljegren 5162b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu if ((errno == ERANGE && rval == ULONG_MAX) 51749e8615fd07b150891182e202d356384c8c98416Mats Liljegren || (errno != 0 && rval == 0)) { 518354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup_fn, 51949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtoul(%s) failed", file, lineno, str); 52049e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 52149e8615fd07b150891182e202d356384c8c98416Mats Liljegren 52249e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (rval > max || rval < min) { 5232b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu tst_brkm(TBROK, cleanup_fn, 52449e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: strtoul(%s): %lu is out of range %lu - %lu", 52549e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, str, rval, min, max); 52649e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 52749e8615fd07b150891182e202d356384c8c98416Mats Liljegren 52849e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (endptr == str || (*endptr != '\0' && *endptr != '\n')) { 5292b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu tst_brkm(TBROK, cleanup_fn, 530354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Invalid value: '%s' at %s:%d", str, file, lineno); 53149e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 5322b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu 5332b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu return rval; 5342b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu} 5353b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao 5363b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gaolong safe_sysconf(const char *file, const int lineno, 537354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void (cleanup_fn) (void), int name) 5383b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao{ 5393b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao long rval; 5403b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao errno = 0; 5413b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao 5423b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao rval = sysconf(name); 5433b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao 5443b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao if (rval == -1) { 54549e8615fd07b150891182e202d356384c8c98416Mats Liljegren if (errno) { 546354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup_fn, 54749e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: sysconf(%d) failed", 54849e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, name); 54949e8615fd07b150891182e202d356384c8c98416Mats Liljegren } else { 55049e8615fd07b150891182e202d356384c8c98416Mats Liljegren tst_resm(TINFO, "%s:%d: sysconf(%d): " 55149e8615fd07b150891182e202d356384c8c98416Mats Liljegren "queried option is not available" 55249e8615fd07b150891182e202d356384c8c98416Mats Liljegren " or there is no definite limit", 55349e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, name); 55449e8615fd07b150891182e202d356384c8c98416Mats Liljegren } 5553b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao } 5563b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao 5573b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao return rval; 5583b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao} 5591030c9d2c5264e6b1422e8c58ed92f89c66dc51aZeng Linggang 560c45923544542e125a89e420c5ed40388bb20751eCyril Hrubisint safe_chmod(const char *file, const int lineno, 561c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis void (cleanup_fn)(void), const char *path, mode_t mode) 562c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis{ 563c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis int rval; 564c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 565c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis rval = chmod(path, mode); 566c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 567c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis if (rval == -1) { 568c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 56949e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: chmod(%s,0%o) failed", 57049e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, path, mode); 571c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis } 572c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 573c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis return rval; 574c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis} 575c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 576c45923544542e125a89e420c5ed40388bb20751eCyril Hrubisint safe_fchmod(const char *file, const int lineno, 577c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis void (cleanup_fn)(void), int fd, mode_t mode) 578c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis{ 579c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis int rval; 580c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 581c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis rval = fchmod(fd, mode); 582c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 583c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis if (rval == -1) { 584c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 58549e8615fd07b150891182e202d356384c8c98416Mats Liljegren "%s:%d: fchmod(%d,0%o) failed", 58649e8615fd07b150891182e202d356384c8c98416Mats Liljegren file, lineno, fd, mode); 587c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis } 588c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis 589c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis return rval; 590c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis} 591f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 59292a14596c5e157dfbcb610393d4abba4757d9f90Xing Guint safe_chown(const char *file, const int lineno, void (cleanup_fn)(void), 59392a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu const char *path, uid_t owner, gid_t group) 59492a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu{ 59592a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu int rval; 59692a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu 59792a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu rval = chown(path, owner, group); 59892a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu 59992a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu if (rval == -1) { 60092a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu tst_brkm(TBROK | TERRNO, cleanup_fn, 60192a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu "%s:%d: chown(%s,%d,%d) failed", 60292a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu file, lineno, path, owner, group); 60392a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu } 60492a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu 60592a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu return rval; 60692a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu} 60734ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 60834ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubisint safe_fchown(const char *file, const int lineno, void (cleanup_fn)(void), 60934ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis int fd, uid_t owner, gid_t group) 61034ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis{ 61134ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis int rval; 61234ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 61334ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis rval = fchown(fd, owner, group); 61434ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 61534ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis if (rval == -1) { 61634ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 61734ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis "%s:%d: fchown(%d,%d,%d) failed", 61834ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis file, lineno, fd, owner, group); 61934ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis } 62034ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 62134ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis return rval; 62234ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis} 62334ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis 624f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubispid_t safe_wait(const char *file, const int lineno, void (cleanup_fn)(void), 625f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis int *status) 626f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis{ 627f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis pid_t rval; 628f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 629f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis rval = wait(status); 630f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis if (rval == -1) { 631f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 632f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis "%s:%d: wait(%p) failed", 633f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis file, lineno, status); 634f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis } 635f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 636f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis return rval; 637f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis} 638f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 639f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubispid_t safe_waitpid(const char *file, const int lineno, void (cleanup_fn)(void), 640f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis pid_t pid, int *status, int opts) 641f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis{ 642f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis pid_t rval; 643f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 644f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis rval = waitpid(pid, status, opts); 645f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis if (rval == -1) { 646f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 647f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis "%s:%d: waitpid(%d,%p,%d) failed", 648f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis file, lineno, pid, status, opts); 649f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis } 650f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis 651f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis return rval; 652f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis} 6535ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang 6545ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggangvoid *safe_memalign(const char *file, const int lineno, 6555ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang void (*cleanup_fn) (void), size_t alignment, size_t size) 6565ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang{ 6575ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang void *rval; 6585ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang 6595ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang rval = memalign(alignment, size); 6605ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang if (rval == NULL) 6615ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang tst_brkm(TBROK | TERRNO, cleanup_fn, "memalign failed at %s:%d", 6625ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang file, lineno); 6635ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang 6645ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang return rval; 6655ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang} 6666deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang 6676deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wangint safe_kill(const char *file, const int lineno, void (cleanup_fn)(void), 6686deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang pid_t pid, int sig) 6696deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang{ 6706deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang int rval; 6716deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang 6726deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang rval = kill(pid, sig); 6736deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang 6746deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang if (rval == -1) { 6756deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang tst_brkm(TBROK | TERRNO, cleanup_fn, 6766deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang "%s:%d: kill(%d,%s) failed", 6776deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang file, lineno, pid, tst_strsig(sig)); 6786deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang } 6796deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang 6806deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang return rval; 6816deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang} 6823a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis 6833a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubisint safe_mkfifo(const char *file, const int lineno, 6843a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis void (*cleanup_fn)(void), const char *pathname, mode_t mode) 6853a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis{ 6863a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis int rval; 6873a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis 6883a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis rval = mkfifo(pathname, mode); 6893a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis 6903a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis if (rval == -1) { 6913a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 6923a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis "%s:%d: mkfifo(%s, 0%o) failed", 6933a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis file, lineno, pathname, mode); 6943a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis } 6953a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis 6963a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis return rval; 6973a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis} 698f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang 699f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wangint safe_rename(const char *file, const int lineno, void (*cleanup_fn)(void), 700f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang const char *oldpath, const char *newpath) 701f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang{ 702f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang int rval; 703f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang 704f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang rval = rename(oldpath, newpath); 705f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang 706f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang if (rval == -1) { 707f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang tst_brkm(TBROK | TERRNO, cleanup_fn, 708f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang "%s:%d: rename(%s, %s) failed", 709f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang file, lineno, oldpath, newpath); 710f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang } 711f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang 712f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang return rval; 713f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang} 7148e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7158e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefkaint safe_mount(const char *file, const int lineno, void (*cleanup_fn)(void), 7168e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka const char *source, const char *target, 7178e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka const char *filesystemtype, unsigned long mountflags, 7188e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka const void *data) 7198e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka{ 7208e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka int rval; 7218e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7228e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka rval = mount(source, target, filesystemtype, mountflags, data); 7238e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7248e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka if (rval == -1) { 7258e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka tst_brkm(TBROK | TERRNO, cleanup_fn, 7268e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka "%s:%d: mount(%s, %s, %s, %lu, %p) failed", 7278e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka file, lineno, source, target, filesystemtype, 7288e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka mountflags, data); 7298e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka } 7308e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7318e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka return rval; 7328e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka} 7338e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7348e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefkaint safe_umount(const char *file, const int lineno, void (*cleanup_fn)(void), 7358e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka const char *target) 7368e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka{ 7378e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka int rval; 7388e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7398e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka rval = umount(target); 7408e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7418e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka if (rval == -1) { 7428e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka tst_brkm(TBROK | TERRNO, cleanup_fn, 7438e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka "%s:%d: umount(%s) failed", 7448e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka file, lineno, target); 7458e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka } 7468e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka 7478e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka return rval; 7488e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka} 7499138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7509138a0184105389aad4aeae89dc1331829d7d2cbCyril HrubisDIR* safe_opendir(const char *file, const int lineno, void (cleanup_fn)(void), 7519138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis const char *name) 7529138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{ 7539138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis DIR *rval; 7549138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7559138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis rval = opendir(name); 7569138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7579138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis if (!rval) { 7589138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 7599138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis "%s:%d: opendir(%s) failed", file, lineno, name); 7609138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis } 7619138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7629138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis return rval; 7639138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis} 7649138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7659138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubisint safe_closedir(const char *file, const int lineno, void (cleanup_fn)(void), 7669138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis DIR *dirp) 7679138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{ 7689138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis int rval; 7699138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7709138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis rval = closedir(dirp); 7719138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7729138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis if (rval) { 7739138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 7749138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis "%s:%d: closedir(%p) failed", file, lineno, dirp); 7759138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis } 7769138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7779138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis return rval; 7789138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis} 7799138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7809138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubisstruct dirent *safe_readdir(const char *file, const int lineno, void (cleanup_fn)(void), 7819138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis DIR *dirp) 7829138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{ 7839138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis struct dirent *rval; 7849138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis int err = errno; 7859138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7869138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis errno = 0; 7879138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis rval = readdir(dirp); 7889138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7899138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis if (!rval && errno) { 7909138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis tst_brkm(TBROK | TERRNO, cleanup_fn, 7919138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis "%s:%d: readdir(%p) failed", file, lineno, dirp); 7929138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis } 7939138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis 7949138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis errno = err; 7959138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis return rval; 7969138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis} 797