From 123e8278ed8db4bd2f9a774dd700124de79d3bf4 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Wed, 1 Aug 2012 23:35:34 +0200 Subject: [PATCH] testsuite preload: Factorize into macros, add more stat and open variants Instead of replicating the same code several times, define and use macros for the various types of wrapped functions in the testsuite's path.c LD_PRELOAD wrapper. Add various __xstat() variants and open64(), which are being used when enabling large file support. --- testsuite/path.c | 214 ++++++++++++++++++++--------------------------- 1 file changed, 90 insertions(+), 124 deletions(-) diff --git a/testsuite/path.c b/testsuite/path.c index bc797fc4..5cb17bb9 100644 --- a/testsuite/path.c +++ b/testsuite/path.c @@ -95,139 +95,105 @@ static void *get_libc_func(const char *f) return fp; } -TS_EXPORT FILE *fopen(const char *path, const char *mode) -{ - const char *p; - char buf[PATH_MAX * 2]; - static FILE* (*_fopen)(const char *path, const char *mode); - - if (!get_rootpath(__func__)) - return NULL; - - _fopen = get_libc_func("fopen"); - - p = trap_path(path, buf); - if (p == NULL) - return NULL; - - return (*_fopen)(p, mode); +/* wrapper template for a function with one "const char* path" argument */ +#define WRAP_1ARG(rettype, failret, name) \ +TS_EXPORT rettype name(const char *path) \ +{ \ + const char *p; \ + char buf[PATH_MAX * 2]; \ + static rettype (*_fn)(const char*); \ + \ + if (!get_rootpath(__func__)) \ + return failret; \ + _fn = get_libc_func(#name); \ + p = trap_path(path, buf); \ + if (p == NULL) \ + return failret; \ + return (*_fn)(p); \ } -TS_EXPORT int open(const char *path, int flags, ...) -{ - const char *p; - char buf[PATH_MAX * 2]; - static int (*_open)(const char *path, int flags, ...); - - if (!get_rootpath(__func__)) - return -1; - - _open = get_libc_func("open"); - p = trap_path(path, buf); - if (p == NULL) - return -1; - - if (flags & O_CREAT) { - mode_t mode; - va_list ap; - - va_start(ap, flags); - mode = va_arg(ap, mode_t); - va_end(ap); - return _open(p, flags, mode); - } - - return _open(p, flags); +/* wrapper template for a function with "const char* path" and another argument */ +#define WRAP_2ARGS(rettype, failret, name, arg2t) \ +TS_EXPORT rettype name(const char *path, arg2t arg2) \ +{ \ + const char *p; \ + char buf[PATH_MAX * 2]; \ + static rettype (*_fn)(const char*, arg2t arg2); \ + \ + if (!get_rootpath(__func__)) \ + return failret; \ + _fn = get_libc_func(#name); \ + p = trap_path(path, buf); \ + if (p == NULL) \ + return failret; \ + return (*_fn)(p, arg2); \ } -TS_EXPORT int mkdir(const char *path, mode_t mode) -{ - const char *p; - char buf[PATH_MAX * 2]; - static int (*_mkdir)(const char *path, mode_t mode); - - if (!get_rootpath(__func__)) - return -1; - - _mkdir = get_libc_func("mkdir"); - p = trap_path(path, buf); - if (p == NULL) - return -1; - - return _mkdir(p, mode); +/* wrapper template for open family */ +#define WRAP_OPEN(suffix) \ +TS_EXPORT int open ## suffix (const char *path, int flags, ...) \ +{ \ + const char *p; \ + char buf[PATH_MAX * 2]; \ + static int (*_fn)(const char *path, int flags, ...); \ + \ + if (!get_rootpath(__func__)) \ + return -1; \ + _fn = get_libc_func("open" #suffix); \ + p = trap_path(path, buf); \ + if (p == NULL) \ + return -1; \ + \ + if (flags & O_CREAT) { \ + mode_t mode; \ + va_list ap; \ + \ + va_start(ap, flags); \ + mode = va_arg(ap, mode_t); \ + va_end(ap); \ + return _fn(p, flags, mode); \ + } \ + \ + return _fn(p, flags); \ } -TS_EXPORT int stat(const char *path, struct stat *st) -{ - const char *p; - char buf[PATH_MAX * 2]; - static int (*_stat)(const char *path, struct stat *buf); - - if (!get_rootpath(__func__)) - return -1; - - _stat = get_libc_func("stat"); - - p = trap_path(path, buf); - if (p == NULL) - return -1; - - return _stat(p, st); +/* wrapper template for __xstat family */ +#define WRAP_VERSTAT(prefix, suffix) \ +TS_EXPORT int prefix ## stat ## suffix (int ver, \ + const char *path, \ + struct stat ## suffix *st) \ +{ \ + const char *p; \ + char buf[PATH_MAX * 2]; \ + static int (*_fn)(int ver, const char *path, \ + struct stat ## suffix *); \ + _fn = get_libc_func(#prefix "stat" #suffix); \ + \ + if (!get_rootpath(__func__)) \ + return -1; \ + p = trap_path(path, buf); \ + if (p == NULL) \ + return -1; \ + \ + return _fn(ver, p, st); \ } -#ifdef HAVE___XSTAT -TS_EXPORT int __xstat(int ver, const char *path, struct stat *st) -{ - const char *p; - char buf[PATH_MAX * 2]; - static int (*_xstat)(int __ver, const char *__filename, - struct stat *__stat_buf); - - if (!get_rootpath(__func__)) - return -1; +WRAP_1ARG(DIR*, NULL, opendir); - _xstat = get_libc_func("__xstat"); +WRAP_2ARGS(FILE*, NULL, fopen, const char*); +WRAP_2ARGS(int, -1, mkdir, mode_t); +WRAP_2ARGS(int, -1, access, int); +WRAP_2ARGS(int, -1, stat, struct stat*); +WRAP_2ARGS(int, -1, stat64, struct stat64*); +WRAP_2ARGS(int, -1, lstat, struct stat*); +WRAP_2ARGS(int, -1, lstat64, struct stat64*); - p = trap_path(path, buf); - if (p == NULL) - return -1; +WRAP_OPEN(); +WRAP_OPEN(64); - return _xstat(ver, p, st); -} +#ifdef HAVE___XSTAT +WRAP_VERSTAT(__x,); +WRAP_VERSTAT(__x,64); +WRAP_VERSTAT(__lx,); +WRAP_VERSTAT(__lx,64); #endif - -TS_EXPORT int access(const char *path, int mode) -{ - const char *p; - char buf[PATH_MAX * 2]; - static int (*_access)(const char *path, int mode); - - if (!get_rootpath(__func__)) - return -1; - - _access = get_libc_func("access"); - - p = trap_path(path, buf); - if (p == NULL) - return -1; - - return _access(p, mode); -} - -TS_EXPORT DIR *opendir(const char *path) -{ - const char *p; - char buf[PATH_MAX * 2]; - static DIR* (*_opendir)(const char *path); - - if (!get_rootpath(__func__)) - return NULL; - - _opendir = get_libc_func("opendir"); - - p = trap_path(path, buf); - if (p == NULL) - return NULL; - - return (*_opendir)(p); -} -- 2.47.2