コード例 #1
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);

#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;
}
コード例 #2
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);
}
コード例 #3
0
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 */
}