summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'kde-base/pykde4/files/kpythonpluginfactorywrapper.c')
-rw-r--r--kde-base/pykde4/files/kpythonpluginfactorywrapper.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/kde-base/pykde4/files/kpythonpluginfactorywrapper.c b/kde-base/pykde4/files/kpythonpluginfactorywrapper.c
new file mode 100644
index 000000000000..3915a0d122be
--- /dev/null
+++ b/kde-base/pykde4/files/kpythonpluginfactorywrapper.c
@@ -0,0 +1,52 @@
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define VERSION_LEN 10
+
+#define FORMAT EPREFIX PLUGIN_DIR "/kpython%spluginfactory.so"
+
+static void *handle;
+static void *(*wrapped_qt_plugin_instance)();
+
+static void get_python_version(char* out) {
+ int pipefd[2];
+ pipe(pipefd);
+ pid_t cpid = fork();
+ if (cpid == 0) {
+ close(pipefd[1]);
+ read(pipefd[0], out, VERSION_LEN);
+ } else {
+ close(pipefd[0]);
+ close(1);
+ dup2(pipefd[1], 1);
+ close(pipefd[1]);
+ close(0);
+ char *args[] = { "eselect", "python", "show", "--ABI", "--python2", 0 };
+ execv(EPREFIX "/usr/bin/eselect", args);
+ }
+}
+
+__attribute__((constructor))
+static void init() {
+ char buf[VERSION_LEN + 1];
+ memset(buf, 0, VERSION_LEN + 1);
+ get_python_version(buf);
+ int length = strlen(FORMAT) + strlen(buf) + 1;
+ char *name = malloc(length + 1);
+ snprintf(name, length, FORMAT, buf);
+ void *handle = dlopen(name, RTLD_NOW);
+ free(name);
+ wrapped_qt_plugin_instance = dlsym(handle, "qt_plugin_instance");
+}
+
+__attribute__((destructor))
+static void fini() {
+ dlclose(handle);
+}
+
+void *qt_plugin_instance() {
+ return wrapped_qt_plugin_instance();
+}