summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-03-10 06:45:56 -0800
committerKaz Kylheku <kaz@kylheku.com>2016-03-10 06:45:56 -0800
commitcf0d9e5d49ca21fc45cf222b53e5a9124ce8e07e (patch)
treeb3a02f848f9de12e72bbc214a50ff6a73bcec276
parente73f74bff9ecec623f2cc14bd353c3170a20bafe (diff)
downloadtxr-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.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/socket.c b/socket.c
index eb9c917c..fb16088f 100644
--- a/socket.c
+++ b/socket.c
@@ -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);
}