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 06792404BA for ; Tue, 24 May 2022 22:21:02 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C100468B58F; Wed, 25 May 2022 01:21:00 +0300 (EEST) Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0E02468B443 for ; Wed, 25 May 2022 01:20:55 +0300 (EEST) Received: by mail-pj1-f41.google.com with SMTP id ds11so18082021pjb.0 for ; Tue, 24 May 2022 15:20: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=MelPbwMQUES53sDrrefYpEeMKN9JZZZ7m++yxKC69MI=; b=KNloENzk+y2SBKdzex/2i5pRripICk80GSpvEWLFIsFwS8UbD8XOTG7IPHANTaIdbB oo3vs4Ktg3p/Rm9dAhtsxuws8sWl6z9tDBR4lkBEDVZNd3F1RjRrgYu27WNARE6/j94J cctOAP6a8EkNg9pd66R+ocoE/idU8kA+wIgBTN28cK/YVJXr+fPc9Z0DbECWCBSylT1u AoGdUggasoswefrUh/egjB3TMltDzA+OfuC8D7067XAWGkoycF/9ZIAxVlOP7Q/BT4KS Ahd0C9WDiMHssWhHU5vgjLUWqdRKIP3aAHAWc4euxzq9wXfhoWP1IIjDlyDEkEJL/Yi4 O5DQ== 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=MelPbwMQUES53sDrrefYpEeMKN9JZZZ7m++yxKC69MI=; b=C9kCZ/qiytzlu+AKpwYrBrrYlL94W5L0UYFvj6LZ9+vrRpyE+Lem5UDDwgQF16oJC7 KCKRMuy6fjVEejAjbSkasZP9pGjormlxnSSJOtL5leGR+Ybvg3JxnVaNH5TV7u5aeadu Sibyzmi+dCYxSCOabIxt8TytF4QmzHQahbdSaZqIBo/tf/oo9azpB02TIn0uitmlEuqk JPzUg/gd6WSuUUitvPkrYZt8p9tSRjXVD7gW3sHEDmW/cVGlCQEvRup9dllZlic5tD5n pKzMDJsvUyZqS29f/CULA3gFbHF7LhlKzYKIzOODDLgNkVwkuJggl1ocYHACVSVLfvjd Le1g== X-Gm-Message-State: AOAM532q+Ll3JUBjkPi9H0NuGQhOhMFa06GsWl6QBNSiF5Jv0YM07aGv gCkQjMqrnqB3NErHfa6bQy7MfaTmx/tpiA== X-Google-Smtp-Source: ABdhPJzceXV2EWbOx1w0CiAmZzbTHvG5ud597TqGw5lmP5hZTGEJH7OhC523uqdBzxfgQB3GaUwmqw== X-Received: by 2002:a17:903:2283:b0:161:d0c4:d420 with SMTP id b3-20020a170903228300b00161d0c4d420mr29628702plh.43.1653430853117; Tue, 24 May 2022 15:20:53 -0700 (PDT) Received: from [127.0.0.1] (master.gitmailbox.com. [34.83.118.50]) by smtp.gmail.com with ESMTPSA id q16-20020a170902eb9000b00161b50c3db4sm7651708plg.94.2022.05.24.15.20.52 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 24 May 2022 15:20:52 -0700 (PDT) Message-Id: In-Reply-To: References: From: ffmpegagent Date: Tue, 24 May 2022 22:20:48 +0000 Fcc: Sent MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH v7 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 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 | 106 ++++++++++++++++------ libavutil/file_open.c | 2 +- libavutil/wchar_filename.h | 180 +++++++++++++++++++++++++++++++++++++ 4 files changed, 262 insertions(+), 30 deletions(-) base-commit: 6076dbcb55d0c9b6693d1acad12a63f7268301aa Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-28%2Fsoftworkz%2Fsubmit_long_filenames-v7 Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-28/softworkz/submit_long_filenames-v7 Pull-Request: https://github.com/ffstaging/FFmpeg/pull/28 Range-diff vs v6: 1: 960aa795ff = 1: 960aa795ff avutil/wchar_filename,file_open: Support long file names on Windows 2: 6f8d400db7 ! 2: 7751335906 avformat/os_support: Support long file names on Windows @@ libavformat/os_support.h + short st_uid; /* user ID of owner */ + short st_gid; /* group ID of owner */ + _dev_t st_rdev; /* device ID (if special file) */ -+ long st_size; /* total size, in bytes */ -+ time_t st_atime; /* time of last access */ -+ time_t st_mtime; /* time of last modification */ -+ time_t st_ctime; /* time of last status change */ ++ 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) */ + + @@ libavformat/os_support.h: static inline int win32_##name(const char *filename_utf8) \ wchar_t *filename_w; \ int ret; \ @@ libavformat/os_support.h: DEF_FS_FUNCTION(unlink, _wunlink, _unlink) + 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 stat *par) ++static inline int win32_stat(const char *filename_utf8, struct win32_stat *par) +{ ++ struct _stati64 winstat = { 0 }; + wchar_t *filename_w; + int ret; -+ struct _stati64 winstat = { 0 }; + + if (get_extended_win32_path(filename_utf8, &filename_w)) + return -1; @@ libavformat/os_support.h: DEF_FS_FUNCTION(unlink, _wunlink, _unlink) + } else + ret = _stat64(filename_utf8, &winstat); + -+ 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; ++ 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; +} -: ---------- > 3: 0522fc2315 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".