diff options
-rw-r--r-- | src/af-usrd.c | 16 | ||||
-rw-r--r-- | src/appfwk-run.c | 365 | ||||
-rw-r--r-- | src/appfwk-run.h | 4 | ||||
-rw-r--r-- | src/secmgr-wrap.c | 5 | ||||
-rw-r--r-- | src/secmgr-wrap.h | 1 | ||||
-rw-r--r-- | src/simulation/security-manager.h | 4 |
6 files changed, 207 insertions, 188 deletions
diff --git a/src/af-usrd.c b/src/af-usrd.c index 6dac577..33268f1 100644 --- a/src/af-usrd.c +++ b/src/af-usrd.c @@ -73,26 +73,26 @@ static void on_start(struct jreq *jreq, struct json_object *obj) } } -static void on_stop(struct jreq *jreq, struct json_object *obj) +static void on_terminate(struct jreq *jreq, struct json_object *obj) { int runid = getrunid(obj); - int status = appfwk_run_stop(runid); + int status = appfwk_run_terminate(runid); jbus_replyj(jreq, status ? error_not_found : "true"); json_object_put(obj); } -static void on_suspend(struct jreq *jreq, struct json_object *obj) +static void on_stop(struct jreq *jreq, struct json_object *obj) { int runid = getrunid(obj); - int status = appfwk_run_suspend(runid); + int status = appfwk_run_stop(runid); jbus_replyj(jreq, status ? error_not_found : "true"); json_object_put(obj); } -static void on_resume(struct jreq *jreq, struct json_object *obj) +static void on_continue(struct jreq *jreq, struct json_object *obj) { int runid = getrunid(obj); - int status = appfwk_run_resume(runid); + int status = appfwk_run_continue(runid); jbus_replyj(jreq, status ? error_not_found : "true"); json_object_put(obj); } @@ -142,9 +142,9 @@ int main(int ac, char **av) if(jbus_add_service(jbus, "runnables", on_runnables) || jbus_add_service(jbus, "detail", on_detail) || jbus_add_service(jbus, "start", on_start) + || jbus_add_service(jbus, "terminate", on_terminate) || jbus_add_service(jbus, "stop", on_stop) - || jbus_add_service(jbus, "suspend", on_suspend) - || jbus_add_service(jbus, "resume", on_resume) + || jbus_add_service(jbus, "continue", on_continue) || jbus_add_service(jbus, "runners", on_runners) || jbus_add_service(jbus, "state", on_state)) { ERROR("adding services failed"); diff --git a/src/appfwk-run.c b/src/appfwk-run.c index f0bb478..87b02b0 100644 --- a/src/appfwk-run.c +++ b/src/appfwk-run.c @@ -15,7 +15,7 @@ */ #include <unistd.h> - +#include <signal.h> @@ -33,51 +33,101 @@ enum appstate { - as_in_progress, + as_starting, as_running, - as_paused, - as_stopping + as_stopped, + as_terminating, + as_terminated }; struct apprun { - struct apprun *next; - int id; - enum appstate state; + struct apprun *next_by_runid; + struct apprun *next_by_pgid; + int runid; pid_t backend; pid_t frontend; + enum appstate state; + json_object *appli; }; #define ROOT_RUNNERS_COUNT 32 #define MAX_RUNNER_COUNT 32767 -static struct apprun *runners[ROOT_RUNNERS_COUNT]; +static struct apprun *runners_by_runid[ROOT_RUNNERS_COUNT]; +static struct apprun *runners_by_pgid[ROOT_RUNNERS_COUNT]; static int runnercount = 0; static int runnerid = 0; -static struct apprun *getrunner(int id) +/****************** manages pgids **********************/ + +/* get a runner by its pgid */ +static struct apprun *runner_of_pgid(pid_t pgid) +{ + struct apprun *result = runners_by_pgid[(int)(pgid & (ROOT_RUNNERS_COUNT - 1))]; + while (result && result->backend != pgid) + result = result->next_by_pgid; + return result; +} + +/* insert a runner for its pgid */ +static void pgid_insert(struct apprun *runner) +{ + struct apprun **prev = &runners_by_runid[(int)(runner->backend & (ROOT_RUNNERS_COUNT - 1))]; + runner->next_by_pgid = *prev; + *prev = runner; +} + +/* remove a runner for its pgid */ +static void pgid_remove(struct apprun *runner) +{ + struct apprun **prev = &runners_by_runid[(int)(runner->backend & (ROOT_RUNNERS_COUNT - 1))]; + runner->next_by_pgid = *prev; + *prev = runner; +} + +/****************** manages pids **********************/ + +/* get a runner by its pid */ +static struct apprun *runner_of_pid(pid_t pid) { - struct apprun *result = runners[id & (ROOT_RUNNERS_COUNT - 1)]; - while (result && result->id != id) - result = result->next; + /* try avoiding system call */ + struct apprun *result = runner_of_pgid(pid); + if (result == NULL) + result = runner_of_pgid(getpgid(pid)); return result; } +/****************** manages runners (by runid) **********************/ + +/* get a runner by its runid */ +static struct apprun *getrunner(int runid) +{ + struct apprun *result = runners_by_runid[runid & (ROOT_RUNNERS_COUNT - 1)]; + while (result && result->runid != runid) + result = result->next_by_runid; + return result; +} + +/* free an existing runner */ static void freerunner(struct apprun *runner) { - struct apprun **prev = &runners[runner->id & (ROOT_RUNNERS_COUNT - 1)]; + struct apprun **prev = &runners_by_runid[runner->runid & (ROOT_RUNNERS_COUNT - 1)]; assert(*prev); while(*prev != runner) { - prev = &(*prev)->next; + prev = &(*prev)->next_by_runid; assert(*prev); } - *prev = runner->next; + *prev = runner->next_by_runid; + json_object_put(runner->appli); free(runner); runnercount--; } -static struct apprun *createrunner() +/* create a new runner */ +static struct apprun *createrunner(json_object *appli) { struct apprun *result; + struct apprun **prev; if (runnercount >= MAX_RUNNER_COUNT) return NULL; @@ -86,224 +136,183 @@ static struct apprun *createrunner() if (runnerid > MAX_RUNNER_COUNT) runnerid = 1; } while(getrunner(runnerid)); - result = malloc(sizeof * result); + result = calloc(1, sizeof * result); if (result) { - result->id = runnerid; - result->state = as_in_progress; + prev = &runners_by_runid[runnerid & (ROOT_RUNNERS_COUNT - 1)]; + result->next_by_runid = *prev; + result->next_by_pgid = NULL; + result->runid = runnerid; result->backend = 0; result->frontend = 0; - result->next = runners[runnerid & (ROOT_RUNNERS_COUNT - 1)]; - runners[runnerid & (ROOT_RUNNERS_COUNT - 1)] = result; + result->state = as_starting; + result->appli = json_object_get(appli); + *prev = result; runnercount++; } return result; } -int appfwk_run_start(struct json_object *appli) -{ - return -1; -} - -int appfwk_run_stop(int runid) -{ - return -1; -} +/**************** signaling ************************/ -int appfwk_run_suspend(int runid) +static void started(int runid) { - return -1; } -int appfwk_run_resume(int runid) +static void stopped(int runid) { - return -1; } -struct json_object *appfwk_run_list() +static void continued(int runid) { - return NULL; } -struct json_object *appfwk_run_state(int runid) +static void terminated(int runid) { - return NULL; } -#if 0 - -static struct json_object *mkrunner(const char *appid, const char *runid) +static void removed(int runid) { - struct json_object *result = json_object_new_object(); - if (result) { - if(json_add_str(result, "id", appid) - || json_add_str(result, "runid", runid) - || json_add_str(result, "state", NULL)) { - json_object_put(result); - result = NULL; - } - } - return result; } -const char *appfwk_start(struct appfwk *af, const char *appid) -{ - struct json_object *appli; - struct json_object *runner; - char buffer[250]; - - /* get the application description */ - appli = appfwk_get_application(af, appid); - if (appli == NULL) { - errno = ENOENT; - return -1; - } - - /* prepare the execution */ - snprintf(buffer, sizeof buffer, "{\"id\":\"%s\",\"runid\":\"%s\"" -} +/**************** running ************************/ -int appfwk_stop(struct appfwk *af, const char *runid) +static int killrunner(int runid, int sig, enum appstate tostate) { - struct json_object *runner; - runner = appfwk_state(af, runid); + int rc; + struct apprun *runner = getrunner(runid); if (runner == NULL) { errno = ENOENT; - return -1; + rc = -1; } - json_object_get(runner); - json_object_object_del(af->runners, runid); - - - - - - -.......... - - - - - - - json_object_put(runner); + else if (runner->state != as_running && runner->state != as_stopped) { + errno = EPERM; + rc = -1; + } + else if (runner->state == tostate) { + rc = 0; + } + else { + rc = killpg(runner->backend, sig); + if (!rc) + runner->state = tostate; + } + return rc; } -int appfwk_suspend(struct appfwk *af, const char *runid) -{ -} +/**************** API handling ************************/ -int appfwk_resume(struct appfwk *af, const char *runid) +int appfwk_run_start(struct json_object *appli) { + return -1; } -struct json_object *appfwk_running_list(struct appfwk *af) +int appfwk_run_terminate(int runid) { - return af->runners; + return killrunner(runid, SIGTERM, as_terminating); } -struct json_object *appfwk_state(struct appfwk *af, const char *runid) +int appfwk_run_stop(int runid) { - struct json_object *result; - int status = json_object_object_get_ex(af->runners, runid, &result); - return status ? result : NULL; + return killrunner(runid, SIGSTOP, as_stopped); } - - - - - - -#if defined(TESTAPPFWK) -#include <stdio.h> -int main() +int appfwk_run_continue(int runid) { -struct appfwk *af = appfwk_create(); -appfwk_add_root(af,FWK_APP_DIR); -appfwk_update_applications(af); -printf("array = %s\n", json_object_to_json_string_ext(af->applications.pubarr, 3)); -printf("direct = %s\n", json_object_to_json_string_ext(af->applications.direct, 3)); -printf("byapp = %s\n", json_object_to_json_string_ext(af->applications.byapp, 3)); -return 0; + return killrunner(runid, SIGCONT, as_running); } -#endif -static struct json_object *mkrunner(const char *appid, const char *runid) +static json_object *mkstate(struct apprun *runner, const char **runidstr) { - struct json_object *result = json_object_new_object(); - if (result) { - if(json_add_str(result, "id", appid) - || json_add_str(result, "runid", runid) - || json_add_str(result, "state", NULL)) { - json_object_put(result); - result = NULL; - } + const char *state; + struct json_object *result, *obj, *runid; + int rc; + + /* the structure */ + result = json_object_new_object(); + if (result == NULL) + goto error; + + /* the runid */ + runid = json_object_new_int(runner->runid); + if (runid == NULL) + goto error2; + json_object_object_add(result, "runid", obj); /* TODO TEST STATUS */ + + /* the state */ + switch(runner->state) { + case as_starting: + case as_running: + state = "running"; + break; + case as_stopped: + state = "stopped"; + break; + default: + state = "terminated"; + break; } + obj = json_object_new_string(state); + if (obj == NULL) + goto error2; + json_object_object_add(result, "state", obj); /* TODO TEST STATUS */ + + /* the application id */ + rc = json_object_object_get_ex(runner->appli, "public", &obj); + assert(rc); + rc = json_object_object_get_ex(obj, "id", &obj); + assert(rc); + json_object_object_add(result, "id", obj); /* TODO TEST STATUS */ + json_object_get(obj); + + /* done */ + if (runidstr) + *runidstr = json_object_get_string(runid); return result; + +error2: + json_object_put(result); +error: + errno = ENOMEM; + return NULL; } -const char *appfwk_start(struct appfwk *af, const char *appid) +struct json_object *appfwk_run_list() { - struct json_object *appli; - struct json_object *runner; - char buffer[250]; - - /* get the application description */ - appli = appfwk_get_application(af, appid); - if (appli == NULL) { - errno = ENOENT; - return -1; + struct json_object *result, *obj; + struct apprun *runner; + const char *runidstr; + int i; + + /* creates the object */ + result = json_object_new_object(); + if (result == NULL) { + errno = ENOMEM; + return NULL; } - /* prepare the execution */ + for (i = 0 ; i < ROOT_RUNNERS_COUNT ; i++) { + for (runner = runners_by_runid[i] ; runner ; runner = runner->next_by_runid) { + if (runner->state != as_terminating && runner->state != as_terminated) { + obj = mkstate(runner, &runidstr); + if (obj == NULL) { + json_object_put(result); + return NULL; + } + /* TODO status ? */ + json_object_object_add(result, runidstr, obj); + } + } + } + return result; } -int appfwk_stop(struct appfwk *af, const char *runid) +struct json_object *appfwk_run_state(int runid) { - struct json_object *runner; - runner = appfwk_state(af, runid); - if (runner == NULL) { + struct apprun *runner = getrunner(runid); + if (runner == NULL || runner->state == as_terminating || runner->state == as_terminated) { errno = ENOENT; - return -1; + return NULL; } - json_object_get(runner); - json_object_object_del(af->runners, runid); - - - - - - -.......... - - - - - - - json_object_put(runner); + return mkstate(runner, NULL); } -int appfwk_suspend(struct appfwk *af, const char *runid) -{ -} - -int appfwk_resume(struct appfwk *af, const char *runid) -{ -} - -struct json_object *appfwk_running_list(struct appfwk *af) -{ - return af->runners; -} - -struct json_object *appfwk_state(struct appfwk *af, const char *runid) -{ - struct json_object *result; - int status = json_object_object_get_ex(af->runners, runid, &result); - return status ? result : NULL; -} - - - -#endif diff --git a/src/appfwk-run.h b/src/appfwk-run.h index ea0f1a5..8d3526b 100644 --- a/src/appfwk-run.h +++ b/src/appfwk-run.h @@ -15,9 +15,9 @@ */ extern int appfwk_run_start(struct json_object *appli); +extern int appfwk_run_terminate(int runid); extern int appfwk_run_stop(int runid); -extern int appfwk_run_suspend(int runid); -extern int appfwk_run_resume(int runid); +extern int appfwk_run_continue(int runid); extern struct json_object *appfwk_run_list(); extern struct json_object *appfwk_run_state(int runid); diff --git a/src/secmgr-wrap.c b/src/secmgr-wrap.c index 87aa5a5..996f924 100644 --- a/src/secmgr-wrap.c +++ b/src/secmgr-wrap.c @@ -113,3 +113,8 @@ int secmgr_path_read_write(const char *pathname) return addpath(pathname, SECURITY_MANAGER_PATH_RW); } +int secmgr_prepare_exec(const char *appid) +{ + return retcode(security_manager_prepare_app(appid)); +} + diff --git a/src/secmgr-wrap.h b/src/secmgr-wrap.h index 3558c69..b6b6890 100644 --- a/src/secmgr-wrap.h +++ b/src/secmgr-wrap.h @@ -22,3 +22,4 @@ int secmgr_path_public_read_only(const char *pathname); int secmgr_path_read_only(const char *pathname); int secmgr_path_read_write(const char *pathname); +int secmgr_prepare_exec(const char *appid); diff --git a/src/simulation/security-manager.h b/src/simulation/security-manager.h index 4969555..6bc379a 100644 --- a/src/simulation/security-manager.h +++ b/src/simulation/security-manager.h @@ -51,3 +51,7 @@ static int diese = 0; #define security_manager_app_install(r) \ (printf("security_manager_app_install(%p)\n",r), SECURITY_MANAGER_SUCCESS) + +#define security_manager_prepare_app(a) \ + (printf("security_manager_prepare_app(%s)\n",a), SECURITY_MANAGER_SUCCESS) + |