#include <app2ext_interface.h>
#include <libmount.h>
#include <blkid/blkid.h>
+#include <ode/luks.h>
#include "log.h"
#include "config-parser.h"
/**
* TODO Assume root device is always mmcblk0*.
*/
-#define MMC_PATH "*/mmcblk[0-9]*"
-#define MMC_PARTITION_PATH "mmcblk[0-9]p[0-9]"
+#define MMC_PATH "*/mmcblk[0-9]*"
+#define MMC_PARTITION_PATH "mmcblk[0-9]p[0-9]"
/* Emulator send devlink for sdcard as \*\/sdcard\/\* */
-#define MMC_LINK_PATH "*/sdcard/*"
-#define SCSI_PATH "*/sd[a-z]*"
-#define SCSI_PARTITION_PATH "sd[a-z][0-9]"
-#define SCSI_PARTITION_LENGTH 9
-#define EXTENDEDSD_PATH "/dev/mapper/extendedsd*"
+#define MMC_LINK_PATH "*/sdcard/*"
+#define SCSI_PATH "*/sd[a-z]*"
+#define SCSI_PARTITION_PATH "sd[a-z][0-9]"
+#define SCSI_PARTITION_LENGTH 9
+#define EXTENDEDSD_NODE_PATH "/dev/mapper/extendedsd*"
-#define FILESYSTEM "filesystem"
+#define FILESYSTEM "filesystem"
-#define DEV_PREFIX "/dev/"
-#define ROOT_DIR "/"
+#define DEV_PREFIX "/dev/"
+#define ROOT_DIR "/"
-#define UNMOUNT_RETRY 5
-#define TIMEOUT_MAKE_OBJECT 500 /* milliseconds */
+#define UNMOUNT_RETRY 5
+#define TIMEOUT_MAKE_OBJECT 500 /* milliseconds */
#define SIGNAL_POWEROFF_STATE "ChangeState"
#define EXTENDED_INTERNAL_PATH "/run/extended-internal-sd"
#define PATH_LEN 55
-#define EXTENDED_SD_PATH "/opt/extendedsd"
-#define EXTENDED_SD_STRING "ExtendedInternalSD"
+#define EXTENDEDSD_MOUNT_POINT "/opt/extendedsd"
+#define EXTENDEDSD_STRING "ExtendedInternalSD"
#define EXT4_NAME "ext4"
#define LUKS_NAME "crypto_LUKS"
ret = get_scsi_mount_node(name, node, sizeof(node));
break;
case BLOCK_EXTENDEDSD_DEV:
- return strdup(EXTENDED_SD_PATH);
+ return strdup(EXTENDEDSD_MOUNT_POINT);
default:
_E("Invalid block type (%d)", data->block_type);
return NULL;
if (fnmatch(MMC_LINK_PATH, devnode, 0) &&
fnmatch(MMC_PATH, devnode, 0) &&
fnmatch(SCSI_PATH, devnode, 0) &&
- fnmatch(EXTENDEDSD_PATH, devnode, 0))
+ fnmatch(EXTENDEDSD_NODE_PATH, devnode, 0))
return false;
temp = strrchr(devnode, '/');
data->block_type = BLOCK_MMC_DEV;
else if (!fnmatch(SCSI_PATH, devnode, 0))
data->block_type = BLOCK_SCSI_DEV;
- else if (!fnmatch(EXTENDEDSD_PATH, devnode, 0))
+ else if (!fnmatch(EXTENDEDSD_NODE_PATH, devnode, 0))
data->block_type = BLOCK_EXTENDEDSD_DEV;
else
data->block_type = -1;
return NULL;
}
+// Called By MainThread - Remove Device
+static struct block_device *find_block_device_path(const char *mount_point)
+{
+ struct block_device *bdev;
+ dd_list *elem;
+ int len;
+ int i;
+
+ len = strlen(mount_point) + 1;
+ for (i = 0; i < THREAD_MAX; i++) {
+ pthread_mutex_lock(&(th_manager[i].mutex));
+ DD_LIST_FOREACH(th_manager[i].block_dev_list, elem, bdev) {
+ if (bdev->data && !bdev->removed &&
+ !strncmp(bdev->data->mount_point, mount_point, len)) {
+ pthread_mutex_unlock(&(th_manager[i].mutex));
+ return bdev;
+ }
+ }
+ pthread_mutex_unlock(&(th_manager[i].mutex));
+ }
+
+ return NULL;
+}
+
// Called By MainThread - Mount,Unmount,Format,GetInfo
static struct block_device *find_block_device_by_id(int id)
{
bdev->data->block_type = BLOCK_EXTENDEDSD_DEV;
_D("Need to unlock encrypted sdcard");
// ---- ODE UI launch ----
- ret = launch_system_app(POPUP_DEFAULT, 8, POPUP_KEY_CONTENT, "unlockextendedsd", VIEWTYPE_KEY, INSERT_SD_CARD, DEVPATH_KEY, bdev->data->devnode, MAPPING_NODE_KEY, EXTENDEDSD_NAME);
+ ret = launch_system_app(POPUP_DEFAULT
+ , 8
+ , POPUP_KEY_CONTENT
+ , "unlockextendedsd"
+ , VIEWTYPE_KEY
+ , INSERT_SD_CARD
+ , DEVPATH_KEY
+ , bdev->data->devnode
+ , MAPPING_NODE_KEY
+ , EXTENDEDSD_NAME);
if (ret < 0)
_E("Failed to launch popup");
- //ode_luks_set_event_cb(CALLBACK)
-
return 0;
} else if (mapper && !strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) {
bdev->data->block_type = BLOCK_EXTENDEDSD_DEV;
- ret = change_mount_point(bdev, EXTENDED_SD_PATH);
+ ret = change_mount_point(bdev, EXTENDEDSD_MOUNT_POINT);
if (ret < 0) {
ret = -EPERM;
free_block_device(bdev);
static int remove_block_device(struct udev_device *dev, const char *devnode)
{
struct block_device *bdev;
+ struct block_device *bdev_extended;
int ret;
bdev = find_block_device(devnode);
_D("Private operation state: %d", bdev->on_private_op);
}
+ if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) {
+ bdev_extended = find_block_device_path(EXTENDEDSD_MOUNT_POINT);
+ if (bdev_extended) {
+ BLOCK_FLAG_SET(bdev_extended->data, UNMOUNT_UNSAFE);
+
+ bdev_extended->removed = true;
+ if (bdev_extended->on_private_op != REQ_NORMAL) {
+ bdev_extended->on_private_op = REQ_NORMAL;
+ _D("Private operation state: %d", bdev_extended->on_private_op);
+ }
+
+ ret = add_operation(bdev_extended, BLOCK_DEV_UNMOUNT, NULL, (void *)UNMOUNT_FORCE);
+ if (ret < 0) {
+ _E("Failed to add operation (unmount %s)", devnode);
+ return ret;
+ }
+
+ ret = add_operation(bdev_extended, BLOCK_DEV_REMOVE, NULL, NULL);
+ if (ret < 0) {
+ _E("Failed to add operation (remove %s)", devnode);
+ return ret;
+ }
+
+ ret = ode_luks_close(EXTENDEDSD_NAME);
+ if (ret < 0) {
+ _E("Failed on ode_luks_close(%s)", EXTENDEDSD_NAME);
+ return ret;
+ }
+ } else
+ _E("fail to find block data for extended sd card");
+ }
+
ret = add_operation(bdev, BLOCK_DEV_UNMOUNT, NULL, (void *)UNMOUNT_FORCE);
if (ret < 0) {
_E("Failed to add operation (unmount %s)", devnode);
if (fnmatch(MMC_PATH, devnode, 0) &&
fnmatch(SCSI_PATH, devnode, 0) &&
- fnmatch(EXTENDEDSD_PATH, devnode, 0))
+ fnmatch(EXTENDEDSD_NODE_PATH, devnode, 0))
continue;
}
devnode = devlink;
break;
}
- if (!fnmatch(EXTENDEDSD_PATH, devlink, 0)) {
+ if (!fnmatch(EXTENDEDSD_NODE_PATH, devlink, 0)) {
mapper = true;
devnode = devlink;
break;
/* if requester want to use a specific mount point */
if (mount_point &&
- !strncmp(mount_point, EXTENDED_SD_STRING, strlen(EXTENDED_SD_STRING) + 1) != 0) {
+ !strncmp(mount_point, EXTENDEDSD_STRING, strlen(EXTENDEDSD_STRING) + 1) != 0) {
if (!block_conf[bdev->data->block_type].extendedinternal ||
!bdev->data->primary) {
_E("Not support extended internal storage");
goto out;
} else {
bdev->data->block_type = BLOCK_EXTENDEDSD_DEV;
- ret = change_mount_point(bdev, EXTENDED_SD_PATH);
+ ret = change_mount_point(bdev, EXTENDEDSD_MOUNT_POINT);
if (ret < 0) {
ret = -EPERM;
goto out;