static BD_FILE_H *_file_open(const char* filename, const char *cmode) { BD_FILE_H *file; int fd = -1; int flags = 0; int mode = 0; if (strchr(cmode, 'w')) { flags = O_WRONLY | O_CREAT | O_TRUNC; mode = S_IRUSR | S_IWUSR; } else { flags = O_RDONLY; } #ifdef O_CLOEXEC flags |= O_CLOEXEC; #endif #ifdef O_BINARY flags |= O_BINARY; #endif if (strncmp(filename, "myth://", 7) == 0) return file_open_mythiowrapper(filename, cmode); if ((fd = open(filename, flags, mode)) < 0) { BD_DEBUG(DBG_FILE, "Error opening file %s\n", filename); return NULL; } file = calloc(1, sizeof(BD_FILE_H)); if (!file) { close(fd); BD_DEBUG(DBG_FILE, "Error opening file %s (out of memory)\n", filename); return NULL; } file->close = _file_close; file->seek = _file_seek; file->read = _file_read; file->write = _file_write; file->tell = _file_tell; //file->eof = file_eof_linux; file->internal = (void*)(intptr_t)fd; BD_DEBUG(DBG_FILE, "Opened POSIX file %s (%p)\n", filename, (void*)file); return file; }
static BD_FILE_H *file_open_linux(const char* filename, const char *mode) { if (strncmp(filename, "myth://", 7) == 0) return file_open_mythiowrapper(filename, mode); FILE *fp = NULL; BD_FILE_H *file = malloc(sizeof(BD_FILE_H)); BD_DEBUG(DBG_FILE, "Opening LINUX file %s... (%p)\n", filename, file); file->close = file_close_linux; file->seek = file_seek_linux; file->read = file_read_linux; file->write = file_write_linux; file->tell = file_tell_linux; file->eof = file_eof_linux; file->stat = file_stat_linux; #ifdef WIN32 wchar_t wfilename[MAX_PATH], wmode[8]; if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, wfilename, MAX_PATH) && MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, mode, -1, wmode, 8) && (fp = _wfopen(wfilename, wmode))) { #else if ((fp = fopen(filename, mode))) { #endif file->internal = fp; return file; } BD_DEBUG(DBG_FILE, "Error opening file! (%p)\n", file); X_FREE(file); return NULL; } BD_FILE_H* (*file_open)(const char* filename, const char *mode) = file_open_linux; BD_FILE_OPEN file_open_default(void) { return file_open_linux; }