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