#define STORAGE_EXT_GET_LIST "GetDeviceList"
-#define STORAGE_EXT_OBJECT_ADDED "ObjectAdded"
-#define STORAGE_EXT_OBJECT_REMOVED "ObjectRemoved"
#define STORAGE_EXT_DEVICE_CHANGED "DeviceChanged"
+#define STORAGE_EXT_DEVICE_ADDED "DeviceAdded"
+#define STORAGE_EXT_DEVICE_REMOVED "DeviceRemoved"
+#define STORAGE_EXT_DEVICE_BLOCKED "DeviceBlocked"
#define DBUS_REPLY_TIMEOUT (-1)
-#define DEV_PREFIX "/dev/"
-
struct storage_ext_callback {
storage_ext_changed_cb func;
void *data;
guint block_id;
- guint blockmanager_id;
};
static dd_list *changed_list;
return conn;
}
-static GVariant *dbus_method_call_sync(const gchar *dest, const gchar *path,
+GVariant *dbus_method_call_sync(const gchar *dest, const gchar *path,
const gchar *iface, const gchar *method, GVariant *param)
{
GDBusConnection *conn;
GError *err = NULL;
GVariant *ret;
- if (!dest || !path || !iface || !method || !param)
+ if (!dest || !path || !iface || !method)
return NULL;
conn = get_dbus_connection();
out:
if (ret < 0)
- storage_ext_release_list(list);
+ storage_ext_release_list(list); //LCOV_EXCL_LINE System Error
g_variant_iter_free(iter);
g_variant_unref(result);
return ret;
}
//LCOV_EXCL_START Not called Callback
-static char *get_devnode_from_path(char *path)
-{
- if (!path)
- return NULL;
- /* 1 means '/' */
- return path + strlen(STORAGE_EXT_PATH_DEVICES) + 1;
-}
-//LCOV_EXCL_STOP
-
-//LCOV_EXCL_START Not called Callback
-static void storage_ext_object_path_changed(enum storage_ext_state state,
- GVariant *params, gpointer user_data)
-{
- storage_ext_device *dev = NULL;
- dd_list *elem;
- struct storage_ext_callback *callback;
- char *path = NULL;
- char *devnode;
- int ret;
-
- if (!params)
- return;
-
- g_variant_get(params, "(s)", &path);
-
- devnode = get_devnode_from_path(path);
- if (!devnode)
- goto out;
-
- dev = calloc(1, sizeof(storage_ext_device));
- if (!dev)
- goto out;
-
- dev->devnode = strdup(devnode);
- if (dev->devnode == NULL) {
- _E("strdup() failed");
- goto out;
- }
-
- DD_LIST_FOREACH(changed_list, elem, callback) {
- if (!callback->func)
- continue;
- ret = callback->func(dev, state, callback->data);
- if (ret < 0)
- _E("Failed to call callback for devnode(%s, %d)", devnode, ret);
- }
-
-out:
- if (dev) {
- free(dev->devnode);
- free(dev);
- }
- free(path);
-}
-//LCOV_EXCL_STOP
-
-//LCOV_EXCL_START Not called Callback
-static void storage_ext_device_added(GVariant *params, gpointer user_data)
-{
- storage_ext_object_path_changed(STORAGE_EXT_ADDED, params, user_data);
-}
-//LCOV_EXCL_STOP
-
-//LCOV_EXCL_START Not called Callback
-static void storage_ext_device_removed(GVariant *params, gpointer user_data)
-{
- storage_ext_object_path_changed(STORAGE_EXT_REMOVED, params, user_data);
-}
-//LCOV_EXCL_STOP
-
-//LCOV_EXCL_START Not called Callback
-static void storage_ext_device_changed(GVariant *params, gpointer user_data)
+static void storage_ext_device_changed(GVariant *params, enum storage_ext_state state, gpointer user_data)
{
storage_ext_device *dev;
dd_list *elem;
&dev->flags,
&dev->storage_id);
+ /* Callback is called when unmount is started(DeviceBlocked signal) */
+ if (state == STORAGE_EXT_CHANGED && dev->state == STORAGE_EXT_UNMOUNTED) {
+ storage_ext_release_device(&dev);
+ return;
+ }
+
DD_LIST_FOREACH(changed_list, elem, callback) {
if (!callback->func)
continue;
- ret = callback->func(dev, STORAGE_EXT_CHANGED, callback->data);
+ ret = callback->func(dev, state, callback->data);
if (ret < 0)
_E("Failed to call callback for devnode(%s, %d)", dev->devnode, ret);
}
gpointer user_data)
{
size_t iface_len, signal_len;
+ enum storage_ext_state state;
if (!params || !sender || !path || !iface || !signal)
return;
iface_len = strlen(iface) + 1;
signal_len = strlen(signal) + 1;
- if (!strncmp(iface, STORAGE_EXT_IFACE_MANAGER, iface_len)) {
- if (!strncmp(signal, STORAGE_EXT_OBJECT_ADDED, signal_len))
- storage_ext_device_added(params, user_data);
- else if (!strncmp(signal, STORAGE_EXT_OBJECT_REMOVED, signal_len))
- storage_ext_device_removed(params, user_data);
+ if (strncmp(iface, STORAGE_EXT_IFACE_MANAGER, iface_len))
return;
- }
- if (!strncmp(iface, STORAGE_EXT_IFACE, iface_len) &&
- !strncmp(signal, STORAGE_EXT_DEVICE_CHANGED, signal_len)) {
- storage_ext_device_changed(params, user_data);
+ if (!strncmp(signal, STORAGE_EXT_DEVICE_CHANGED, signal_len))
+ state = STORAGE_EXT_CHANGED;
+
+ else if (!strncmp(signal, STORAGE_EXT_DEVICE_ADDED, signal_len))
+ state = STORAGE_EXT_ADDED;
+
+ else if (!strncmp(signal, STORAGE_EXT_DEVICE_REMOVED, signal_len))
+ state = STORAGE_EXT_REMOVED;
+
+ else if (!strncmp(signal, STORAGE_EXT_DEVICE_BLOCKED, signal_len))
+ state = STORAGE_EXT_BLOCKED;
+
+ else
return;
- }
+
+ storage_ext_device_changed(params, state, user_data);
}
//LCOV_EXCL_STOP
int storage_ext_register_device_change(storage_ext_changed_cb func, void *data)
{
GDBusConnection *conn;
- guint block_id = NULL, blockmanager_id = NULL;
+ guint block_id = 0;
struct storage_ext_callback *callback;
dd_list *elem;
DD_LIST_FOREACH(changed_list, elem, callback) {
if (callback->func != func)
continue;
- if (callback->block_id == 0 || callback->blockmanager_id == 0)
+ if (callback->block_id == 0)
continue;
return -EEXIST;
callback = (struct storage_ext_callback *)malloc(sizeof(struct storage_ext_callback));
if (!callback) {
-//LCOV_EXCL_START System Error
+ //LCOV_EXCL_START System Error
_E("malloc() failed");
return -ENOMEM;
-//LCOV_EXCL_STOP
+ //LCOV_EXCL_STOP
}
conn = get_dbus_connection();
if (!conn) {
-//LCOV_EXCL_START System Error
+ //LCOV_EXCL_START System Error
free(callback);
_E("Failed to get dbus connection");
return -EPERM;
-//LCOV_EXCL_STOP
+ //LCOV_EXCL_STOP
}
block_id = g_dbus_connection_signal_subscribe(conn,
- STORAGE_EXT_BUS_NAME,
- STORAGE_EXT_IFACE,
- STORAGE_EXT_DEVICE_CHANGED,
- NULL,
- NULL,
- G_DBUS_SIGNAL_FLAGS_NONE,
- storage_ext_changed,
NULL,
- NULL);
- if (block_id == 0) {
- free(callback);
- _E("Failed to subscrive bus signal");
- return -EPERM;
- }
-
- blockmanager_id = g_dbus_connection_signal_subscribe(conn,
- STORAGE_EXT_BUS_NAME,
STORAGE_EXT_IFACE_MANAGER,
NULL,
- STORAGE_EXT_PATH_MANAGER,
+ NULL,
NULL,
G_DBUS_SIGNAL_FLAGS_NONE,
storage_ext_changed,
NULL,
NULL);
- if (blockmanager_id == 0) {
-//LCOV_EXCL_START System Error
+ if (block_id == 0) {
+ //LCOV_EXCL_START System Error
free(callback);
_E("Failed to subscrive bus signal");
return -EPERM;
-//LCOV_EXCL_STOP
+ //LCOV_EXCL_STOP
}
callback->func = func;
callback->data = data;
callback->block_id = block_id;
- callback->blockmanager_id = blockmanager_id;
DD_LIST_APPEND(changed_list, callback);
GDBusConnection *conn;
struct storage_ext_callback *callback;
dd_list *elem;
+ dd_list *elem_n;
if (!func)
return;
//LCOV_EXCL_STOP
}
- DD_LIST_FOREACH(changed_list, elem, callback) {
+ DD_LIST_FOREACH_SAFE(changed_list, elem, elem_n, callback) {
if (callback->func != func)
continue;
if (callback->block_id > 0)
g_dbus_connection_signal_unsubscribe(conn, callback->block_id);
- if (callback->blockmanager_id > 0)
- g_dbus_connection_signal_unsubscribe(conn, callback->blockmanager_id);
DD_LIST_REMOVE(changed_list, callback);
free(callback);
result = dbus_method_call_sync(STORAGE_EXT_BUS_NAME,
STORAGE_EXT_PATH_MANAGER,
STORAGE_EXT_IFACE_MANAGER,
- "GetDeviceInfoByID",
+ "GetDeviceInfo",
g_variant_new("(i)", storage_id));
if (!result) {
_E("There is no storage with the storage id (%d)", storage_id); //LCOV_EXCL_LINE
return -ENODEV;
}
- g_variant_get(result, "(issssssisibii)",
- &info->type, &info->devnode, &info->syspath,
- &info->fs_usage, &info->fs_type,
- &info->fs_version, &info->fs_uuid,
- &info->readonly, &info->mount_point,
- &info->state, &info->primary,
- &info->flags, &info->storage_id);
+ if (g_variant_check_format_string(result, "(issssssisibii)", true)) {
+ g_variant_get(result, "(issssssisibii)",
+ &info->type, &info->devnode, &info->syspath,
+ &info->fs_usage, &info->fs_type,
+ &info->fs_version, &info->fs_uuid,
+ &info->readonly, &info->mount_point,
+ &info->state, &info->primary,
+ &info->flags, &info->storage_id);
+ } else {
+ _E("No storage with the storage id (%d)", storage_id); //LCOV_EXCL_LINE
+ return -ENODEV;
+ }
g_variant_unref(result);