diff options
author | Taeyoung Kim <ty317.kim@samsung.com> | 2016-05-03 16:53:14 +0900 |
---|---|---|
committer | Taeyoung Kim <ty317.kim@samsung.com> | 2016-05-03 19:52:01 +0900 |
commit | 5c9b5c8e88f74909f7c373c8d8adcd877deb0a80 (patch) | |
tree | def390e550f9941898abc02809ebc89cf81bf782 | |
parent | 5cb747c643d9de171db7fb493ccef8a999c9e0a4 (diff) | |
download | deviced-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.c | 83 |
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) |