From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 9782843272 for ; Thu, 26 May 2022 09:29:02 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F11A168B583; Thu, 26 May 2022 12:28:59 +0300 (EEST) Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6BEEF68B356 for ; Thu, 26 May 2022 12:28:54 +0300 (EEST) Received: by mail-pf1-f180.google.com with SMTP id bo5so1251963pfb.4 for ; Thu, 26 May 2022 02:28:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=g+UMJGNmJuXI4/74/C+XPdZjGqh6R54wxmsNq/JdrQQ=; b=XPUNeBBsNGo4ZY43eCbUtaCreM8a75WQp1YljX0oIuxSQp8K8q0hdjJSI5wMCkpkUU HW24YH4XIoQgu35+psyjfLMp3xRmiZfas5s3LDZQ6aADHfug7/9DJbR/65xXAB8CLJM2 eBTJx1X3yftyF/sk8TqmPWzUNzVJRU0gNINkrcEIVf4CLP+SNNn1wUaNRLuHAwz7XUyY YERdlIB0/QasQWLdRjrOJFpwE/Qvr5FYTpUeX8M6ZnmsnkWKu7XkNCYtNRkVy9P/NUxf IUL0jV3jnnB72YjBPjPx8BQWUYq0S8c0xXf4JBxMcOQnQLJnQ4VDhWB+j0KU4OM8Qw98 y73Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=g+UMJGNmJuXI4/74/C+XPdZjGqh6R54wxmsNq/JdrQQ=; b=mT6H91HsNwRa+/LjF94/t1GUOFfjrqK3odfLZ/r+KZuqyxAFJ5yabnJ7Rz2Aic7AWH c50K7YJm6KpawfJ/fa9lXRpNnznwqYqk4G8qpT8B4+5gflg0TboYSwnMxLWHt0wloV4W W8fYuM0K4ivYxLT6L2Ta0Xia2TjVxy/tHdyReY19SW1berzAiVlxb/jEu6mI+G/pzkPp dTZ+ftuMQl55huGda6ey1tO8hCOnHUOp7b7pBmhQ9wGwy7t8crrOazc53fTk24vhcDBo BsdCy/F/kXLSUUO+5nY6mwOvua6IJvwjJp031Mpy92QXAFrqnNbH0wQjrgalIOgJgbvx +EHQ== X-Gm-Message-State: AOAM533l+1yp9DpblqlU0O7PRTiums3ds39uUNkZU3k5vh3zQVgn9F/U LH3TOSDSF2YRF0ANJKbtkgH8yKULwdI0mg== X-Google-Smtp-Source: ABdhPJxWbQQnTakOIlbMXGvsLuvwFAjZZ4tkpoz7kY59L+uafEU6DmL+LqkzwFczckdbLig/Kg0e5g== X-Received: by 2002:a63:2645:0:b0:3f5:f438:c0e0 with SMTP id m66-20020a632645000000b003f5f438c0e0mr32056943pgm.186.1653557332209; Thu, 26 May 2022 02:28:52 -0700 (PDT) Received: from [127.0.0.1] (master.gitmailbox.com. [34.83.118.50]) by smtp.gmail.com with ESMTPSA id j2-20020a17090a2a8200b001d92e2e5694sm3237182pjd.1.2022.05.26.02.28.50 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 May 2022 02:28:51 -0700 (PDT) Message-Id: In-Reply-To: References: From: ffmpegagent Date: Thu, 26 May 2022 09:28:47 +0000 Fcc: Sent MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH v8 0/3] Support long file names on Windows X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Martin =?UTF-8?Q?Storsj=C3=B6?= , softworkz , Hendrik Leppkes Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: 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 v4 * rebased. no changes v5 * resolved the ugly struct duplication * compatible with _USE_32BIT_TIME_T v6 * wchar_filename.h: added links to .NET source code * wchar_filename.h: free allocations on error * os_support.hs: use clean and safe way to redirect stat() calls v7 * os_support.h: remapped fstat with win32_stat structure * os_support.h: use int64_t for some members * avformat/file: remove _WIN32 condition v8 * os_support.h: documented win32_stat structure * os_support.h: renamed function parameters softworkz (3): avutil/wchar_filename,file_open: Support long file names on Windows avformat/os_support: Support long file names on Windows avformat/file: remove _WIN32 condition libavformat/file.c | 4 - libavformat/os_support.h | 116 ++++++++++++++++++------ libavutil/file_open.c | 2 +- libavutil/wchar_filename.h | 180 +++++++++++++++++++++++++++++++++++++ 4 files changed, 272 insertions(+), 30 deletions(-) base-commit: 6076dbcb55d0c9b6693d1acad12a63f7268301aa Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-28%2Fsoftworkz%2Fsubmit_long_filenames-v8 Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-28/softworkz/submit_long_filenames-v8 Pull-Request: https://github.com/ffstaging/FFmpeg/pull/28 Range-diff vs v7: 1: 960aa795ff = 1: 960aa795ff avutil/wchar_filename,file_open: Support long file names on Windows 2: 7751335906 ! 2: d0cc40a0d4 avformat/os_support: Support long file names on Windows @@ libavformat/os_support.h + +# define stat win32_stat + ++ /* ++ * The POSIX definition for the stat() function uses a struct of the ++ * same name (struct stat), that why it takes this extra effort for ++ * redirecting/replacing the stat() function with our own one which ++ * is capable to handle long path names on Windows. ++ * The struct below roughly follows the POSIX definition. Time values ++ * are 64bit, but in cases when _USE_32BIT_TIME_T is defined, they ++ * will be set to values no larger than INT32_MAX which corresponds ++ * to file times up to the year 2038. ++ */ + struct win32_stat + { + _dev_t st_dev; /* ID of device containing file */ @@ libavformat/os_support.h: DEF_FS_FUNCTION(unlink, _wunlink, _unlink) -fallback: \ - /* filename may be be in CP_ACP */ \ - return afunc(filename_utf8, par); \ -+static inline int win32_access(const char *filename_utf8, int par) ++static inline int win32_access(const char *filename_utf8, int mode) +{ + wchar_t *filename_w; + int ret; @@ libavformat/os_support.h: DEF_FS_FUNCTION(unlink, _wunlink, _unlink) + return -1; + if (!filename_w) + goto fallback; -+ ret = _waccess(filename_w, par); ++ ret = _waccess(filename_w, mode); + av_free(filename_w); + return ret; +fallback: -+ return _access(filename_utf8, par); ++ return _access(filename_utf8, mode); +} + -+static inline void copy_stat(struct _stati64 *winstat, struct win32_stat *par) ++static inline void copy_stat(struct _stati64 *crtstat, struct win32_stat *buf) +{ -+ 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; ++ buf->st_dev = crtstat->st_dev; ++ buf->st_ino = crtstat->st_ino; ++ buf->st_mode = crtstat->st_mode; ++ buf->st_nlink = crtstat->st_nlink; ++ buf->st_uid = crtstat->st_uid; ++ buf->st_gid = crtstat->st_gid; ++ buf->st_rdev = crtstat->st_rdev; ++ buf->st_size = crtstat->st_size; ++ buf->st_atime = crtstat->st_atime; ++ buf->st_mtime = crtstat->st_mtime; ++ buf->st_ctime = crtstat->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) ++static inline int win32_stat(const char *filename_utf8, struct win32_stat *buf) +{ -+ struct _stati64 winstat = { 0 }; ++ struct _stati64 crtstat = { 0 }; + wchar_t *filename_w; + int ret; + @@ libavformat/os_support.h: DEF_FS_FUNCTION(unlink, _wunlink, _unlink) + return -1; + + if (filename_w) { -+ ret = _wstat64(filename_w, &winstat); ++ ret = _wstat64(filename_w, &crtstat); + av_free(filename_w); + } else -+ ret = _stat64(filename_utf8, &winstat); ++ ret = _stat64(filename_utf8, &crtstat); + -+ copy_stat(&winstat, par); ++ copy_stat(&crtstat, buf); + + return ret; +} + -+static inline int win32_fstat(int fd, struct win32_stat *par) ++static inline int win32_fstat(int fd, struct win32_stat *buf) +{ -+ struct _stati64 winstat = { 0 }; ++ struct _stati64 crtstat = { 0 }; + int ret; + -+ ret = _fstat64(fd, &winstat); ++ ret = _fstat64(fd, &crtstat); + -+ copy_stat(&winstat, par); ++ copy_stat(&crtstat, buf); + + return ret; +} 3: 0522fc2315 = 3: e13c6b0aaa avformat/file: remove _WIN32 condition -- 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".