Пример #1
0
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);
}
Пример #2
0
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 ();
}
Пример #3
0
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);
}
Пример #4
0
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);
}