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; }
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; }
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; }