diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-03-10 06:45:56 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-03-10 06:45:56 -0800 |
commit | cf0d9e5d49ca21fc45cf222b53e5a9124ce8e07e (patch) | |
tree | b3a02f848f9de12e72bbc214a50ff6a73bcec276 | |
parent | e73f74bff9ecec623f2cc14bd353c3170a20bafe (diff) | |
download | txr-cf0d9e5d49ca21fc45cf222b53e5a9124ce8e07e.tar.gz txr-cf0d9e5d49ca21fc45cf222b53e5a9124ce8e07e.tar.bz2 txr-cf0d9e5d49ca21fc45cf222b53e5a9124ce8e07e.zip |
Solaris: cannot sendto on connected dgram socket.
* socket.c (struct dgram_stream): New member, sock_connected.
(make_dgram_sock_stream): Initialize sock_connected to zero.
(dgram_flush): Use send if sock_connected is nonzero, otherwise
sendto.
(dgram_set_sock_peer): Set sock_connected to 1.
-rw-r--r-- | socket.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -66,6 +66,7 @@ struct dgram_stream { mem_t *tx_buf; int rx_size, rx_pos; int tx_pos; + unsigned sock_connected : 1; }; val sockaddr_in_s, sockaddr_in6_s, sockaddr_un_s, addrinfo_s; @@ -281,6 +282,7 @@ static val make_dgram_sock_stream(int fd, val family, val peer, d->stream = stream; d->family = family; d->peer = peer; + d->sock_connected = 0; return stream; } @@ -459,8 +461,11 @@ static val dgram_flush(val stream) struct dgram_stream *d = coerce(struct dgram_stream *, stream->co.handle); if (d->fd != -1 && d->tx_buf) { if (d->peer) { - int nwrit = sendto(d->fd, d->tx_buf, d->tx_pos, 0, - coerce(struct sockaddr *, &d->peer_addr), d->pa_len); + int nwrit = d->sock_connected + ? send(d->fd, d->tx_buf, d->tx_pos, 0) + : sendto(d->fd, d->tx_buf, d->tx_pos, 0, + coerce(struct sockaddr *, &d->peer_addr), + d->pa_len); if (nwrit != d->tx_pos) { d->err = (nwrit < 0) ? errno : ENOBUFS; @@ -590,6 +595,7 @@ static val dgram_set_sock_peer(val stream, val peer) { struct dgram_stream *d = coerce(struct dgram_stream *, stream->co.handle); sockaddr_in(peer, d->family, &d->peer_addr, &d->pa_len); + d->sock_connected = 1; return set(mkloc(d->peer, stream), peer); } |