ssize_t
writev(int fd, const struct iovec *vector, int count) 
{
  ssize_t retval;

#ifdef X_BUF
  print_trace ("%*swritev(%d, {", indent, "", fd);
  for (int i=0; i<count; i++) {
    print_msg ("{\"%s\", %d}%s", 
	       vector[i].iov_base, 
	       vector[i].iov_len,
	       i==count-1 ? "" : ", ");
  }
  print_msg ("}, %d)=...\n", count);
#else
  print_trace ("%*swritev(%d, %p, %d)=...\n", indent, "",
	       fd, vector, count);
#endif
  indent+=2;

  /* call the real writev function */
  retval = real_writev (fd, vector, count);

  indent-=2;
  print_trace ("%*swritev(%d, %p, %d)=%d\n", indent, "", 
	       fd, vector, count, retval);

  return retval;
}
Beispiel #2
0
ssize_t _native_writev(int fd, const struct iovec *iov, int iovcnt)
{
    ssize_t r;

    _native_syscall_enter();
    r = real_writev(fd, iov, iovcnt);
    _native_syscall_leave();

    return r;
}
ssize_t
writev(int fd, const struct iovec *vector, int count) 
{
  ssize_t retval;

  print_trace ("%*swritev(%d, %p, %d)=...\n", indent, "",
	       fd, vector, count);
  indent+=2;

  /* call the real writev function */
  retval = real_writev (fd, vector, count);

  indent-=2;
  print_trace ("%*swritev(%d, %p, %d)=%d\n", indent, "", 
	       fd, vector, count, retval);

  return retval;
}
Beispiel #4
0
int swrap_writev(int s, const struct iovec *vector, size_t count)
{
	int ret;
	struct socket_info *si = find_socket_info(s);
	struct iovec v;

	if (!si) {
		return real_writev(s, vector, count);
	}

	/* we write 1500 bytes as maximum */
	if (count > 0) {
		size_t i, len = 0;

		for (i=0; i < count; i++) {
			size_t nlen;
			nlen = len + vector[i].iov_len;
			if (nlen > 1500) {
				break;
			}
		}
		count = i;
		if (count == 0) {
			v = vector[0];
			v.iov_len = MIN(v.iov_len, 1500);
			vector = &v;
			count = 1;
		}
	}

	ret = real_writev(s, vector, count);
	if (ret == -1) {
		swrap_dump_packet(si, NULL, SWRAP_SEND_RST, NULL, 0);
	} else {
		uint8_t *buf;
		off_t ofs = 0;
		size_t i;
		size_t remain = ret;

		/* we capture it as one single packet */
		buf = (uint8_t *)malloc(ret);
		if (!buf) {
			/* we just not capture the packet */
			errno = 0;
			return ret;
		}

		for (i=0; i < count; i++) {
			size_t this_time = MIN(remain, vector[i].iov_len);
			memcpy(buf + ofs,
			       vector[i].iov_base,
			       this_time);
			ofs += this_time;
			remain -= this_time;
		}

		swrap_dump_packet(si, NULL, SWRAP_SEND, buf, ret);
		free(buf);
	}

	return ret;
}