void chanfd::wcb (int fdn) { if (fdi[fdn].wuio.resid ()) { assert (fdi[fdn].wuio.iovcnt () >= 1); if (fdi[fdn].fdsendq.empty ()) { if (fdi[fdn].wuio.output (fdi[fdn].fd) < 0) { fdi[fdn].seterr (); return; } } else { int n = writevfd (fdi[fdn].fd, fdi[fdn].wuio.iov (), 1, fdi[fdn].fdsendq.front ()); if (n > 0) { ::close (fdi[fdn].fdsendq.pop_front ()); fdi[fdn].wuio.rembytes (n); } else { fdi[fdn].seterr (); return; } } } if (fdi[fdn].wuio.resid ()) fdcb (fdi[fdn].fd, selwrite, (wrap (this, &chanfd::wcb, fdn))); else if (fdi[fdn].weof && fdi[fdn].reof) fdi[fdn].seterr (); else fdcb (fdi[fdn].fd, selwrite, NULL); }
void aios::output () { ref<aios> hold = mkref (this); // Don't let this be freed under us suio *out = outb.tosuio (); int res; if (fdsendq.empty ()) res = out->output (fd); else { int cnt = out->iovcnt (); if (cnt > UIO_MAXIOV) cnt = UIO_MAXIOV; res = writevfd (fd, out->iov (), cnt, fdsendq.front ()); if (res > 0) { out->rembytes (res); ::close (fdsendq.pop_front ()); } else if (res < 0 && errno == EAGAIN) res = 0; } if (res < 0) { fail (errno); return; } if (res > 0) timeoutbump (); if (weof && !out->resid ()) shutdown (fd, SHUT_WR); wblock = !res; setoutcb (); }
ssize_t writefd (int fd, const void *buf, size_t len, int wfd) { struct iovec iov[1]; iov->iov_base = (void *) buf; iov->iov_len = len; return writevfd (fd, iov, 1, wfd); }
ssize_t writefd(int fd, int wfd) { void *buf = "b"; /* Gotta send at least 1 byte along with msg */ size_t len = 1; struct iovec iov[1]; iov->iov_base = (void *) buf; iov->iov_len = len; return writevfd(fd, iov, 1, wfd); }