This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [2.24 PATCH 2/3] Minimize sysdeps code involved in defining major/minor/makedev.


On 07/31/2016 04:09 PM, Zack Weinberg wrote:
> Presently sys/sysmacros.h is entirely defined in sysdeps.  This would
> mean that the deprecation logic coming up in the next patch would have
> to be written twice (in generic/ and unix/sysv/linux/).  To avoid that,
> hoist all but the unavoidably system-dependent logic to misc/, leaving a
> bits/ header behind.  This also promotes the Linux-specific encoding of
> dev_t, which accommodates 32-bit major and minor numbers in a 64-bit dev_t,
> to generic, as glibc's dev_t is always 64 bits wide.
> 
> The former Linux implementation used inline functions to avoid evaluating
> arguments more than once.  After this change, all platforms use inline
> functions, which means that three new symbols are added to the generic ABI.
> Since NaCl is the only non-Linux port currently in the tree, the only
> libc.abilist file that requires a change is arm/nacl/libc.abilist.
> 
> New ports henceforth need only provide a bits/sysmacros.h defining
> internal macros __SYSMACROS_{DECLARE,DEFINE}_{MAJOR,MINOR,MAKEDEV}.
> 
> While I was at it, I added a basic round-trip test for these functions.

(1) Inclusion in 2.25?

I have already made comments that I think we need to put this into 2.25
at this late stage. If you can answer (3) I can commit this immeidately
once 2.25 opens.

(2) Testing?

Awesome test.

(3) New symbols?

Overall this looks good. I have only questions about why the new functions
are going into the users namespace. Traditionally we put things into the
implementation namespace, particularly to discourage users calling the
functions directly. I would like the user to use the normal interfaces for
calling this functionality.

