Example #1
0
_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;
}
Example #3
0
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;
}