_PUBLIC_ ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) { struct sockaddr_un un_addr; socklen_t un_addrlen = sizeof(un_addr); int ret; struct socket_info *si = find_socket_info(s); struct sockaddr_storage ss; socklen_t ss_len = sizeof(ss); if (!si) { return real_recvfrom(s, buf, len, flags, from, fromlen); } if (!from) { from = (struct sockaddr *)&ss; fromlen = &ss_len; } len = MIN(len, 1500); /* irix 6.4 forgets to null terminate the sun_path string :-( */ memset(&un_addr, 0, sizeof(un_addr)); ret = real_recvfrom(s, buf, len, flags, (struct sockaddr *)&un_addr, &un_addrlen); if (ret == -1) return ret; if (sockaddr_convert_from_un(si, &un_addr, un_addrlen, si->family, from, fromlen) == -1) { return -1; } swrap_dump_packet(si, from, SWRAP_RECVFROM, buf, ret); return ret; }
ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) { ssize_t retval; print_trace ("%*srecvfrom(%d, %p, %d, %d, %p, %p)=...\n", indent, "", s, buf, len, flags, from, fromlen); indent+=2; /* call the real recvfrom function */ retval = real_recvfrom (s, buf, len, flags, from, fromlen); indent-=2; print_trace ("%*srecvfrom(%d, %p, %d, %d, %p, %p)=%d\n", indent, "", s, buf, len, flags, from, fromlen, retval); return retval; }
ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len) { static struct sockaddr_in *address_in; address_in = (struct sockaddr_in *)address; if (address_in != NULL && address_in->sin_port == old_port) { address_in->sin_port = new_port; } ssize_t res; res = real_recvfrom(socket, buffer, length, flags, address, address_len); if (address_in != NULL && address_in->sin_port == new_port) { address_in->sin_port = old_port; } return res; }