[vlc-devel] [PATCH 1/2] compat: add realpath used by test_media_subitems()
Rémi Denis-Courmont
remi at remlab.net
Tue Oct 4 10:09:31 CEST 2016
Le maanantaina 3. lokakuuta 2016, 9.10.02 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
>
> replaces https://patches.videolan.org/patch/14582/
> * set errno
> * remove useless cast
> ---
> compat/realpath.c | 80
> ++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac |
> 2 ++
> include/vlc_fixups.h | 4 +++
> 3 files changed, 86 insertions(+)
> create mode 100644 compat/realpath.c
>
> diff --git a/compat/realpath.c b/compat/realpath.c
> new file mode 100644
> index 0000000..5817350
> --- /dev/null
> +++ b/compat/realpath.c
> @@ -0,0 +1,80 @@
> +/**************************************************************************
> *** + * 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>
> +#include <errno.h>
> +#ifdef _WIN32
> +#include <windows.h>
> +#endif
> +
> +char *realpath(const char * restrict relpath, char * restrict
> resolved_path) +{
> + if (relpath == NULL)
> + {
> + errno = EINVAL;
> + return NULL;
> + }
> +
> +#ifdef _WIN32
> + int len = MultiByteToWideChar( CP_UTF8, 0, relpath, -1, NULL, 0 );
> + if (len == 0)
> + {
> + errno = ENOENT;
That´s a no-op...
> + return NULL;
> + }
> +
> + wchar_t *wrelpath = malloc(len * sizeof (wchar_t));
> + if (wrelpath == NULL)
> + {
> + errno = ENOMEM;
Ditto.
> + 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);
> + }
> +#else
> + (void)resolved_path;
> +#endif
> + errno = EACCES;
> + return NULL;
> +}
> diff --git a/configure.ac b/configure.ac
> index 671c8a1..85b14d1 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -604,6 +604,8 @@ AC_CHECK_FUNC(fdatasync,,
> [AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if missing.])
> ])
>
> +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 7a76ef4..690daae 100644
> --- a/include/vlc_fixups.h
> +++ b/include/vlc_fixups.h
> @@ -481,6 +481,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
More information about the vlc-devel
mailing list