⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io.c

📁 快速开发
💻 C
📖 第 1 页 / 共 2 页
字号:
}#endif /* MD_ALWAYS_UNSERIALIZED_ACCEPT */int st_connect(_st_netfd_t *fd, const struct sockaddr *addr, int addrlen,	       st_utime_t timeout){  int n, err = 0;  while (connect(fd->osfd, addr, addrlen) < 0) {    if (errno != EINTR) {      /*       * On some platforms, if connect() is interrupted (errno == EINTR)       * after the kernel binds the socket, a subsequent connect()       * attempt will fail with errno == EADDRINUSE.  Ignore EADDRINUSE       * iff connect() was previously interrupted.  See Rich Stevens'       * "UNIX Network Programming," Vol. 1, 2nd edition, p. 413       * ("Interrupted connect").       */      if (errno != EINPROGRESS && (errno != EADDRINUSE || err == 0))	return -1;      /* Wait until the socket becomes writable */      if (st_netfd_poll(fd, POLLOUT, timeout) < 0)	return -1;      /* Try to find out whether the connection setup succeeded or failed */      n = sizeof(int);      if (getsockopt(fd->osfd, SOL_SOCKET, SO_ERROR, (char *)&err,		     (socklen_t *)&n) < 0)	return -1;      if (err) {	errno = err;	return -1;      }      break;    }    err = 1;  }  return 0;}ssize_t st_read(_st_netfd_t *fd, void *buf, size_t nbyte, st_utime_t timeout){  ssize_t n;  while ((n = read(fd->osfd, buf, nbyte)) < 0) {    if (errno == EINTR)      continue;    if (!_IO_NOT_READY_ERROR)      return -1;    /* Wait until the socket becomes readable */    if (st_netfd_poll(fd, POLLIN, timeout) < 0)      return -1;  }  return n;}int st_read_resid(_st_netfd_t *fd, void *buf, size_t *resid,		  st_utime_t timeout){  struct iovec iov, *riov;  int riov_size, rv;  iov.iov_base = buf;  iov.iov_len = *resid;  riov = &iov;  riov_size = 1;  rv = st_readv_resid(fd, &riov, &riov_size, timeout);  *resid = iov.iov_len;  return rv;}ssize_t st_readv(_st_netfd_t *fd, const struct iovec *iov, int iov_size,		 st_utime_t timeout){  ssize_t n;  while ((n = readv(fd->osfd, iov, iov_size)) < 0) {    if (errno == EINTR)      continue;    if (!_IO_NOT_READY_ERROR)      return -1;    /* Wait until the socket becomes readable */    if (st_netfd_poll(fd, POLLIN, timeout) < 0)      return -1;  }  return n;}int st_readv_resid(_st_netfd_t *fd, struct iovec **iov, int *iov_size,		   st_utime_t timeout){  ssize_t n;  while (*iov_size > 0) {    if (*iov_size == 1)      n = read(fd->osfd, (*iov)->iov_base, (*iov)->iov_len);    else      n = readv(fd->osfd, *iov, *iov_size);    if (n < 0) {      if (errno == EINTR)	continue;      if (!_IO_NOT_READY_ERROR)	return -1;    } else if (n == 0)      break;    else {      while (n >= (*iov)->iov_len) {	n -= (*iov)->iov_len;	(*iov)->iov_base = (char *) (*iov)->iov_base + (*iov)->iov_len;	(*iov)->iov_len = 0;	(*iov)++;	(*iov_size)--;	if (n == 0)	  break;      }      if (*iov_size == 0)	break;      (*iov)->iov_base = (char *) (*iov)->iov_base + n;      (*iov)->iov_len -= n;    }    /* Wait until the socket becomes readable */    if (st_netfd_poll(fd, POLLIN, timeout) < 0)      return -1;  }  return 0;}ssize_t st_read_fully(_st_netfd_t *fd, void *buf, size_t nbyte,		      st_utime_t timeout){  size_t resid = nbyte;  return st_read_resid(fd, buf, &resid, timeout) == 0 ?    (ssize_t) (nbyte - resid) : -1;}int st_write_resid(_st_netfd_t *fd, const void *buf, size_t *resid,		   st_utime_t timeout){  struct iovec iov, *riov;  int riov_size, rv;  iov.iov_base = (void *) buf;  iov.iov_len = *resid;  riov = &iov;  riov_size = 1;  rv = st_writev_resid(fd, &riov, &riov_size, timeout);  *resid = iov.iov_len;  return rv;}ssize_t st_write(_st_netfd_t *fd, const void *buf, size_t nbyte,		 st_utime_t timeout){  size_t resid = nbyte;  return st_write_resid(fd, buf, &resid, timeout) == 0 ?    (ssize_t) (nbyte - resid) : -1;}ssize_t st_writev(_st_netfd_t *fd, const struct iovec *iov, int iov_size,		  st_utime_t timeout){  ssize_t n, rv;  size_t nleft, nbyte;  int index, iov_cnt;  struct iovec *tmp_iov;  struct iovec local_iov[_LOCAL_MAXIOV];  /* Calculate the total number of bytes to be sent */  nbyte = 0;  for (index = 0; index < iov_size; index++)    nbyte += iov[index].iov_len;  rv = (ssize_t)nbyte;  nleft = nbyte;  tmp_iov = (struct iovec *) iov;	/* we promise not to modify iov */  iov_cnt = iov_size;  while (nleft > 0) {    if (iov_cnt == 1) {      if (st_write(fd, tmp_iov[0].iov_base, nleft, timeout) != nleft)	rv = -1;      break;    }    if ((n = writev(fd->osfd, tmp_iov, iov_cnt)) < 0) {      if (errno == EINTR)	continue;      if (!_IO_NOT_READY_ERROR) {	rv = -1;	break;      }    } else {      if (n == nleft)	break;      nleft -= n;      /* Find the next unwritten vector */      n = (ssize_t)(nbyte - nleft);      for (index = 0; n >= iov[index].iov_len; index++)	n -= iov[index].iov_len;      if (tmp_iov == iov) {	/* Must copy iov's around */	if (iov_size - index <= _LOCAL_MAXIOV) {	  tmp_iov = local_iov;	} else {	  tmp_iov = calloc(1, (iov_size - index) * sizeof(struct iovec));	  if (tmp_iov == NULL)	    return -1;	}      }      /* Fill in the first partial read */      tmp_iov[0].iov_base = &(((char *)iov[index].iov_base)[n]);      tmp_iov[0].iov_len = iov[index].iov_len - n;      index++;      /* Copy the remaining vectors */      for (iov_cnt = 1; index < iov_size; iov_cnt++, index++) {	tmp_iov[iov_cnt].iov_base = iov[index].iov_base;	tmp_iov[iov_cnt].iov_len = iov[index].iov_len;      }    }    /* Wait until the socket becomes writable */    if (st_netfd_poll(fd, POLLOUT, timeout) < 0) {      rv = -1;      break;    }  }  if (tmp_iov != iov && tmp_iov != local_iov)    free(tmp_iov);  return rv;}int st_writev_resid(_st_netfd_t *fd, struct iovec **iov, int *iov_size,		    st_utime_t timeout){  ssize_t n;  while (*iov_size > 0) {    if (*iov_size == 1)      n = write(fd->osfd, (*iov)->iov_base, (*iov)->iov_len);    else      n = writev(fd->osfd, *iov, *iov_size);    if (n < 0) {      if (errno == EINTR)	continue;      if (!_IO_NOT_READY_ERROR)	return -1;    } else {      while (n >= (*iov)->iov_len) {	n -= (*iov)->iov_len;	(*iov)->iov_base = (char *) (*iov)->iov_base + (*iov)->iov_len;	(*iov)->iov_len = 0;	(*iov)++;	(*iov_size)--;	if (n == 0)	  break;      }      if (*iov_size == 0)	break;      (*iov)->iov_base = (char *) (*iov)->iov_base + n;      (*iov)->iov_len -= n;    }    /* Wait until the socket becomes writable */    if (st_netfd_poll(fd, POLLOUT, timeout) < 0)      return -1;  }  return 0;}/* * Simple I/O functions for UDP. */int st_recvfrom(_st_netfd_t *fd, void *buf, int len, struct sockaddr *from,		int *fromlen, st_utime_t timeout){  int n;  while ((n = recvfrom(fd->osfd, buf, len, 0, from, (socklen_t *)fromlen))	 < 0) {    if (errno == EINTR)      continue;    if (!_IO_NOT_READY_ERROR)      return -1;    /* Wait until the socket becomes readable */    if (st_netfd_poll(fd, POLLIN, timeout) < 0)      return -1;  }  return n;}int st_sendto(_st_netfd_t *fd, const void *msg, int len,	      const struct sockaddr *to, int tolen, st_utime_t timeout){  int n;  while ((n = sendto(fd->osfd, msg, len, 0, to, tolen)) < 0) {    if (errno == EINTR)      continue;    if (!_IO_NOT_READY_ERROR)      return -1;    /* Wait until the socket becomes writable */    if (st_netfd_poll(fd, POLLOUT, timeout) < 0)      return -1;  }  return n;}int st_recvmsg(_st_netfd_t *fd, struct msghdr *msg, int flags,	       st_utime_t timeout){  int n;  while ((n = recvmsg(fd->osfd, msg, flags)) < 0) {    if (errno == EINTR)      continue;    if (!_IO_NOT_READY_ERROR)      return -1;    /* Wait until the socket becomes readable */    if (st_netfd_poll(fd, POLLIN, timeout) < 0)      return -1;  }  return n;}int st_sendmsg(_st_netfd_t *fd, const struct msghdr *msg, int flags,	       st_utime_t timeout){  int n;  while ((n = sendmsg(fd->osfd, msg, flags)) < 0) {    if (errno == EINTR)      continue;    if (!_IO_NOT_READY_ERROR)      return -1;    /* Wait until the socket becomes writable */    if (st_netfd_poll(fd, POLLOUT, timeout) < 0)      return -1;  }  return n;}/* * To open FIFOs or other special files. */_st_netfd_t *st_open(const char *path, int oflags, mode_t mode){  int osfd, err;  _st_netfd_t *newfd;  while ((osfd = open(path, oflags | O_NONBLOCK, mode)) < 0) {    if (errno != EINTR)      return NULL;  }  newfd = _st_netfd_new(osfd, 0, 0);  if (!newfd) {    err = errno;    close(osfd);    errno = err;  }  return newfd;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -