diff options
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/io.c | 29 | ||||
-rw-r--r-- | osdep/io.h | 32 |
2 files changed, 54 insertions, 7 deletions
diff --git a/osdep/io.c b/osdep/io.c index b93618400c..a78dd78c2c 100644 --- a/osdep/io.c +++ b/osdep/io.c @@ -132,11 +132,36 @@ void mp_get_converted_argv(int *argc, char ***argv) *argv = win32_argv_utf8; } -int mp_stat(const char *path, struct stat *buf) +static void copy_stat(struct mp_stat *dst, struct _stat64 *src) { + dst->st_dev = src->st_dev; + dst->st_ino = src->st_ino; + dst->st_mode = src->st_mode; + dst->st_nlink = src->st_nlink; + dst->st_uid = src->st_uid; + dst->st_gid = src->st_gid; + dst->st_rdev = src->st_rdev; + dst->st_size = src->st_size; + dst->st_atime = src->st_atime; + dst->st_mtime = src->st_mtime; + dst->st_ctime = src->st_ctime; +} + +int mp_stat(const char *path, struct mp_stat *buf) +{ + struct _stat64 buf_; wchar_t *wpath = mp_from_utf8(NULL, path); - int res = _wstati64(wpath, buf); + int res = _wstat64(wpath, &buf_); talloc_free(wpath); + copy_stat(buf, &buf_); + return res; +} + +int mp_fstat(int fd, struct mp_stat *buf) +{ + struct _stat64 buf_; + int res = _fstat64(fd, &buf_); + copy_stat(buf, &buf_); return res; } diff --git a/osdep/io.h b/osdep/io.h index a24ad7c231..b56953aedf 100644 --- a/osdep/io.h +++ b/osdep/io.h @@ -22,6 +22,7 @@ #include "config.h" #include <stdbool.h> +#include <stdint.h> #include <limits.h> #include <sys/types.h> #include <sys/stat.h> @@ -65,7 +66,6 @@ char *mp_to_utf8(void *talloc_ctx, const wchar_t *s); void mp_get_converted_argv(int *argc, char ***argv); -int mp_stat(const char *path, struct stat *buf); int mp_printf(const char *format, ...); int mp_fprintf(FILE *stream, const char *format, ...); int mp_open(const char *filename, int oflag, ...); @@ -79,6 +79,27 @@ FILE *mp_tmpfile(void); char *mp_getenv(const char *name); off_t mp_lseek(int fd, off_t offset, int whence); +// MinGW-w64 will define "stat" to something useless. Since this affects both +// the type (struct stat) and the stat() function, it makes us harder to +// override these separately. +// Corresponds to struct _stat64 (copy & pasted, but using public types). +struct mp_stat { + dev_t st_dev; + ino_t st_ino; + unsigned short st_mode; + short st_nlink; + short st_uid; + short st_gid; + dev_t st_rdev; + int64_t st_size; + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +}; + +int mp_stat(const char *path, struct mp_stat *buf); +int mp_fstat(int fd, struct mp_stat *buf); + typedef struct { size_t gl_pathc; char **gl_pathv; @@ -113,6 +134,11 @@ void mp_globfree(mp_glob_t *pglob); #define lseek(...) mp_lseek(__VA_ARGS__) #endif +#undef stat +#define stat mp_stat +#undef fstat +#define fstat(...) mp_fstat(__VA_ARGS__) + #ifndef GLOB_NOMATCH #define GLOB_NOMATCH 3 #endif @@ -121,10 +147,6 @@ void mp_globfree(mp_glob_t *pglob); #define glob(...) mp_glob(__VA_ARGS__) #define globfree(...) mp_globfree(__VA_ARGS__) -#else /* __MINGW32__ */ - -#define mp_stat(...) stat(__VA_ARGS__) - #endif /* __MINGW32__ */ #endif |