diff options
Diffstat (limited to 'pkg/launcher')
-rw-r--r-- | pkg/launcher/Makefile | 2 | ||||
-rw-r--r-- | pkg/launcher/bitmask-launcher.c | 33 |
2 files changed, 30 insertions, 5 deletions
diff --git a/pkg/launcher/Makefile b/pkg/launcher/Makefile index 8dd1013d..8948e6b4 100644 --- a/pkg/launcher/Makefile +++ b/pkg/launcher/Makefile @@ -1,5 +1,5 @@ CC = gcc -CFLAGS = -g -Wall +CFLAGS = -g -Wall -fPIE STRIP = strip default: bitmask diff --git a/pkg/launcher/bitmask-launcher.c b/pkg/launcher/bitmask-launcher.c index cf5c2a18..b9bda1c2 100644 --- a/pkg/launcher/bitmask-launcher.c +++ b/pkg/launcher/bitmask-launcher.c @@ -4,20 +4,45 @@ * part of the bitmask bundle. * execute main entrypoint in a child folder inside the bundle. * - * (c) LEAP Encryption Access Project, 2016. + * (c) LEAP Encryption Access Project, 2016-2018. * License: GPL. * */ #include <unistd.h> #include <stdlib.h> +#include <libgen.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> -char* const bitmask_path = "lib"; -char* const entrypoint = "bitmask"; +#define MAXBUFFSIZE 1024 + +char* const lib = "/lib"; +char* const entrypoint = "app"; +char* const linkname = "/proc/self/exe"; int main(int argc, char *argv[]) { + char buf[MAXBUFFSIZE]; + char pth[MAXBUFFSIZE]; + char *dirc, *dname; + const size_t bufsize = MAXBUFFSIZE + 1; + argv[0] = entrypoint; - chdir(bitmask_path); + buf[0] = 0; + pth[0] = 0; + + readlink(linkname, buf, bufsize - 1); + + dirc = strdup(buf); + dname = dirname(dirc); + strncat(pth, dname, strlen(dname)); + strncat(pth, lib, strlen(lib)); + + if (chdir(pth) < 0) + { + fprintf(stderr, "error: %s\n", strerror(errno)); + } execv(entrypoint, argv); } |