summaryrefslogtreecommitdiff
path: root/libdynsymlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdynsymlink.c')
-rw-r--r--libdynsymlink.c75
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;
}