You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/kde-base/pykde4/files/kpythonpluginfactorywrapper...

72 lines
1.5 KiB

#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.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);
close(pipefd[0]);
waitpid(cpid, NULL, 0);
} else if (cpid < 0) {
/* fork failed, guess 2.7 */
strcpy(out, "2.7\n");
close(pipefd[0]);
close(pipefd[1]);
} 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);
/* exec failed, guess 2.7 */
write(1, "2.7\n", 4);
exit(0);
}
}
__attribute__((constructor))
static void init() {
char buf[VERSION_LEN + 1];
memset(buf, 0, VERSION_LEN + 1);
get_python_version(buf);
char *s = buf;
while(*s != '\0') {
if(*s == '\n') {
*s = '\0';
break;
}
++s;
}
int length = strlen(FORMAT) + strlen(buf) + 1;
char *name = malloc(length + 1);
snprintf(name, length, FORMAT, buf);
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();
}