VSCSI(4) - example if (i2t.direction == VSCSI_DIR_WRITE) { data.tag = i2t.tag; if ((data.buf = malloc(i2t.datalen)) == NULL err(1, "malloc"); data.datalen = i2t.datalen; if (ioctl(fd, VSCSI_DATA_WRITE, &data) == -1 err(1, "ioctl VSCSI_DATA_WRITE"); /* work with provided data */ data_write(i2t, data.buf, data.datalen); free(data.buf); } if (i2t.direction == VSCSI_DIR_READ) { void *buf; size_t len; /* get requested data */ buf = data_read(i2t, &len); data.tag = i2t.tag; data.buf = buf; data.datalen = len; if (ioctl(fd, VSCSI_DATA_READ, &data) == -1) err(1, "ioctl VSCSI_DATA_READ"); free(buf);/* allocated by data_read */ }