[FFmpeg-devel] [PATCH v7 2/3] avformat/os_support: Support long file names on Windows
softworkz
ffmpegagent at gmail.com
Wed May 25 01:20:50 EEST 2022
From: softworkz <softworkz at hotmail.com>
Signed-off-by: softworkz <softworkz at hotmail.com>
---
libavformat/os_support.h | 106 ++++++++++++++++++++++++++++++---------
1 file changed, 81 insertions(+), 25 deletions(-)
diff --git a/libavformat/os_support.h b/libavformat/os_support.h
index 5e6b32d2dc..1c3b234b06 100644
--- a/libavformat/os_support.h
+++ b/libavformat/os_support.h
@@ -49,11 +49,28 @@
# ifdef stat
# undef stat
# endif
-# define stat _stati64
+
+# define stat win32_stat
+
+ struct win32_stat
+ {
+ _dev_t st_dev; /* ID of device containing file */
+ _ino_t st_ino; /* inode number */
+ unsigned short st_mode; /* protection */
+ short st_nlink; /* number of hard links */
+ short st_uid; /* user ID of owner */
+ short st_gid; /* group ID of owner */
+ _dev_t st_rdev; /* device ID (if special file) */
+ int64_t st_size; /* total size, in bytes */
+ int64_t st_atime; /* time of last access */
+ int64_t st_mtime; /* time of last modification */
+ int64_t st_ctime; /* time of last status change */
+ };
+
# ifdef fstat
# undef fstat
# endif
-# define fstat(f,s) _fstati64((f), (s))
+# define fstat win32_fstat
#endif /* defined(_WIN32) */
@@ -153,7 +170,7 @@ static inline int win32_##name(const char *filename_utf8) \
wchar_t *filename_w; \
int ret; \
\
- if (utf8towchar(filename_utf8, &filename_w)) \
+ if (get_extended_win32_path(filename_utf8, &filename_w)) \
return -1; \
if (!filename_w) \
goto fallback; \
@@ -171,37 +188,76 @@ DEF_FS_FUNCTION(unlink, _wunlink, _unlink)
DEF_FS_FUNCTION(mkdir, _wmkdir, _mkdir)
DEF_FS_FUNCTION(rmdir, _wrmdir , _rmdir)
-#define DEF_FS_FUNCTION2(name, wfunc, afunc, partype) \
-static inline int win32_##name(const char *filename_utf8, partype par) \
-{ \
- wchar_t *filename_w; \
- int ret; \
- \
- if (utf8towchar(filename_utf8, &filename_w)) \
- return -1; \
- if (!filename_w) \
- goto fallback; \
- \
- ret = wfunc(filename_w, par); \
- av_free(filename_w); \
- return ret; \
- \
-fallback: \
- /* filename may be be in CP_ACP */ \
- return afunc(filename_utf8, par); \
+static inline int win32_access(const char *filename_utf8, int par)
+{
+ wchar_t *filename_w;
+ int ret;
+ if (get_extended_win32_path(filename_utf8, &filename_w))
+ return -1;
+ if (!filename_w)
+ goto fallback;
+ ret = _waccess(filename_w, par);
+ av_free(filename_w);
+ return ret;
+fallback:
+ return _access(filename_utf8, par);
+}
+
+static inline void copy_stat(struct _stati64 *winstat, struct win32_stat *par)
+{
+ par->st_dev = winstat->st_dev;
+ par->st_ino = winstat->st_ino;
+ par->st_mode = winstat->st_mode;
+ par->st_nlink = winstat->st_nlink;
+ par->st_uid = winstat->st_uid;
+ par->st_gid = winstat->st_gid;
+ par->st_rdev = winstat->st_rdev;
+ par->st_size = winstat->st_size;
+ par->st_atime = winstat->st_atime;
+ par->st_mtime = winstat->st_mtime;
+ par->st_ctime = winstat->st_ctime;
}
-DEF_FS_FUNCTION2(access, _waccess, _access, int)
-DEF_FS_FUNCTION2(stat, _wstati64, _stati64, struct stat*)
+static inline int win32_stat(const char *filename_utf8, struct win32_stat *par)
+{
+ struct _stati64 winstat = { 0 };
+ wchar_t *filename_w;
+ int ret;
+
+ if (get_extended_win32_path(filename_utf8, &filename_w))
+ return -1;
+
+ if (filename_w) {
+ ret = _wstat64(filename_w, &winstat);
+ av_free(filename_w);
+ } else
+ ret = _stat64(filename_utf8, &winstat);
+
+ copy_stat(&winstat, par);
+
+ return ret;
+}
+
+static inline int win32_fstat(int fd, struct win32_stat *par)
+{
+ struct _stati64 winstat = { 0 };
+ int ret;
+
+ ret = _fstat64(fd, &winstat);
+
+ copy_stat(&winstat, par);
+
+ return ret;
+}
static inline int win32_rename(const char *src_utf8, const char *dest_utf8)
{
wchar_t *src_w, *dest_w;
int ret;
- if (utf8towchar(src_utf8, &src_w))
+ if (get_extended_win32_path(src_utf8, &src_w))
return -1;
- if (utf8towchar(dest_utf8, &dest_w)) {
+ if (get_extended_win32_path(dest_utf8, &dest_w)) {
av_free(src_w);
return -1;
}
--
ffmpeg-codebot
More information about the ffmpeg-devel
mailing list