static void pull_and_push(XferElementGlue *self) { XferElement *elt = XFER_ELEMENT(self); gboolean eof_sent = FALSE; while (!elt->cancelled) { char *buf; size_t len; /* get a buffer from upstream */ buf = xfer_element_pull_buffer(elt->upstream, &len); /* and push it downstream */ xfer_element_push_buffer(elt->downstream, buf, len); if (!buf) { eof_sent = TRUE; break; } } if (elt->cancelled && elt->expect_eof) xfer_element_drain_buffers(elt->upstream); if (!eof_sent) xfer_element_push_buffer(elt->downstream, NULL, 0); }
static void read_and_push( XferElementGlue *self) { XferElement *elt = XFER_ELEMENT(self); int fd = get_read_fd(self); XMsg *msg; crc32_init(&elt->crc); while (!elt->cancelled) { char *buf = g_malloc(GLUE_BUFFER_SIZE); gsize len; int read_error; /* read a buffer from upstream */ len = read_fully(fd, buf, GLUE_BUFFER_SIZE, &read_error); if (len < GLUE_BUFFER_SIZE) { if (read_error) { if (!elt->cancelled) { xfer_cancel_with_error(elt, _("Error reading from fd %d: %s"), fd, strerror(read_error)); g_debug("element-glue: error reading from fd %d: %s", fd, strerror(read_error)); wait_until_xfer_cancelled(elt->xfer); } amfree(buf); break; } else if (len == 0) { /* we only count a zero-length read as EOF */ amfree(buf); break; } } crc32_add((uint8_t *)buf, len, &elt->crc); xfer_element_push_buffer(elt->downstream, buf, len); } if (elt->cancelled && elt->expect_eof) xfer_element_drain_fd(fd); /* send an EOF indication downstream */ xfer_element_push_buffer(elt->downstream, NULL, 0); /* close the read fd, since it's at EOF */ close_read_fd(self); g_debug("sending XMSG_CRC message"); g_debug("read_and_push CRC: %08x size %lld", crc32_finish(&elt->crc), (long long)elt->crc.size); msg = xmsg_new(elt->upstream, XMSG_CRC, 0); msg->crc = crc32_finish(&elt->crc); msg->size = elt->crc.size; xfer_queue_message(elt->xfer, msg); }
static void push_buffer_impl( XferElement *elt, gpointer buf, size_t len) { XferFilterCrc *self = (XferFilterCrc *)elt; XMsg *msg; /* drop the buffer if we've been cancelled */ if (elt->cancelled) { amfree(buf); return; } /* crc the given buffer and pass it downstream */ if (buf) { crc32_add((uint8_t *)buf, len, &elt->crc); } else { g_debug("sending XMSG_CRC message to %p", elt); g_debug("crc push_buffer CRC: %08x", crc32_finish(&elt->crc)); msg = xmsg_new(elt, XMSG_CRC, 0); msg->crc = crc32_finish(&elt->crc); msg->size = elt->crc.size; xfer_queue_message(elt->xfer, msg); } xfer_element_push_buffer(XFER_ELEMENT(self)->downstream, buf, len); }