launch: fix rootdir for afb-daemon
[src/app-framework-main.git] / src / afm-launch.c
index a66004b..72120ac 100644 (file)
@@ -54,10 +54,9 @@ extern char **environ;
 
 static const char *args_for_afb_daemon[] = {
        "/usr/bin/afb-daemon",
-       "--daemon",
        "--alias=/icons:%I",
        "--port=%P",
-       "--rootdir=%D",
+       "--rootdir=%r",
        "--token=%S",
        NULL
 };
@@ -104,6 +103,8 @@ struct launchparam {
        const char **slave_args;
 };
 
+static gid_t groupid = 0;
+
 static char **instantiate_arguments(const char **args, struct afm_launch_desc *desc, struct launchparam *params)
 {
        const char **iter, *p, *v;
@@ -210,6 +211,10 @@ static int launchexec1(struct afm_launch_desc *desc, pid_t children[2], struct l
        }
 
        /********* in the master child ************/
+
+       /* avoid set-gid effect */
+       setresgid(groupid, groupid, groupid);
+
        /* enter the process group */
        rc = setpgid(0, 0);
        if (rc) {
@@ -308,6 +313,9 @@ static int launchexec2(struct afm_launch_desc *desc, pid_t children[2], struct l
        close(mpipe[0]);
        close(spipe[1]);
 
+       /* avoid set-gid effect */
+       setresgid(groupid, groupid, groupid);
+
        /* enter the process group */
        rc = setpgid(0, 0);
        if (rc) {
@@ -380,6 +388,18 @@ static int launchexec2(struct afm_launch_desc *desc, pid_t children[2], struct l
        _exit(1);
 }
 
+static void afm_launch_init_group()
+{
+       if (!groupid) {
+               gid_t r, e, s;
+               getresgid(&r, &e, &s);
+               if (s && s != e)
+                       groupid = s;
+               else
+                       groupid = -1;
+       }
+}
+
 int afm_launch(struct afm_launch_desc *desc, pid_t children[2])
 {
        char datadir[PATH_MAX];
@@ -387,6 +407,9 @@ int afm_launch(struct afm_launch_desc *desc, pid_t children[2])
        char secret[9];
        struct launchparam params;
 
+       /* static init */
+       afm_launch_init_group();
+
        /* what launcher ? */
        ikl = 0;
        if (desc->type != NULL && *desc->type) {