aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am6
-rw-r--r--src/af-db.c (renamed from src/appfwk.c)109
-rw-r--r--src/af-db.h30
-rw-r--r--src/af-run.c (renamed from src/appfwk-run.c)103
-rw-r--r--src/af-run.h (renamed from src/appfwk-run.h)13
-rw-r--r--src/af-usrd.c47
-rw-r--r--src/appfwk.h30
7 files changed, 203 insertions, 135 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 3259434..b1c95bc 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -30,8 +30,8 @@ SECWRP = \
secmgr-wrap.c
APPFWK = \
- appfwk.c \
- appfwk-run.c
+ af-db.c \
+ af-run.c
AM_CFLAGS = -Wall -Wno-pointer-sign
@@ -45,6 +45,7 @@ fwk_icondir = $(fwk_datadir)/icons
fwk_prefix = urn:agl:
fwk_prefix_permission = $(fwk_prefix)perm:
fwk_prefix_plugin = $(fwk_prefix)plugin:
+fwk_user_appdir = app-data
wgtpkg_trusted_cert_dir = $(fwk_confdir)/certs
AM_CFLAGS += -DFWK_CONFIG_DIR=\"$(fwk_confdir)\"
@@ -52,6 +53,7 @@ AM_CFLAGS += -DFWK_PREFIX_PERMISSION=\"$(fwk_prefix_permission)\"
AM_CFLAGS += -DFWK_PREFIX_PLUGIN=\"$(fwk_prefix_plugin)\"
AM_CFLAGS += -DFWK_ICON_DIR=\"$(fwk_icondir)\"
AM_CFLAGS += -DFWK_APP_DIR=\"$(fwk_appdir)\"
+AM_CFLAGS += -DFWK_USER_APP_DIR=\"$(fwk_user_appdir)\"
AM_CFLAGS += -DWGTPKG_TRUSTED_CERT_DIR=\"$(wgtpkg_trusted_cert_dir)\"
diff --git a/src/appfwk.c b/src/af-db.c
index a8ae6c8..1663b35 100644
--- a/src/appfwk.c
+++ b/src/af-db.c
@@ -25,7 +25,8 @@
#include <json.h>
-#include <wgt-info.h>
+#include "wgt-info.h"
+#include "af-db.h"
struct afapps {
struct json_object *pubarr;
@@ -33,55 +34,55 @@ struct afapps {
struct json_object *byapp;
};
-struct appfwk {
+struct af_db {
int refcount;
int nrroots;
char **roots;
struct afapps applications;
};
-struct appfwk *appfwk_create()
+struct af_db *af_db_create()
{
- struct appfwk *appfwk = malloc(sizeof * appfwk);
- if (appfwk == NULL)
+ struct af_db *afdb = malloc(sizeof * afdb);
+ if (afdb == NULL)
errno = ENOMEM;
else {
- appfwk->refcount = 1;
- appfwk->nrroots = 0;
- appfwk->roots = NULL;
- appfwk->applications.pubarr = NULL;
- appfwk->applications.direct = NULL;
- appfwk->applications.byapp = NULL;
+ afdb->refcount = 1;
+ afdb->nrroots = 0;
+ afdb->roots = NULL;
+ afdb->applications.pubarr = NULL;
+ afdb->applications.direct = NULL;
+ afdb->applications.byapp = NULL;
}
- return appfwk;
+ return afdb;
}
-void appfwk_addref(struct appfwk *appfwk)
+void af_db_addref(struct af_db *afdb)
{
- assert(appfwk);
- appfwk->refcount++;
+ assert(afdb);
+ afdb->refcount++;
}
-void appfwk_unref(struct appfwk *appfwk)
+void af_db_unref(struct af_db *afdb)
{
- assert(appfwk);
- if (!--appfwk->refcount) {
- json_object_put(appfwk->applications.pubarr);
- json_object_put(appfwk->applications.direct);
- json_object_put(appfwk->applications.byapp);
- while (appfwk->nrroots)
- free(appfwk->roots[--appfwk->nrroots]);
- free(appfwk->roots);
- free(appfwk);
+ assert(afdb);
+ if (!--afdb->refcount) {
+ json_object_put(afdb->applications.pubarr);
+ json_object_put(afdb->applications.direct);
+ json_object_put(afdb->applications.byapp);
+ while (afdb->nrroots)
+ free(afdb->roots[--afdb->nrroots]);
+ free(afdb->roots);
+ free(afdb);
}
}
-int appfwk_add_root(struct appfwk *appfwk, const char *path)
+int af_db_add_root(struct af_db *afdb, const char *path)
{
int i, n;
char *r, **roots;
- assert(appfwk);
+ assert(afdb);
/* don't depend on the cwd and unique name */
r = realpath(path, NULL);
@@ -89,8 +90,8 @@ int appfwk_add_root(struct appfwk *appfwk, const char *path)
return -1;
/* avoiding duplications */
- n = appfwk->nrroots;
- roots = appfwk->roots;
+ n = afdb->nrroots;
+ roots = afdb->roots;
for (i = 0 ; i < n ; i++) {
if (!strcmp(r, roots[i])) {
free(r);
@@ -106,8 +107,8 @@ int appfwk_add_root(struct appfwk *appfwk, const char *path)
return -1;
}
roots[n++] = r;
- appfwk->roots = roots;
- appfwk->nrroots = n;
+ afdb->roots = roots;
+ afdb->nrroots = n;
return 0;
}
@@ -172,10 +173,12 @@ static int addapp(struct afapps *apps, const char *path)
goto error2;
}
- if(json_add_str(pub, "id", appid)
- || json_add_str(priv, "id", desc->id)
- || json_add_str(pub, "version", desc->version)
+ if(json_add_str(priv, "id", desc->id)
|| json_add_str(priv, "path", path)
+ || json_add_str(priv, "content", desc->content_src)
+ || json_add_str(priv, "type", desc->content_type)
+ || json_add_str(pub, "id", appid)
+ || json_add_str(pub, "version", desc->version)
|| json_add_int(pub, "width", desc->width)
|| json_add_int(pub, "height", desc->height)
|| json_add_str(pub, "name", desc->name)
@@ -285,7 +288,7 @@ static int enumvers(struct enumdata *data)
}
/* regenerate the list of applications */
-int appfwk_update_applications(struct appfwk *af)
+int af_db_update_applications(struct af_db *afdb)
{
int rc, iroot;
struct enumdata edata;
@@ -300,8 +303,8 @@ int appfwk_update_applications(struct appfwk *af)
goto error;
}
/* for each root */
- for (iroot = 0 ; iroot < af->nrroots ; iroot++) {
- edata.length = stpcpy(edata.path, af->roots[iroot]) - edata.path;
+ for (iroot = 0 ; iroot < afdb->nrroots ; iroot++) {
+ edata.length = stpcpy(edata.path, afdb->roots[iroot]) - edata.path;
assert(edata.length < sizeof edata.path);
/* enumerate the applications */
rc = enumentries(&edata, enumvers);
@@ -309,8 +312,8 @@ int appfwk_update_applications(struct appfwk *af)
goto error;
}
/* commit the result */
- oldapps = af->applications;
- af->applications = edata.apps;
+ oldapps = afdb->applications;
+ afdb->applications = edata.apps;
json_object_put(oldapps.pubarr);
json_object_put(oldapps.direct);
json_object_put(oldapps.byapp);
@@ -323,27 +326,27 @@ error:
return -1;
}
-int appfwk_ensure_applications(struct appfwk *af)
+int af_db_ensure_applications(struct af_db *afdb)
{
- return af->applications.pubarr ? 0 : appfwk_update_applications(af);
+ return afdb->applications.pubarr ? 0 : af_db_update_applications(afdb);
}
-struct json_object *appfwk_application_list(struct appfwk *af)
+struct json_object *af_db_application_list(struct af_db *afdb)
{
- return appfwk_ensure_applications(af) ? NULL : af->applications.pubarr;
+ return af_db_ensure_applications(afdb) ? NULL : afdb->applications.pubarr;
}
-struct json_object *appfwk_get_application(struct appfwk *af, const char *id)
+struct json_object *af_db_get_application(struct af_db *afdb, const char *id)
{
struct json_object *result;
- if (!appfwk_ensure_applications(af) && json_object_object_get_ex(af->applications.direct, id, &result))
+ if (!af_db_ensure_applications(afdb) && json_object_object_get_ex(afdb->applications.direct, id, &result))
return result;
return NULL;
}
-struct json_object *appfwk_get_application_public(struct appfwk *af, const char *id)
+struct json_object *af_db_get_application_public(struct af_db *afdb, const char *id)
{
- struct json_object *result = appfwk_get_application(af, id);
+ struct json_object *result = af_db_get_application(afdb, id);
return result && json_object_object_get_ex(result, "public", &result) ? result : NULL;
}
@@ -354,12 +357,12 @@ struct json_object *appfwk_get_application_public(struct appfwk *af, const char
#include <stdio.h>
int main()
{
-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));
+struct af_db *afdb = af_db_create();
+af_db_add_root(afdb,FWK_APP_DIR);
+af_db_update_applications(afdb);
+printf("array = %s\n", json_object_to_json_string_ext(afdb->applications.pubarr, 3));
+printf("direct = %s\n", json_object_to_json_string_ext(afdb->applications.direct, 3));
+printf("byapp = %s\n", json_object_to_json_string_ext(afdb->applications.byapp, 3));
return 0;
}
#endif
diff --git a/src/af-db.h b/src/af-db.h
new file mode 100644
index 0000000..f54d807
--- /dev/null
+++ b/src/af-db.h
@@ -0,0 +1,30 @@
+/*
+ Copyright 2015 IoT.bzh
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+struct af_db;
+
+extern struct af_db *af_db_create();
+extern void af_db_addref(struct af_db *afdb);
+extern void af_db_unref(struct af_db *afdb);
+
+extern int af_db_add_root(struct af_db *afdb, const char *path);
+extern int af_db_update_applications(struct af_db *afdb);
+extern int af_db_ensure_applications(struct af_db *afdb);
+
+extern struct json_object *af_db_application_list(struct af_db *afdb);
+extern struct json_object *af_db_get_application(struct af_db *afdb, const char *id);
+extern struct json_object *af_db_get_application_public(struct af_db *afdb, const char *id);
+
diff --git a/src/appfwk-run.c b/src/af-run.c
index 87b02b0..0fd533c 100644
--- a/src/appfwk-run.c
+++ b/src/af-run.c
@@ -14,23 +14,22 @@
limitations under the License.
*/
+#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
-
-
-
-#include <stdlib.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <errno.h>
#include <assert.h>
+#include <stdio.h>
+#include <limits.h>
#include <string.h>
-#include <errno.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <sys/types.h>
#include <json.h>
-#include <wgt-info.h>
-
+#include "verbose.h"
+#include "utils-dir.h"
+#include "wgt-info.h"
enum appstate {
as_starting,
@@ -44,8 +43,7 @@ struct apprun {
struct apprun *next_by_runid;
struct apprun *next_by_pgid;
int runid;
- pid_t backend;
- pid_t frontend;
+ pid_t pgid;
enum appstate state;
json_object *appli;
};
@@ -58,13 +56,16 @@ static struct apprun *runners_by_pgid[ROOT_RUNNERS_COUNT];
static int runnercount = 0;
static int runnerid = 0;
+static const char fwk_user_app_dir[] = FWK_USER_APP_DIR;
+static char *homeappdir;
+
/****************** 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)
+ while (result && result->pgid != pgid)
result = result->next_by_pgid;
return result;
}
@@ -72,7 +73,7 @@ static struct apprun *runner_of_pgid(pid_t pgid)
/* 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))];
+ struct apprun **prev = &runners_by_runid[(int)(runner->pgid & (ROOT_RUNNERS_COUNT - 1))];
runner->next_by_pgid = *prev;
*prev = runner;
}
@@ -80,7 +81,7 @@ static void pgid_insert(struct apprun *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))];
+ struct apprun **prev = &runners_by_runid[(int)(runner->pgid & (ROOT_RUNNERS_COUNT - 1))];
runner->next_by_pgid = *prev;
*prev = runner;
}
@@ -142,8 +143,7 @@ static struct apprun *createrunner(json_object *appli)
result->next_by_runid = *prev;
result->next_by_pgid = NULL;
result->runid = runnerid;
- result->backend = 0;
- result->frontend = 0;
+ result->pgid = 0;
result->state = as_starting;
result->appli = json_object_get(appli);
*prev = result;
@@ -192,31 +192,46 @@ static int killrunner(int runid, int sig, enum appstate tostate)
rc = 0;
}
else {
- rc = killpg(runner->backend, sig);
+ rc = killpg(runner->pgid, sig);
if (!rc)
runner->state = tostate;
}
return rc;
}
+/**************** summarizing the application *********************/
+
+struct applisum {
+ const char *path;
+ const char *tag;
+ const char *appid;
+ const char *content;
+ const char *type;
+ const char *name;
+ int width;
+ int height;
+};
+
/**************** API handling ************************/
-int appfwk_run_start(struct json_object *appli)
+int af_run_start(struct json_object *appli)
{
+ const char *path;
+ const char *id;
return -1;
}
-int appfwk_run_terminate(int runid)
+int af_run_terminate(int runid)
{
return killrunner(runid, SIGTERM, as_terminating);
}
-int appfwk_run_stop(int runid)
+int af_run_stop(int runid)
{
return killrunner(runid, SIGSTOP, as_stopped);
}
-int appfwk_run_continue(int runid)
+int af_run_continue(int runid)
{
return killrunner(runid, SIGCONT, as_running);
}
@@ -276,7 +291,7 @@ error:
return NULL;
}
-struct json_object *appfwk_run_list()
+struct json_object *af_run_list()
{
struct json_object *result, *obj;
struct apprun *runner;
@@ -306,7 +321,7 @@ struct json_object *appfwk_run_list()
return result;
}
-struct json_object *appfwk_run_state(int runid)
+struct json_object *af_run_state(int runid)
{
struct apprun *runner = getrunner(runid);
if (runner == NULL || runner->state == as_terminating || runner->state == as_terminated) {
@@ -316,3 +331,43 @@ struct json_object *appfwk_run_state(int runid)
return mkstate(runner, NULL);
}
+/**************** INITIALISATION **********************/
+
+int af_run_init()
+{
+ char buf[2048];
+ char dir[PATH_MAX];
+ int rc;
+ uid_t me;
+ struct passwd passwd, *pw;
+
+ /* computes the 'homeappdir' */
+ me = geteuid();
+ rc = getpwuid_r(me, &passwd, buf, sizeof buf, &pw);
+ if (rc || pw == NULL) {
+ errno = rc ? errno : ENOENT;
+ ERROR("getpwuid_r failed for uid=%d: %m",(int)me);
+ return -1;
+ }
+ rc = snprintf(dir, sizeof dir, "%s/%s", passwd.pw_dir, fwk_user_app_dir);
+ if (rc >= sizeof dir) {
+ ERROR("buffer overflow in user_app_dir for uid=%d",(int)me);
+ return -1;
+ }
+ rc = create_directory(dir, 0755, 1);
+ if (rc && errno != EEXIST) {
+ ERROR("creation of directory %s failed in user_app_dir: %m", dir);
+ return -1;
+ }
+ homeappdir = strdup(dir);
+ if (homeappdir == NULL) {
+ errno = ENOMEM;
+ ERROR("out of memory in user_app_dir for %s : %m", dir);
+ return -1;
+ }
+
+ /* install signal handlers */
+
+ return 0;
+}
+
diff --git a/src/appfwk-run.h b/src/af-run.h
index 8d3526b..e3cd14f 100644
--- a/src/appfwk-run.h
+++ b/src/af-run.h
@@ -14,10 +14,11 @@
limitations under the License.
*/
-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_continue(int runid);
-extern struct json_object *appfwk_run_list();
-extern struct json_object *appfwk_run_state(int runid);
+extern int af_run_start(struct json_object *appli);
+extern int af_run_terminate(int runid);
+extern int af_run_stop(int runid);
+extern int af_run_continue(int runid);
+extern struct json_object *af_run_list();
+extern struct json_object *af_run_state(int runid);
+extern int af_run_init();
diff --git a/src/af-usrd.c b/src/af-usrd.c
index 1563e44..89e1c57 100644
--- a/src/af-usrd.c
+++ b/src/af-usrd.c
@@ -14,17 +14,18 @@
limitations under the License.
*/
+#include <unistd.h>
#include <stdio.h>
#include <json.h>
#include "verbose.h"
#include "utils-jbus.h"
-#include "appfwk.h"
-#include "appfwk-run.h"
+#include "af-db.h"
+#include "af-run.h"
static struct jbus *jbus;
-static struct appfwk *appfwk;
+static struct af_db *afdb;
const char error_nothing[] = "[]";
const char error_bad_request[] = "{\"status\":\"error: bad request\"}";
@@ -51,7 +52,7 @@ static void reply(struct jreq *jreq, struct json_object *resp, const char *errst
static void on_runnables(struct jreq *jreq, struct json_object *obj)
{
- struct json_object *resp = appfwk_application_list(appfwk);
+ struct json_object *resp = af_db_application_list(afdb);
jbus_reply(jreq, resp);
json_object_put(obj);
}
@@ -59,7 +60,7 @@ static void on_runnables(struct jreq *jreq, struct json_object *obj)
static void on_detail(struct jreq *jreq, struct json_object *obj)
{
const char *appid = getappid(obj);
- struct json_object *resp = appfwk_get_application_public(appfwk, appid);
+ struct json_object *resp = af_db_get_application_public(afdb, appid);
reply(jreq, resp, error_not_found);
json_object_put(obj);
}
@@ -75,11 +76,11 @@ static void on_start(struct jreq *jreq, struct json_object *obj)
if (appid == NULL)
jbus_replyj(jreq, error_bad_request);
else {
- appli = appfwk_get_application(appfwk, appid);
+ appli = af_db_get_application(afdb, appid);
if (appli == NULL)
jbus_replyj(jreq, error_not_found);
else {
- runid = appfwk_run_start(appli);
+ runid = af_run_start(appli);
if (runid <= 0)
jbus_replyj(jreq, error_cant_start);
else {
@@ -95,7 +96,7 @@ static void on_start(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_stop(runid);
+ int status = af_run_stop(runid);
jbus_replyj(jreq, status ? error_not_found : "true");
json_object_put(obj);
}
@@ -103,7 +104,7 @@ static void on_stop(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_continue(runid);
+ int status = af_run_continue(runid);
jbus_replyj(jreq, status ? error_not_found : "true");
json_object_put(obj);
}
@@ -111,14 +112,14 @@ static void on_continue(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_terminate(runid);
+ int status = af_run_terminate(runid);
jbus_replyj(jreq, status ? error_not_found : "true");
json_object_put(obj);
}
static void on_runners(struct jreq *jreq, struct json_object *obj)
{
- struct json_object *resp = appfwk_run_list();
+ struct json_object *resp = af_run_list();
jbus_reply(jreq, resp);
json_object_put(resp);
json_object_put(obj);
@@ -127,7 +128,7 @@ static void on_runners(struct jreq *jreq, struct json_object *obj)
static void on_state(struct jreq *jreq, struct json_object *obj)
{
int runid = getrunid(obj);
- struct json_object *resp = appfwk_run_state(runid);
+ struct json_object *resp = af_run_state(runid);
reply(jreq, resp, error_not_found);
json_object_put(resp);
json_object_put(obj);
@@ -145,25 +146,31 @@ static int daemonize()
int main(int ac, char **av)
{
- LOGAUTH("af-usrd");
+ LOGAUTH("afdb-usrd");
+
+ /* init runners */
+ if (af_run_init()) {
+ ERROR("af_run_init failed");
+ return 1;
+ }
/* init framework */
- appfwk = appfwk_create();
- if (!appfwk) {
- ERROR("appfwk_create failed");
+ afdb = af_db_create();
+ if (!afdb) {
+ ERROR("af_create failed");
return 1;
}
- if (appfwk_add_root(appfwk, FWK_APP_DIR)) {
+ if (af_db_add_root(afdb, FWK_APP_DIR)) {
ERROR("can't add root %s", FWK_APP_DIR);
return 1;
}
- if (appfwk_update_applications(appfwk)) {
- ERROR("appfwk_update_applications failed");
+ if (af_db_update_applications(afdb)) {
+ ERROR("af_update_applications failed");
return 1;
}
/* init service */
- jbus = create_jbus(1, "/org/automotive/linux/framework");
+ jbus = create_jbus(1, "/org/AGL/framework");
if (!jbus) {
ERROR("create_jbus failed");
return 1;
diff --git a/src/appfwk.h b/src/appfwk.h
deleted file mode 100644
index 7bd4af2..0000000
--- a/src/appfwk.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- Copyright 2015 IoT.bzh
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-struct appfwk;
-
-extern struct appfwk *appfwk_create();
-extern void appfwk_addref(struct appfwk *appfwk);
-extern void appfwk_unref(struct appfwk *appfwk);
-
-extern int appfwk_add_root(struct appfwk *appfwk, const char *path);
-extern int appfwk_update_applications(struct appfwk *af);
-extern int appfwk_ensure_applications(struct appfwk *af);
-
-extern struct json_object *appfwk_application_list(struct appfwk *af);
-extern struct json_object *appfwk_get_application(struct appfwk *af, const char *id);
-extern struct json_object *appfwk_get_application_public(struct appfwk *af, const char *id);
-