diff options
| author | eroen | 2015-07-13 00:08:15 +0200 |
|---|---|---|
| committer | eroen | 2015-07-13 00:11:05 +0200 |
| commit | 6b97d2952aca4692c7d1464d9ac901fef8b52ea9 (patch) | |
| tree | c8415496d839b3a560c64c2b281b957e925be389 /libdynsymlink.c | |
| parent | 1ff4e0626696cce79347cea1f8af03ff0df5c3fd (diff) | |
| download | dynsymlink-6b97d2952aca4692c7d1464d9ac901fef8b52ea9.tar.gz dynsymlink-6b97d2952aca4692c7d1464d9ac901fef8b52ea9.tar.bz2 dynsymlink-6b97d2952aca4692c7d1464d9ac901fef8b52ea9.tar.xz | |
Diffstat (limited to 'libdynsymlink.c')
| -rw-r--r-- | libdynsymlink.c | 75 |
1 files changed, 70 insertions, 5 deletions
diff --git a/libdynsymlink.c b/libdynsymlink.c index f1c225c..cd86478 100644 --- a/libdynsymlink.c +++ b/libdynsymlink.c @@ -2,22 +2,87 @@ #include <dlfcn.h> #include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <libgen.h> static int dynsym_initialized = 0; -static int (*real_printf) (const char *); +static int (*real_open) (const char *, int flags); void dynsym_init(void) { if(!dynsym_initialized) { - real_printf = dlsym(RTLD_NEXT, "printf"); + real_open = dlsym(RTLD_NEXT, "open"); dynsym_initialized = 1; } } -int printf(const char *__restrict __format, ...) +int open(const char *pathname, int flags, ...) { dynsym_init(); - (*real_printf)("This is libdynsymlink printf\n"); - return (*real_printf)(__format); + printf("This is libdynsymlink open\n"); + + int ret; + int errsv; + char prefix[] = "prefixdir/"; + int newpathlen = strlen(pathname) + strlen(prefix); + char *newpathname = malloc(newpathlen); + newpathname = strcpy(newpathname, prefix); + newpathname = strcat(newpathname, pathname); + + printf("Prefix: %s\n", prefix); + printf("Original pathname: %s\n", pathname); + printf("Amended pathname: %s\n", newpathname); + + // 1: prefix + path + ret = (*real_open)(newpathname, flags); + + if(ret < 0) { + errsv = errno; + perror("real_open with prefix failed: "); + + // 2: path + ret = (*real_open)(pathname, flags); + if(ret < 0) { + errsv = errno; + perror("real_open without prefix failed: "); + + // 3: create prefix + path + printf("TODO: attempt copying file to prefix\n"); + + char *newdir = strdup(newpathname); + newdir = dirname(newdir); + + // TODO: + char *mkdircmd = malloc(256); + sprintf(mkdircmd, "mkdir -p %s", newdir); + printf("command: %s\n", mkdircmd); + system(mkdircmd); + + // TODO: + char *cpcmd = malloc(256); + sprintf(cpcmd, "cp %s %s", pathname, newpathname); + printf("command: %s\n", cpcmd); + system(cpcmd); + + // TODO: + chmod(newpathname, 00600); + + ret = (*real_open)(newpathname, flags); + if(ret < 0) { + errsv = errno; + perror("real_open of copy failed: "); + } + } + } + + free(newpathname); + + errno = errsv; + return ret; } |
