summaryrefslogtreecommitdiff
path: root/libdynsymlink.c
diff options
context:
space:
mode:
authoreroen2015-07-13 00:08:15 +0200
committereroen2015-07-13 00:11:05 +0200
commit6b97d2952aca4692c7d1464d9ac901fef8b52ea9 (patch)
treec8415496d839b3a560c64c2b281b957e925be389 /libdynsymlink.c
parent1ff4e0626696cce79347cea1f8af03ff0df5c3fd (diff)
downloaddynsymlink-master.tar.gz
dynsymlink-master.tar.bz2
dynsymlink-master.tar.xz
Shabbily implement overlay for open()HEADmaster
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;
}