Remove __need_IOV_MAX and __need_FOPEN_MAX.

__need_FOPEN_MAX wasn't being used anywhere.  __need_IOV_MAX was more
complicated; the basic deal is that sys/uio.h wants to define a
constant named UIO_MAXIOV and bits/xopen_lim.h wants to define a
constant named IOV_MAX, with the same meaning.  For no apparent reason
this was being handled via bits/stdio_lim.h -- stdio.h is NOT supposed
to define IOV_MAX -- and some mess in Makerules.  Also, bits/uio.h on
Linux was being used as a dumping ground for extension functions.

So now we have bits/uio_lim.h, which defines __IOV_MAX.
bits/xopen_lim.h and sys/uio.h use that to define their respective
constants.  We also now have bits/uio-ext.h, which is the official
Proper Home for extensions to sys/uio.h.  bits/uio.h is removed, and
stdio_lim.h doesn't define IOV_MAX at all.

	* bits/uio_lim.h, sysdeps/unix/sysv/linux/bits/uio_lim.h
	* bits/uio-ext.h, sysdeps/unix/sysv/linux/bits/uio-ext.h: New file.
	* bits/uio.h, sysdeps/unix/sysv/linux/bits/uio.h: Delete file.

	* include/bits/xopen_lim.h: Use bits/uio_lim.h to get the value
	for IOV_MAX.
	* misc/Makefile: Install bits/uio-ext.h and bits/uio_lim.h.
	Don't install bits/uio.h.
	* misc/sys/uio.h: Don't include bits/uio.h.  Do include
	bits/types/struct_iovec.h and bits/uio_lim.h.  Set UIO_MAXIOV
	based on __IOV_MAX. Under __USE_GNU, also include bits/uio-ext.h.

	* stdio-common/stdio_lim.h.in: Remove logic for __need_FOPEN_MAX
	and __need_IOV_MAX.  Don't define IOV_MAX at all.
	* Makerules (stdio_lim.h): Remove logic for setting IOV_MAX.

	* sysdeps/unix/sysv/linux/bits/fcntl-linux.h:
	Include bits/types/struct_iovec.h, not bits/uio.h.
	Use __ssize_t, not ssize_t, in function prototypes.
	Don't use hard TAB for double space after period in comments.
This commit is contained in:
Zack Weinberg 2017-03-22 10:55:38 -04:00
parent 0572433b5b
commit 37f802f864
11 changed files with 166 additions and 105 deletions

View File

@ -1,3 +1,26 @@
2017-06-14 Zack Weinberg <zackw@panix.com>
* bits/uio_lim.h, sysdeps/unix/sysv/linux/bits/uio_lim.h
* bits/uio-ext.h, sysdeps/unix/sysv/linux/bits/uio-ext.h: New file.
* bits/uio.h, sysdeps/unix/sysv/linux/bits/uio.h: Delete file.
* include/bits/xopen_lim.h: Use bits/uio_lim.h to get the value
for IOV_MAX.
* misc/Makefile: Install bits/uio-ext.h and bits/uio_lim.h.
Don't install bits/uio.h.
* misc/sys/uio.h: Don't include bits/uio.h. Do include
bits/types/struct_iovec.h and bits/uio_lim.h. Set UIO_MAXIOV
based on __IOV_MAX. Under __USE_GNU, also include bits/uio-ext.h.
* stdio-common/stdio_lim.h.in: Remove logic for __need_FOPEN_MAX
and __need_IOV_MAX. Don't define IOV_MAX at all.
* Makerules (stdio_lim.h): Remove logic for setting IOV_MAX.
* sysdeps/unix/sysv/linux/bits/fcntl-linux.h:
Include bits/types/struct_iovec.h, not bits/uio.h.
Use __ssize_t, not ssize_t, in function prototypes.
Don't use hard TAB for double space after period in comments.
2017-06-14 Alan Modra <amodra@gmail.com>
* elf/elf.h (PPC64_OPT_LOCALENTRY): Define.

View File

