[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