]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Allow the usage of MSG_NOSIGNAL in send functions
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 17 May 2015 18:33:48 +0000 (20:33 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 17 May 2015 19:11:53 +0000 (21:11 +0200)
That introduces the GNUTLS_NO_SIGNAL flag for gnutls_init(),
which is available in systems that support the MSG_NOSIGNAL
flag to send(). That eases the usage of the library within
other libraries.
Resolves #11

lib/gnutls_state.c
lib/includes/gnutls/gnutls.h.in
lib/system.c
lib/system.h

index e3463d9b074ebc620e6963f178294de7fcbcf227..ef2a587f9e4159d377a9673726a30d761539e01d 100644 (file)
@@ -288,10 +288,8 @@ void _gnutls_handshake_internal_state_clear(gnutls_session_t session)
  * 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 
@@ -376,7 +374,12 @@ int gnutls_init(gnutls_session_t * session, unsigned int flags)
        (*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
index 010ffff13158e5883d69bc51c4ceebd17283a123..49c4805adde90713e6f3d7352a178184e46b246c 100644 (file)
@@ -322,6 +322,7 @@ typedef enum {
    * @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.
    *
@@ -332,6 +333,7 @@ typedef enum {
 #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:
index d336b529b17f91195e2c8dbeb27d692ac974bc08..f12dbfc2f3ec02662442ed43e2d4c331956771ca 100644 (file)
@@ -110,16 +110,31 @@ int system_errno(gnutls_transport_ptr_t ptr)
        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)
 {
index 03cf7fd4942a83f0b787bb5b1bf60caf46b01146..23d291d41d1f033cf56dce4409d68d02924792af 100644 (file)
@@ -48,6 +48,8 @@ ssize_t system_write(gnutls_transport_ptr_t ptr, const void *data,
 #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);