char *canonicalize_file_name(const char *path) { const char *p; libc_func(canonicalize_file_name, char*, const char*); char *r, *oldr; TRAP_PATH_LOCK; p = trap_path(path); if (p == NULL) r = NULL; else { r = _canonicalize_file_name(p); if (p == path) { DBG(DBG_PATH, "testbed wrapped canonicalize_file_name(%s) -> %s (not wrapped)\n", path, r); } else if (r != NULL) { /* cut off the prefix again */ oldr = r; r = strdup(r + trap_path_prefix_len); free (oldr); DBG(DBG_PATH, "testbed wrapped canonicalize_file_name(%s -> %s) -> %s (wrapped)\n", path, p, r); } } TRAP_PATH_UNLOCK; return r; }
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { libc_func(connect, int, int, const struct sockaddr *, socklen_t); int res; /* playback */ if (addr->sa_family == AF_UNIX) { const char *sock_path = ((struct sockaddr_un *) addr)->sun_path; TRAP_PATH_LOCK; const char *p = trap_path(sock_path); struct sockaddr_un trapped_addr; if (p != sock_path) { DBG(DBG_NETLINK, "testbed wrapped connect: redirecting Unix socket %s to %s\n", sock_path, p); trapped_addr.sun_family = AF_UNIX; strncpy(trapped_addr.sun_path, p, sizeof(trapped_addr.sun_path)); addr = (struct sockaddr*) &trapped_addr; } TRAP_PATH_UNLOCK; } res = _connect(sockfd, addr, addrlen); script_record_connect(sockfd, addr, addrlen, res); return res; }
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); _open(p, flags, mode); } return _open(p, flags); }
int inotify_add_watch(int fd, const char *path, uint32_t mask) { const char *p; libc_func(inotify_add_watch, int, int, const char*, uint32_t); p = trap_path(path); if (p == NULL) return -1; return _inotify_add_watch(fd, p, mask); }
ssize_t readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz) { const char *p; libc_func(readlinkat, size_t, int, const char*, char*, size_t); size_t r; TRAP_PATH_LOCK; p = trap_path(pathname); DBG(DBG_PATH, "testbed wrapped readlinkat (%s) -> %s\n", pathname, p); if (p == NULL) r = -1; else r = _readlinkat(dirfd, p, buf, bufsiz); TRAP_PATH_UNLOCK; return r; }
int inotify_add_watch(int fd, const char *path, uint32_t mask) { const char *p; libc_func(inotify_add_watch, int, int, const char*, uint32_t); int r; TRAP_PATH_LOCK; p = trap_path(path); if (p == NULL) r = -1; else r = _inotify_add_watch(fd, p, mask); TRAP_PATH_UNLOCK; return r; }
TS_EXPORT FILE *fopen(const char *path, const char *mode) { const char *p; char buf[PATH_MAX * 2]; static int (*_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 (void *) (long) (*_fopen)(p, mode); }
TS_EXPORT DIR *opendir(const char *path) { const char *p; char buf[PATH_MAX * 2]; static int (*_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 (void *)(long)(*_opendir)(p); }
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 int stat64(const char *path, struct stat64 *st) { const char *p; char buf[PATH_MAX * 2]; static int (*_stat64)(const char *path, struct stat64 *buf); if (!get_rootpath(__func__)) return -1; _stat64 = get_libc_func("stat64"); p = trap_path(path, buf); if (p == NULL) return -1; return _stat64(p, st); }
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; _xstat = get_libc_func("__xstat"); p = trap_path(path, buf); if (p == NULL) return -1; return _xstat(ver, p, st); }