> ChangeLog:
> 
> 	* sysdeps/generic/sys/sysmacros.h: Delete file.
> 	* sysdeps/unix/sysv/linux/makedev.c: Delete file.
> 	* sysdeps/unix/sysv/linux/sys/sysmacros.h: Move file ...
> 	* bits/sysmacros.h: ... here; this encoding is now the generic
> 	encoding.  Now defines only the following macros:
> 	__SYSMACROS_DECLARE_MAJOR, __SYSMACROS_DEFINE_MAJOR,
> 	__SYSMACROS_DECLARE_MINOR, __SYSMACROS_DEFINE_MINOR,
> 	__SYSMACROS_DECLARE_MAKEDEV, __SYSMACROS_DEFINE_MAKEDEV.
> 
> 	* misc/sys/sysmacros.h, misc/makedev.c: New files that use
> 	bits/sysmacros.h and the above new macros to generate the
> 	public implementations of major, minor, and makedev.
> 	* misc/tst-makedev.c: New test.
> 	* include/sys/sysmacros.h: New wrapper.
> 
> 	* misc/Makefile (headers): Add sys/sysmacros.h, bits/sysmacros.h.
> 	(routines): Add makedev.
> 	(tests): Add tst-makedev.
> 	* misc/Versions [GLIBC_2.24]: Add gnu_dev_major, gnu_dev_minor,
> 	gnu_dev_makedev.
> 	* posix/Makefile (headers): Remove sys/sysmacros.h.
> 	* sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Remove makedev.
> 
> 	* sysdeps/arm/nacl/libc.abilist: Add GLIBC_2.24,
> 	gnu_dev_major, gnu_dev_makedev, gnu_dev_minor.
> ---
>  bits/sysmacros.h                        |  74 +++++++++++++++++++++++
>  include/sys/sysmacros.h                 |   1 +
>  misc/Makefile                           |   7 ++-
>  misc/Versions                           |   3 +
>  misc/makedev.c                          |  30 +++++++++
>  misc/sys/sysmacros.h                    |  64 ++++++++++++++++++++
>  misc/tst-makedev.c                      | 104 ++++++++++++++++++++++++++++++++
>  posix/Makefile                          |   2 +-
>  sysdeps/arm/nacl/libc.abilist           |   4 ++
>  sysdeps/generic/sys/sysmacros.h         |  30 ---------
>  sysdeps/unix/sysv/linux/Makefile        |   2 +-
>  sysdeps/unix/sysv/linux/makedev.c       |  40 ------------
>  sysdeps/unix/sysv/linux/sys/sysmacros.h |  65 --------------------
>  13 files changed, 286 insertions(+), 140 deletions(-)
>  create mode 100644 bits/sysmacros.h
>  create mode 100644 include/sys/sysmacros.h
>  create mode 100644 misc/makedev.c
>  create mode 100644 misc/sys/sysmacros.h
>  create mode 100644 misc/tst-makedev.c
>  delete mode 100644 sysdeps/generic/sys/sysmacros.h
>  delete mode 100644 sysdeps/unix/sysv/linux/makedev.c
>  delete mode 100644 sysdeps/unix/sysv/linux/sys/sysmacros.h
> 
> diff --git a/bits/sysmacros.h b/bits/sysmacros.h
> new file mode 100644
> index 0000000..e2c0bc2
> --- /dev/null
> +++ b/bits/sysmacros.h
> @@ -0,0 +1,74 @@
> +/* Definitions of macros to access `dev_t' values.
> +   Copyright (C) 1996-2016 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library 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.
> +
> +   The GNU C Library 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 the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _BITS_SYSMACROS_H
> +#define _BITS_SYSMACROS_H 1
> +
> +#ifndef _SYS_SYSMACROS_H
> +# error "Never include <bits/sysmacros.h> directly; use <sys/sysmacros.h> instead."
> +#endif
> +
> +/* dev_t in glibc is a 64-bit quantity, with 32-bit major and minor numbers.
> +   Our default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of
> +   the major number and m is a hex digit of the minor number.  This is
> +   downward compatible with legacy systems where dev_t is 16 bits wide,
> +   encoded as MMmm.  It is also downward compatible with the Linux kernel,
> +   which (as of 2016) uses 32-bit dev_t, encoded as mmmM MMmm.
> +
> +   Systems that use an incompatible encoding for dev_t should override this
> +   file in the appropriate sysdeps subdirectory.  */
> +
> +#define __SYSMACROS_DECLARE_MAJOR(DECL_TEMPL)			\
> +  DECL_TEMPL(unsigned int, major, (__dev_t __dev))
> +
> +#define __SYSMACROS_DEFINE_MAJOR(DECL_TEMPL)			\
> +  __SYSMACROS_DECLARE_MAJOR (DECL_TEMPL)			\
> +  {								\
> +    unsigned int __major;					\
> +    __major  = ((__dev & (__dev_t) 0x00000000000fff00u) >>  8); \
> +    __major |= ((__dev & (__dev_t) 0xfffff00000000000u) >> 32); \

OK.

> +    return __major;						\
> +  }
> +
> +#define __SYSMACROS_DECLARE_MINOR(DECL_TEMPL)			\
> +  DECL_TEMPL(unsigned int, minor, (__dev_t __dev))
> +
> +#define __SYSMACROS_DEFINE_MINOR(DECL_TEMPL)			\
> +  __SYSMACROS_DECLARE_MINOR (DECL_TEMPL)			\
> +  {								\
> +    unsigned int __minor;					\
> +    __minor  = ((__dev & (__dev_t) 0x00000000000000ffu) >>  0); \
> +    __minor |= ((__dev & (__dev_t) 0x00000ffffff00000u) >> 12); \

OK.

> +    return __minor;						\
> +  }
> +
> +#define __SYSMACROS_DECLARE_MAKEDEV(DECL_TEMPL)			\
> +  DECL_TEMPL(__dev_t, makedev, (unsigned int __major, unsigned int __minor))
> +
> +#define __SYSMACROS_DEFINE_MAKEDEV(DECL_TEMPL)			\
> +  __SYSMACROS_DECLARE_MAKEDEV (DECL_TEMPL)			\
> +  {								\
> +    __dev_t __dev;						\
> +    __dev  = (((__dev_t) (__major & 0x00000fffu)) <<  8);	\
> +    __dev |= (((__dev_t) (__major & 0xfffff000u)) << 32);	\
> +    __dev |= (((__dev_t) (__minor & 0x000000ffu)) <<  0);	\
> +    __dev |= (((__dev_t) (__minor & 0xffffff00u)) << 12);	\

OK.

> -  return ((minor & 0xff) | ((major & 0xfff) << 8)
> -	  | (((unsigned long long int) (minor & ~0xff)) << 12)
> -	  | (((unsigned long long int) (major & ~0xfff)) << 32));

OK. Verified matches the old code.

> +    return __dev;						\
> +  }
> +
> +#endif /* bits/sysmacros.h */
> diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h
> new file mode 100644
> index 0000000..87813c5
> --- /dev/null
> +++ b/include/sys/sysmacros.h
> @@ -0,0 +1 @@
> +#include <misc/sys/sysmacros.h>
> diff --git a/misc/Makefile b/misc/Makefile
> index 56e20ce..3d2ebb8 100644
> --- a/misc/Makefile
> +++ b/misc/Makefile
> @@ -34,7 +34,8 @@ headers	:= sys/uio.h bits/uio.h sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
>  	   regexp.h bits/select.h bits/mman.h sys/xattr.h \
>  	   syslog.h sys/syslog.h \
>  	   bits/syslog.h bits/syslog-ldbl.h bits/syslog-path.h bits/error.h \
> -	   bits/select2.h bits/hwcap.h sys/auxv.h
> +	   bits/select2.h bits/hwcap.h sys/auxv.h \
> +	   sys/sysmacros.h bits/sysmacros.h

