From: ffmpegagent <ffmpegagent@gmail.com> To: ffmpeg-devel@ffmpeg.org Cc: softworkz <softworkz@hotmail.com> Subject: [FFmpeg-devel] [PATCH v3 0/2] Support long file names on Windows Date: Mon, 16 May 2022 21:23:21 +0000 Message-ID: <pull.28.v3.ffstaging.FFmpeg.1652736203.ffmpegagent@gmail.com> (raw) In-Reply-To: <pull.28.v2.ffstaging.FFmpeg.1652653071.ffmpegagent@gmail.com> This patchset adds support for long file and directory paths on Windows. The implementation follows the same logic that .NET is using internally, with the only exception that it doesn't expand short path components in 8.3 format. .NET does this as the same function is also used for other purposes, but in our case, that's not required. Short (8.3) paths are working as well with the extended path prefix, even when longer than 260. Successfully tested: * Regular paths wth drive letter * Regular UNC paths * Long paths wth drive letter * Long paths wth drive letter and forward slashes * Long UNC paths * Prefixed paths wth drive letter * Prefixed UNC paths I have kept the individual functions separate on purpose, to make it easy to compare with the .NET impl. (compilers should inlinie those anyway) v2 * wchar_filename: Improve comments and function documentation * os_support: adjust defines to use win32_stat v3 * removed length check in path_is_extended() * added path_is_device_path() check in add_extended_prefix() * add_extended_prefix(): clarified doc and add checks * clarified string allocation length calculation * replaced 260 with MAX_PATH * removed redundant checks after normalization softworkz (2): avutil/wchar_filename,file_open: Support long file names on Windows avformat/os_support: Support long file names on Windows libavformat/os_support.h | 26 ++++-- libavutil/file_open.c | 2 +- libavutil/wchar_filename.h | 166 +++++++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+), 6 deletions(-) base-commit: e3580f60775c897c3b13b178c57ab191ecc4a031 Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-28%2Fsoftworkz%2Fsubmit_long_filenames-v3 Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-28/softworkz/submit_long_filenames-v3 Pull-Request: https://github.com/ffstaging/FFmpeg/pull/28 Range-diff vs v2: 1: b66dbdf40c ! 1: ce70f7b021 avutil/wchar_filename,file_open: Support long file names on Windows @@ libavutil/wchar_filename.h: static inline int utf8towchar(const char *filename_u + */ +static inline int path_is_extended(const wchar_t *path) +{ -+ size_t len = wcslen(path); -+ if (len >= 4 && path[0] == L'\\' && (path[1] == L'\\' || path[1] == L'?') && path[2] == L'?' && path[3] == L'\\') ++ if (path[0] == L'\\' && (path[1] == L'\\' || path[1] == L'?') && path[2] == L'?' && path[3] == L'\\') ++ return 1; ++ ++ return 0; ++} ++ ++/** ++ * Checks for a device path prefix. ++ * see .NET6: PathInternal.IsDevicePath() ++ */ ++static inline int path_is_device_path(const wchar_t *path) ++{ ++ if (path[0] == L'\\' && path[1] == L'\\' && path[2] == L'.' && path[3] == L'\\') + return 1; + + return 0; @@ libavutil/wchar_filename.h: static inline int utf8towchar(const char *filename_u + * Adds an extended path or UNC prefix to longs paths or paths ending + * with a space or a dot. (' ' or '.'). + * This function expects that the path has been normalized before by -+ * calling path_normalize(). ++ * calling path_normalize() and it doesn't check whether the path is ++ * actually long (> MAX_PATH). + * see .NET6: PathInternal.EnsureExtendedPrefix() * + */ +static inline int add_extended_prefix(wchar_t **ppath_w) @@ libavutil/wchar_filename.h: static inline int utf8towchar(const char *filename_u + const size_t len = wcslen(path_w); + wchar_t *temp_w; + -+ if (len < 2) ++ /* We're skipping the check IsPartiallyQualified() because ++ * we expect to have called GetFullPathNameW() already. */ ++ if (len < 2 || path_is_extended(*ppath_w) || path_is_device_path(*ppath_w)) { + return 0; ++ } + -+ /* We're skipping the check IsPartiallyQualified() because -+ * we know we have called GetFullPathNameW() already, also -+ * we don't check IsDevice() because device paths are not -+ * allowed to be long paths and we're calling this only -+ * for long paths. -+ */ + if (path_w[0] == L'\\' && path_w[1] == L'\\') { -+ // The length of unc_prefix is 6 plus 1 for terminating zeros -+ temp_w = (wchar_t *)av_calloc(len + 6 + 1, sizeof(wchar_t)); ++ /* unc_prefix length is 8 plus 1 for terminating zeros, ++ * we subtract 2 for the leading '\\' of the original path */ ++ temp_w = (wchar_t *)av_calloc(len - 2 + 8 + 1, sizeof(wchar_t)); + if (!temp_w) { + errno = ENOMEM; + return -1; @@ libavutil/wchar_filename.h: static inline int utf8towchar(const char *filename_u + * APIs. Paths with extended path prefix (either '\\?\' or \??\') are + * left unchanged. + * All other paths are normalized and converted to absolute paths. -+ * Longs paths (>= 260) are prefixed with the extended path or extended ++ * Longs paths (>= MAX_PATH) are prefixed with the extended path or extended + * UNC path prefix. + * see .NET6: Path.GetFullPath() and Path.GetFullPathInternal() + */ @@ libavutil/wchar_filename.h: static inline int utf8towchar(const char *filename_u + + // see .NET6: PathInternal.EnsureExtendedPrefixIfNeeded() + len = wcslen(*ppath_w); -+ if (len >= 260 || (*ppath_w)[len - 1] == L' ' || (*ppath_w)[len - 1] == L'.') { ++ if (len >= MAX_PATH) { + if ((ret = add_extended_prefix(ppath_w)) < 0) + return ret; + } 2: 8ecbafe2b7 = 2: a5268800a4 avformat/os_support: Support long file names on Windows -- ffmpeg-codebot _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2022-05-16 21:23 UTC|newest] Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-05-13 9:53 [FFmpeg-devel] [PATCH " ffmpegagent 2022-05-13 9:53 ` [FFmpeg-devel] [PATCH 1/2] avutil/wchar_filename, file_open: " softworkz 2022-05-15 19:02 ` nil-admirari 2022-05-15 20:24 ` Soft Works 2022-05-16 8:34 ` nil-admirari 2022-05-13 9:53 ` [FFmpeg-devel] [PATCH 2/2] avformat/os_support: " softworkz 2022-05-15 19:13 ` nil-admirari 2022-05-15 22:14 ` Soft Works 2022-05-16 8:19 ` nil-admirari 2022-05-13 10:02 ` [FFmpeg-devel] [PATCH 0/2] " Soft Works 2022-05-15 19:36 ` nil-admirari 2022-05-15 20:31 ` Soft Works 2022-05-16 8:45 ` nil-admirari 2022-05-17 0:37 ` Soft Works 2022-05-15 22:17 ` [FFmpeg-devel] [PATCH v2 " ffmpegagent 2022-05-15 22:17 ` [FFmpeg-devel] [PATCH v2 1/2] avutil/wchar_filename, file_open: " softworkz 2022-05-16 8:12 ` nil-admirari 2022-05-16 21:14 ` Soft Works 2022-05-17 15:06 ` nil-admirari 2022-05-17 15:28 ` Soft Works 2022-05-17 15:43 ` Soft Works 2022-05-20 17:51 ` nil-admirari 2022-05-20 18:03 ` Soft Works 2022-05-21 11:08 ` nil-admirari 2022-05-21 11:12 ` Soft Works 2022-05-23 15:35 ` nil-admirari 2022-05-23 15:47 ` Soft Works 2022-05-23 17:12 ` Hendrik Leppkes 2022-05-24 5:32 ` Soft Works 2022-05-24 5:54 ` Soft Works 2022-05-24 9:47 ` Soft Works 2022-05-24 12:11 ` nil-admirari 2022-05-15 22:17 ` [FFmpeg-devel] [PATCH v2 2/2] avformat/os_support: " softworkz 2022-05-16 21:23 ` ffmpegagent [this message] 2022-05-16 21:23 ` [FFmpeg-devel] [PATCH v3 1/2] avutil/wchar_filename, file_open: " softworkz 2022-05-16 21:23 ` [FFmpeg-devel] [PATCH v3 2/2] avformat/os_support: " softworkz 2022-05-23 11:29 ` [FFmpeg-devel] [PATCH v4 0/2] " ffmpegagent 2022-05-23 11:29 ` [FFmpeg-devel] [PATCH v4 1/2] avutil/wchar_filename, file_open: " softworkz 2022-05-23 11:29 ` [FFmpeg-devel] [PATCH v4 2/2] avformat/os_support: " softworkz 2022-05-24 8:43 ` [FFmpeg-devel] [PATCH v5 0/2] " ffmpegagent 2022-05-24 8:43 ` [FFmpeg-devel] [PATCH v5 1/2] avutil/wchar_filename, file_open: " softworkz 2022-05-24 9:09 ` Martin Storsjö 2022-05-24 8:43 ` [FFmpeg-devel] [PATCH v5 2/2] avformat/os_support: " softworkz 2022-05-24 9:23 ` Martin Storsjö 2022-05-24 9:33 ` Soft Works 2022-05-24 10:25 ` Martin Storsjö 2022-05-24 11:15 ` Soft Works 2022-05-24 11:26 ` Martin Storsjö 2022-05-24 12:31 ` Soft Works 2022-05-24 12:44 ` Martin Storsjö 2022-05-24 13:41 ` Soft Works 2022-05-24 13:58 ` [FFmpeg-devel] [PATCH v6 0/2] " ffmpegagent 2022-05-24 13:58 ` [FFmpeg-devel] [PATCH v6 1/2] avutil/wchar_filename, file_open: " softworkz 2022-05-24 20:55 ` Martin Storsjö 2022-05-24 13:58 ` [FFmpeg-devel] [PATCH v6 2/2] avformat/os_support: " softworkz 2022-05-24 20:58 ` Martin Storsjö 2022-05-24 22:12 ` Soft Works 2022-05-25 7:09 ` Martin Storsjö 2022-05-24 22:20 ` [FFmpeg-devel] [PATCH v7 0/3] " ffmpegagent 2022-05-24 22:20 ` [FFmpeg-devel] [PATCH v7 1/3] avutil/wchar_filename, file_open: " softworkz 2022-05-24 22:20 ` [FFmpeg-devel] [PATCH v7 2/3] avformat/os_support: " softworkz 2022-05-25 14:47 ` nil-admirari 2022-05-25 15:28 ` Soft Works 2022-05-25 19:17 ` nil-admirari 2022-05-26 5:09 ` Soft Works 2022-05-25 18:50 ` Martin Storsjö 2022-05-24 22:20 ` [FFmpeg-devel] [PATCH v7 3/3] avformat/file: remove _WIN32 condition softworkz 2022-05-25 7:34 ` [FFmpeg-devel] [PATCH v7 0/3] Support long file names on Windows Martin Storsjö 2022-05-26 9:28 ` [FFmpeg-devel] [PATCH v8 " ffmpegagent 2022-05-26 9:28 ` [FFmpeg-devel] [PATCH v8 1/3] avutil/wchar_filename, file_open: " softworkz 2022-05-26 9:28 ` [FFmpeg-devel] [PATCH v8 2/3] avformat/os_support: " softworkz 2022-05-26 9:28 ` [FFmpeg-devel] [PATCH v8 3/3] avformat/file: remove _WIN32 condition softworkz 2022-05-26 21:26 ` [FFmpeg-devel] [PATCH v8 0/3] Support long file names on Windows Martin Storsjö 2022-06-09 10:03 ` Martin Storsjö 2022-06-09 19:37 ` nil-admirari 2022-06-09 20:15 ` Soft Works 2022-06-09 20:22 ` nil-admirari 2022-06-09 21:32 ` Soft Works 2022-06-09 20:21 ` Martin Storsjö 2022-06-09 20:57 ` nil-admirari 2022-06-09 21:02 ` Martin Storsjö 2022-06-13 16:42 ` nil-admirari 2022-06-09 21:03 ` Soft Works
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=pull.28.v3.ffstaging.FFmpeg.1652736203.ffmpegagent@gmail.com \ --to=ffmpegagent@gmail.com \ --cc=ffmpeg-devel@ffmpeg.org \ --cc=softworkz@hotmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git