summaryrefslogtreecommitdiff
path: root/pkg/launcher/bitmask-launcher.c
blob: 09f5fe21fe35bc78210bf65a9482e315aa3a7fcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
 * bitmask-launcher.c
 *
 * part of the bitmask bundle.
 * execute main entrypoint in a child folder inside the bundle.
 *
 * (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>

#define MAXBUFSIZE 1024

char* const lib = "/lib";
char* const entrypoint = "bitmask";
char* const linkname = "/proc/self/exe";

int main(int argc, char *argv[])
{
    char buf[MAXBUFSIZE];
    char pth[MAXBUFSIZE];
    char *dirc, *dname;

    argv[0] = entrypoint;
    buf[0] = 0;
    pth[0] = 0;

    readlink(linkname, buf, MAXBUFSIZE);

    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);
}