diff options
author | David Reid <dreid@apache.org> | 2001-03-20 13:47:00 +0000 |
---|---|---|
committer | David Reid <dreid@apache.org> | 2001-03-20 13:47:00 +0000 |
commit | ab472e468909f18bd072a296882c759051d2774a (patch) | |
tree | c9c2eba282ec3773ba90a720d7d09e83f28851b2 /network_io/beos | |
parent | bee5aca62da8087db60ebafa60868068f5d8bf7d (diff) | |
download | apr-ab472e468909f18bd072a296882c759051d2774a.tar.gz |
Add the UDP support to BeOS R5.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@61369 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'network_io/beos')
-rw-r--r-- | network_io/beos/sendrecv.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/network_io/beos/sendrecv.c b/network_io/beos/sendrecv.c index a5380940c..ec08949d2 100644 --- a/network_io/beos/sendrecv.c +++ b/network_io/beos/sendrecv.c @@ -160,4 +160,80 @@ apr_status_t apr_sendv(apr_socket_t * sock, const struct iovec *vec, return apr_send(sock, vec[0].iov_base, len); } +apr_status_t apr_sendto(apr_socket_t *sock, apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, apr_size_t *len) +{ + ssize_t rv; + + do { + rv = sendto(sock->socketdes, buf, (*len), flags, + (const struct sockaddr*)&where->sa, + where->salen); + } while (rv == -1 && errno == EINTR); + + if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) + && sock->timeout != 0) { + apr_status_t arv = wait_for_io_or_timeout(sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } else { + do { + rv = sendto(sock->socketdes, buf, (*len), flags, + (const struct sockaddr*)&where->sa, + where->salen); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + *len = 0; + return errno; + } + *len = rv; + return APR_SUCCESS; +} + +apr_status_t apr_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len) +{ + ssize_t rv; + + if (from == NULL){ + return APR_ENOMEM; + /* Not sure if this is correct. Maybe we should just allocate + the memory?? + */ + } + + do { + rv = recvfrom(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&from->sa, &from->salen); + } while (rv == -1 && errno == EINTR); + + if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) && + sock->timeout != 0) { + apr_status_t arv = wait_for_io_or_timeout(sock, 1); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } else { + do { + rv = recvfrom(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&from->sa, &from->salen); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + (*len) = 0; + return errno; + } + + (*len) = rv; + if (rv == 0) + return APR_EOF; + + return APR_SUCCESS; +} + #endif |