* be allocated. This function allocates structures which can only
* be free'd by calling gnutls_deinit(). Returns %GNUTLS_E_SUCCESS (0) on success.
*
- * @flags can be one of %GNUTLS_CLIENT and %GNUTLS_SERVER. For a DTLS
- * entity, the flags %GNUTLS_DATAGRAM and %GNUTLS_NONBLOCK are
- * also available. The latter flag will indicated non-blocking
- * operation of the sockets provided to gnutls.
+ * @flags can be one of %GNUTLS_CLIENT, %GNUTLS_SERVER, %GNUTLS_DATAGRAM,
+ * %GNUTLS_NONBLOCK or %GNUTLS_NOSIGNAL (since 3.4.2).
*
* The flag %GNUTLS_NO_REPLAY_PROTECTION will disable any
* replay protection in DTLS mode. That must only used when
(*session)->internals.priorities.sr = SR_PARTIAL;
#ifdef HAVE_WRITEV
- gnutls_transport_set_vec_push_function(*session, system_writev);
+#ifdef MSG_NOSIGNAL
+ if (flags & GNUTLS_NO_SIGNAL)
+ gnutls_transport_set_vec_push_function(*session, system_writev_nosignal);
+ else
+#endif
+ gnutls_transport_set_vec_push_function(*session, system_writev);
#else
gnutls_transport_set_push_function(*session, system_write);
#endif
* @GNUTLS_CLIENT: Connection end is a client.
* @GNUTLS_DATAGRAM: Connection is datagram oriented (DTLS).
* @GNUTLS_NONBLOCK: Connection should not block.
+ * @GNUTLS_NO_SIGNAL: In systems where SIGPIPE is delivered on send, it will be disabled. That flag has effect in systems which support the MSG_NOSIGNAL sockets flag.
* @GNUTLS_NO_EXTENSIONS: Do not enable any TLS extensions by default.
* @GNUTLS_NO_REPLAY_PROTECTION: Disable any replay protection in DTLS.
*
#define GNUTLS_NONBLOCK (1<<3)
#define GNUTLS_NO_EXTENSIONS (1<<4)
#define GNUTLS_NO_REPLAY_PROTECTION (1<<5)
+#define GNUTLS_NO_SIGNAL (1<<6)
/**
* gnutls_alert_level_t:
return errno;
}
+#ifdef MSG_NOSIGNAL
+ssize_t
+system_writev_nosignal(gnutls_transport_ptr_t ptr, const giovec_t * iovec,
+ int iovec_cnt)
+{
+ struct msghdr hdr;
+
+ memset(&hdr, 0, sizeof(hdr));
+ hdr.msg_iov = (struct iovec *)iovec;
+ hdr.msg_iovlen = iovec_cnt;
+
+ return sendmsg(GNUTLS_POINTER_TO_INT(ptr), &hdr, MSG_NOSIGNAL);
+}
+#endif
+
ssize_t
system_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec,
int iovec_cnt)
{
return writev(GNUTLS_POINTER_TO_INT(ptr), (struct iovec *) iovec,
iovec_cnt);
-
}
#endif
+
ssize_t
system_read(gnutls_transport_ptr_t ptr, void *data, size_t data_size)
{
#define HAVE_WRITEV
ssize_t system_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec,
int iovec_cnt);
+ssize_t system_writev_nosignal(gnutls_transport_ptr_t ptr, const giovec_t * iovec,
+ int iovec_cnt);
#endif
ssize_t system_read(gnutls_transport_ptr_t ptr, void *data,
size_t data_size);