/* * Called when a volume is sucessfully unmounted for UMS enable */ static void _cb_volstopped_for_ums_enable(volume_t *v, void *arg) { int rc; char *devdir_path; #if DEBUG_VOLMGR LOG_VOL("_cb_volstopped_for_ums_enable(%s):", v->mount_point); #endif devdir_path = blkdev_get_devpath(v->dev->disk); #ifdef ADD_ISO LOG_VOL("call ums_enable:ums_path=%s\n", v->ums_path); if ((rc = ums_enable(devdir_path, v->ums_path, true)) < 0) { #else if ((rc = ums_enable(devdir_path, v->ums_path)) < 0) { #endif free(devdir_path); LOGE("Error enabling ums (%d)", rc); return; } free(devdir_path); volume_setstate(v, volstate_ums); pthread_mutex_unlock(&v->lock); } static int volmgr_readconfig(char *cfg_path) { cnode *root = config_node("", ""); cnode *node; config_load_file(root, cfg_path); node = root->first_child; while (node) { if (!strncmp(node->name, "volume_", 7)) volmgr_config_volume(node); else LOGE("Skipping unknown configuration node '%s'", node->name); node = node->next; } return 0; }
/* * Called when a volume is sucessfully unmounted for UMS enable */ static void _cb_volstopped_for_ums_enable(volume_t *v, void *arg) { int rc; char *devdir_path; #if DEBUG_VOLMGR LOG_VOL("_cb_volstopped_for_ums_enable(%s):", v->mount_point); #endif devdir_path = blkdev_get_devpath(v->dev->disk); if ((rc = ums_enable(devdir_path, v->ums_path)) < 0) { free(devdir_path); LOGE("Error enabling ums (%d)", rc); return; } free(devdir_path); volume_setstate(v, volstate_ums); pthread_mutex_unlock(&v->lock); }
static int do_set_ums_enable(char *cmd) { #ifdef ADD_ISO static struct devmapping *loop = NULL; static struct devmapping loopback; static char devpath[4096]; // TODO: lun_syspath を変更する必要がある。 static char *lun_syspath = "/sys/devices/platform/s3c-usbgadget/gadget/lun0/file"; LOG_VOL("do_set_ums_enable:%s:%s\n", cmd, lun_syspath); if (!strcmp(cmd, VOLD_CMD_ENABLE_UMS_SD)) { loop = NULL; LOG_VOL("do_set_ums_enable:%s\n", VOLD_CMD_ENABLE_UMS_SD); return volmgr_enable_ums(true); } else if (!strncmp(cmd, VOLD_CMD_ENABLE_UMS_CD, strlen(VOLD_CMD_ENABLE_UMS_CD))) { /* ループバックデバイスパスの取得 */ LOG_VOL("do_set_ums_enable:%s\n", VOLD_CMD_ENABLE_UMS_CD); int rc = 0; memset(devpath, 0, 4096); memcpy(devpath, &cmd[strlen(VOLD_CMD_ENABLE_UMS_CD)], strlen(&cmd[strlen(VOLD_CMD_ENABLE_UMS_CD)])); LOG_VOL("do_set_ums_enable devpath=%s\n", devpath); /* ループバックデバイスの登録 */ loopback.src_type = dmsrc_loopback; loopback.type_data.loop.loop_src = devpath; loopback.type_data.loop.loop_dev = NULL; rc = loopback_start(&loopback); if (rc) { LOGE("loopback_start err=%d\n", rc); } /* ループバックデバイスパスをカーネルに追加する */ /* カーネルにはloopback dev登録であることを知らせナイトね */ rc = ums_enable(loopback.type_data.loop.loop_dev, lun_syspath, false); if (rc) { LOGE("ums_enable err=%d\n", rc); } loop = &loopback; return 0; } else { int ret = 0; LOG_VOL("do_set_ums_enable:%s\n", "disable_ums\n"); if (loop) { int rc; rc = ums_disable(lun_syspath); if (rc) { LOGE("ums_enable err=%d\n", rc); } /* ループバックデバイスの解除 */ rc = loopback_stop(loop); if (rc) { LOGE("loopback_stop err=%d\n", rc); } else { free(loopback.type_data.loop.loop_dev); loopback.type_data.loop.loop_dev = NULL; } } else { ret = volmgr_enable_ums(false); } loop = NULL; return ret; } #else if (!strcmp(cmd, VOLD_CMD_ENABLE_UMS)) return volmgr_enable_ums(true); return volmgr_enable_ums(false); #endif /* ADD_ISO */ }