Commit 785b6e2b authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

access_out_file: fix append mode, relax stdout support, simplify

O_APPEND puts the file pointer to the end after _each_ write.
We want to put it at the end (only) after open.
Also allow reading/seeking stdout, as it could be a redirected file
(of course, it won't work if it's a terminal)
parent 77acf509
...@@ -42,16 +42,13 @@ ...@@ -42,16 +42,13 @@
#include <vlc_charset.h> #include <vlc_charset.h>
#include "vlc_strings.h" #include "vlc_strings.h"
#ifdef HAVE_UNISTD_H #if defined( WIN32 ) && !defined( UNDER_CE )
# include <unistd.h>
#elif defined( WIN32 ) && !defined( UNDER_CE )
# include <io.h> # include <io.h>
# define lseek _lseeki64
#else
# include <unistd.h>
#endif #endif
/* For those platforms that don't use these */
#ifndef STDOUT_FILENO
# define STDOUT_FILENO 1
#endif
#ifndef O_LARGEFILE #ifndef O_LARGEFILE
# define O_LARGEFILE 0 # define O_LARGEFILE 0
#endif #endif
...@@ -103,8 +100,7 @@ struct sout_access_out_sys_t ...@@ -103,8 +100,7 @@ struct sout_access_out_sys_t
static int Open( vlc_object_t *p_this ) static int Open( vlc_object_t *p_this )
{ {
sout_access_out_t *p_access = (sout_access_out_t*)p_this; sout_access_out_t *p_access = (sout_access_out_t*)p_this;
int i_flags; int fd;
vlc_value_t val;
config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg ); config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg );
...@@ -114,47 +110,40 @@ static int Open( vlc_object_t *p_this ) ...@@ -114,47 +110,40 @@ static int Open( vlc_object_t *p_this )
return VLC_EGENERIC; return VLC_EGENERIC;
} }
if( !( p_access->p_sys = malloc( sizeof( sout_access_out_sys_t ) ) ) ) bool append = var_GetBool( p_access, SOUT_CFG_PREFIX "append" );
{
return( VLC_ENOMEM );
}
i_flags = O_RDWR|O_CREAT|O_LARGEFILE;
var_Get( p_access, SOUT_CFG_PREFIX "append", &val );
i_flags |= val.b_bool ? O_APPEND : O_TRUNC;
if( !strcmp( p_access->psz_path, "-" ) ) if( !strcmp( p_access->psz_path, "-" ) )
{ {
#if defined(WIN32) #ifdef WIN32
setmode (STDOUT_FILENO, O_BINARY); setmode (fileno (stdout), O_BINARY);
#endif #endif
p_access->p_sys->i_handle = STDOUT_FILENO; fd = dup (fileno (stdout));
msg_Dbg( p_access, "using stdout" ); msg_Dbg( p_access, "using stdout" );
} }
else else
{ {
int fd;
char *psz_tmp = str_format( p_access, p_access->psz_path ); char *psz_tmp = str_format( p_access, p_access->psz_path );
path_sanitize( psz_tmp ); path_sanitize( psz_tmp );
fd = utf8_open( psz_tmp, i_flags, 0666 ); fd = utf8_open( psz_tmp, O_RDWR | O_CREAT | O_LARGEFILE |
(append ? 0 : O_TRUNC), 0666 );
free( psz_tmp ); free( psz_tmp );
}
if( fd == -1 ) if (fd == -1)
{ {
msg_Err( p_access, "cannot open `%s' (%m)", p_access->psz_path ); msg_Err( p_access, "cannot open `%s' (%m)", p_access->psz_path );
free( p_access->p_sys ); return VLC_EGENERIC;
return( VLC_EGENERIC );
}
p_access->p_sys->i_handle = fd;
} }
p_access->pf_write = Write; p_access->pf_write = Write;
p_access->pf_read = Read; p_access->pf_read = Read;
p_access->pf_seek = Seek; p_access->pf_seek = Seek;
p_access->p_sys = (void *)(intptr_t)fd;
msg_Dbg( p_access, "file access output opened (`%s')", p_access->psz_path ); msg_Dbg( p_access, "file access output opened (%s)", p_access->psz_path );
if (append)
lseek (fd, 0, SEEK_END);
/* Update pace control flag */ /* Update pace control flag */
if( p_access->psz_access && !strcmp( p_access->psz_access, "stream" ) ) if( p_access->psz_access && !strcmp( p_access->psz_access, "stream" ) )
...@@ -170,14 +159,7 @@ static void Close( vlc_object_t * p_this ) ...@@ -170,14 +159,7 @@ static void Close( vlc_object_t * p_this )
{ {
sout_access_out_t *p_access = (sout_access_out_t*)p_this; sout_access_out_t *p_access = (sout_access_out_t*)p_this;
if( strcmp( p_access->psz_path, "-" ) ) close( (intptr_t)p_access->p_sys );
{
if( p_access->p_sys->i_handle )
{
close( p_access->p_sys->i_handle );
}
}
free( p_access->p_sys );
/* Update pace control flag */ /* Update pace control flag */
if( p_access->psz_access && !strcmp( p_access->psz_access, "stream" ) ) if( p_access->psz_access && !strcmp( p_access->psz_access, "stream" ) )
...@@ -191,14 +173,8 @@ static void Close( vlc_object_t * p_this ) ...@@ -191,14 +173,8 @@ static void Close( vlc_object_t * p_this )
*****************************************************************************/ *****************************************************************************/
static ssize_t Read( sout_access_out_t *p_access, block_t *p_buffer ) static ssize_t Read( sout_access_out_t *p_access, block_t *p_buffer )
{ {
if( strcmp( p_access->psz_path, "-" ) ) return read( (intptr_t)p_access->p_sys, p_buffer->p_buffer,
{ p_buffer->i_buffer );
return read( p_access->p_sys->i_handle, p_buffer->p_buffer,
p_buffer->i_buffer );
}
msg_Err( p_access, "cannot read while using stdout" );
return VLC_EGENERIC;
} }
/***************************************************************************** /*****************************************************************************
...@@ -212,7 +188,7 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer ) ...@@ -212,7 +188,7 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer )
{ {
block_t *p_next = p_buffer->p_next;; block_t *p_next = p_buffer->p_next;;
i_write += write( p_access->p_sys->i_handle, i_write += write( (intptr_t)p_access->p_sys,
p_buffer->p_buffer, p_buffer->i_buffer ); p_buffer->p_buffer, p_buffer->i_buffer );
block_Release( p_buffer ); block_Release( p_buffer );
...@@ -227,17 +203,5 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer ) ...@@ -227,17 +203,5 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer )
*****************************************************************************/ *****************************************************************************/
static int Seek( sout_access_out_t *p_access, off_t i_pos ) static int Seek( sout_access_out_t *p_access, off_t i_pos )
{ {
if( strcmp( p_access->psz_path, "-" ) ) return lseek( (intptr_t)p_access->p_sys, i_pos, SEEK_SET );
{
#if defined( WIN32 ) && !defined( UNDER_CE )
return( _lseeki64( p_access->p_sys->i_handle, i_pos, SEEK_SET ) );
#else
return( lseek( p_access->p_sys->i_handle, i_pos, SEEK_SET ) );
#endif
}
else
{
msg_Err( p_access, "cannot seek while using stdout" );
return VLC_EGENERIC;
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment