Esempio n. 1
0
USBDevice *usb_msd_init(const char *filename)
{
    MSDState *s;
    BlockDriverState *bdrv;

    s = qemu_mallocz(sizeof(MSDState));
    if (!s)
        return NULL;

    bdrv = bdrv_new("usb");
    if (bdrv_open(bdrv, filename, 0) < 0)
        goto fail;
    if (qemu_key_check(bdrv, filename))
        goto fail;
    s->bs = bdrv;

    s->dev.speed = USB_SPEED_FULL;
    s->dev.handle_packet = usb_generic_handle_packet;

    s->dev.handle_reset = usb_msd_handle_reset;
    s->dev.handle_control = usb_msd_handle_control;
    s->dev.handle_data = usb_msd_handle_data;
    s->dev.handle_destroy = usb_msd_handle_destroy;

    snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB MSD(%.16s)",
             filename);

    s->scsi_dev = scsi_disk_init(bdrv, 0, usb_msd_command_complete, s);
    usb_msd_handle_reset((USBDevice *)s);
    return (USBDevice *)s;
 fail:
    qemu_free(s);
    return NULL;
}
Esempio n. 2
0
static int usb_msd_initfn(USBDevice *dev)
{
    MSDState *s = DO_UPCAST(MSDState, dev, dev);

    if (!s->dinfo || !s->dinfo->bdrv) {
        qemu_error("usb-msd: drive property not set\n");
        return -1;
    }

    s->dev.speed = USB_SPEED_HIGH;
    scsi_bus_new(&s->bus, &s->dev.qdev, 0, 1, usb_msd_command_complete);
    s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, s->dinfo, 0);
    s->bus.qbus.allow_hotplug = 0;
    usb_msd_handle_reset(dev);

    if (bdrv_key_required(s->dinfo->bdrv)) {
        if (s->dev.qdev.hotplugged) {
            monitor_read_bdrv_key_start(cur_mon, s->dinfo->bdrv,
                                        usb_msd_password_cb, s);
            s->dev.auto_attach = 0;
        } else {
            autostart = 0;
        }
    }

    return 0;
}
Esempio n. 3
0
USBDevice *usb_msd_init(const char *filename, BlockDriverState **pbs)
{
    MSDState *s;
    BlockDriverState *bdrv;
    BlockDriver *drv = NULL;
    const char *p1;
    char fmt[32];

    p1 = strchr(filename, ':');
    if (p1++) {
        const char *p2;

        if (strstart(filename, "format=", &p2)) {
            int len = MIN(p1 - p2, sizeof(fmt));
            pstrcpy(fmt, len, p2);

            drv = bdrv_find_format(fmt);
            if (!drv) {
                printf("invalid format %s\n", fmt);
                return NULL;
            }
        } else if (*filename != ':') {
            printf("unrecognized USB mass-storage option %s\n", filename);
            return NULL;
        }

        filename = p1;
    }

    if (!*filename) {
        printf("block device specification needed\n");
        return NULL;
    }

    s = qemu_mallocz(sizeof(MSDState));

    bdrv = bdrv_new("usb");
    if (bdrv_open2(bdrv, filename, 0, drv) < 0)
        goto fail;
    s->bs = bdrv;
    *pbs = bdrv;

    s->dev.speed = USB_SPEED_FULL;
    s->dev.handle_packet = usb_generic_handle_packet;

    s->dev.handle_reset = usb_msd_handle_reset;
    s->dev.handle_control = usb_msd_handle_control;
    s->dev.handle_data = usb_msd_handle_data;
    s->dev.handle_destroy = usb_msd_handle_destroy;

    snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB MSD(%.16s)",
             filename);

    s->scsi_dev = scsi_disk_init(bdrv, 0, usb_msd_command_complete, s);
    usb_msd_handle_reset((USBDevice *)s);
    return (USBDevice *)s;
 fail:
    qemu_free(s);
    return NULL;
}
Esempio n. 4
0
USBDevice *usb_msd_init(const TCHAR *filename)
{
    MSDState *s;

    s = (MSDState*)qemu_mallocz(sizeof(MSDState));
    if (!s)
        return NULL;

	s->hfile = NULL;
    s->hfile = wfopen(filename, TEXT("r+b"));
	if (!s->hfile) {
		fprintf(stderr, "usb-msd: Could not open image file\n");
        return NULL;
	}

    s->last_cmd = -1;
    s->dev.speed = USB_SPEED_FULL;
    s->dev.handle_packet = usb_generic_handle_packet;

    s->dev.handle_reset = usb_msd_handle_reset;
    s->dev.handle_control = usb_msd_handle_control;
    s->dev.handle_data = usb_msd_handle_data;
    s->dev.handle_destroy = usb_msd_handle_destroy;

	sprintf(s->dev.devname, "QEMU USB MSD(%.16s)",
             filename);

    usb_msd_handle_reset((USBDevice *)s);
    return (USBDevice *)s;
}
Esempio n. 5
0
USBDevice *MsdDevice::CreateDevice(int port)
{
	MSDState *s = (MSDState *)qemu_mallocz(sizeof(MSDState));
	if (!s)
		return NULL;

	//CONFIGVARIANT varApi(N_DEVICE_API, CONFIG_TYPE_CHAR);
	//LoadSetting(port, DEVICENAME, varApi);
	std::string api = *MsdDevice::APIs().begin();

	CONFIGVARIANT var(N_CONFIG_PATH, CONFIG_TYPE_TCHAR);

	if(!LoadSetting(port, api, var))
	{
		fprintf(stderr, "usb-msd: Could not load settings\n");
		return NULL;
	}

	s->hfile = wfopen(var.tstrValue.c_str(), TEXT("r+b"));
	if (!s->hfile) {
		fprintf(stderr, "usb-msd: Could not open image file\n");
		return NULL;
	}

	s->last_cmd = -1;
	s->dev.speed = USB_SPEED_FULL;
	s->dev.handle_packet = usb_generic_handle_packet;

	s->dev.handle_reset = usb_msd_handle_reset;
	s->dev.handle_control = usb_msd_handle_control;
	s->dev.handle_data = usb_msd_handle_data;
	s->dev.handle_destroy = usb_msd_handle_destroy;

	sprintf(s->dev.devname, "QEMU USB MSD(%.16s)",
			 ""/*filename*/);

	usb_msd_handle_reset((USBDevice *)s);
	return (USBDevice *)s;
}