#define TEP_INTERFACE_NAME "org.tizen.system.deviced.Tzip"
#define TEP_IS_MOUNTED_METHOD "IsMounted"
+#define APP2SD_BUS_NAME "org.tizen.app2sd"
+#define APP2SD_OBJECT_PATH "/org/tizen/app2sd"
+#define APP2SD_INTERFACE_NAME "org.tizen.app2sd"
+#define APP2SD_ONDEMANDSETUPINIT_METHOD "OndemandSetupInit"
+#define APP2SD_RETRY_MAX 5
+#define APP2SD_WAIT_USEC (1000000 / 2) /* 0.5 sec */
+
static int __read_proc(const char *path, char *buf, int size)
{
int fd;
return r;
}
-static int __is_tep_mount_done(const char *tep_path)
+static int __dbus_send_message(DBusMessage *callback(void *), void *user_data,
+ int timeout, int *result)
{
DBusError err;
DBusConnection *conn;
goto end;
}
- msg = dbus_message_new_method_call(TEP_BUS_NAME,
- TEP_OBJECT_PATH,
- TEP_INTERFACE_NAME,
- TEP_IS_MOUNTED_METHOD);
+ msg = callback(user_data);
if (!msg) {
- _E("Message is NULL");
- ret = -1;
- goto end;
- }
-
- dbus_message_iter_init_append(msg, &args);
- r = dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &tep_path);
- if (!r) {
- _E("Out of memory");
- ret = -1;
+ _E("Message is nullptr");
goto end;
}
- r = dbus_connection_send_with_reply(conn, msg, &pending, 500);
+ r = dbus_connection_send_with_reply(conn, msg, &pending, timeout);
if (!r || !pending) {
_E("Failed to send message");
ret = -1;
ret = -1;
} else {
dbus_message_iter_get_basic(&args, &i);
- ret = i;
+ *result = i;
}
- _D("Result: %d", ret);
+ _D("Result: %d", *result);
end:
if (msg)
dbus_message_unref(msg);
return ret;
}
+static DBusMessage *__create_tep_mount_message(void *user_data)
+{
+ DBusMessage *message;
+ DBusMessageIter args;
+ dbus_bool_t r;
+ const char *tep_path = (const char *)user_data;
+
+ message = dbus_message_new_method_call(TEP_BUS_NAME,
+ TEP_OBJECT_PATH,
+ TEP_INTERFACE_NAME,
+ TEP_IS_MOUNTED_METHOD);
+ if (!message) {
+ _E("Message is nullptr");
+ return NULL;
+ }
+
+ dbus_message_iter_init_append(message, &args);
+ r = dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &tep_path);
+ if (!r) {
+ _E("Out of memory");
+ dbus_message_unref(message);
+ return NULL;
+ }
+
+ return message;
+}
+
+static int __is_tep_mount_done(const char *tep_path)
+{
+ int result = -1;
+ int ret;
+
+ ret = __dbus_send_message(__create_tep_mount_message,
+ (void *)tep_path, 500, &result);
+ if (ret != 0)
+ _E("Failed to send message");
+
+ return result;
+}
+
static int __check_tep_mount(const char *tep_path)
{
int r;
return 0;
}
+
+struct package_info_s {
+ const char *id;
+ uid_t uid;
+};
+
+static DBusMessage *__create_app2sd_message(void *user_data)
+{
+ struct package_info_s *pkg_info = (struct package_info_s *)user_data;
+ DBusMessage *message;
+ DBusMessageIter args;
+ dbus_bool_t r;
+
+ _D("[__APP2SD__] package(%s), uid(%u)", pkg_info->id, pkg_info->uid);
+
+ message = dbus_message_new_method_call(APP2SD_BUS_NAME,
+ APP2SD_OBJECT_PATH,
+ APP2SD_INTERFACE_NAME,
+ APP2SD_ONDEMANDSETUPINIT_METHOD);
+ if (!message) {
+ _E("Message is nullptr");
+ return NULL;
+ }
+
+ dbus_message_iter_init_append(message, &args);
+ r = dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING,
+ &pkg_info->id);
+ if (!r) {
+ _E("Failed to append pkgid");
+ dbus_message_unref(message);
+ return NULL;
+ }
+
+ r = dbus_message_iter_append_basic(&args, DBUS_TYPE_INT32,
+ &pkg_info->uid);
+ if (!r) {
+ _E("Failed to append uid");
+ dbus_message_unref(message);
+ return NULL;
+ }
+
+ return message;
+}
+
+int _enable_external_pkg(bundle *b, const char *pkgid, uid_t pkg_uid)
+{
+ const char *installed_storage;
+ int retry_cnt = 0;
+ int result = -1;
+ int ret;
+ struct package_info_s pkg_info = {
+ .id = pkgid,
+ .uid = pkg_uid
+ };
+
+ installed_storage = bundle_get_val(b, AUL_K_INSTALLED_STORAGE);
+ if (!installed_storage || strcmp(installed_storage, "external") != 0)
+ return 0;
+
+ do {
+ ret = __dbus_send_message(__create_app2sd_message,
+ &pkg_info, G_MAXINT, &result);
+ if (ret != 0) {
+ _E("Failed to send message");
+ retry_cnt++;
+ usleep(APP2SD_WAIT_USEC);
+ continue;
+ }
+
+ break;
+ } while (retry_cnt <= APP2SD_RETRY_MAX);
+
+ _D("[__APP2SD__] result(%d)", result);
+
+ return result;
+}