On 08/03/16 02:18, Mike Frysinger wrote:
lib/mountlist.c assumes that sys/types.h includes sys/sysmacros.h
directly in order to provide makedev().  when it doesn't, things
fall apart like:
mountlist.c: In function 'read_file_system_list':
mountlist.c:532:26: warning: implicit declaration of function 'makedev' 
[-Wimplicit-function-declaration]
        me->me_dev = makedev (devmaj, devmin);
...
.../libgnulib.a(mountlist.o): In function `read_file_system_list':
.../mountlist.c:532: undefined reference to `makedev'
collect2: error: ld returned 1 exit status

configure output looks like:
checking sys/mkdev.h usability... no
checking sys/mkdev.h presence... no
checking for sys/mkdev.h... no
checking whether sys/types.h defines makedev... no
checking for sys/mkdev.h... (cached) no
checking sys/sysmacros.h usability... yes
checking sys/sysmacros.h presence... yes
checking for sys/sysmacros.h... yes

autoconf provides a AC_HEADER_MAJOR helper specifically for this:
        If sys/types.h does not define major, minor, and makedev, but
        sys/mkdev.h does, define MAJOR_IN_MKDEV; otherwise, if
        sys/sysmacros.h does, define MAJOR_IN_SYSMACROS.

lib/ptsname_r.c could probably do with a bit of cleanup in this area too.
-mike


This would be for BSD userspace on Linux kernel I suppose.
Yes I noted previously that if ever porting this part of read_file_system_list()
that it would be worth creating a makedev gnulib module
to wrap all these differences. The basis would be this from coreutils:

/* Since major is a function on SVR4, we can't use 'ifndef major'.  */
#if MAJOR_IN_MKDEV
# include <sys/mkdev.h>
# define HAVE_MAJOR
#endif
#if MAJOR_IN_SYSMACROS
# include <sys/sysmacros.h>
# define HAVE_MAJOR
#endif
#ifdef major                    /* Might be defined in sys/types.h.  */
# define HAVE_MAJOR
#endif

#ifndef HAVE_MAJOR
# define major(dev)  (((dev) >> 8) & 0xff)
# define minor(dev)  ((dev) & 0xff)
# define makedev(maj, min)  (((maj) << 8) | (min))
#endif
#undef HAVE_MAJOR

#if ! defined makedev && defined mkdev
# define makedev(maj, min)  mkdev (maj, min)
#endif

cheers,
Pádraig

Reply via email to