[PATCH] xfree86: Fix prototype for ConfigFilter

Mark Kettenis mark.kettenis at xs4all.nl
Sun Oct 16 04:40:16 PDT 2011


> From: Jeremy Huddleston <jeremyhu at apple.com>
> Date: Sun, 16 Oct 2011 02:27:08 -0700
> 
> This allows scan.c to build with -Wincompatible-pointer-types
> 
> Build regression introduced by: efa5269f23c2237eb5368bf5245ffbbf35714153
> 
> Signed-off-by: Jeremy Huddleston <jeremyhu at apple.com>

Guess it would help if you provided a little bit more information
here.  I'm guessing the problem is with scandir(3), which
traditionally had (and still has on various BSDs, including perhaps
Darwin) the following prototype:

     int
     scandir(const char *dirname, struct dirent ***namelist, int
     (*select)(struct dirent *), int (*compar)(const void *, const void *));

But over in System V land, at least on Solaris, the prototype is:

     int
     scandir(const char  *dirname, struct  dirent  *(*namelist[]), int
     (*select)(const struct dirent *), int (*dcomp)(const struct dirent **,
     const struct dirent **));

Which unfortunately is what ended up in POSIX :(.

Linux, for a long time, had a hybrid:

     int
     scandir(const char *dir, struct dirent ***namelist, int
     (*selector)(const struct dirent *), int (*cmp)(const void *,
      const void *));

But they've fixed that somewhere in 2009.

So I guess that with your changes, things will break on Linux and Solaris.

One could argue that this is a problem with -Wincompatible-pointer-types,
since in this context the const-restricted version of the "select"
function is perfectly safe even if the scandir(3) prototype doesn't
request it.

> ---
>  hw/xfree86/parser/scan.c | 2 +- 1 files changed, 1 insertions(+), 1
>  deletions(-)
> 
> diff --git a/hw/xfree86/parser/scan.c b/hw/xfree86/parser/scan.c
> index 1cff3bc..7ce8c6d 100644
> --- a/hw/xfree86/parser/scan.c
> +++ b/hw/xfree86/parser/scan.c
> @@ -767,7 +767,7 @@ OpenConfigFile(const char *path, const char *cmdline, const char *projroot,
>   * suffix. This filter is passed to scandir(3).
>   */
>  static int
> -ConfigFilter(const struct dirent *de)
> +ConfigFilter(struct dirent *de)
>  {
>  	const char *name = de->d_name;
>  	size_t len;
> -- 
> 1.7.6.1
> 
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list