[FFmpeg-devel] [PATCH v2 2/2] avformat/utils: simplify the ff_mkdir_p with SEPARATOR
Hendrik Leppkes
h.leppkes at gmail.com
Mon Dec 2 17:25:14 EET 2019
On Mon, Dec 2, 2019 at 3:36 PM Limin Wang <lance.lmwang at gmail.com> wrote:
>
> On Mon, Dec 02, 2019 at 09:26:11AM +0100, Hendrik Leppkes wrote:
> > On Mon, Dec 2, 2019 at 3:16 AM Limin Wang <lance.lmwang at gmail.com> wrote:
> > >
> > > On Sun, Dec 01, 2019 at 05:33:16PM +0100, Hendrik Leppkes wrote:
> > > > On Sun, Dec 1, 2019 at 3:08 PM <lance.lmwang at gmail.com> wrote:
> > > > >
> > > > > From: Limin Wang <lance.lmwang at gmail.com>
> > > > >
> > > > > Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
> > > > > ---
> > > > > libavformat/utils.c | 16 ++++++++++------
> > > > > 1 file changed, 10 insertions(+), 6 deletions(-)
> > > > >
> > > > > diff --git a/libavformat/utils.c b/libavformat/utils.c
> > > > > index 579e6d6..993e6d2 100644
> > > > > --- a/libavformat/utils.c
> > > > > +++ b/libavformat/utils.c
> > > > > @@ -4843,12 +4843,17 @@ void av_url_split(char *proto, int proto_size,
> > > > > }
> > > > > }
> > > > >
> > > > > +#if HAVE_DOS_PATHS
> > > > > +#define SEPARATOR '\\'
> > > > > +#else
> > > > > +#define SEPARATOR '/'
> > > > > +#endif
> > > > > +
> > > > > int ff_mkdir_p(const char *path)
> > > > > {
> > > > > int ret = 0;
> > > > > char *temp = av_strdup(path);
> > > > > char *pos = temp;
> > > > > - char tmp_ch = '\0';
> > > > >
> > > > > if (!path || !temp) {
> > > > > return -1;
> > > > > @@ -4856,19 +4861,18 @@ int ff_mkdir_p(const char *path)
> > > > >
> > > > > if (*temp == '.')
> > > > > pos++;
> > > > > - if (*temp == '/' || *temp == '\\')
> > > > > + if (*temp == SEPARATOR)
> > > > > pos++;
> > > > >
> > > > > for ( ; *pos != '\0'; ++pos) {
> > > > > - if (*pos == '/' || *pos == '\\') {
> > > > > - tmp_ch = *pos;
> > > > > + if (*pos == SEPARATOR) {
> > > > > *pos = '\0';
> > > > > ret = mkdir(temp, 0755);
> > > > > - *pos = tmp_ch;
> > > > > + *pos = SEPARATOR;
> > > > > }
> > > > > }
> > > > >
> > > > > - if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
> > > > > + if (*(pos - 1) != SEPARATOR) {
> > > > > ret = mkdir(temp, 0755);
> > > > > }
> > > >
> > > > I think there is some value to be able to specify a path with both
> > > > kinds of slashes. For example, most of everything else on Windows will
> > > > accept normal slashes, in addition to the default backslash.
> > > Hendrik, I haven't got your point yet, can you make it clear so that I
> > > can change the patch for your case.
> > >
> > > For example, on Linux, if the path is:
> > > ~/Movies/hl\\s/vs%v/manifest.m3u8
> > >
> > > The current code will mkdir below path:
> > > path: /Users
> > > path: /Users/lmwang
> > > path: /Users/lmwang/Movies
> > > path: /Users/lmwang/Movies/hl >>> unexpected
> > > path: /Users/lmwang/Movies/hl\s
> > > path: /Users/lmwang/Movies/hl\s/vs0
> > >
> > > You can see /Users/lmwang/Movies/hl directory isn't expected directory which is created.
> > >
> > > After applied the patch, it'll not create it anymore.
> > >
> >
> > But if I'm on Windows and I specify a path with normal slashes (where
> > SEPARATOR is backslash), I would absolutely expect it to create it
> > like that. Which it does right now.
>
> Now I haven't windows system in hand, so I can't test your condition.
> For windows, the old code will consider normal slashes(/) as path separator
> instead of special charactor. Maybe I have misunderstanding for that.
>
Yes, it does, and it should continue to do so, because everything else
on Windows does as well. Both slash and backslash are valid path
seperators.
- Hendrik
More information about the ffmpeg-devel
mailing list