00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #if HAVE_CONFIG_H
00022 #include "config.h"
00023 #endif
00024
00025 #if defined(__MINGW32__)
00026
00027 # undef __STRICT_ANSI__
00028 #endif
00029
00030 #include "file.h"
00031 #include "file_mythiowrapper.h"
00032 #include "util/macro.h"
00033 #include "util/logging.h"
00034
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 #include <sys/stat.h>
00038 #include <sys/types.h>
00039
00040 #ifdef WIN32
00041 #define ftello _ftelli64
00042 #define fseeko _fseeki64
00043 #endif // #ifdef WIN32
00044
00045 static void file_close_linux(BD_FILE_H *file)
00046 {
00047 if (file) {
00048 fclose((FILE *)file->internal);
00049
00050 BD_DEBUG(DBG_FILE, "Closed LINUX file (%p)\n", file);
00051
00052 X_FREE(file);
00053 }
00054 }
00055
00056 static int64_t file_seek_linux(BD_FILE_H *file, int64_t offset, int32_t origin)
00057 {
00058 #if defined(__MINGW32__)
00059 return fseeko64((FILE *)file->internal, offset, origin);
00060 #else
00061 return fseeko((FILE *)file->internal, offset, origin);
00062 #endif
00063 }
00064
00065 static int64_t file_tell_linux(BD_FILE_H *file)
00066 {
00067 #if defined(__MINGW32__)
00068 return ftello64((FILE *)file->internal);
00069 #else
00070 return ftello((FILE *)file->internal);
00071 #endif
00072 }
00073
00074 static int file_stat_linux(BD_FILE_H *file, struct stat *buf)
00075 {
00076 return fstat(fileno((FILE *)file->internal), buf);
00077 }
00078
00079 static int file_eof_linux(BD_FILE_H *file)
00080 {
00081 return feof((FILE *)file->internal);
00082 }
00083
00084 static int64_t file_read_linux(BD_FILE_H *file, uint8_t *buf, int64_t size)
00085 {
00086 return fread(buf, 1, size, (FILE *)file->internal);
00087 }
00088
00089 static int64_t file_write_linux(BD_FILE_H *file, const uint8_t *buf, int64_t size)
00090 {
00091 return fwrite(buf, 1, size, (FILE *)file->internal);
00092 }
00093
00094 static BD_FILE_H *file_open_linux(const char* filename, const char *mode)
00095 {
00096 if (strncmp(filename, "myth://", 7) == 0)
00097 return file_open_mythiowrapper(filename, mode);
00098
00099 FILE *fp = NULL;
00100 BD_FILE_H *file = malloc(sizeof(BD_FILE_H));
00101
00102 BD_DEBUG(DBG_FILE, "Opening LINUX file %s... (%p)\n", filename, file);
00103 file->close = file_close_linux;
00104 file->seek = file_seek_linux;
00105 file->read = file_read_linux;
00106 file->write = file_write_linux;
00107 file->tell = file_tell_linux;
00108 file->eof = file_eof_linux;
00109 file->stat = file_stat_linux;
00110
00111 if ((fp = fopen(filename, mode))) {
00112 file->internal = fp;
00113
00114 return file;
00115 }
00116
00117 BD_DEBUG(DBG_FILE, "Error opening file! (%p)\n", file);
00118
00119 X_FREE(file);
00120
00121 return NULL;
00122 }
00123
00124 BD_FILE_H* (*file_open)(const char* filename, const char *mode) = file_open_linux;