Beispiel #1
0
int
tap_ctl_detach(const int id, const int minor)
{
	int err;
	tapdisk_message_t message;

	memset(&message, 0, sizeof(message));
	message.type = TAPDISK_MESSAGE_DETACH;
	message.cookie = minor;

	err = tap_ctl_connect_send_and_receive(id, &message, NULL);
	if (err)
		return err;

	if (message.type == TAPDISK_MESSAGE_DETACH_RSP) {
		err = message.u.response.error;
		if (err < 0)
			printf("detach failed: %d\n", err);
	} else {
		printf("got unexpected result '%s' from %d\n",
		       tapdisk_message_name(message.type), id);
		err = EINVAL;
	}

	return err;
}
Beispiel #2
0
int
tap_ctl_close(const int id, const int minor, const int force,
	      struct timeval *timeout)
{
	int err;
	tapdisk_message_t message;

	memset(&message, 0, sizeof(message));
	message.type = TAPDISK_MESSAGE_CLOSE;
	if (force)
		message.type = TAPDISK_MESSAGE_FORCE_SHUTDOWN;
	message.cookie = minor;

	err = tap_ctl_connect_send_and_receive(id, &message, timeout);
	if (err)
		return err;

	if (message.type == TAPDISK_MESSAGE_CLOSE_RSP) {
		err = message.u.response.error;
		if (err)
			EPRINTF("close failed: %d\n", err);
	} else {
		EPRINTF("got unexpected result '%s' from %d\n",
			tapdisk_message_name(message.type), id);
		err = EINVAL;
	}

