summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTaeyoung Kim <ty317.kim@samsung.com>2016-05-03 16:53:14 +0900
committerTaeyoung Kim <ty317.kim@samsung.com>2016-05-03 19:52:01 +0900
commit5c9b5c8e88f74909f7c373c8d8adcd877deb0a80 (patch)
treedef390e550f9941898abc02809ebc89cf81bf782
parent5cb747c643d9de171db7fb493ccef8a999c9e0a4 (diff)
downloaddeviced-5c9b5c8e88f74909f7c373c8d8adcd877deb0a80.tar.gz
deviced-5c9b5c8e88f74909f7c373c8d8adcd877deb0a80.tar.bz2
deviced-5c9b5c8e88f74909f7c373c8d8adcd877deb0a80.zip
block: support sdcard of emulator
- Sdcard device /dev/mmcblk* is just for target devices. - Emulator supports virtual sdcards which are located under /dev/sdcard/* - The device nodes /dev/sdcard/* are symlnk nodes made by udev rule "95-tizen-emulator.rules" which is installed with system-plugin-emulator - Now deviced handles the devices under /dev/sdcard/ for Emulator. Change-Id: I5701779d4f906fc4de51a9bab1ab587b465d092d Signed-off-by: Taeyoung Kim <ty317.kim@samsung.com>
-rw-r--r--src/block/block.c83
1 files changed, 60 insertions, 23 deletions
diff --git a/src/block/block.c b/src/block/block.c
index 9c6f0100..25f12c87 100644
--- a/src/block/block.c
+++ b/src/block/block.c
@@ -53,6 +53,7 @@
*/
#define MMC_PATH "*/mmcblk[1-9]*"
#define MMC_PARTITION_PATH "mmcblk[1-9]p[0-9]"
+#define MMC_LINK_PATH "*/sdcard/*"
#define SCSI_PATH "*/sd[a-z]*"
#define SCSI_PARTITION_PATH "sd[a-z][0-9]"
@@ -348,19 +349,29 @@ static int get_mmc_mount_node(char *devnode, char *node, size_t len)
char *name = devnode;
char *pt;
int dev = -1, part = -1;
+ char emul[32] = { 0, };
+ int i;
if (!name)
return -EINVAL;
+ /* Check Target */
sscanf(name, "mmcblk%dp%d", &dev, &part);
- if (dev < 0)
- return -EINVAL;
-
- if (part < 0)
- snprintf(node, len, "Sdcard%c", dev + 'A' - 1);
- else
- snprintf(node, len, "Sdcard%c%d", dev + 'A' - 1, part);
+ if (dev >= 0) {
+ if (part < 0)
+ snprintf(node, len, "Sdcard%c", dev + 'A' - 1);
+ else
+ snprintf(node, len, "Sdcard%c%d", dev + 'A' - 1, part);
+ return 0;
+ }
+ /* Check Emulator */
+ sscanf(name, "vd%s", emul);
+ if (emul[0] == '\0')
+ return -EINVAL;
+ for (i = 0 ; i < strlen(emul) ; i++)
+ emul[i] = toupper(emul[i]);
+ snprintf(node, len, "Sdcard%s", emul);
return 0;
}
@@ -435,8 +446,9 @@ static bool check_primary_partition(const char *devnode)
int i;
/* if no partition */
- if (!fnmatch("*/mmcblk[1-9]", devnode, 0) ||
- !fnmatch("*/sd[a-z]", devnode, 0))
+ if (!fnmatch(MMC_LINK_PATH, devnode, 0) ||
+ !fnmatch(MMC_PATH, devnode, 0) ||
+ !fnmatch(SCSI_PATH, devnode, 0))
return true;
snprintf(str, sizeof(str), "%s", devnode);
@@ -491,7 +503,9 @@ static struct block_data *make_block_data(const char *devnode,
data->primary = check_primary_partition(devnode);
/* TODO should we know block dev type? */
- if (!fnmatch(MMC_PATH, devnode, 0))
+ if (!fnmatch(MMC_LINK_PATH, devnode, 0))
+ data->block_type = BLOCK_MMC_DEV;
+ else if (!fnmatch(MMC_PATH, devnode, 0))
data->block_type = BLOCK_MMC_DEV;
else if (!fnmatch(SCSI_PATH, devnode, 0))
data->block_type = BLOCK_SCSI_DEV;
@@ -1804,7 +1818,7 @@ static int block_init_from_udev_enumerate(void)
{
struct udev *udev;
struct udev_enumerate *enumerate;
- struct udev_list_entry *list_entry;
+ struct udev_list_entry *list_entry, *list_sub_entry;
struct udev_device *dev;
const char *syspath;
const char *devnode;
@@ -1841,13 +1855,25 @@ static int block_init_from_udev_enumerate(void)
if (!dev)
continue;
- devnode = udev_device_get_devnode(dev);
- if (!devnode)
- continue;
+ devnode = NULL;
+ udev_list_entry_foreach(list_sub_entry,
+ udev_device_get_devlinks_list_entry(dev)) {
+ const char *devlink = udev_list_entry_get_name(list_sub_entry);
+ if (!fnmatch(MMC_LINK_PATH, devlink, 0)) {
+ devnode = devlink;
+ break;
+ }
+ }
- if (fnmatch(MMC_PATH, devnode, 0) &&
- fnmatch(SCSI_PATH, devnode, 0))
- continue;
+ if (!devnode) {
+ devnode = udev_device_get_devnode(dev);
+ if (!devnode)
+ continue;
+
+ if (fnmatch(MMC_PATH, devnode, 0) &&
+ fnmatch(SCSI_PATH, devnode, 0))
+ continue;
+ }
_D("%s device add", devnode);
add_block_device(dev, devnode);
@@ -1936,14 +1962,25 @@ static void uevent_block_handler(struct udev_device *dev)
{
const char *devnode;
const char *action;
+ struct udev_list_entry *list_entry;
- devnode = udev_device_get_devnode(dev);
- if (!devnode)
- return;
+ udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev)) {
+ const char *devlink = udev_list_entry_get_name(list_entry);
+ if (!fnmatch(MMC_LINK_PATH, devlink, 0)) {
+ devnode = devlink;
+ break;
+ }
+ }
- if (fnmatch(MMC_PATH, devnode, 0) &&
- fnmatch(SCSI_PATH, devnode, 0))
- return;
+ if (!devnode) {
+ devnode = udev_device_get_devnode(dev);
+ if (!devnode)
+ return;
+
+ if (fnmatch(MMC_PATH, devnode, 0) &&
+ fnmatch(SCSI_PATH, devnode, 0))
+ return;
+ }
action = udev_device_get_action(dev);
if (!action)