ssize_t ret;
int err;
bool retry;
+#ifdef MSG_NOSIGNAL
+ struct msghdr msg;
+ struct iovec vec;
+#endif
if (bsds->netlink) {
ret = tsocket_bsd_netlink_pending(bsds->fd);
bsda->u.sa.sa_len = bsda->sa_socklen;
#endif
+#ifdef MSG_NOSIGNAL
+ vec.iov_base = (char *)state->buf;
+ vec.iov_len = state->len;
+
+ msg.msg_name = &bsda->u.sa; /* optional address */
+ msg.msg_namelen = bsda->sa_socklen; /* size of address */
+ msg.msg_iov = &vec; /* scatter/gather array */
+ msg.msg_iovlen = 1; /* # elements in msg_iov */
+ msg.msg_control = NULL; /* ancillary data, see below */
+ msg.msg_controllen = 0; /* ancillary data buffer len */
+ msg.msg_flags = 0; /* flags on received message */
+
+ ret = recvmsg(bsds->fd, &msg, MSG_NOSIGNAL);
+ bsda->sa_socklen = msg.msg_namelen;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ bsda->u.sa.sa_len = bsda->sa_socklen;
+#endif
+#else
ret = recvfrom(bsds->fd, state->buf, state->len, 0,
&bsda->u.sa, &bsda->sa_socklen);
+#endif
err = tsocket_bsd_error_from_errno(ret, errno, &retry);
if (retry) {
/* retry later */
int err;
int _count;
bool ok, retry;
+#ifdef MSG_NOSIGNAL
+ struct msghdr msg;
+ msg.msg_name = NULL; /* optional address */
+ msg.msg_namelen = 0; /* size of address */
+ msg.msg_iov = state->vector; /* scatter/gather array */
+ msg.msg_iovlen = state->count; /* # elements in msg_iov */
+ msg.msg_control = NULL; /* ancillary data, see below */
+ msg.msg_controllen = 0; /* ancillary data buffer len */
+ msg.msg_flags = 0; /* flags on received message */
+
+ ret = recvmsg(bsds->fd, &msg, MSG_NOSIGNAL);
+#else
ret = readv(bsds->fd, state->vector, state->count);
+#endif
if (ret == 0) {
/* propagate end of file */
tevent_req_error(req, EPIPE);