Example #1
0
ssize_t sendto(int socket, const void *message, size_t length, int flags,
	const struct sockaddr *dest_addr, socklen_t dest_len)
{
	int r;
	nwio_tcpopt_t tcpopt;
	nwio_udpopt_t udpopt;

	r= ioctl(socket, NWIOGTCPOPT, &tcpopt);
	if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL))
	{
		if (r == -1)
			return r;
		return _tcp_sendto(socket, message, length, flags,
			dest_addr, dest_len);
	}

	r= ioctl(socket, NWIOGUDPOPT, &udpopt);
	if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL))
	{
		if (r == -1)
			return r;
		return _udp_sendto(socket, message, length, flags,
			dest_addr, dest_len, &udpopt);
	}

#if DEBUG
	fprintf(stderr, "sendto: not implemented for fd %d\n", socket);
#endif
	errno= ENOSYS;
	return -1;
}
Example #2
0
ssize_t sendto(int sock, const void *message, size_t length, int flags,
	const struct sockaddr *dest_addr, socklen_t dest_len)
{
	int r;
	nwio_tcpopt_t tcpopt;
	nwio_udpopt_t udpopt;
	struct sockaddr_un uds_addr;
	int uds_sotype = -1;

	r= ioctl(sock, NWIOGTCPOPT, &tcpopt);
	if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL))
	{
		if (r == -1)
			return r;
		return _tcp_sendto(sock, message, length, flags,
			dest_addr, dest_len);
	}

	r= ioctl(sock, NWIOGUDPOPT, &udpopt);
	if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL))
	{
		if (r == -1)
			return r;
		return _udp_sendto(sock, message, length, flags,
			dest_addr, dest_len, &udpopt);
	}

	r= ioctl(sock, NWIOGUDSSOTYPE, &uds_sotype);
	if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL))
	{
		if (r == -1) {
			return r;
		}

		if (uds_sotype == SOCK_DGRAM) {

			return _uds_sendto_dgram(sock, message, 
				length, flags,dest_addr, dest_len);
		} else {

			return _uds_sendto_conn(sock, message,
				length, flags, dest_addr, dest_len);
		}
	}

#if DEBUG
	fprintf(stderr, "sendto: not implemented for fd %d\n", sock);
#endif
	errno= ENOSYS;
	return -1;
}
Example #3
0
ssize_t sendto(int sock, const void *message, size_t length, int flags,
	const struct sockaddr *dest_addr, socklen_t dest_len)
{
	int r;
	nwio_tcpopt_t tcpopt;
	nwio_udpopt_t udpopt;
	int uds_sotype = -1;

	r= ioctl(sock, NWIOGTCPOPT, &tcpopt);
	if (r != -1 || errno != ENOTTY)
	{
		if (r == -1)
			return r;
		return _tcp_sendto(sock, message, length, flags,
			dest_addr, dest_len);
	}

	r= ioctl(sock, NWIOGUDPOPT, &udpopt);
	if (r != -1 || errno != ENOTTY)
	{
		if (r == -1)
			return r;
		return _udp_sendto(sock, message, length, flags,
			dest_addr, dest_len, &udpopt);
	}

	r= ioctl(sock, NWIOGUDSSOTYPE, &uds_sotype);
	if (r != -1 || errno != ENOTTY)
	{
		if (r == -1) {
			return r;
		}

		if (uds_sotype == SOCK_DGRAM) {

			return _uds_sendto_dgram(sock, message, 
				length, flags,dest_addr, dest_len);
		} else {

			return _uds_sendto_conn(sock, message,
				length, flags, dest_addr, dest_len);
		}
	}

	{
		ip_hdr_t *ip_hdr;
		int ihl;
		icmp_hdr_t *icmp_hdr;
		struct sockaddr_in *sinp;

		sinp = (struct sockaddr_in *) __UNCONST(dest_addr);
		if (sinp->sin_family != AF_INET)
		{
			errno= EAFNOSUPPORT;
			return -1;
		}

		/* raw */
		ip_hdr= (ip_hdr_t *)message;
		ip_hdr->ih_dst= sinp->sin_addr.s_addr;

		return write(sock, message, length);
	}

#if DEBUG
	fprintf(stderr, "sendto: not implemented for fd %d\n", sock);
#endif
	errno= ENOSYS;
	return -1;
}