[vlc-commits] access_out_file: check file descriptor type in Open()
Rémi Denis-Courmont
git at videolan.org
Tue May 26 22:28:13 CEST 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue May 26 23:03:36 2015 +0300| [7050a20a46caaaf26588a78fc55ef908af775616] | committer: Rémi Denis-Courmont
access_out_file: check file descriptor type in Open()
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7050a20a46caaaf26588a78fc55ef908af775616
---
modules/access_output/file.c | 31 +++++++++++++++++++++++++------
1 file changed, 25 insertions(+), 6 deletions(-)
diff --git a/modules/access_output/file.c b/modules/access_output/file.c
index 080ef89..edece6d 100644
--- a/modules/access_output/file.c
+++ b/modules/access_output/file.c
@@ -110,6 +110,12 @@ static int Seek( sout_access_out_t *p_access, off_t i_pos )
return lseek( (intptr_t)p_access->p_sys, i_pos, SEEK_SET );
}
+static int NoSeek(sout_access_out_t *access, off_t pos)
+{
+ (void) access; (void) pos;
+ return -1;
+}
+
static int Control( sout_access_out_t *p_access, int i_query, va_list args )
{
switch( i_query )
@@ -124,11 +130,7 @@ static int Control( sout_access_out_t *p_access, int i_query, va_list args )
case ACCESS_OUT_CAN_SEEK:
{
bool *pb = va_arg( args, bool * );
- struct stat st;
- if( fstat( (intptr_t)p_access->p_sys, &st ) == -1 )
- *pb = false;
- else
- *pb = S_ISREG( st.st_mode ) || S_ISBLK( st.st_mode );
+ *pb = p_access->pf_seek == Seek;
break;
}
@@ -245,9 +247,26 @@ static int Open( vlc_object_t *p_this )
return VLC_EGENERIC;
}
+ struct stat st;
+
+ if (fstat (fd, &st))
+ {
+ msg_Err (p_access, "write error: %s", vlc_strerror_c(errno));
+ close (fd);
+ return VLC_EGENERIC;
+ }
+
p_access->pf_write = Write;
p_access->pf_read = Read;
- p_access->pf_seek = Seek;
+
+ if (S_ISREG(st.st_mode) || S_ISBLK(st.st_mode))
+ {
+ p_access->pf_seek = Seek;
+ }
+ else
+ {
+ p_access->pf_seek = NoSeek;
+ }
p_access->pf_control = Control;
p_access->p_sys = (void *)(intptr_t)fd;
More information about the vlc-commits
mailing list