#define MMC_PARTITION_PATH "mmcblk[0-9]p[0-9]"
/* Emulator send devlink for sdcard as \*\/sdcard\/\* */
#define MMC_LINK_PATH "*/sdcard/*"
-#define MMC_LINK_PARTITION_PATH "vd[a-z][0-9]"
+#define MMC_LINK_PARTITION_PATH "vd[a-z][0-9]"
#define SCSI_PATH "*/sd[a-z]*"
#define SCSI_PARTITION_PATH "sd[a-z][0-9]"
#define SCSI_PARTITION_LENGTH 9
#define FILESYSTEM_NAME "filesystem"
#define DEV_PREFIX "/dev/"
-#define ROOT_DIR "/"
#define UNMOUNT_RETRY 5
#define TIMEOUT_MAKE_OBJECT 500 /* milliseconds */
#define EXTENDEDSD_NAME "extendedsd"
/* Minimum value of block id */
-#define BLOCK_ID_MIN 10
+#define BLOCK_ID_MIN 10
/* For 2.4 Backward Compatibility */
-#define EXT_PRIMARY_SD_FIXID 1
+#define EXT_PRIMARY_SD_FIXID 1
/* Maximum number of thread */
-#define THREAD_MAX 5
+#define THREAD_MAX 5
-#define SPEEDCHECK_SIZE 16
-#define SPEEDCHECK_CRITERION 4 /* MB/s */
+#define SPEEDCHECK_SIZE 16
+#define SPEEDCHECK_CRITERION 4 /* MB/s */
-#define PKGDIR_BUS_NAME "org.tizen.pkgdir_tool"
-#define PKGDIR_PATH "/org/tizen/pkgdir_tool"
-#define PKGDIR_INTERFACE "org.tizen.pkgdir_tool"
+#define PKGDIR_BUS_NAME "org.tizen.pkgdir_tool"
+#define PKGDIR_PATH "/org/tizen/pkgdir_tool"
+#define PKGDIR_INTERFACE "org.tizen.pkgdir_tool"
-#define POPUP_KEY_CONTENT "_SYSPOPUP_CONTENT_"
-#define VIEWTYPE_KEY "viewtype"
-#define DEVPATH_KEY "dev_path"
-#define MAPPING_NODE_KEY "mapping_node"
-#define INSERT_SD_CARD "INSERT_SD_CARD"
+#define POPUP_KEY_CONTENT "_SYSPOPUP_CONTENT_"
+#define VIEWTYPE_KEY "viewtype"
+#define DEVPATH_KEY "dev_path"
+#define MAPPING_NODE_KEY "mapping_node"
+#define INSERT_SD_CARD "INSERT_SD_CARD"
-#define MMC_POPUP_NOTI "SDcardNoti"
-#define MMC_INSERTED "inserted"
-#define MMC_REMOVED "removed"
+#define MMC_POPUP_NOTI "SDcardNoti"
+#define MMC_INSERTED "inserted"
+#define MMC_REMOVED "removed"
-#define ARRAY_SIZE(name) (sizeof(name)/sizeof(name[0]))
+#define ARRAY_SIZE(name) (sizeof(name)/sizeof(name[0]))
-#define FILE_NAME_LEN_MAX 255
+#define FILE_NAME_LEN_MAX 255
+#define DEV_INTERNAL_COUNT 2
enum block_dev_operation {
BLOCK_DEV_MOUNT,
{"Downloads"},
};
+static const char *dev_internal_list[DEV_INTERNAL_COUNT] = {
+ "/",
+ "/opt"
+};
+
+static struct dev_internal_struct {
+ enum block_device_type type;
+ char c_id;
+ int n_id;
+} dev_internal_ids[DEV_INTERNAL_COUNT];
+
+
#define DIR_NUM ((int)(sizeof(mmc_default_path)/sizeof(mmc_default_path[0])))
static GList *fs_head;
static pthread_mutex_t pipe_mutex = PTHREAD_MUTEX_INITIALIZER;
static bool add_poweroff_wait = false;
-/* Assume there is only one physical internal storage */
-static int dev_internal = -1;
-static char dev_internal_scsi = '\0';
-static char dev_internal_emul = '\0';
-
static int block_start(void *data);
static int block_stop(void *data);
return 0;
}
-static void get_internal_storage_number_from_device_mapper(char *root_name)
+static void get_internal_storage_number_from_device_mapper(char *root_name, int index)
{
int major, minor;
char dev_name[PATH_MAX];
_D("Found actual device associated with root device of device mapper: %s", dev_name);
if (!is_emulator()) {
- if (!fnmatch(MMC_PARTITION_PATH, dev_name, 0))
- sscanf(dev_name, "mmcblk%d", &dev_internal);
- else if (!fnmatch(SCSI_PARTITION_PATH, dev_name, 0))
- sscanf(dev_name, "sd%c", &dev_internal_scsi);
- } else
- if (!fnmatch(MMC_LINK_PARTITION_PATH, dev_name, 0))
- sscanf(dev_name, "vd%c", &dev_internal_emul);
-
+ if (!fnmatch(MMC_PARTITION_PATH, dev_name, 0)) {
+ sscanf(dev_name, "mmcblk%d", &dev_internal_ids[index].n_id);
+ dev_internal_ids[index].type = BLOCK_MMC_DEV;
+ } else if (!fnmatch(SCSI_PARTITION_PATH, dev_name, 0)) {
+ sscanf(dev_name, "sd%c", &dev_internal_ids[index].c_id);
+ dev_internal_ids[index].type = BLOCK_SCSI_DEV;
+ } else {
+ dev_internal_ids[index].type = BLOCK_UNKNOWN_DEV;
+ dev_internal_ids[index].c_id = '\0';
+ dev_internal_ids[index].n_id = -1;
+ }
+ } else {
+ if (!fnmatch(MMC_LINK_PARTITION_PATH, dev_name, 0)) {
+ sscanf(dev_name, "vd%c", &dev_internal_ids[index].c_id);
+ dev_internal_ids[index].type = BLOCK_EMUL_DEV;
+ } else {
+ dev_internal_ids[index].type = BLOCK_UNKNOWN_DEV;
+ dev_internal_ids[index].c_id = '\0';
+ dev_internal_ids[index].n_id = -1;
+ }
+ }
out:
dm_task_destroy(dmt);
}
const char *temp;
char *name;
int r = 0, dev_temp;
-
- if ((!is_emulator() && (dev_internal >= 0 || dev_internal_scsi != '\0')) ||
- (is_emulator() && dev_internal_emul != '\0'))
- return 0;
+ int dev_i;
t = mnt_new_table();
if (!t)
return -EPERM;
}
- fs = mnt_table_find_target(t, ROOT_DIR, MNT_ITER_BACKWARD);
+ for ( dev_i = 0; dev_i < DEV_INTERNAL_COUNT; dev_i++) {
+ fs = mnt_table_find_target(t, dev_internal_list[dev_i], MNT_ITER_BACKWARD);
- if (!fs) {
- mnt_free_table(t);
- return -EPERM;
- }
- temp = mnt_fs_get_srcpath(fs);
- if (!temp) {
- mnt_free_table(t);
- return -EPERM;
- }
- name = strrchr(temp, '/');
- if (!name) {
- mnt_free_table(t);
- return -EPERM;
- }
- name++;
+ if (!fs) {
+ mnt_free_table(t);
+ return -EPERM;
+ }
- /* Boot from USB is not handled */
- if (!strcmp(temp, DEVICE_MAPPER_ROOT_NODE_PATH))
- get_internal_storage_number_from_device_mapper(name);
- else if (!is_emulator()) {
- if (!fnmatch(MMC_PATH, temp, 0))
- sscanf(name, "mmcblk%d", &dev_internal);
- else if (!fnmatch(SCSI_PATH, temp, 0))
- sscanf(name, "sd%c", &dev_internal_scsi);
- } else {
- if (!fnmatch(MMC_LINK_PATH, temp, 0))
- sscanf(name, "vd%c%d", &dev_internal_emul, &dev_temp);
- else
- dev_internal_emul = '\0';
+ temp = mnt_fs_get_srcpath(fs);
+ if (!temp) {
+ mnt_free_table(t);
+ return -EPERM;
+ }
+
+ name = strrchr(temp, '/');
+ if (!name) {
+ mnt_free_table(t);
+ return -EPERM;
+ }
+ name++;
+
+ /* Boot from USB is not handled */
+ if (!strcmp(temp, DEVICE_MAPPER_ROOT_NODE_PATH))
+ get_internal_storage_number_from_device_mapper(name, dev_i);
+ else if (!is_emulator()) {
+ if (!fnmatch(MMC_PATH, temp, 0)) {
+ sscanf(name, "mmcblk%d", &dev_internal_ids[dev_i].n_id);
+ dev_internal_ids[dev_i].type = BLOCK_MMC_DEV;
+ _D("Found internal device (%s). type=BLOCK_MMC_DEV, id=%d", dev_internal_list[dev_i], dev_internal_ids[dev_i].n_id);
+ } else if (!fnmatch(SCSI_PATH, temp, 0)) {
+ sscanf(name, "sd%c", &dev_internal_ids[dev_i].c_id);
+ dev_internal_ids[dev_i].type = BLOCK_SCSI_DEV;
+ _D("Found internal device (%s). type=BLOCK_SCSI_DEV, id=%c", dev_internal_list[dev_i], dev_internal_ids[dev_i].c_id);
+ } else {
+ dev_internal_ids[dev_i].type = BLOCK_UNKNOWN_DEV;
+ dev_internal_ids[dev_i].c_id = '\0';
+ dev_internal_ids[dev_i].n_id = -1;
+ _E("Failed to get internal device (%s) number.", dev_internal_list[dev_i]);
+ }
+ } else {
+ if (!fnmatch(MMC_LINK_PATH, temp, 0)) {
+ sscanf(name, "vd%c%d", &dev_internal_ids[dev_i].c_id, &dev_temp);
+ dev_internal_ids[dev_i].type = BLOCK_EMUL_DEV;
+ _D("Found internal device (%s). type=BLOCK_EMUL_DEV, id=%c", dev_internal_list[dev_i], dev_internal_ids[dev_i].c_id);
+ } else {
+ dev_internal_ids[dev_i].type = BLOCK_UNKNOWN_DEV;
+ dev_internal_ids[dev_i].c_id = '\0';
+ dev_internal_ids[dev_i].n_id = -1;
+ _E("Failed to get internal device (%s) number.", dev_internal_list[dev_i]);
+ }
+ }
}
mnt_free_table(t);
return 0;
}
+static bool is_internal_storage_char(enum block_device_type type, const char c_id)
+{
+ int i;
+
+ for (i = 0; i < DEV_INTERNAL_COUNT; i++) {
+ if (dev_internal_ids[i].type == type) {
+ if (dev_internal_ids[i].c_id == c_id)
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool is_internal_storage_num(enum block_device_type type, int n_id)
+{
+ int i;
+
+ for (i = 0; i < DEV_INTERNAL_COUNT; i++) {
+ if (dev_internal_ids[i].type == type) {
+ if (dev_internal_ids[i].n_id == n_id)
+ return true;
+ }
+ }
+ return false;
+}
+
static int check_external_storage(const char* devnode)
{
char dev_scsi = '\0';
if (!is_emulator()) {
if (!fnmatch(MMC_PATH, devnode, 0)) {
sscanf(name, "mmcblk%d", &dev_num);
- if (dev_internal == dev_num) {
+ if (is_internal_storage_num(BLOCK_MMC_DEV, dev_num)) {
_D("%s is internal storage.", devnode);
return 0;
}
} else if (!fnmatch(SCSI_PATH, devnode, 0)) {
sscanf(name, "sd%c", &dev_scsi);
- if (dev_internal_scsi == dev_scsi) {
+ if (is_internal_storage_char(BLOCK_SCSI_DEV, dev_scsi)) {
_D("%s is internal storage.", devnode);
return 0;
}
} else {
if (!fnmatch(MMC_LINK_PATH, devnode, 0)) {
sscanf(name, "vd%c%d", &emul, &dev_temp);
- if (dev_internal_emul == emul) {
+ if (is_internal_storage_char(BLOCK_EMUL_DEV, emul)) {
_D("%s is internal storage.", devnode);
return 0;
}