summaryrefslogtreecommitdiffstats
path: root/src/socket_wrapper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket_wrapper.c')
-rw-r--r--src/socket_wrapper.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 88d1d42..205d457 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -3010,6 +3010,10 @@ static ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags,
fromlen);
}
+ tmp.iov_base = buf;
+ tmp.iov_len = len;
+
+ ZERO_STRUCT(msg);
if (from != NULL && fromlen != NULL) {
msg.msg_name = from; /* optional address */
msg.msg_namelen = *fromlen; /* size of address */
@@ -3017,15 +3021,13 @@ static ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags,
msg.msg_name = (struct sockaddr *)(void *)&ss; /* optional address */
msg.msg_namelen = ss_len; /* size of address */
}
-
- tmp.iov_base = buf;
- tmp.iov_len = len;
-
msg.msg_iov = &tmp; /* scatter/gather array */
msg.msg_iovlen = 1; /* # elements in msg_iov */
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
msg.msg_control = NULL; /* ancillary data, see below */
msg.msg_controllen = 0; /* ancillary data buffer len */
msg.msg_flags = 0; /* flags on received message */
+#endif
tret = swrap_recvmsg_before(s, si, &msg, &tmp);
if (tret == -1) {
@@ -3101,7 +3103,7 @@ static ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags,
msg.msg_namelen = tolen; /* size of address */
msg.msg_iov = &tmp; /* scatter/gather array */
msg.msg_iovlen = 1; /* # elements in msg_iov */
-#if 0 /* not available on solaris */
+#if HAVE_STRUCT_MSGHDR_MSG_CONTROL
msg.msg_control = NULL; /* ancillary data, see below */
msg.msg_controllen = 0; /* ancillary data buffer len */
msg.msg_flags = 0; /* flags on received message */
@@ -3180,13 +3182,16 @@ static ssize_t swrap_recv(int s, void *buf, size_t len, int flags)
tmp.iov_base = buf;
tmp.iov_len = len;
+ ZERO_STRUCT(msg);
msg.msg_name = (struct sockaddr *)(void *)&ss; /* optional address */
msg.msg_namelen = ss_len; /* size of address */
msg.msg_iov = &tmp; /* scatter/gather array */
msg.msg_iovlen = 1; /* # elements in msg_iov */
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
msg.msg_control = NULL; /* ancillary data, see below */
msg.msg_controllen = 0; /* ancillary data buffer len */
msg.msg_flags = 0; /* flags on received message */
+#endif
tret = swrap_recvmsg_before(s, si, &msg, &tmp);
if (tret == -1) {
@@ -3234,13 +3239,16 @@ static ssize_t swrap_read(int s, void *buf, size_t len)
tmp.iov_base = buf;
tmp.iov_len = len;
+ ZERO_STRUCT(msg);
msg.msg_name = (struct sockaddr *)(void *)&ss; /* optional address */
msg.msg_namelen = ss_len; /* size of address */
msg.msg_iov = &tmp; /* scatter/gather array */
msg.msg_iovlen = 1; /* # elements in msg_iov */
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
msg.msg_control = NULL; /* ancillary data, see below */
msg.msg_controllen = 0; /* ancillary data buffer len */
msg.msg_flags = 0; /* flags on received message */
+#endif
tret = swrap_recvmsg_before(s, si, &msg, &tmp);
if (tret == -1) {
@@ -3290,7 +3298,7 @@ static ssize_t swrap_send(int s, const void *buf, size_t len, int flags)
msg.msg_namelen = 0; /* size of address */
msg.msg_iov = &tmp; /* scatter/gather array */
msg.msg_iovlen = 1; /* # elements in msg_iov */
-#if 0 /* not available on solaris */
+#if HAVE_STRUCT_MSGHDR_MSG_CONTROL
msg.msg_control = NULL; /* ancillary data, see below */
msg.msg_controllen = 0; /* ancillary data buffer len */
msg.msg_flags = 0; /* flags on received message */
@@ -3339,12 +3347,19 @@ static ssize_t swrap_recvmsg(int s, struct msghdr *omsg, int flags)
return -1;
}
- msg = *omsg;
- tmp.iov_base = msg.msg_iov;
- tmp.iov_len = msg.msg_iovlen;
+ ZERO_STRUCT(msg);
+ msg.msg_name = (struct sockaddr *)&from_addr; /* optional address */
+ msg.msg_namelen = from_addrlen; /* size of address */
+ msg.msg_iov = omsg->msg_iov; /* scatter/gather array */
+ msg.msg_iovlen = omsg->msg_iovlen; /* # elements in msg_iov */
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
+ msg.msg_control = omsg->msg_control; /* ancillary data, see below */
+ msg.msg_controllen = omsg->msg_controllen; /* ancillary data buffer len */
+ msg.msg_flags = omsg->msg_flags; /* flags on received message */
+#endif
- msg.msg_name = (struct sockaddr *)&from_addr;
- msg.msg_namelen = from_addrlen;
+ tmp.iov_base = omsg->msg_iov;
+ tmp.iov_len = omsg->msg_iovlen;
ret = libc_recvmsg(s, &msg, flags);
@@ -3380,21 +3395,20 @@ static ssize_t swrap_sendmsg(int s, const struct msghdr *omsg, int flags)
return libc_sendmsg(s, omsg, flags);
}
- tmp.iov_base = NULL;
- tmp.iov_len = 0;
-
- msg = *omsg;
-#if 0
+ ZERO_STRUCT(msg);
msg.msg_name = omsg->msg_name; /* optional address */
msg.msg_namelen = omsg->msg_namelen; /* size of address */
msg.msg_iov = omsg->msg_iov; /* scatter/gather array */
msg.msg_iovlen = omsg->msg_iovlen; /* # elements in msg_iov */
- /* the following is not available on solaris */
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
msg.msg_control = omsg->msg_control; /* ancillary data, see below */
msg.msg_controllen = omsg->msg_controllen; /* ancillary data buffer len */
msg.msg_flags = omsg->msg_flags; /* flags on received message */
#endif
+ tmp.iov_base = omsg->msg_iov;
+ tmp.iov_len = omsg->msg_iovlen;
+
ret = swrap_sendmsg_before(s, si, &msg, &tmp, &un_addr, &to_un, &to, &bcast);
if (ret == -1) return -1;
@@ -3566,7 +3580,7 @@ static ssize_t swrap_writev(int s, const struct iovec *vector, int count)
msg.msg_namelen = 0; /* size of address */
msg.msg_iov = discard_const_p(struct iovec, vector); /* scatter/gather array */
msg.msg_iovlen = count; /* # elements in msg_iov */
-#if 0 /* not available on solaris */
+#if HAVE_STRUCT_MSGHDR_MSG_CONTROL
msg.msg_control = NULL; /* ancillary data, see below */
msg.msg_controllen = 0; /* ancillary data buffer len */
msg.msg_flags = 0; /* flags on received message */