[vlc-devel] [PATCH 1/2] compat: add realpath used by test_media_subitems()
Hugo Beauzée-Luyssen
hugo at beauzee.fr
Thu Sep 15 10:53:33 CEST 2016
On 09/15/2016 10:44 AM, Steve Lhomme wrote:
> --
> replaces https://patches.videolan.org/patch/14469/
> * support non ASCII chars in pathes
> * use resolved_path if provided
> ---
> compat/realpath.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> configure.ac | 3 +++
> include/vlc_fixups.h | 4 ++++
> 3 files changed, 73 insertions(+)
> create mode 100644 compat/realpath.c
>
> diff --git a/compat/realpath.c b/compat/realpath.c
> new file mode 100644
> index 0000000..635247c
> --- /dev/null
> +++ b/compat/realpath.c
> @@ -0,0 +1,66 @@
> +/*****************************************************************************
> + * 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 );
This seems to be leaking 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);
> + }
> +#else
> + (void)resolved_path;
> + (void)relpath;
> +#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
>
More information about the vlc-devel
mailing list