Minimize sysdeps code involved in defining major/minor/makedev.
Commit Message
In my previous round of patches to deprecate sys/types.h including
sys/sysmacros.h, there was some confusion about which parts were new and
which parts were moving code around, so I decided to separate out the
moving code around. I was going to post this when I'd revised the whole
thing, but Roland's request for more generally useful __has_extension
means I have to think about that some more, and this bit is done,
independently applicable, hopefully uncontroversial, and much bigger
than everything else. So here it is as its own thing.
Presently sys/sysmacros.h is entirely defined in sysdeps. If I left
that alone, the deprecation logic would have to be written twice (in
generic/ and unix/sysv/linux/). To avoid that, I hoist all but the
unavoidably system-dependent logic to misc/, leaving a bits/ header behind.
The generic implementation was done entirely with macros, whereas the
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.
New ports henceforth need only provide bits/sysmacros.h defining
macros __dev_makedev, __dev_major, and __dev_minor, and it's OK if
these macros evaluate their arguments more than once.
While I was at it, I added a basic round-trip test for these functions.
Questions for the peanut gallery:
1) There seem to be generic "bits" headers in a top-level directory
named bits/, as well as sysdeps/generic/bits/ which is where I would
expect them to be. What's up with that?
2) On all supported platforms except Hurd, dev_t is either __UQUAD_TYPE
or __U64_TYPE; these are both 64-bit unsigned integer types (I don't
fully understand the distinction; the comments in bits/types.h are
inconsistent with the code). The generic sysmacros.h, however, only
supports what I'll call the "traditional" dev_t encoding, with 8 bits
each for major and minor number. Does it maybe make sense to promote
the extended dev_t encoding glibc uses on all Linux-based
configurations, which supports 32-bit major and minor numbers, to
generic? Hurd would of course need an override, but that's not
difficult provided someone tells me what Hurd's dev_t encoding actually
is (also, it's probably wrong as is). (Note that Linux-the-kernel
honors only 12-bit major and 20-bit minor numbers; glibc's encoding is
an upward compatible extension of *that*.)
ChangeLog:
* misc/sys/sysmacros.h: New file with generic
inline-function-based implementation of major,
minor, and makedev, derived from the old
sysdeps/unix/sysv/linux/sys/sysmacros.h.
* include/sys/sysmacros.h: New wrapper.
* sysdeps/generic/sys/sysmacros.h: Move ...
* sysdeps/generic/bits/sysmacros.h: ... here; only define
__dev_makedev, __dev_major, __dev_minor.
* sysdeps/unix/sysv/linux/sys/sysmacros.h: Move ...
* sysdeps/unix/sysv/linux/bits/sysmacros.h: ... here;
only define __dev_makedev, __dev_major, __dev_minor.
* sysdeps/unix/sysv/linux/makedev.c: Move ...
* misc/makedev.c: ... here; make generic.
* misc/tst-makedev.c: New test.
* 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.
* sysdeps/unix/sysv/linux/aarch64/libc.abilist
* sysdeps/unix/sysv/linux/alpha/libc.abilist
* sysdeps/unix/sysv/linux/arm/libc.abilist
* sysdeps/unix/sysv/linux/hppa/libc.abilist
* sysdeps/unix/sysv/linux/i386/libc.abilist
* sysdeps/unix/sysv/linux/ia64/libc.abilist
* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
* sysdeps/unix/sysv/linux/microblaze/libc.abilist
* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
* sysdeps/unix/sysv/linux/nios2/libc.abilist
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
* sysdeps/unix/sysv/linux/sh/libc.abilist
* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist:
Add GLIBC_2.24.
Comments
On Thu, Apr 28, 2016 at 9:39 PM, Zack Weinberg <zackw@panix.com> wrote:
> In my previous round of patches to deprecate sys/types.h including
> sys/sysmacros.h, there was some confusion about which parts were new and
> which parts were moving code around, so I decided to separate out the
> moving code around. I was going to post this when I'd revised the whole
> thing, but Roland's request for more generally useful __has_extension
> means I have to think about that some more, and this bit is done,
> independently applicable, hopefully uncontroversial, and much bigger
> than everything else. So here it is as its own thing.
Ping?
On 28 Apr 2016 21:39, Zack Weinberg wrote:
> New ports henceforth need only provide bits/sysmacros.h defining
> macros __dev_makedev, __dev_major, and __dev_minor, and it's OK if
> these macros evaluate their arguments more than once.
as a general policy, i don't think we want that.
> 1) There seem to be generic "bits" headers in a top-level directory
> named bits/, as well as sysdeps/generic/bits/ which is where I would
> expect them to be. What's up with that?
i suspect it's something like:
- bits/: The One True header that is used everywhere and overriding
doesn't make sense.
- sysdeps/generic/bits/: We expect platforms to override it, so throw
it in here to signal as much.
> 2) On all supported platforms except Hurd, dev_t is either __UQUAD_TYPE
> or __U64_TYPE; these are both 64-bit unsigned integer types (I don't
> fully understand the distinction; the comments in bits/types.h are
> inconsistent with the code). The generic sysmacros.h, however, only
> supports what I'll call the "traditional" dev_t encoding, with 8 bits
> each for major and minor number. Does it maybe make sense to promote
> the extended dev_t encoding glibc uses on all Linux-based
> configurations, which supports 32-bit major and minor numbers, to
> generic? Hurd would of course need an override, but that's not
> difficult provided someone tells me what Hurd's dev_t encoding actually
> is (also, it's probably wrong as is). (Note that Linux-the-kernel
> honors only 12-bit major and 20-bit minor numbers; glibc's encoding is
> an upward compatible extension of *that*.)
i think making it 64-bit as a GNU extesion/base makes sense
> --- /dev/null
> +++ b/misc/tst-makedev.c
> @@ -0,0 +1,87 @@
> +#include <sys/types.h>
all new files need a comment block at the top with:
- one line overview blurb
- copyright
- license
> +/* Confirm that makedev (major (d), minor (d)) == d. */
GNU style says two spaces after periods. comes up a few times.
> +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: %04lx != %04lx (maj %02x min %02x)\n",
> + d2, d1, maj, min);
you noted that we can't rely on dev_t size, so you'll probably want to
cast to uint64_t and use PRIx64 in the format string.
also, you seem to be omitting the 8 spaces -> 1 tab conversion here and
in other places in this patch.
> --- /dev/null
> +++ b/sysdeps/generic/bits/sysmacros.h
>
> +#define __dev_makedev(major, minor) (((major) << 8) | (minor & 0xff))
parens around (minor) please
-mike
On 05/05/2016 12:15 AM, Mike Frysinger wrote:
> On 28 Apr 2016 21:39, Zack Weinberg wrote:
>> 1) There seem to be generic "bits" headers in a top-level directory
>> named bits/, as well as sysdeps/generic/bits/ which is where I would
>> expect them to be. What's up with that?
>
> i suspect it's something like:
> - bits/: The One True header that is used everywhere and overriding
> doesn't make sense.
> - sysdeps/generic/bits/: We expect platforms to override it, so throw
> it in here to signal as much.
Before revising this patch again I would like a definitive answer to
this question.
On further investigation, Roland moved sysdeps/generic/bits/ to bits/
_en masse_ in 2005:
2005-12-21 Roland McGrath <roland@redhat.com>
* sysdeps/generic/bits: Subdirectory and all files moved to ...
* bits: ... here, new subdirectory.
* Makeconfig (+includes): Reordered includes to put build and
sysdeps dirs first after $(..)include, $(sysincludes) last.
I checked libc-alpha and libc-hacker for that month and there's no
mention of this change; there is, however, a closely related event where
Ulrich moved all the .c files out of sysdeps/generic to the appropriate
top-level module directories. I'm guessing that the idea was eventually
to dispose of sysdeps/generic altogether (which I would certainly
support) and that there isn't supposed to be a sysdeps/generic/bits anymore.
Besides the file I added with the sysmacros.h patches, the only file
_currently_ in sysdeps/generic/bits is hwcap.h, which was added by
Richard Henderson in 2012:
commit c7683a6d02f3ed59f5cd119b3e8547f45a15912f
Author: Richard Henderson <rth@twiddle.net>
Date: Sun May 20 10:34:00 2012 -0700
Add <sys/auxv.h> and getauxval.
I'm also guessing that this was a simple oversight.
Roland and Richard cc:ed for comments.
zw
On 05/05/2016 12:15 AM, Mike Frysinger wrote:
> On 28 Apr 2016 21:39, Zack Weinberg wrote:
>> New ports henceforth need only provide bits/sysmacros.h defining
>> macros __dev_makedev, __dev_major, and __dev_minor, and it's OK if
>> these macros evaluate their arguments more than once.
>
> as a general policy, i don't think we want that.
Hmm. The only obvious alternative is to make the macros be function
bodies. On the one hand, that's uglier; on the other hand, that would
discourage people from using them directly (__names only go so far).
I'll try that in the next revision and you can see what you think.
>> 1) There seem to be generic "bits" headers in a top-level directory
>> named bits/, as well as sysdeps/generic/bits/ which is where I would
>> expect them to be. What's up with that?
>
> i suspect it's something like:
> - bits/: The One True header that is used everywhere and overriding
> doesn't make sense.
> - sysdeps/generic/bits/: We expect platforms to override it, so throw
> it in here to signal as much.
addressed separately
>> Does it maybe make sense to promote
>> the extended dev_t encoding glibc uses on all Linux-based
>> configurations, which supports 32-bit major and minor numbers, to
>> generic?
>
> i think making it 64-bit as a GNU extesion/base makes sense
OK, I'll make that change. I'll have to leave Hurd potentially broken,
though.
>> +/* Confirm that makedev (major (d), minor (d)) == d. */
>
> GNU style says two spaces after periods. comes up a few times.
argh
>> + printf ("FAIL: %04lx != %04lx (maj %02x min %02x)\n",
>> + d2, d1, maj, min);
>
> you noted that we can't rely on dev_t size, so you'll probably want to
> cast to uint64_t and use PRIx64 in the format string.
Good point. I think it's always 64 bits _wide_, but it isn't
necessarily always matched to %lx.
> also, you seem to be omitting the 8 spaces -> 1 tab conversion here and
> in other places in this patch.
Sorry, I mostly work on projects that want _no_ tabs these days so I
have my editor set to always use spaces.
>> +#define __dev_makedev(major, minor) (((major) << 8) | (minor & 0xff))
>
> parens around (minor) please
This file will not exist in the revision, but I've double-checked for
other such errors.
zw
On Tue, 10 May 2016, Zack Weinberg wrote:
> top-level module directories. I'm guessing that the idea was eventually
> to dispose of sysdeps/generic altogether (which I would certainly
> support) and that there isn't supposed to be a sysdeps/generic/bits anymore.
I'm not sure how disposing of sysdeps/generic would work in the case of a
header (non-installed, overridden by some configurations) that's used by
multiple subdirectories. That's most cases of files in sysdeps/generic
(there are also some installed headers there, and some .c files, and
default ABI test baselines), and you'd need to have another place to put
them (like top-level bits/ is for bits/ headers).
On 05/10/2016 10:24 AM, Joseph Myers wrote:
> On Tue, 10 May 2016, Zack Weinberg wrote:
>
>> top-level module directories. I'm guessing that the idea was eventually
>> to dispose of sysdeps/generic altogether (which I would certainly
>> support) and that there isn't supposed to be a sysdeps/generic/bits anymore.
>
> I'm not sure how disposing of sysdeps/generic would work in the case of a
> header (non-installed, overridden by some configurations) that's used by
> multiple subdirectories. That's most cases of files in sysdeps/generic
> (there are also some installed headers there, and some .c files, and
> default ABI test baselines), and you'd need to have another place to put
> them (like top-level bits/ is for bits/ headers).
Without having looked into it at all, couldn't they go in include/?
(in principle - I'm aware that there are any number of reasons why this
won't work right now)
zw
On Tue, 10 May 2016, Zack Weinberg wrote:
> > I'm not sure how disposing of sysdeps/generic would work in the case of a
> > header (non-installed, overridden by some configurations) that's used by
> > multiple subdirectories. That's most cases of files in sysdeps/generic
> > (there are also some installed headers there, and some .c files, and
> > default ABI test baselines), and you'd need to have another place to put
> > them (like top-level bits/ is for bits/ headers).
>
> Without having looked into it at all, couldn't they go in include/?
> (in principle - I'm aware that there are any number of reasons why this
> won't work right now)
The most obvious problem with using include/ would be that it is searched
*before* all the sysdeps directories, and needs to be searched before them
because lots of the headers there are wrappers that add internal
interfaces to installed headers (and some of those installed headers are
in sysdeps), whereas a replacement for sysdeps/generic needs to be
searched *after* all the sysdeps directories.
new file mode 100644
@@ -0,0 +1 @@
+#include <misc/sys/sysmacros.h>
@@ -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
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
generated += tst-error1.mtrace tst-error1-mem.out
@@ -77,7 +78,8 @@ 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-mntent-blank-corrupt tst-mntent-blank-passno bug18240 \
+ tst-makedev
ifeq ($(run-built-tests),yes)
tests-special += $(objpfx)tst-error1-mem.out
endif
@@ -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;
+ }
GLIBC_PRIVATE {
__madvise;
__mktemp;
new file mode 100644
@@ -0,0 +1,40 @@
+/* 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
+#include <sys/sysmacros.h>
+#include <sys/types.h>
+
+unsigned int
+gnu_dev_major (dev_t dev)
+{
+ return __dev_major (dev);
+}
+
+unsigned int
+gnu_dev_minor (dev_t dev)
+{
+ return __dev_minor (dev);
+}
+
+dev_t
+gnu_dev_makedev (unsigned int major, unsigned int minor)
+{
+ return __dev_makedev (major, minor);
+}
new file mode 100644
@@ -0,0 +1,56 @@
+/* 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(rtype, name, proto) \
+ extern rtype gnu_dev_##name proto __THROW __attribute_const__;
+
+#ifdef __USE_EXTERN_INLINES
+# define __SYSMACROS_IMPL(rtype, name, proto, expr) \
+ __SYSMACROS_DECL (rtype, name, proto) \
+ __extension__ __extern_inline __attribute_const__ rtype \
+ __NTH (gnu_dev_##name proto) { return expr; }
+#else
+# define __SYSMACROS_IMPL(rtype, name, proto, expr) \
+ __SYSMACROS_DECL (rtype, name, proto)
+#endif
+
+__BEGIN_DECLS
+
+__SYSMACROS_IMPL (unsigned int, major, (__dev_t __dev), __dev_major (__dev))
+__SYSMACROS_IMPL (unsigned int, minor, (__dev_t __dev), __dev_minor (__dev))
+__SYSMACROS_IMPL (__dev_t, makedev,
+ (unsigned int __major, unsigned int __minor),
+ __dev_makedev (__major, __minor))
+
+__END_DECLS
+
+#undef __SYSMACROS_IMPL
+#undef __SYSMACROS_DECL
+
+#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 */
new file mode 100644
@@ -0,0 +1,87 @@
+#include <sys/types.h>
+#include <sys/sysmacros.h>
+#include <stdio.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: %04lx != %04lx (maj %02x min %02x)\n",
+ d2, 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: %02x != %02x, %02x != %02x (dev %04lx)\n",
+ maj2, maj1, min2, min1, d);
+ return 1;
+ }
+ else if (maj1 != maj2)
+ {
+ printf ("FAIL: %02x != %02x, %02x == %02x (dev %04lx)\n",
+ maj2, maj1, min2, min1, d);
+ return 1;
+ }
+ else if (min1 != min2)
+ {
+ printf ("FAIL: %02x == %02x, %02x != %02x (dev %04lx)\n",
+ maj2, maj1, min2, min1, 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);
+
+ for (maj = 0; maj <= 0xFF; maj++)
+ for (min = 0; min <= 0xFF; min++)
+ status |= do_test_combine_split (maj, min);
+
+#ifdef __linux__
+ /* Test Linux's expanded range (32-bit dev_t, 12-bit major, 20-bit minor).
+ Exhaustive testing would take much too long, instead we shift a pair of
+ 1-bits over each range. */
+ {
+ unsigned int a, b;
+ for (a = 0; a <= 31; a++)
+ do_test_split_combine (((dev_t) 0x03) << a);
+
+ for (a = 0; a < 11; a++)
+ for (b = 0; b <= 19; b++)
+ do_test_combine_split (0x03u << a, 0x03u << b);
+ }
+#endif
+
+ return status;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
@@ -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
routines := \
uname \
new file mode 100644
@@ -0,0 +1,30 @@
+/* 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
+
+#define __dev_major(dev) ((dev) >> 8) & 0xff))
+#define __dev_minor(dev) ((dev) & 0xff))
+#define __dev_makedev(major, minor) (((major) << 8) | (minor & 0xff))
+
+#endif /* bits/sysmacros.h */
deleted file mode 100644
@@ -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 */
@@ -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 \
eventfd eventfd_read eventfd_write prlimit \
personality
new file mode 100644
@@ -0,0 +1,44 @@
+/* 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 _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, encoded as MMMM Mmmm mmmM MMmm,
+ where M is a hex digit of the major number and m is a hex digit of
+ the minor number. Linux-the-kernel only uses the low 32 bits. */
+
+#define __dev_major(dev) \
+ ( (((dev) & (__dev_t) 0x00000000000fff00u) >> 8) \
+ | (((dev) & (__dev_t) 0xfffff00000000000u) >> 32))
+
+#define __dev_minor(dev) \
+ ( (((dev) & (__dev_t) 0x00000000000000ffu) >> 0) \
+ | (((dev) & (__dev_t) 0x00000ffffff00000u) >> 12))
+
+#define __dev_makedev(major, minor) \
+ ( (((__dev_t) ((minor) & 0x000000ffu)) << 0) \
+ | (((__dev_t) ((minor) & 0xffffff00u)) << 12) \
+ | (((__dev_t) ((major) & 0x00000fffu)) << 8) \
+ | (((__dev_t) ((major) & 0xfffff000u)) << 32))
+
+#endif /* bits/sysmacros.h */
deleted file mode 100644
@@ -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));
-}
deleted file mode 100644
@@ -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 */
@@ -1840,3 +1840,7 @@ 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 gnu_dev_major F
+GLIBC_2.24 gnu_dev_makedev F
+GLIBC_2.24 gnu_dev_minor F
@@ -2087,3 +2087,4 @@ 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
@@ -1998,6 +1998,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -88,6 +88,7 @@ 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.4 GLIBC_2.4 A
GLIBC_2.4 _Exit F
GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
@@ -1852,6 +1852,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -2010,6 +2010,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1874,6 +1874,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -89,6 +89,7 @@ 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.4 GLIBC_2.4 A
GLIBC_2.4 _Exit F
GLIBC_2.4 _IO_2_1_stderr_ D 0x98
@@ -1966,6 +1966,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -2087,3 +2087,4 @@ 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
@@ -1941,6 +1941,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1939,6 +1939,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1937,6 +1937,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1932,6 +1932,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -2128,3 +2128,4 @@ 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
@@ -1970,6 +1970,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1975,6 +1975,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -2175,3 +2175,4 @@ 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
@@ -89,6 +89,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 _Exit F
GLIBC_2.3 _IO_2_1_stderr_ D 0xe0
@@ -1970,6 +1970,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1871,6 +1871,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1856,6 +1856,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1962,6 +1962,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -1900,6 +1900,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -2094,3 +2094,4 @@ 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
@@ -2094,3 +2094,4 @@ 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
@@ -1851,6 +1851,7 @@ 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.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F
@@ -2094,3 +2094,4 @@ 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