From: Soft Works <softworkz@hotmail.com>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH v2 1/2] avutil/wchar_filename, file_open: Support long file names on Windows
Date: Tue, 24 May 2022 09:47:37 +0000
Message-ID: <DM8P223MB036539E9A894F7A3D8C1B5C5BAD79@DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <DM8P223MB03655CFD438DDAD21FC780D1BAD49@DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM>
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Soft
> Works
> Sent: Monday, May 23, 2022 5:48 PM
> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH v2 1/2] avutil/wchar_filename,
> file_open: Support long file names on Windows
>
>
>
> > -----Original Message-----
> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of nil-
> > admirari@mailo.com
> > Sent: Monday, May 23, 2022 5:36 PM
> > To: ffmpeg-devel@ffmpeg.org
> > Subject: Re: [FFmpeg-devel] [PATCH v2 1/2] avutil/wchar_filename,
> > file_open: Support long file names on Windows
> >
> > >> Not possible for stat precisely because of function and struct
> sharing
> > a
> > >> name.
> >
> > > That's exactly what is said above and before :-)
> >
> > My previous question was not answered, so I had to look up the answer
> > myself.
> >
> > > I'm actually wondering how does it even compile. All stat structs in
> > code
> > > become struct win32_stat, and all calls to stat become calls to
> > win32_stat,
> > > which in turn wraps _wstati64. But _wstati64 does not accept struct
> > win32_stat*,
> > > it accepts struct _stati64*. Content of these structs is probably
> > identical, but
> > > it should not matter: C is typed nominally, not structurally.
> >
> > Turns out C actually has a concept of compatible types:
> > https://en.cppreference.com/w/c/language/type.
> >
> > The problems is:
> > > they are both structure/union/enumeration types, and
> > > - (c99) if one is declared with a tag, the other must also be declared
> > with the same tag.
> > > ...
> > > If two declarations refer to the same object or function and do not
> use
> > compatible types,
> > > the behavior of the program is undefined.
> >
> > Your structure does not have the same tag as the CRT's one.
> > Are you sure you want to rely on undefined behaviour?
> >
> > I haven't compiled your code, but the following simple example:
> >
> > struct A { int a, b, c; };
> > struct B { int a, b, c; };
> > void printA(struct A *a);
> >
> > struct B b = { 1, 2, 3 };
> > printA(&b);
> >
> > generates a
> >
> > warning: passing argument 1 of ‘printA’ from incompatible pointer type
> [-
> > Wincompatible-pointer-types]
> > | printA(&b);
> > | ^~
> > | |
> > | struct B *
> > note: expected ‘struct A *’ but argument is of type ‘struct B *’
> > | void printA(struct A *a)
> >
> > Are you sure you wanna add a couple of similar warnings to the project?
>
> This is not what's happening. No warnings, not even from clang diagnostics
> with -Weverything.
I'm sorry, you were right and I was wrong. The includes and macros had hidden
away all the warnings.
For my new solution which I had submitted today, I had made a test in a code
file where I put all the new things directly and expanded the macros.
This gives in fact the kind of error you mentioned:
... function': incompatible types - from 'win32_stat *' to '_stat64 *'
I had explained the way it works to Martin in another response. The
relevant part is:
The struct:
struct win32_stat
{
struct _stati64;
};
makes use of a MS compiler feature called "anonymous structures":
This way, we automatically "inherit" the members of the struct.
Now, that still gives the incompatible type warning.
If we would
want to get rid of this, we could define the struct as follows:
struct win32_stat
{
union
{
struct _stati64;
struct _stati64 stat;
};
};
The union is anonymous and includes _stati64 twice: once anonymous
and once named.
This would allow us to define our win32_stat function like this:
static inline int win32_stat(const char *filename_utf8, struct win32_stat *par)
{
wchar_t *filename_w;
int ret;
if (get_extended_win32_path(filename_utf8, &filename_w))
return -1;
if (!filename_w)
goto fallback;
ret = _wstat64(filename_w, &par->stat);
av_free(filename_w);
return ret;
fallback:
return _stat64(filename_utf8, &par->stat);
}
so it uses the ->stat member for doing the api calls while
the calling (ffmpeg) code can use the structure as if it was the
actual POSIX stat structure.
Kind regards,
sw
_______________________________________________
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-24 9:47 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-13 9:53 [FFmpeg-devel] [PATCH 0/2] " 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 [this message]
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 ` [FFmpeg-devel] [PATCH v3 0/2] " ffmpegagent
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=DM8P223MB036539E9A894F7A3D8C1B5C5BAD79@DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM \
--to=softworkz@hotmail.com \
--cc=ffmpeg-devel@ffmpeg.org \
/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