@ -1521,8 +1521,7 @@ $(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
$(common-objpfx)config.make
$(make-target-directory)
{ echo '#include "$(..)posix/bits/posix1_lim.h"'; \
echo '#define _LIBC 1'; \
echo '#include "$(..)misc/sys/uio.h"'; } | \
} | \
$(CC) -E -dM -MD -MP -MF $(@:st=dT) -MT '$(@:st=h) $(@:st=d)' \
$(CPPUNDEFS) $(+includes) -xc - -o $(@:st=hT)
sed $(sed-remove-objpfx) $(sed-remove-dotdot) \
@ -1530,21 +1529,14 @@ $(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
mv -f $(@:st=dt) $(@:st=d)
fopen_max=`sed -n 's/^#define OPEN_MAX //1p' $(@:st=hT)`; \
filename_max=`sed -n 's/^#define PATH_MAX //1p' $(@:st=hT)`; \
iov_max=`sed -n 's/^#define UIO_MAXIOV //p' $(@:st=hT)`; \
fopen_max=$${fopen_max:-16}; \
filename_max=$${filename_max:-1024}; \
if [ -z "$$iov_max" ]; then \
define_iov_max="# undef IOV_MAX"; \
else \
define_iov_max="# define IOV_MAX $$iov_max"; \
fi; \
sed -e "s/@FOPEN_MAX@/$$fopen_max/" \
-e "s/@FILENAME_MAX@/$$filename_max/" \
-e "s/@L_tmpnam@/$(L_tmpnam)/" \
-e "s/@TMP_MAX@/$(TMP_MAX)/" \
-e "s/@L_ctermid@/$(L_ctermid)/" \
-e "s/@L_cuserid@/$(L_cuserid)/" \
-e "s/@define_IOV_MAX@/$$define_iov_max/" \
$< > $(@:st=h.new)
$(move-if-change) $(@:st=h.new) $(@:st=h)
# Remove these last so that they can be examined if something went wrong.

28
bits/uio-ext.h Normal file
View File

@ -0,0 +1,28 @@
/* Operating system-specific extensions to sys/uio.h - generic version.
Copyright (C) 2017 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_UIO_EXT_H
#define _BITS_UIO_EXT_H 1
#ifndef _SYS_UIO_H
# error "Never include <bits/uio-ext.h> directly; use <sys/uio.h> instead."
#endif
/* This operating system does not extend sys/uio.h. */
#endif /* sys/uio_ext.h */

View File

@ -1,4 +1,5 @@
/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
/* Implementation limits related to sys/uio.h - generic version.
Copyright (C) 2017 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
@ -15,9 +16,11 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_UIO_H
# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
#ifndef _BITS_UIO_LIM_H
#define _BITS_UIO_LIM_H 1
/* Maximum length of the 'struct iovec' array in a single call to
readv or writev. If there is no limit, the macro is not defined. */
#undef __IOV_MAX
#endif
#include <bits/types/struct_iovec.h>

View File

@ -29,9 +29,6 @@
#ifndef _XOPEN_LIM_H
#define _XOPEN_LIM_H 1
#define __need_IOV_MAX
#include <bits/stdio_lim.h>
/* We do not provide fixed values for
ARG_MAX Maximum length of argument to the `exec' function
@ -60,10 +57,16 @@
*/
/* Maximum number of `iovec' structures that one process has available
for use with `readv' or writev'. */
/* Maximum number of `iovec' structures that may be used in a single call
to `readv', `writev', etc. */
#define _XOPEN_IOV_MAX _POSIX_UIO_MAXIOV
#include <bits/uio_lim.h>
#ifdef __IOV_MAX
# define IOV_MAX __IOV_MAX
#else
# undef IOV_MAX
#endif
/* Maximum value of `digit' in calls to the `printf' and `scanf'
functions. We have no limit, so return a reasonable value. */

View File

@ -23,7 +23,8 @@ subdir := misc
include ../Makeconfig
headers := sys/uio.h bits/uio.h sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
headers := sys/uio.h bits/uio-ext.h bits/uio_lim.h \
sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
sys/ptrace.h sys/file.h sys/dir.h sys/cdefs.h \
ar.h a.out.h libgen.h stab.h bits/stab.def sgtty.h \
ttyent.h paths.h sys/reboot.h \

View File

@ -19,15 +19,17 @@
#define _SYS_UIO_H 1
#include <features.h>
#include <sys/types.h>
#include <bits/types/struct_iovec.h>
#include <bits/uio_lim.h>
#ifdef __IOV_MAX
# define UIO_MAXIOV __IOV_MAX
#else
# undef UIO_MAXIOV
#endif
__BEGIN_DECLS
/* This file defines `struct iovec'. */
#include <bits/uio.h>
/* Read data from file descriptor FD, and put the result in the
buffers described by IOVEC, which is a vector of COUNT 'struct iovec's.
The buffers are filled in the order specified.
@ -160,4 +162,10 @@ extern ssize_t pwritev64v2 (int __fd, const struct iovec *__iodev,
__END_DECLS
/* Some operating systems provide system-specific extensions to this
header. */
#ifdef __USE_GNU
# include <bits/uio-ext.h>
#endif
#endif /* sys/uio.h */

View File

@ -15,28 +15,25 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#if !defined _STDIO_H && !defined __need_FOPEN_MAX && !defined __need_IOV_MAX
#ifndef _BITS_STDIO_LIM_H
#define _BITS_STDIO_LIM_H 1
#ifndef _STDIO_H
# error "Never include <bits/stdio_lim.h> directly; use <stdio.h> instead."
#endif
#ifdef _STDIO_H
# define L_tmpnam @L_tmpnam@
# define TMP_MAX @TMP_MAX@
# define FILENAME_MAX @FILENAME_MAX@
#define L_tmpnam @L_tmpnam@
#define TMP_MAX @TMP_MAX@
#define FILENAME_MAX @FILENAME_MAX@
# ifdef __USE_POSIX
#ifdef __USE_POSIX
# define L_ctermid @L_ctermid@
# if !defined __USE_XOPEN2K || defined __USE_GNU
# define L_cuserid @L_cuserid@
# endif
# endif
#endif
#if defined __need_FOPEN_MAX || defined _STDIO_H
# undef FOPEN_MAX
# define FOPEN_MAX @FOPEN_MAX@
#endif
#undef FOPEN_MAX
#define FOPEN_MAX @FOPEN_MAX@
#if defined __need_IOV_MAX && !defined IOV_MAX
@define_IOV_MAX@
#endif
#endif /* bits/stdio_lim.h */

View File

@ -35,7 +35,7 @@
*/
#ifdef __USE_GNU
# include <bits/uio.h>
# include <bits/types/struct_iovec.h>
#endif
/* open/fcntl. */
@ -151,7 +151,7 @@
# define O_TMPFILE __O_TMPFILE /* Atomically create nameless file. */
#endif
/* For now, Linux has no separate synchronicitiy options for read
/* For now, Linux has no separate synchronicity options for read
operations. We define O_RSYNC therefore as the same as O_SYNC
since this is a superset. */
#if defined __USE_POSIX199309 || defined __USE_UNIX98
@ -339,7 +339,7 @@ __BEGIN_DECLS
#ifdef __USE_GNU
/* Provide kernel hint to read ahead. */
extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
extern __ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
__THROW;
@ -355,14 +355,14 @@ extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count,
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern ssize_t vmsplice (int __fdout, const struct iovec *__iov,
extern __ssize_t vmsplice (int __fdout, const struct iovec *__iov,
size_t __count, unsigned int __flags);
/* Splice two files together.
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
extern __ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
__off64_t *__offout, size_t __len,
unsigned int __flags);
@ -370,7 +370,7 @@ extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern ssize_t tee (int __fdin, int __fdout, size_t __len,
extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
unsigned int __flags);
/* Reserve storage for the data of the file associated with FD.

View File

@ -1,4 +1,5 @@
/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
/* Operating system-specific extensions to sys/uio.h - Linux version.
Copyright (C) 1996-2017 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
@ -15,39 +16,13 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#if !defined _SYS_UIO_H && !defined _FCNTL_H
# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
#ifndef _BITS_UIO_EXT_H
#define _BITS_UIO_EXT_H 1
#ifndef _SYS_UIO_H
# error "Never include <bits/uio-ext.h> directly; use <sys/uio.h> instead."
#endif
#ifndef _BITS_UIO_H
#define _BITS_UIO_H 1
#include <sys/types.h>
/* We should normally use the Linux kernel header file to define this
type and macros but this calls for trouble because of the header
includes other kernel headers. */
/* Size of object which can be written atomically.
This macro has different values in different kernel versions. The
latest versions of the kernel use 1024 and this is good choice. Since
the C library implementation of readv/writev is able to emulate the
functionality even if the currently running kernel does not support
this large value the readv/writev call will not fail because of this. */
#define UIO_MAXIOV 1024
#include <bits/types/struct_iovec.h>
#endif
#ifdef __USE_GNU
# if defined _SYS_UIO_H && !defined _BITS_UIO_H_FOR_SYS_UIO_H
# define _BITS_UIO_H_FOR_SYS_UIO_H 1
__BEGIN_DECLS
/* Read from another process' address space. */
@ -66,13 +41,12 @@ extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec,
unsigned long int __flags)
__THROW;
__END_DECLS
# endif
/* Flags for preadv2/pwritev2: */
#define RWF_HIPRI 0x00000001 /* High priority request. */
#define RWF_DSYNC 0x00000002 /* per-IO O_DSYNC. */
#define RWF_SYNC 0x00000004 /* per-IO O_SYNC. */
#endif
__END_DECLS
#endif /* bits/uio-ext.h */

View File

@ -0,0 +1,32 @@
/* Implementation limits related to sys/uio.h - Linux version.
Copyright (C) 2017 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_UIO_LIM_H
#define _BITS_UIO_LIM_H 1
/* Maximum length of the 'struct iovec' array in a single call to
readv or writev.
This macro has different values in different kernel versions. The
latest versions of the kernel use 1024 and this is good choice. Since
the C library implementation of readv/writev is able to emulate the
functionality even if the currently running kernel does not support
this large value the readv/writev call will not fail because of this. */
#define __IOV_MAX 1024
#endif