vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue May 26 23:16:48 2015 +0300| [9457a9cf741513be7917d5a2662c0606a706511b] | committer: Rémi Denis-Courmont
access_out_file: use send(MSG_NOSIGNAL) for sockets > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9457a9cf741513be7917d5a2662c0606a706511b --- modules/access_output/file.c | 51 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/modules/access_output/file.c b/modules/access_output/file.c index edece6d..8a2d94e 100644 --- a/modules/access_output/file.c +++ b/modules/access_output/file.c @@ -30,11 +30,10 @@ # include "config.h" #endif +#include <assert.h> #include <sys/types.h> -#include <time.h> #include <fcntl.h> #include <errno.h> -#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> @@ -43,6 +42,7 @@ #include <vlc_sout.h> #include <vlc_block.h> #include <vlc_fs.h> +#include <vlc_network.h> #include <vlc_strings.h> #include <vlc_dialog.h> @@ -102,6 +102,43 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer ) return i_write; } +#ifdef S_ISSOCK +static ssize_t Send(sout_access_out_t *access, block_t *block) +{ + int fd = (intptr_t)access->p_sys; + size_t total = 0; + + while (block != NULL) + { + if (block->i_buffer == 0) + { + block_t *next = block->p_next; + block_Release(block); + block = next; + continue; + } + + /* TODO: vectorized I/O with sendmsg() */ + ssize_t val = send(fd, block->p_buffer, block->i_buffer, MSG_NOSIGNAL); + if (val <= 0) + { /* FIXME: errno is meaningless if val is zero */ + if (errno == EINTR) + continue; + block_ChainRelease(block); + msg_Err(access, "cannot write: %s", vlc_strerror_c(errno)); + return -1; + } + + total += val; + + assert((size_t)val <= block->i_buffer); + block->p_buffer += val; + block->i_buffer -= val; + } + return total; +} +#endif + /***************************************************************************** * Seek: seek to a specific location in a file *****************************************************************************/ @@ -256,15 +293,23 @@ static int Open( vlc_object_t *p_this ) return VLC_EGENERIC; } - p_access->pf_write = Write; p_access->pf_read = Read; if (S_ISREG(st.st_mode) || S_ISBLK(st.st_mode)) { + p_access->pf_write = Write; p_access->pf_seek = Seek; } +#ifdef S_ISSOCK + else if (S_ISSOCK(st.st_mode)) + { + p_access->pf_write = Send; + p_access->pf_seek = NoSeek; + } +#endif else { + p_access->pf_write = Write; p_access->pf_seek = NoSeek; } p_access->pf_control = Control; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
