summaryrefslogtreecommitdiffstats
path: root/extras/test/ld-preload-test/ld-preload-lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'extras/test/ld-preload-test/ld-preload-lib.c')
-rw-r--r--extras/test/ld-preload-test/ld-preload-lib.c615
1 files changed, 615 insertions, 0 deletions
diff --git a/extras/test/ld-preload-test/ld-preload-lib.c b/extras/test/ld-preload-test/ld-preload-lib.c
new file mode 100644
index 00000000000..d120c053a69
--- /dev/null
+++ b/extras/test/ld-preload-test/ld-preload-lib.c
@@ -0,0 +1,615 @@
+/*
+ Copyright (c) 2007-2012 Red Hat, Inc. <http://www.redhat.com>
+ This file is part of GlusterFS.
+
+ This file is licensed to you under your choice of the GNU Lesser
+ General Public License, version 3 or any later version (LGPLv3 or
+ later), or the GNU General Public License, version 2 (GPLv2), in all
+ cases as published by the Free Software Foundation.
+*/
+
+/* LD PRELOAD'able library
+ * A very simple library that intercepts booster supported system calls
+ * and prints a log message to stdout.
+ *
+ * Combined with the ld-preload-test, we cam determine whether all system calls
+ * are getting redirected into this library when LD_PRELOAD'ed. This helps us
+ * conduct a basic test to ensure that the required syscalls actually will
+ * be intercepted by the booster library.
+ */
+
+#include <dlfcn.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <utime.h>
+#include <sys/statfs.h>
+#include <sys/statvfs.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <sys/xattr.h>
+#include <sys/sendfile.h>
+
+/* Err number that is assigned to errno so that test application can
+ * verify that the function was intercepted correctly.
+ */
+#define PRELOAD_ERRNO_VERF 6449
+#define set_errno() (errno = PRELOAD_ERRNO_VERF)
+
+void
+intercept(char *call, int tabs)
+{
+ while (tabs > 0) {
+ fprintf(stdout, "\t");
+ --tabs;
+ }
+
+ fprintf(stdout, "Intercepted by %s", call);
+}
+
+int
+creat64(const char *pathname, mode_t mode)
+{
+ intercept("creat64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+creat(const char *pathname, mode_t mode)
+{
+ intercept("creat", 2);
+ set_errno();
+ return -1;
+}
+
+int
+close(int fd)
+{
+ intercept("close", 2);
+ set_errno();
+ return -1;
+}
+
+int
+open64(const char *pathname, int flags, ...)
+{
+ intercept("open64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+open(const char *pathname, int flags, ...)
+{
+ intercept("open", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+read(int fd, void *buf, size_t count)
+{
+ intercept("read", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+readv(int fd, const struct iovec *vector, int count)
+{
+ intercept("readv", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+pread(int fd, void *buf, size_t count, unsigned long offset)
+{
+ intercept("pread", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+pread64(int fd, void *buf, size_t count, uint64_t offset)
+{
+ intercept("pread64", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+write(int fd, const void *buf, size_t count)
+{
+ intercept("write", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+writev(int fd, const struct iovec *vector, int count)
+{
+ intercept("writev", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+pwrite(int fd, const void *buf, size_t count, unsigned long offset)
+{
+ intercept("pwrite", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+pwrite64(int fd, const void *buf, size_t count, uint64_t offset)
+{
+ intercept("pwrite64", 2);
+ set_errno();
+ return -1;
+}
+
+off_t
+lseek(int fildes, unsigned long offset, int whence)
+{
+ intercept("lseek", 2);
+ set_errno();
+ return -1;
+}
+
+off_t
+lseek64(int fildes, uint64_t offset, int whence)
+{
+ intercept("lseek64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+dup(int fd)
+{
+ intercept("dup", 2);
+ set_errno();
+ return -1;
+}
+
+int
+dup2(int oldfd, int newfd)
+{
+ intercept("dup2", 2);
+ set_errno();
+ return -1;
+}
+
+int
+mkdir(const char *pathname, mode_t mode)
+{
+ intercept("mkdir", 2);
+ set_errno();
+ return -1;
+}
+
+int
+rmdir(const char *pathname)
+{
+ intercept("rmdir", 2);
+ set_errno();
+ return -1;
+}
+
+int
+chmod(const char *pathname, mode_t mode)
+{
+ intercept("chmod", 2);
+ set_errno();
+ return -1;
+}
+
+int
+chown(const char *pathname, uid_t owner, gid_t group)
+{
+ intercept("chown", 2);
+ set_errno();
+ return -1;
+}
+
+int
+fchmod(int fd, mode_t mode)
+{
+ intercept("fchmod", 2);
+ set_errno();
+ return -1;
+}
+
+int
+fchown(int fd, uid_t uid, gid_t gid)
+{
+ intercept("fchown", 2);
+ set_errno();
+ return -1;
+}
+
+int
+fsync(int fd)
+{
+ intercept("fsync", 2);
+ set_errno();
+ return -1;
+}
+
+int
+ftruncate(int fd, off_t length)
+{
+ intercept("ftruncate", 1);
+ set_errno();
+ return -1;
+}
+
+int
+ftruncate64(int fd, off_t length)
+{
+ intercept("ftruncate64", 1);
+ set_errno();
+ return -1;
+}
+
+int
+link(const char *oldpath, const char *newname)
+{
+ intercept("link", 2);
+ set_errno();
+ return -1;
+}
+
+int
+rename(const char *oldpath, const char *newpath)
+{
+ intercept("rename", 2);
+ set_errno();
+ return -1;
+}
+
+int
+utimes(const char *path, const struct timeval times[2])
+{
+ intercept("utimes", 2);
+ set_errno();
+ return -1;
+}
+
+int
+futimes(int fd, const struct timeval times[2])
+{
+ intercept("futimes", 2);
+ set_errno();
+ return -1;
+}
+
+int
+utime(const char *path, const struct utimbuf *buf)
+{
+ intercept("utime", 2);
+ set_errno();
+ return -1;
+}
+
+int
+mknod(const char *path, mode_t mode, dev_t dev)
+{
+ intercept("mknod", 2);
+ set_errno();
+ return -1;
+}
+
+int
+__xmknod(int ver, const char *path, mode_t mode, dev_t *dev)
+{
+ intercept("__xmknod", 2);
+ set_errno();
+ return -1;
+}
+
+int
+mkfifo(const char *path, mode_t mode)
+{
+ intercept("mkfifo", 2);
+ set_errno();
+ return -1;
+}
+
+int
+unlink(const char *path)
+{
+ intercept("unlink", 2);
+ set_errno();
+ return -1;
+}
+
+int
+symlink(const char *oldpath, const char *newpath)
+{
+ intercept("symlink", 2);
+ set_errno();
+ return -1;
+}
+
+int
+readlink(const char *path, char *buf, size_t bufsize)
+{
+ intercept("readlink", 1);
+ set_errno();
+ return -1;
+}
+
+char *
+realpath(const char *path, char *resolved)
+{
+ intercept("realpath", 1);
+ set_errno();
+ return NULL;
+}
+
+DIR *
+opendir(const char *path)
+{
+ intercept("opendir", 2);
+ set_errno();
+ return NULL;
+}
+
+struct dirent *
+readdir(DIR *dir)
+{
+ intercept("readdir\t", 2);
+ set_errno();
+ return NULL;
+}
+
+struct dirent *
+readdir64(DIR *dir)
+{
+ intercept("readdir64", 2);
+ set_errno();
+ return NULL;
+}
+
+int
+readdir_r(DIR *dir, struct dirent *entry, struct dirent **result)
+{
+ intercept("readdir_r", 1);
+ set_errno();
+ return -1;
+}
+
+int
+readdir64_r(DIR *dir, struct dirent *entry, struct dirent **result)
+{
+ intercept("readdir64_r", 1);
+ set_errno();
+ return -1;
+}
+
+int
+closedir(DIR *dh)
+{
+ intercept("closedir", 1);
+ set_errno();
+ return -1;
+}
+
+int
+__xstat(int ver, const char *path, struct stat *buf)
+{
+ intercept("__xstat\t", 2);
+ set_errno();
+ return -1;
+}
+
+int
+__xstat64(int ver, const char *path, struct stat *buf)
+{
+ intercept("__xstat64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+stat(const char *path, struct stat *buf)
+{
+ intercept("stat", 2);
+ set_errno();
+ return -1;
+}
+
+int
+stat64(const char *path, struct stat *buf)
+{
+ intercept("stat64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+__fxstat(int ver, int fd, struct stat *buf)
+{
+ intercept("__fxstat\t", 2);
+ set_errno();
+ return -1;
+}
+
+int
+__fxstat64(int ver, int fd, struct stat *buf)
+{
+ intercept("__fxstat64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+fstat(int fd, struct stat *buf)
+{
+ intercept("fstat", 2);
+ set_errno();
+ return -1;
+}
+
+int
+fstat64(int fd, struct stat *buf)
+{
+ intercept("fstat64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+__lxstat(int ver, const char *path, struct stat *buf)
+{
+ intercept("__lxstat\t", 2);
+ set_errno();
+ return -1;
+}
+
+int
+__lxstat64(int ver, const char *path, struct stat *buf)
+{
+ intercept("__lxstat64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+lstat(const char *path, struct stat *buf)
+{
+ intercept("lstat", 2);
+ set_errno();
+ return -1;
+}
+
+int
+lstat64(const char *path, struct stat *buf)
+{
+ intercept("lstat64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+statfs(const char *path, struct statfs *buf)
+{
+ intercept("statfs", 2);
+ set_errno();
+ return -1;
+}
+
+int
+statfs64(const char *path, struct statfs *buf)
+{
+ intercept("statfs64", 2);
+ set_errno();
+ return -1;
+}
+
+int
+statvfs(const char *path, struct statvfs *buf)
+{
+ intercept("statvfs\t", 2);
+ set_errno();
+ return -1;
+}
+
+int
+statvfs64(const char *path, struct statvfs *buf)
+{
+ intercept("statvfs64", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+getxattr(const char *path, const char *name, void *value, size_t size)
+{
+ intercept("getxattr", 1);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+lgetxattr(const char *path, const char *name, void *value, size_t size)
+{
+ intercept("lgetxattr", 1);
+ set_errno();
+ return -1;
+}
+
+int
+remove(const char *path)
+{
+ intercept("remove", 2);
+ set_errno();
+ return -1;
+}
+
+int
+lchown(const char *path, uid_t owner, gid_t group)
+{
+ intercept("lchown", 2);
+ set_errno();
+ return -1;
+}
+
+void
+rewinddir(DIR *dirp)
+{
+ intercept("rewinddir", 1);
+ set_errno();
+ return;
+}
+
+void
+seekdir(DIR *dirp, off_t offset)
+{
+ intercept("seekdir", 2);
+ set_errno();
+ return;
+}
+
+off_t
+telldir(DIR *dirp)
+{
+ intercept("telldir", 2);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
+{
+ intercept("sendfile\t", 1);
+ set_errno();
+ return -1;
+}
+
+ssize_t
+sendfile64(int out_fd, int in_fd, off_t *offset, size_t count)
+{
+ intercept("sendfile64", 1);
+ set_errno();
+ return -1;
+}
+
+int
+fcntl(int fd, int cmd, ...)
+{
+ intercept("fcntl", 2);
+ set_errno();
+ return -1;
+}