X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Ffile.c;h=8e00b3d94f0bf1aede33334ff5e359d9259e7f35;hb=6d5336200143e6d1ad70ef653c72265d25f67640;hp=972e7eec03a79d75366cf9ec5d374cac186da39c;hpb=ed68c13dee214d79d4c9c9632e4bac4b5714da32;p=vlc diff --git a/modules/access/file.c b/modules/access/file.c index 972e7eec03..8e00b3d94f 100644 --- a/modules/access/file.c +++ b/modules/access/file.c @@ -1,26 +1,26 @@ /***************************************************************************** * file.c: file input (file: access plug-in) ***************************************************************************** - * Copyright (C) 2001-2006 the VideoLAN team + * Copyright (C) 2001-2006 VLC authors and VideoLAN * Copyright © 2006-2007 Rémi Denis-Courmont * $Id$ * * Authors: Christophe Massiot * Rémi Denis-Courmont * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifdef HAVE_CONFIG_H @@ -44,7 +44,7 @@ # include #endif -#if defined( WIN32 ) +#if defined( _WIN32 ) # include # include # include @@ -58,7 +58,7 @@ #include #include #include -#ifdef WIN32 +#ifdef _WIN32 # include #endif #include @@ -66,15 +66,13 @@ struct access_sys_t { - unsigned int i_nb_reads; - int fd; /* */ bool b_pace_control; }; -#if !defined (WIN32) && !defined (__OS2__) +#if !defined (_WIN32) && !defined (__OS2__) static bool IsRemote (int fd) { #if defined (HAVE_FSTATVFS) && defined (MNT_LOCAL) @@ -111,10 +109,10 @@ static bool IsRemote (int fd) } # define IsRemote(fd,path) IsRemote(fd) -#else /* WIN32 || __OS2__ */ +#else /* _WIN32 || __OS2__ */ static bool IsRemote (const char *path) { -# if !defined(UNDER_CE) && !defined(__OS2__) +# if !defined(__OS2__) && !VLC_WINSTORE_APP wchar_t *wpath = ToWide (path); bool is_remote = (wpath != NULL && PathIsNetworkPathW (wpath)); free (wpath); @@ -130,6 +128,12 @@ static bool IsRemote (const char *path) # define posix_fadvise(fd, off, len, adv) #endif +static ssize_t FileRead (access_t *, uint8_t *, size_t); +static int FileSeek (access_t *, uint64_t); +static ssize_t StreamRead (access_t *, uint8_t *, size_t); +static int NoSeek (access_t *, uint64_t); +static int FileControl (access_t *, int, va_list); + /***************************************************************************** * FileOpen: open the file *****************************************************************************/ @@ -170,7 +174,7 @@ int FileOpen( vlc_object_t *p_this ) { msg_Err (p_access, "cannot open file %s (%m)", path); dialog_Fatal (p_access, _("File reading failed"), - _("VLC could not open the file \"%s\". (%m)"), path); + _("VLC could not open the file \"%s\" (%m)."), path); } } if (fd == -1) @@ -213,40 +217,36 @@ int FileOpen( vlc_object_t *p_this ) if (unlikely(p_sys == NULL)) goto error; access_InitFields (p_access); - p_access->pf_read = FileRead; p_access->pf_block = NULL; p_access->pf_control = FileControl; - p_access->pf_seek = FileSeek; p_access->p_sys = p_sys; - p_sys->i_nb_reads = 0; p_sys->fd = fd; - p_sys->b_pace_control = true; - if (S_ISREG (st.st_mode)) - p_access->info.i_size = st.st_size; - else if (!S_ISBLK (st.st_mode)) + if (S_ISREG (st.st_mode) || S_ISBLK (st.st_mode)) { - p_access->pf_seek = NoSeek; - p_sys->b_pace_control = strcasecmp (p_access->psz_access, "stream"); - } + p_access->pf_read = FileRead; + p_access->pf_seek = FileSeek; + p_access->info.i_size = st.st_size; + p_sys->b_pace_control = true; - if (p_access->pf_seek != NoSeek) - { /* Demuxers will need the beginning of the file for probing. */ posix_fadvise (fd, 0, 4096, POSIX_FADV_WILLNEED); /* In most cases, we only read the file once. */ posix_fadvise (fd, 0, 0, POSIX_FADV_NOREUSE); -#if defined(HAVE_FCNTL) - /* We'd rather use any available memory for reading ahead - * than for caching what we've already seen/heard */ -# if defined(F_RDAHEAD) +#ifdef F_RDAHEAD fcntl (fd, F_RDAHEAD, 1); -# endif -# if defined(F_NOCACHE) - fcntl (fd, F_NOCACHE, 1); -# endif +#endif +#ifdef F_NOCACHE + fcntl (fd, F_NOCACHE, 0); #endif } + else + { + p_access->pf_read = StreamRead; + p_access->pf_seek = NoSeek; + p_sys->b_pace_control = strcasecmp (p_access->psz_access, "stream"); + } + return VLC_SUCCESS; error: @@ -276,65 +276,47 @@ void FileClose (vlc_object_t * p_this) #include -/***************************************************************************** - * Read: standard read on a file descriptor. - *****************************************************************************/ -ssize_t FileRead( access_t *p_access, uint8_t *p_buffer, size_t i_len ) +/** + * Reads from a regular file. + */ +static ssize_t FileRead (access_t *p_access, uint8_t *p_buffer, size_t i_len) { access_sys_t *p_sys = p_access->p_sys; int fd = p_sys->fd; - ssize_t i_ret; - -#if !defined (WIN32) && !defined (__OS2__) - if (p_access->pf_seek == NoSeek) - i_ret = net_Read (p_access, fd, NULL, p_buffer, i_len, false); - else -#endif - i_ret = read (fd, p_buffer, i_len); + ssize_t val = read (fd, p_buffer, i_len); - if( i_ret < 0 ) + if (val < 0) { switch (errno) { case EINTR: case EAGAIN: - break; - - default: - msg_Err (p_access, "failed to read (%m)"); - dialog_Fatal (p_access, _("File reading failed"), - _("VLC could not read the file (%m).")); - p_access->info.b_eof = true; - return 0; + return -1; } - } - else if( i_ret > 0 ) - p_access->info.i_pos += i_ret; - else - p_access->info.b_eof = true; - p_sys->i_nb_reads++; + msg_Err (p_access, "read error: %m"); + dialog_Fatal (p_access, _("File reading failed"), + _("VLC could not read the file (%m).")); + val = 0; + } - if ((p_access->info.i_size && !(p_sys->i_nb_reads % INPUT_FSTAT_NB_READS)) - || (p_access->info.i_pos > p_access->info.i_size)) + p_access->info.i_pos += val; + p_access->info.b_eof = !val; + if (p_access->info.i_pos >= p_access->info.i_size) { struct stat st; - if ((fstat (fd, &st) == 0) - && (p_access->info.i_size != (uint64_t)st.st_size)) - { + if (fstat (fd, &st) == 0) p_access->info.i_size = st.st_size; - p_access->info.i_update |= INPUT_UPDATE_SIZE; - } } - return i_ret; + return val; } /***************************************************************************** * Seek: seek to a specific location in a file *****************************************************************************/ -int FileSeek (access_t *p_access, uint64_t i_pos) +static int FileSeek (access_t *p_access, uint64_t i_pos) { p_access->info.i_pos = i_pos; p_access->info.b_eof = false; @@ -343,7 +325,38 @@ int FileSeek (access_t *p_access, uint64_t i_pos) return VLC_SUCCESS; } -int NoSeek (access_t *p_access, uint64_t i_pos) +/** + * Reads from a non-seekable file. + */ +static ssize_t StreamRead (access_t *p_access, uint8_t *p_buffer, size_t i_len) +{ + access_sys_t *p_sys = p_access->p_sys; + int fd = p_sys->fd; + +#if !defined (_WIN32) && !defined (__OS2__) + ssize_t val = net_Read (p_access, fd, NULL, p_buffer, i_len, false); +#else + ssize_t val = read (fd, p_buffer, i_len); +#endif + + if (val < 0) + { + switch (errno) + { + case EINTR: + case EAGAIN: + return -1; + } + msg_Err (p_access, "read error: %m"); + val = 0; + } + + p_access->info.i_pos += val; + p_access->info.b_eof = !val; + return val; +} + +static int NoSeek (access_t *p_access, uint64_t i_pos) { /* assert(0); ?? */ (void) p_access; (void) i_pos; @@ -353,7 +366,7 @@ int NoSeek (access_t *p_access, uint64_t i_pos) /***************************************************************************** * Control: *****************************************************************************/ -int FileControl( access_t *p_access, int i_query, va_list args ) +static int FileControl( access_t *p_access, int i_query, va_list args ) { access_sys_t *p_sys = p_access->p_sys; bool *pb_bool;