	return err;
}
Beispiel #3
0
int tap_ctl_connect_xenblkif(pid_t pid, int minor, domid_t domid,
                             int devid, const grant_ref_t * grefs,
                             int order, evtchn_port_t port, int proto,
                             const char *pool)
{
    tapdisk_message_t message;
    int i, err;

    memset(&message, 0, sizeof(message));
    message.type = TAPDISK_MESSAGE_XENBLKIF_CONNECT;
    message.cookie = minor;

    message.u.blkif.domid = domid;
    message.u.blkif.devid = devid;
    for (i = 0; i < 1 << order; i++)
        message.u.blkif.gref[i] = grefs[i];
    message.u.blkif.order = order;
    message.u.blkif.port = port;
    message.u.blkif.proto = proto;
    if (pool)
        strncpy(message.u.blkif.pool, pool, sizeof(message.u.blkif.pool));
    else
        message.u.blkif.pool[0] = 0;

    err = tap_ctl_connect_send_and_receive(pid, &message, NULL);
    if (err)
        return err;

    if (message.type == TAPDISK_MESSAGE_XENBLKIF_CONNECT_RSP)
        err = -message.u.response.error;
    else
        err = -EINVAL;

    return err;
}
Beispiel #4
0
int
tap_ctl_unpause(const int id, const int minor, const char *params)
{
	int err;
	tapdisk_message_t message;

	memset(&message, 0, sizeof(message));
	message.type = TAPDISK_MESSAGE_RESUME;
	message.cookie = minor;

	if (params)
		strncpy(message.u.params.path, params,
			sizeof(message.u.params.path) - 1);

	err = tap_ctl_connect_send_and_receive(id, &message, NULL);
	if (err)
		return err;

	if (message.type == TAPDISK_MESSAGE_RESUME_RSP)
		err = message.u.response.error;
	else {
		err = EINVAL;
		EPRINTF("got unexpected result '%s' from %d\n",
			tapdisk_message_name(message.type), id);
	}

	return err;
}
Beispiel #5
0
int
tap_ctl_connect_xenblkif(const pid_t pid, const domid_t domid, const int devid,
	   	const grant_ref_t * grefs, const int order, const evtchn_port_t port,
		int proto, const char *pool, const int minor)
{
    tapdisk_message_t message;
    int i, err;

	memset(&message, 0, sizeof(message));
    message.type = TAPDISK_MESSAGE_XENBLKIF_CONNECT;
    message.cookie = minor;

    message.u.blkif.domid = domid;
    message.u.blkif.devid = devid;
    for (i = 0; i < 1 << order; i++)
        message.u.blkif.gref[i] = grefs[i];
    message.u.blkif.order = order;
    message.u.blkif.port = port;
    message.u.blkif.proto = proto;
    if (pool)
        strncpy(message.u.blkif.pool, pool, sizeof(message.u.blkif.pool));
    else
        message.u.blkif.pool[0] = 0;

    err = tap_ctl_connect_send_and_receive(pid, &message, NULL);
    if (err || message.type == TAPDISK_MESSAGE_ERROR) {
		if (!err)
			err = -message.u.response.error;
        if (err == -EALREADY)
            EPRINTF("failed to connect tapdisk[%d] to the ring: %s\n", pid,
                    strerror(-err));
	}
    return err;
}
Beispiel #6
0
int
tap_ctl_open(const int id, const int minor, const char *params, int flags,
		const int prt_minor, const char *secondary, int timeout)
{
	int err;
	tapdisk_message_t message;

	memset(&message, 0, sizeof(message));
	message.type = TAPDISK_MESSAGE_OPEN;
	message.cookie = minor;
	message.u.params.devnum = minor;
	message.u.params.prt_devnum = prt_minor;
	message.u.params.req_timeout = timeout;
	message.u.params.flags = flags;

	err = snprintf(message.u.params.path,
		       sizeof(message.u.params.path) - 1, "%s", params);
	if (err >= sizeof(message.u.params.path)) {
		EPRINTF("name too long\n");
		return ENAMETOOLONG;
	}

	if (secondary) {
		err = snprintf(message.u.params.secondary,
			       sizeof(message.u.params.secondary) - 1, "%s",
			       secondary);
		if (err >= sizeof(message.u.params.secondary)) {
			EPRINTF("secondary image name too long\n");
			return ENAMETOOLONG;
		}
	}

	err = tap_ctl_connect_send_and_receive(id, &message, NULL);
	if (err)
		return err;

	switch (message.type) {
	case TAPDISK_MESSAGE_OPEN_RSP:
		break;
	case TAPDISK_MESSAGE_ERROR:
		err = -message.u.response.error;
		EPRINTF("open failed, err %d\n", err);
		break;
	default:
		EPRINTF("got unexpected result '%s' from %d\n",
			tapdisk_message_name(message.type), id);
		err = EINVAL;
	}

	return err;
}
Beispiel #7
0
pid_t tap_ctl_get_pid(const int id)
{
    int err;
    tapdisk_message_t message;

    memset(&message, 0, sizeof(message));
    message.type = TAPDISK_MESSAGE_PID;

    err = tap_ctl_connect_send_and_receive(id, &message, NULL);
    if (err)
        return err;

    return message.u.tapdisk_pid;
}
Beispiel #8
0
int
tap_ctl_unpause(const int id, const int minor, const char *params, int flags,
		char *secondary)
{
	int err;
	tapdisk_message_t message;

	memset(&message, 0, sizeof(message));
	message.type = TAPDISK_MESSAGE_RESUME;
	message.cookie = minor;
	message.u.params.flags = flags;

	if (params)
		strncpy(message.u.params.path, params,
				sizeof(message.u.params.path) - 1);
	if (secondary) {
		err = snprintf(message.u.params.secondary,
				sizeof(message.u.params.secondary) - 1, "%s",
				secondary);
		if (err >= sizeof(message.u.params.secondary)) {
			EPRINTF("secondary image name too long\n");
			return -ENAMETOOLONG;
		}
	}

	err = tap_ctl_connect_send_and_receive(id, &message, NULL);
	if (err)
		return err;

	if (message.type == TAPDISK_MESSAGE_RESUME_RSP
			|| message.type == TAPDISK_MESSAGE_ERROR)
		err = -message.u.response.error;
	else {
		EPRINTF("got unexpected result '%s' from %d\n",
				tapdisk_message_name(message.type), id);
		err = -EINVAL;
	}

	if (err)
		EPRINTF("unpause failed: %s\n", strerror(-err));

	return err;
}
Beispiel #9
0
int tap_ctl_disconnect_xenblkif(pid_t pid, int minor, domid_t domid,
                                int devid, struct timeval *timeout)
{
    tapdisk_message_t message;
    int err;

    memset(&message, 0, sizeof(message));
    message.type = TAPDISK_MESSAGE_XENBLKIF_DISCONNECT;
    message.cookie = minor;
    message.u.blkif.domid = domid;
    message.u.blkif.devid = devid;

    err = tap_ctl_connect_send_and_receive(pid, &message, timeout);
    if (message.type == TAPDISK_MESSAGE_XENBLKIF_CONNECT_RSP)
        err = -message.u.response.error;
    else
        err = -EINVAL;

    return err;
}
Beispiel #10
0
int
tap_ctl_disconnect_xenblkif(const pid_t pid, const domid_t domid,
        const int devid, struct timeval *timeout)
{
    int err;
	tapdisk_message_t message;

	memset(&message, 0, sizeof(message));
	message.type = TAPDISK_MESSAGE_XENBLKIF_DISCONNECT;
	message.u.blkif.domid = domid;
	message.u.blkif.devid = devid;

	err = tap_ctl_connect_send_and_receive(pid, &message, timeout);
	if (err)
		goto out;

	if (message.type == TAPDISK_MESSAGE_XENBLKIF_DISCONNECT_RSP
			|| message.type == TAPDISK_MESSAGE_ERROR)
		err = -message.u.response.error;
	else {
		EPRINTF("got unexpected result '%s' from tapdisk[%d]\n",
				tapdisk_message_name(message.type), pid);
		err = -EINVAL;
	}

out:
	if (err) {
		if (likely(err == -ENOENT))
			DPRINTF("failed to disconnect tapdisk[%d] from the ring: %s\n",
					pid, strerror(-err));
		else
			EPRINTF("failed to disconnect tapdisk[%d] from the ring: %s\n",
					pid, strerror(-err));
	}
	return err;
}
Beispiel #11
0
int
tap_ctl_pause(const int id, const int minor, struct timeval *timeout)
{
	int err;
	tapdisk_message_t message;

	memset(&message, 0, sizeof(message));
	message.type = TAPDISK_MESSAGE_PAUSE;
	message.cookie = minor;

	err = tap_ctl_connect_send_and_receive(id, &message, timeout);
	if (err)
		return err;

	if (message.type == TAPDISK_MESSAGE_PAUSE_RSP)
		err = message.u.response.error;
	else {
		err = EINVAL;
		EPRINTF("got unexpected result '%s' from %d\n",
			tapdisk_message_name(message.type), id);
	}

	return err;
}
Beispiel #12
0
int
tap_ctl_open(const int id, const int minor, const char *params, int flags,
	     const int prt_minor, const char *secondary, int timeout,
	     const char* logpath, uint8_t key_size, uint8_t *encryption_key)
{
	int err;
	tapdisk_message_t message;

	memset(&message, 0, sizeof(message));
	message.type = TAPDISK_MESSAGE_OPEN;
	message.cookie = minor;
	message.u.params.devnum = minor;
	message.u.params.prt_devnum = prt_minor;
	message.u.params.req_timeout = timeout;
	message.u.params.flags = flags;

	err = snprintf(message.u.params.path,
		       sizeof(message.u.params.path) - 1, "%s", params);
	if (err >= sizeof(message.u.params.path)) {
		EPRINTF("name too long\n");
		return ENAMETOOLONG;
	}

	if (secondary) {
		err = snprintf(message.u.params.secondary,
			       sizeof(message.u.params.secondary) - 1, "%s",
			       secondary);
		if (err >= sizeof(message.u.params.secondary)) {
			EPRINTF("secondary image name too long\n");
			return ENAMETOOLONG;
		}
	}
	if (flags & (TAPDISK_MESSAGE_FLAG_ADD_LOG | TAPDISK_MESSAGE_FLAG_OPEN_ENCRYPTED)) {
		err = tap_ctl_connect_send_receive_ex(
			id, &message, logpath, key_size, encryption_key, NULL);
	}
	else {
		err = tap_ctl_connect_send_and_receive(id, &message, NULL);
	}

	if (encryption_key)
		free(encryption_key);

	if (err)
		return err;

	switch (message.type) {
	case TAPDISK_MESSAGE_OPEN_RSP:
		break;
	case TAPDISK_MESSAGE_ERROR:
		err = -message.u.response.error;
		EPRINTF("open failed: %s\n", strerror(-err));
		break;
	default:
		EPRINTF("got unexpected result '%s' from %d\n",
			tapdisk_message_name(message.type), id);
		err = EINVAL;
	}

	return err;
}