[vlc-devel] [PATCH 1/2] compat: add realpath used by test_media_subitems()

Steve Lhomme robux4 at gmail.com
Thu Sep 15 18:45:46 CEST 2016


We're not trying to implement a clean version but something that works in
compat for VLC. I think VLC assumes UTF-8 throughout the app so we should
just use that.

On Sep 15, 2016 18:25, "Rémi Denis-Courmont" <remi at remlab.net> wrote:

> Le torstaina 15. syyskuuta 2016, 11.10.27 EEST Steve Lhomme a écrit :
> > --
> > replaces https://patches.videolan.org/patch/14469/
> > * support non ASCII chars in pathes
> > * use resolved_path if provided
> >
> > replaces https://patches.videolan.org/patch/14471/
> > * fix leak
> > ---
> >  compat/realpath.c    | 67
> > ++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac
>    |
> >  3 +++
> >  include/vlc_fixups.h |  4 ++++
> >  3 files changed, 74 insertions(+)
> >  create mode 100644 compat/realpath.c
> >
> > diff --git a/compat/realpath.c b/compat/realpath.c
> > new file mode 100644
> > index 0000000..a8edce5
> > --- /dev/null
> > +++ b/compat/realpath.c
> > @@ -0,0 +1,67 @@
> > +/**********************************************************
> ****************
> > *** + * realpath.c: POSIX realpath replacement
> > +
> > ************************************************************
> ***************
> > ** + * Copyright © 2016 VLC authors and VideoLAN
> > + *
> > + * This program is free software; you can redistribute it and/or modify
> it
> > + * under the terms of the GNU Lesser General Public License as
> published by
> > + * the Free Software Foundation; either version 2.1 of the License, or
> + *
> > (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> License
> > + * along with this program; if not, write to the Free Software
> Foundation,
> > + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. +
> > ************************************************************
> ***************
> > **/ +
> > +#ifdef HAVE_CONFIG_H
> > +# include <config.h>
> > +#endif
> > +
> > +#include <stdlib.h>
> > +#ifdef _WIN32
> > +#include <windows.h>
> > +#endif
> > +
> > +char *realpath(const char * restrict relpath, char * restrict
> > resolved_path) +{
> > +#ifdef _WIN32
> > +    int len = MultiByteToWideChar( CP_UTF8, 0, relpath, -1, NULL, 0 );
> > +    if (len == 0)
> > +        return NULL;
> > +
> > +    wchar_t *wrelpath = (wchar_t *)malloc(len * sizeof (wchar_t));
> > +    if (wrelpath == NULL)
> > +        return NULL;
> > +
> > +    MultiByteToWideChar( CP_UTF8, 0, relpath, -1, wrelpath, len );
> > +
> > +    wchar_t *wfullpath = _wfullpath( NULL, wrelpath, _MAX_PATH );
> > +    free(wrelpath);
> > +    if (wfullpath != NULL)
> > +    {
> > +        size_t len = WideCharToMultiByte( CP_UTF8, 0, wfullpath, -1,
> NULL,
> > 0, NULL, NULL ); +        if (len != 0)
> > +        {
> > +            if (resolved_path != NULL)
> > +                len = len >= _MAX_PATH ? _MAX_PATH : len;
> > +            else
> > +                resolved_path = (char *)malloc(len);
> > +
> > +            if (resolved_path != NULL)
> > +                WideCharToMultiByte( CP_UTF8, 0, wfullpath, -1,
> > resolved_path, len, NULL, NULL );
> > +            free(wfullpath);
> > +            return resolved_path;
> > +        }
> > +        free(wfullpath);
> > +    }
>
> Is the function call supposed to return an UTF-8 string? I would have
> expected
> ANSI here.
>
> > +#else
> > +    (void)resolved_path;
> > +    (void)relpath;
>
> Missing errno.
>
> > +#endif
> > +    return NULL;
> > +}
> > diff --git a/configure.ac b/configure.ac
> > index 59f116e..cec9e56 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -604,6 +604,9 @@ AC_CHECK_FUNCS(fdatasync,,
> >    [AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if
> missing.])
> >  ])
> >
> > +dnl for tests
> > +VLC_REPLACE_DECL([realpath], [#include <stdlib.h>])
> > +
> >  dnl mingw64 implements those as static inline, not functions with C
> linkage
> > VLC_REPLACE_DECL([asprintf], [#include <stdio.h>])
> >  VLC_REPLACE_DECL([vasprintf], [#include <stdio.h>])
> > diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
> > index a14764f..2992796 100644
> > --- a/include/vlc_fixups.h
> > +++ b/include/vlc_fixups.h
> > @@ -473,6 +473,10 @@ void freeaddrinfo (struct addrinfo *res);
> >  #define nanf(tagp) NAN
> >  #endif
> >
> > +#ifndef HAVE_REALPATH
> > +char *realpath(const char * restrict pathname, char * restrict
> > resolved_path); +#endif
> > +
> >  #ifdef _WIN32
> >  FILE *vlc_win32_tmpfile(void);
> >  #endif
>
>
> --
> Rémi Denis-Courmont
> Nonsponsored VLC developer
> http://www.remlab.net/CV.pdf
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20160915/67e87a53/attachment.html>


More information about the vlc-devel mailing list