libavformat: use MSG_NOSIGNAL when applicable
authorRémi Denis-Courmont <remi@remlab.net>
Wed, 20 Aug 2014 20:06:07 +0000 (23:06 +0300)
committerMartin Storsjö <martin@martin.st>
Mon, 25 Aug 2014 07:49:14 +0000 (10:49 +0300)
If the remote end of a connection oriented socket hangs up, generating
an EPIPE error is preferable over an unhandled SIGPIPE signal.

Signed-off-by: Martin Storsjö <martin@martin.st>
libavformat/network.h
libavformat/sctp.c
libavformat/tcp.c
libavformat/unix.c

index 9d8c92f..09cee58 100644 (file)
@@ -98,6 +98,10 @@ struct sockaddr_storage {
 };
 #endif /* !HAVE_STRUCT_SOCKADDR_STORAGE */
 
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
 #if !HAVE_STRUCT_ADDRINFO
 struct addrinfo {
     int ai_flags;
index 66b31cc..84a4ac1 100644 (file)
@@ -143,7 +143,7 @@ static int ff_sctp_send(int s, const void *msg, size_t len,
         memcpy(CMSG_DATA(cmsg), sinfo, sizeof(struct sctp_sndrcvinfo));
     }
 
-    return sendmsg(s, &outmsg, flags);
+    return sendmsg(s, &outmsg, flags | MSG_NOSIGNAL);
 }
 
 typedef struct SCTPContext {
@@ -300,7 +300,7 @@ static int sctp_write(URLContext *h, const uint8_t *buf, int size)
             abort();
         ret = ff_sctp_send(s->fd, buf + 2, size - 2, &info, MSG_EOR);
     } else
-        ret = send(s->fd, buf, size, 0);
+        ret = send(s->fd, buf, size, MSG_NOSIGNAL);
 
     return ret < 0 ? ff_neterrno() : ret;
 }
index cbd5142..27a0184 100644 (file)
@@ -154,7 +154,7 @@ static int tcp_write(URLContext *h, const uint8_t *buf, int size)
         if (ret < 0)
             return ret;
     }
-    ret = send(s->fd, buf, size, 0);
+    ret = send(s->fd, buf, size, MSG_NOSIGNAL);
     return ret < 0 ? ff_neterrno() : ret;
 }
 
index ab57c68..5c6f576 100644 (file)
@@ -124,7 +124,7 @@ static int unix_write(URLContext *h, const uint8_t *buf, int size)
         if (ret < 0)
             return ret;
     }
-    ret = send(s->fd, buf, size, 0);
+    ret = send(s->fd, buf, size, MSG_NOSIGNAL);
     return ret < 0 ? ff_neterrno() : ret;
 }