ssize_t device_write_consumer(gpointer devicep, queue_buffer_t *buffer) { Device* device; size_t write_size; gsize block_size; device = DEVICE(devicep); block_size = device->block_size; write_size = MIN(buffer->data_size, block_size); /* we assume that the queueing module is providing us with * appropriately-sized blocks until the last block. */ if (device_write_block(device, write_size, buffer->data + buffer->offset)) { /* Success! */ return write_size; } else { /* Nope, really an error. */ return -1; } }
static gboolean do_block( XferDestDevice *self, guint size, gpointer data) { XferElement *elt = XFER_ELEMENT(self); if (device_write_block(self->device, size, data) != WRITE_SUCCEED) { xfer_cancel_with_error(elt, "%s: %s", self->device->device_name, device_error_or_status(self->device)); wait_until_xfer_cancelled(elt->xfer); return FALSE; } /* check for LEOM */ if (self->cancel_at_leom && self->device->is_eom) { xfer_cancel_with_error(elt, "%s: LEOM detected", self->device->device_name); wait_until_xfer_cancelled(elt->xfer); return FALSE; } return TRUE; }