+void Close (vlc_object_t * p_this)
+{
+ access_t *p_access = (access_t*)p_this;
+
+ if (p_access->pf_read == NULL)
+ {
+ DirClose (p_this);
+ return;
+ }
+
+ access_sys_t *p_sys = p_access->p_sys;
+
+ close (p_sys->fd);
+ free (p_sys);
+}
+
+
+#include <vlc_network.h>
+
+/*****************************************************************************
+ * Read: standard read on a file descriptor.
+ *****************************************************************************/
+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;
+
+#ifndef WIN32
+ 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);
+
+ if( i_ret < 0 )
+ {
+ switch (errno)
+ {
+ case EINTR:
+ case EAGAIN:
+ break;
+
+ default:
+ msg_Err (p_access, "failed to read (%m)");
+ dialog_Fatal (p_access, _("File reading failed"), "%s",
+ _("VLC could not read the file."));
+ p_access->info.b_eof = true;
+ return 0;
+ }
+ }
+ else if( i_ret > 0 )
+ p_access->info.i_pos += i_ret;
+ else
+ p_access->info.b_eof = true;
+
+ p_sys->i_nb_reads++;
+
+ 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))
+ {
+#ifdef HAVE_SYS_STAT_H
+ struct stat st;
+
+ if ((fstat (fd, &st) == 0)
+ && (p_access->info.i_size != (uint64_t)st.st_size))
+ {
+ p_access->info.i_size = st.st_size;
+ p_access->info.i_update |= INPUT_UPDATE_SIZE;
+ }
+#endif
+ }
+ return i_ret;
+}
+
+
+/*****************************************************************************
+ * Seek: seek to a specific location in a file
+ *****************************************************************************/
+int FileSeek (access_t *p_access, uint64_t i_pos)
+{
+ p_access->info.i_pos = i_pos;
+ p_access->info.b_eof = false;
+
+ lseek (p_access->p_sys->fd, i_pos, SEEK_SET);
+ return VLC_SUCCESS;
+}
+
+int NoSeek (access_t *p_access, uint64_t i_pos)
+{
+ /* assert(0); ?? */
+ (void) p_access; (void) i_pos;
+ return VLC_EGENERIC;
+}
+
+/*****************************************************************************
+ * Control:
+ *****************************************************************************/
+int FileControl( access_t *p_access, int i_query, va_list args )
+{
+ access_sys_t *p_sys = p_access->p_sys;
+ bool *pb_bool;
+ int64_t *pi_64;
+
+ switch( i_query )
+ {
+ /* */
+ case ACCESS_CAN_SEEK:
+ case ACCESS_CAN_FASTSEEK:
+ pb_bool = (bool*)va_arg( args, bool* );
+ *pb_bool = (p_access->pf_seek != NoSeek);
+ break;
+
+ case ACCESS_CAN_PAUSE:
+ case ACCESS_CAN_CONTROL_PACE:
+ pb_bool = (bool*)va_arg( args, bool* );
+ *pb_bool = p_sys->b_pace_control;
+ break;
+
+ /* */
+ case ACCESS_GET_PTS_DELAY:
+ pi_64 = (int64_t*)va_arg( args, int64_t * );
+ *pi_64 = p_sys->caching * INT64_C(1000);
+ break;
+
+ /* */
+ case ACCESS_SET_PAUSE_STATE:
+ /* Nothing to do */
+ break;
+
+ case ACCESS_GET_TITLE_INFO:
+ case ACCESS_SET_TITLE:
+ case ACCESS_SET_SEEKPOINT:
+ case ACCESS_SET_PRIVATE_ID_STATE:
+ case ACCESS_GET_META:
+ case ACCESS_GET_PRIVATE_ID_STATE:
+ case ACCESS_GET_CONTENT_TYPE:
+ return VLC_EGENERIC;
+
+ default:
+ msg_Warn( p_access, "unimplemented query %d in control", i_query );
+ return VLC_EGENERIC;
+
+ }
+ return VLC_SUCCESS;
+}