OK.

>  
>  routines := brk sbrk sstk ioctl \
>  	    readv writev preadv preadv64 pwritev pwritev64 \
> @@ -67,7 +68,7 @@ routines := brk sbrk sstk ioctl \
>  	    getloadavg getclktck \
>  	    fgetxattr flistxattr fremovexattr fsetxattr getxattr \
>  	    listxattr lgetxattr llistxattr lremovexattr lsetxattr \
> -	    removexattr setxattr getauxval ifunc-impl-list
> +	    removexattr setxattr getauxval ifunc-impl-list makedev

OK.

>  
>  generated += tst-error1.mtrace tst-error1-mem.out
>  
> @@ -78,7 +79,7 @@ gpl2lgpl := error.c error.h
>  tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \
>  	 tst-error1 tst-pselect tst-insremque tst-mntent2 bug-hsearch1 \
>  	 tst-mntent-blank-corrupt tst-mntent-blank-passno bug18240 \
> -	 tst-preadvwritev tst-preadvwritev64
> +	 tst-preadvwritev tst-preadvwritev64 tst-makedev

OK.

>  ifeq ($(run-built-tests),yes)
>  tests-special += $(objpfx)tst-error1-mem.out
>  endif
> diff --git a/misc/Versions b/misc/Versions
> index 671f487..afa22bd 100644
> --- a/misc/Versions
> +++ b/misc/Versions
> @@ -152,6 +152,9 @@ libc {
>    GLIBC_2.23 {
>      # SHLIB_COMPAT(GLIBC_2_0, GLIBC_2_23) used in regexp.c
>    }
> +  GLIBC_2.24 {
> +    gnu_dev_major; gnu_dev_minor; gnu_dev_makedev;
> +  }

Not OK.

Traditionally I thought we hid internal functions like this in the
implemetnation namespace to avoid the suggestion that users could call
them directly. In this case they can, but still, it's a user namespace.

Why do we put these in the user namespace?


>    GLIBC_PRIVATE {
>      __madvise;
>      __mktemp;
> diff --git a/misc/makedev.c b/misc/makedev.c
> new file mode 100644
> index 0000000..7303fb6
> --- /dev/null
> +++ b/misc/makedev.c
> @@ -0,0 +1,30 @@
> +/* Definitions of functions to access `dev_t' values.
> +   Copyright (C) 2003-2016 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library 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.
> +
> +   The GNU C Library 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 the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <features.h>
> +
> +#undef __USE_EXTERN_INLINES
> +#define __SYSMACROS_NEED_IMPLEMENTATION
> +#include <sys/sysmacros.h>
> +
> +#define OUT_OF_LINE_IMPL_TEMPL(rtype, name, proto) \
> +  rtype gnu_dev_##name proto
> +
> +__SYSMACROS_DEFINE_MAJOR(OUT_OF_LINE_IMPL_TEMPL)
> +__SYSMACROS_DEFINE_MINOR(OUT_OF_LINE_IMPL_TEMPL)
> +__SYSMACROS_DEFINE_MAKEDEV(OUT_OF_LINE_IMPL_TEMPL)

OK.

> diff --git a/misc/sys/sysmacros.h b/misc/sys/sysmacros.h
> new file mode 100644
> index 0000000..dc2eb83
> --- /dev/null
> +++ b/misc/sys/sysmacros.h
> @@ -0,0 +1,64 @@
> +/* Definitions of macros to access `dev_t' values.
> +   Copyright (C) 1996-2015 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library 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.
> +
> +   The GNU C Library 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 the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SYSMACROS_H
> +#define _SYS_SYSMACROS_H 1
> +
> +#include <features.h>
> +#include <bits/types.h>
> +#include <bits/sysmacros.h>
> +
> +#define __SYSMACROS_DECL_TEMPL(rtype, name, proto)			     \
> +  extern rtype gnu_dev_##name proto __THROW __attribute_const__;
> +
> +#define __SYSMACROS_IMPL_TEMPL(rtype, name, proto)			     \
> +  __extension__ __extern_inline __attribute_const__ rtype		     \
> +  __NTH (gnu_dev_##name proto)
> +
> +__BEGIN_DECLS
> +
> +__SYSMACROS_DECLARE_MAJOR (__SYSMACROS_DECL_TEMPL)
> +__SYSMACROS_DECLARE_MINOR (__SYSMACROS_DECL_TEMPL)
> +__SYSMACROS_DECLARE_MAKEDEV (__SYSMACROS_DECL_TEMPL)
> +
> +#ifdef __USE_EXTERN_INLINES
> +
> +__SYSMACROS_DEFINE_MAJOR (__SYSMACROS_IMPL_TEMPL)
> +__SYSMACROS_DEFINE_MINOR (__SYSMACROS_IMPL_TEMPL)
> +__SYSMACROS_DEFINE_MAKEDEV (__SYSMACROS_IMPL_TEMPL)
> +
> +#endif
> +
> +__END_DECLS
> +
> +#ifndef __SYSMACROS_NEED_IMPLEMENTATION
> +# undef __SYSMACROS_DECL_TEMPL
> +# undef __SYSMACROS_IMPL_TEMPL
> +# undef __SYSMACROS_DECLARE_MAJOR
> +# undef __SYSMACROS_DECLARE_MINOR
> +# undef __SYSMACROS_DECLARE_MAKEDEV
> +# undef __SYSMACROS_DEFINE_MAJOR
> +# undef __SYSMACROS_DEFINE_MINOR
> +# undef __SYSMACROS_DEFINE_MAKEDEV
> +#endif
> +
> +#define major(dev) gnu_dev_major (dev)
> +#define minor(dev) gnu_dev_minor (dev)
> +#define makedev(maj, min) gnu_dev_makedev (maj, min)
> +
> +#endif /* sys/sysmacros.h */

OK.

> diff --git a/misc/tst-makedev.c b/misc/tst-makedev.c
> new file mode 100644
> index 0000000..b330b5a
> --- /dev/null
> +++ b/misc/tst-makedev.c
> @@ -0,0 +1,104 @@
> +/* Tests of functions to access `dev_t' values.
> +   Copyright (C) 2016 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library 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.
> +
> +   The GNU C Library 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 the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <sys/types.h>
> +#include <sys/sysmacros.h>
> +#include <stdio.h>
> +#include <inttypes.h>
> +
> +/* Confirm that makedev (major (d), minor (d)) == d.  */
> +static int
> +do_test_split_combine (dev_t d1)
> +{
> +  unsigned int maj = major (d1);
> +  unsigned int min = minor (d1);
> +  dev_t d2 = makedev (maj, min);
> +  if (d1 != d2)
> +    {
> +      printf ("FAIL: %016" PRIx64 " != %016" PRIx64 " (maj %08x min %08x)\n",
> +	      (uint64_t)d2, (uint64_t)d1, maj, min);
> +      return 1;
> +    }
> +  else
> +    return 0;
> +}
> +
> +/* Confirm that major (makedev (maj, min)) == maj and
> +   minor (makedev (maj, min)) == min.  */
> +static int
> +do_test_combine_split (unsigned int maj1, unsigned int min1)
> +{
> +  dev_t d = makedev (maj1, min1);
> +  unsigned int maj2 = major (d);
> +  unsigned int min2 = minor (d);
> +  if (maj1 != maj2 && min1 != min2)
> +    {
> +      printf ("FAIL: %08x != %08x, %08x != %08x (dev %016" PRIx64 ")\n",
> +	      maj2, maj1, min2, min1, (uint64_t)d);
> +      return 1;
> +    }
> +  else if (maj1 != maj2)
> +    {
> +      printf ("FAIL: %08x != %08x, %08x == %08x (dev %016" PRIx64 ")\n",
> +	      maj2, maj1, min2, min1, (uint64_t)d);
> +      return 1;
> +    }
> +  else if (min1 != min2)
> +    {
> +      printf ("FAIL: %08x == %08x, %08x != %08x (dev %016" PRIx64 ")\n",
> +	      maj2, maj1, min2, min1, (uint64_t)d);
> +      return 1;
> +    }
> +  else
> +    return 0;
> +}
> +
> +static int
> +do_test (void)
> +{
> +  dev_t d;
> +  unsigned int maj, min;
> +  int status = 0;
> +
> +  /* Test the traditional range (16-bit dev_t, 8-bit each maj/min)
> +     exhaustively.  */
> +  for (d = 0; d <= 0xFFFF; d++)
> +    status |= do_test_split_combine (d);

Awesome. Belt-and-suspenders :-)

> +
> +  for (maj = 0; maj <= 0xFF; maj++)
> +    for (min = 0; min <= 0xFF; min++)
> +      status |= do_test_combine_split (maj, min);
> +
> +  /* Test glibc's expanded range (64-bit dev_t, 32-bit each maj/min).
> +     Exhaustive testing would take much too long, instead we shift a
> +     pair of 1-bits over each range.  */

Awesome compromise.

> +  {
> +    unsigned int a, b;
> +    for (a = 0; a <= 63; a++)
> +      do_test_split_combine (((dev_t) 0x03) << a);
> +
> +    for (a = 0; a < 31; a++)
> +      for (b = 0; b <= 31; b++)
> +	do_test_combine_split (0x03u << a, 0x03u << b);
> +  }
> +
> +  return status;
> +}
> +
> +#define TEST_FUNCTION do_test ()
> +#include "../test-skeleton.c"
> diff --git a/posix/Makefile b/posix/Makefile
> index 5b0e298..3a7719e 100644
> --- a/posix/Makefile
> +++ b/posix/Makefile
> @@ -29,7 +29,7 @@ headers	:= sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h	      \
>  	   bits/local_lim.h tar.h bits/utsname.h bits/confname.h	      \
>  	   bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h	      \
>  	   bits/sched.h re_comp.h wait.h bits/environments.h cpio.h	      \
> -	   sys/sysmacros.h spawn.h bits/unistd.h
> +	   spawn.h bits/unistd.h

OK.

>  
>  routines :=								      \
>  	uname								      \
> diff --git a/sysdeps/arm/nacl/libc.abilist b/sysdeps/arm/nacl/libc.abilist
> index 2f7751d..87b7139 100644
> --- a/sysdeps/arm/nacl/libc.abilist
> +++ b/sysdeps/arm/nacl/libc.abilist
> @@ -1840,4 +1840,8 @@ GLIBC_2.23 fts64_close F
>  GLIBC_2.23 fts64_open F
>  GLIBC_2.23 fts64_read F
>  GLIBC_2.23 fts64_set F
> +GLIBC_2.24 GLIBC_2.24 A
>  GLIBC_2.24 quick_exit F
> +GLIBC_2.24 gnu_dev_major F
> +GLIBC_2.24 gnu_dev_makedev F
> +GLIBC_2.24 gnu_dev_minor F

As discussed about, why not __gnu_dev_major etc. ?

> diff --git a/sysdeps/generic/sys/sysmacros.h b/sysdeps/generic/sys/sysmacros.h
> deleted file mode 100644
> index 4cc5961..0000000
> --- a/sysdeps/generic/sys/sysmacros.h
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -/* Definitions of macros to access `dev_t' values.
> -   Copyright (C) 1996-2016 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library 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.
> -
> -   The GNU C Library 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 the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#ifndef _SYS_SYSMACROS_H
> -#define _SYS_SYSMACROS_H	1
> -
> -/* For compatibility we provide alternative names.
> -
> -   The problem here is that compilers other than GCC probably don't
> -   have the `long long' type and so `dev_t' is actually an array.  */
> -#define major(dev) ((int)(((unsigned int) (dev) >> 8) & 0xff))
> -#define minor(dev) ((int)((dev) & 0xff))
> -#define makedev(major, minor) (((major) << 8) | (minor))
> -
> -#endif /* sys/sysmacros.h */

OK.

> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 35e1ed4..f0b052d 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -15,7 +15,7 @@ ifeq ($(subdir),misc)
>  include $(firstword $(wildcard $(sysdirs:=/sysctl.mk)))
>  
>  sysdep_routines += clone llseek umount umount2 readahead \
> -		   setfsuid setfsgid makedev epoll_pwait signalfd \
> +		   setfsuid setfsgid epoll_pwait signalfd \

OK.

>  		   eventfd eventfd_read eventfd_write prlimit \
>  		   personality
>  
> diff --git a/sysdeps/unix/sysv/linux/makedev.c b/sysdeps/unix/sysv/linux/makedev.c
> deleted file mode 100644
> index 68c18ca..0000000
> --- a/sysdeps/unix/sysv/linux/makedev.c
> +++ /dev/null
> @@ -1,40 +0,0 @@
> -/* Definitions of functions to access `dev_t' values.
> -   Copyright (C) 2003-2016 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library 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.
> -
> -   The GNU C Library 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 the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#include <endian.h>
> -#include <sys/sysmacros.h>
> -
> -unsigned int
> -gnu_dev_major (unsigned long long int dev)
> -{
> -  return ((dev >> 8) & 0xfff) | ((unsigned int) (dev >> 32) & ~0xfff);
> -}
> -
> -unsigned int
> -gnu_dev_minor (unsigned long long int dev)
> -{
> -  return (dev & 0xff) | ((unsigned int) (dev >> 12) & ~0xff);
> -}
> -
> -unsigned long long int
> -gnu_dev_makedev (unsigned int major, unsigned int minor)
> -{
> -  return ((minor & 0xff) | ((major & 0xfff) << 8)
> -	  | (((unsigned long long int) (minor & ~0xff)) << 12)
> -	  | (((unsigned long long int) (major & ~0xfff)) << 32));
> -}

OK.

> diff --git a/sysdeps/unix/sysv/linux/sys/sysmacros.h b/sysdeps/unix/sysv/linux/sys/sysmacros.h
> deleted file mode 100644
> index 4c4a697..0000000
> --- a/sysdeps/unix/sysv/linux/sys/sysmacros.h
> +++ /dev/null
> @@ -1,65 +0,0 @@
> -/* Definitions of macros to access `dev_t' values.
> -   Copyright (C) 1996-2016 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library 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.
> -
> -   The GNU C Library 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 the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#ifndef _SYS_SYSMACROS_H
> -#define _SYS_SYSMACROS_H	1
> -
> -#include <features.h>
> -
> -__BEGIN_DECLS
> -
> -__extension__
> -extern unsigned int gnu_dev_major (unsigned long long int __dev)
> -     __THROW __attribute_const__;
> -__extension__
> -extern unsigned int gnu_dev_minor (unsigned long long int __dev)
> -     __THROW __attribute_const__;
> -__extension__
> -extern unsigned long long int gnu_dev_makedev (unsigned int __major,
> -					       unsigned int __minor)
> -     __THROW __attribute_const__;
> -
> -#ifdef __USE_EXTERN_INLINES
> -__extension__ __extern_inline __attribute_const__ unsigned int
> -__NTH (gnu_dev_major (unsigned long long int __dev))
> -{
> -  return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff);
> -}
> -
> -__extension__ __extern_inline __attribute_const__ unsigned int
> -__NTH (gnu_dev_minor (unsigned long long int __dev))
> -{
> -  return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff);
> -}
> -
> -__extension__ __extern_inline __attribute_const__ unsigned long long int
> -__NTH (gnu_dev_makedev (unsigned int __major, unsigned int __minor))
> -{
> -  return ((__minor & 0xff) | ((__major & 0xfff) << 8)
> -	  | (((unsigned long long int) (__minor & ~0xff)) << 12)
> -	  | (((unsigned long long int) (__major & ~0xfff)) << 32));
> -}
> -#endif
> -__END_DECLS
> -
> -/* Access the functions with their traditional names.  */
> -#define major(dev) gnu_dev_major (dev)
> -#define minor(dev) gnu_dev_minor (dev)
> -#define makedev(maj, min) gnu_dev_makedev (maj, min)
> -
> -#endif /* sys/sysmacros.h */
 
OK.

-- 
Cheers,
Carlos.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]