mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
Linux: Remove <sys/sysctl.h> and the sysctl function
Linux 5.5 remove the system call in commit 61a47c1ad3a4dc6882f01ebdc88138ac62d0df03 ("Linux: Remove <sys/sysctl.h>"). Therefore, the compat function is just a stub that sets ENOSYS. Due to SHLIB_COMPAT, new ports will not add the sysctl function anymore automatically. x32 already lacks the sysctl function, so an empty sysctl.c file is used to suppress it. Otherwise, a new compat symbol would be added. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
c4d4419433
commit
076f09afba
6
NEWS
6
NEWS
@ -16,7 +16,11 @@ Major new features:
|
||||
|
||||
Deprecated and removed features, and other changes affecting compatibility:
|
||||
|
||||
[Add deprecations, removals and changes affecting compatibility here]
|
||||
* The deprecated <sys/sysctl.h> header and the sysctl function have been
|
||||
removed. To support old binaries, the sysctl function continues to
|
||||
exist as a compatibility symbol (on those architectures which had it),
|
||||
but always fails with ENOSYS. This reflects the removal of the system
|
||||
call from all architectures, starting with Linux 5.5.
|
||||
|
||||
Changes to build and runtime requirements:
|
||||
|
||||
|
@ -1,3 +0,0 @@
|
||||
#ifndef _SYS_SYSCTL_H
|
||||
#include_next <sys/sysctl.h>
|
||||
#endif /* _SYS_SYSCTL_H */
|
@ -14,7 +14,6 @@ can make changes.
|
||||
* Platform Type:: Determining operating system and basic
|
||||
machine type
|
||||
* Filesystem Handling:: Controlling/querying mounts
|
||||
* System Parameters:: Getting and setting various system parameters
|
||||
@end menu
|
||||
|
||||
To get information on parameters of the system that are built into the
|
||||
@ -1107,146 +1106,3 @@ to zeroes. It is more widely available than @code{umount2} but since it
|
||||
lacks the possibility to forcefully unmount a filesystem is deprecated
|
||||
when @code{umount2} is also available.
|
||||
@end deftypefun
|
||||
|
||||
|
||||
|
||||
@node System Parameters
|
||||
@section System Parameters
|
||||
|
||||
This section describes the @code{sysctl} function, which gets and sets
|
||||
a variety of system parameters.
|
||||
|
||||
The symbols used in this section are declared in the file @file{sys/sysctl.h}.
|
||||
|
||||
@deftypefun int sysctl (int *@var{names}, int @var{nlen}, void *@var{oldval}, size_t *@var{oldlenp}, void *@var{newval}, size_t @var{newlen})
|
||||
@standards{BSD, sys/sysctl.h}
|
||||
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
|
||||
@c Direct syscall, Linux only.
|
||||
|
||||
@code{sysctl} gets or sets a specified system parameter. There are so
|
||||
many of these parameters that it is not practical to list them all here,
|
||||
but here are some examples:
|
||||
|
||||
@itemize @bullet
|
||||
@item network domain name
|
||||
@item paging parameters
|
||||
@item network Address Resolution Protocol timeout time
|
||||
@item maximum number of files that may be open
|
||||
@item root filesystem device
|
||||
@item when kernel was built
|
||||
@end itemize
|
||||
|
||||
The set of available parameters depends on the kernel configuration and
|
||||
can change while the system is running, particularly when you load and
|
||||
unload loadable kernel modules.
|
||||
|
||||
The system parameters with which @code{sysctl} is concerned are arranged
|
||||
in a hierarchical structure like a hierarchical filesystem. To identify
|
||||
a particular parameter, you specify a path through the structure in a
|
||||
way analogous to specifying the pathname of a file. Each component of
|
||||
the path is specified by an integer and each of these integers has a
|
||||
macro defined for it by @file{sys/sysctl.h}. @var{names} is the path, in
|
||||
the form of an array of integers. Each component of the path is one
|
||||
element of the array, in order. @var{nlen} is the number of components
|
||||
in the path.
|
||||
|
||||
For example, the first component of the path for all the paging
|
||||
parameters is the value @code{CTL_VM}. For the free page thresholds, the
|
||||
second component of the path is @code{VM_FREEPG}. So to get the free
|
||||
page threshold values, make @var{names} an array containing the two
|
||||
elements @code{CTL_VM} and @code{VM_FREEPG} and make @var{nlen} = 2.
|
||||
|
||||
|
||||
The format of the value of a parameter depends on the parameter.
|
||||
Sometimes it is an integer; sometimes it is an ASCII string; sometimes
|
||||
it is an elaborate structure. In the case of the free page thresholds
|
||||
used in the example above, the parameter value is a structure containing
|
||||
several integers.
|
||||
|
||||
In any case, you identify a place to return the parameter's value with
|
||||
@var{oldval} and specify the amount of storage available at that
|
||||
location as *@var{oldlenp}. *@var{oldlenp} does double duty because it
|
||||
is also the output location that contains the actual length of the
|
||||
returned value.
|
||||
|
||||
If you don't want the parameter value returned, specify a null pointer
|
||||
for @var{oldval}.
|
||||
|
||||
To set the parameter, specify the address and length of the new value
|
||||
as @var{newval} and @var{newlen}. If you don't want to set the parameter,
|
||||
specify a null pointer as @var{newval}.
|
||||
|
||||
If you get and set a parameter in the same @code{sysctl} call, the value
|
||||
returned is the value of the parameter before it was set.
|
||||
|
||||
Each system parameter has a set of permissions similar to the
|
||||
permissions for a file (including the permissions on directories in its
|
||||
path) that determine whether you may get or set it. For the purposes of
|
||||
these permissions, every parameter is considered to be owned by the
|
||||
superuser and Group 0 so processes with that effective uid or gid may
|
||||
have more access to system parameters. Unlike with files, the superuser
|
||||
does not invariably have full permission to all system parameters, because
|
||||
some of them are designed not to be changed ever.
|
||||
|
||||
|
||||
@code{sysctl} returns a zero return value if it succeeds. Otherwise, it
|
||||
returns @code{-1} and sets @code{errno} appropriately. Besides the
|
||||
failures that apply to all system calls, the following are the
|
||||
@code{errno} codes for all possible failures:
|
||||
|
||||
@table @code
|
||||
@item EPERM
|
||||
The process is not permitted to access one of the components of the
|
||||
path of the system parameter or is not permitted to access the system parameter
|
||||
itself in the way (read or write) that it requested.
|
||||
@c There is some indication in the Linux 2.2 code that the code is trying to
|
||||
@c return EACCES here, but the EACCES value never actually makes it to the
|
||||
@c user.
|
||||
@item ENOTDIR
|
||||
There is no system parameter corresponding to @var{name}.
|
||||
@item EFAULT
|
||||
@var{oldval} is not null, which means the process wanted to read the parameter,
|
||||
but *@var{oldlenp} is zero, so there is no place to return it.
|
||||
@item EINVAL
|
||||
@itemize @bullet
|
||||
@item
|
||||
The process attempted to set a system parameter to a value that is not valid
|
||||
for that parameter.
|
||||
@item
|
||||
The space provided for the return of the system parameter is not the right
|
||||
size for that parameter.
|
||||
@end itemize
|
||||
@item ENOMEM
|
||||
This value may be returned instead of the more correct @code{EINVAL} in some
|
||||
cases where the space provided for the return of the system parameter is too
|
||||
small.
|
||||
|
||||
@end table
|
||||
|
||||
@end deftypefun
|
||||
|
||||
If you have a Linux kernel with the @code{proc} filesystem, you can get
|
||||
and set most of the same parameters by reading and writing to files in
|
||||
the @code{sys} directory of the @code{proc} filesystem. In the @code{sys}
|
||||
directory, the directory structure represents the hierarchical structure
|
||||
of the parameters. E.g. you can display the free page thresholds with
|
||||
@smallexample
|
||||
cat /proc/sys/vm/freepages
|
||||
@end smallexample
|
||||
@c In Linux, the sysctl() and /proc instances of the parameter are created
|
||||
@c together. The proc filesystem accesses the same data structure as
|
||||
@c sysctl(), which has special fields in it for /proc. But it is still
|
||||
@c possible to create a sysctl-only parameter.
|
||||
|
||||
Some more traditional and more widely available, though less general,
|
||||
@glibcadj{} functions for getting and setting some of the same system
|
||||
parameters are:
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
@code{getdomainname}, @code{setdomainname}
|
||||
@item
|
||||
@code{gethostname}, @code{sethostname} (@xref{Host Identification}.)
|
||||
@item
|
||||
@code{uname} (@xref{Platform Type}.)
|
||||
@end itemize
|
||||
|
@ -74,11 +74,6 @@ for header in "$@"; do
|
||||
(finclude/*)
|
||||
continue;;
|
||||
|
||||
# sys/sysctl.h produces a deprecation warning and therefore
|
||||
# fails compilation with -Werror.
|
||||
(sys/sysctl.h)
|
||||
continue;;
|
||||
|
||||
# sys/vm86.h is "unsupported on x86-64" and errors out on that target.
|
||||
(sys/vm86.h)
|
||||
case "$is_x86_64" in
|
||||
|
@ -54,9 +54,7 @@ CFLAGS-malloc.c += -DMORECORE_CLEARS=2
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),misc)
|
||||
include $(firstword $(wildcard $(sysdirs:=/sysctl.mk)))
|
||||
|
||||
sysdep_routines += adjtimex clone umount umount2 readahead \
|
||||
sysdep_routines += adjtimex clone umount umount2 readahead sysctl \
|
||||
setfsuid setfsgid epoll_pwait signalfd \
|
||||
eventfd eventfd_read eventfd_write prlimit \
|
||||
personality epoll_wait tee vmsplice splice \
|
||||
@ -71,7 +69,7 @@ CFLAGS-open_by_handle_at.c = -fexceptions -fasynchronous-unwind-tables
|
||||
CFLAGS-sync_file_range.c = -fexceptions -fasynchronous-unwind-tables
|
||||
CFLAGS-tst-writev.c += "-DARTIFICIAL_LIMIT=(0x80000000-sysconf(_SC_PAGESIZE))"
|
||||
|
||||
sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
|
||||
sysdep_headers += sys/mount.h sys/acct.h \
|
||||
sys/klog.h \
|
||||
sys/user.h sys/prctl.h \
|
||||
sys/kd.h sys/soundcard.h sys/vt.h \
|
||||
@ -81,7 +79,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
|
||||
bits/a.out.h sys/inotify.h sys/signalfd.h sys/eventfd.h \
|
||||
sys/timerfd.h sys/fanotify.h bits/eventfd.h bits/inotify.h \
|
||||
bits/signalfd.h bits/timerfd.h bits/epoll.h \
|
||||
bits/socket_type.h bits/syscall.h bits/sysctl.h \
|
||||
bits/socket_type.h bits/syscall.h \
|
||||
bits/mman-linux.h bits/mman-shared.h bits/ptrace-shared.h \
|
||||
bits/siginfo-arch.h bits/siginfo-consts-arch.h \
|
||||
bits/procfs.h bits/procfs-id.h bits/procfs-extra.h \
|
||||
|
@ -177,6 +177,8 @@ libc {
|
||||
GLIBC_2.30 {
|
||||
getdents64; gettid; tgkill;
|
||||
}
|
||||
GLIBC_2.32 {
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
# functions used in other libraries
|
||||
__syscall_rt_sigqueueinfo;
|
||||
|
@ -1 +0,0 @@
|
||||
/* Empty file. */
|
@ -1,4 +1,5 @@
|
||||
/* Copyright (C) 2012-2020 Free Software Foundation, Inc.
|
||||
/* sysctl function stub. microblaze version.
|
||||
Copyright (C) 2020 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,6 +16,14 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#if defined __x86_64__ && defined __ILP32__
|
||||
# error "sysctl system call is unsupported in x32 kernel"
|
||||
/* microblaze is special because it has an ABI baseline of 2.18, but
|
||||
still includes the __sysctl symbol. */
|
||||
|
||||
#ifdef SHARED
|
||||
|
||||
# include <sysdeps/unix/sysv/linux/sysctl.c>
|
||||
|
||||
strong_alias (___sysctl, ___sysctl2)
|
||||
compat_symbol (libc, ___sysctl2, __sysctl, GLIBC_2_2);
|
||||
|
||||
#endif
|
@ -1,6 +1,6 @@
|
||||
/* Copyright (C) 2011-2020 Free Software Foundation, Inc.
|
||||
/* sysctl function stub. powerpc64le version.
|
||||
Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
@ -13,20 +13,17 @@
|
||||
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
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
/* powerpc64le is special because it has an ABI baseline of 2.17, but
|
||||
still includes the __sysctl symbol. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/syscall.h>
|
||||
#ifdef SHARED
|
||||
|
||||
/* This deprecated syscall is no longer used (replaced with /proc/sys). */
|
||||
int
|
||||
sysctl (int *name, int nlen, void *oldval, size_t *oldlenp,
|
||||
void *newval, size_t newlen)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (sysctl)
|
||||
# include <sysdeps/unix/sysv/linux/sysctl.c>
|
||||
|
||||
strong_alias (___sysctl, ___sysctl2)
|
||||
compat_symbol (libc, ___sysctl2, __sysctl, GLIBC_2_2);
|
||||
|
||||
#endif
|
@ -1,76 +0,0 @@
|
||||
/* Copyright (C) 1996-2020 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _SYS_SYSCTL_H
|
||||
#define _SYS_SYSCTL_H 1
|
||||
|
||||
#warning "The <sys/sysctl.h> header is deprecated and will be removed."
|
||||
|
||||
#include <features.h>
|
||||
#define __need_size_t
|
||||
#include <stddef.h>
|
||||
/* Prevent more kernel headers than necessary to be included. */
|
||||
#ifndef _LINUX_KERNEL_H
|
||||
# define _LINUX_KERNEL_H 1
|
||||
# define __undef_LINUX_KERNEL_H
|
||||
#endif
|
||||
#ifndef _LINUX_TYPES_H
|
||||
# define _LINUX_TYPES_H 1
|
||||
# define __undef_LINUX_TYPES_H
|
||||
#endif
|
||||
#ifndef _LINUX_LIST_H
|
||||
# define _LINUX_LIST_H 1
|
||||
# define __undef_LINUX_LIST_H
|
||||
#endif
|
||||
#ifndef __LINUX_COMPILER_H
|
||||
# define __LINUX_COMPILER_H 1
|
||||
# define __user
|
||||
# define __undef__LINUX_COMPILER_H
|
||||
#endif
|
||||
|
||||
#include <linux/sysctl.h>
|
||||
|
||||
#ifdef __undef_LINUX_KERNEL_H
|
||||
# undef _LINUX_KERNEL_H
|
||||
# undef __undef_LINUX_KERNEL_H
|
||||
#endif
|
||||
#ifdef __undef_LINUX_TYPES_H
|
||||
# undef _LINUX_TYPES_H
|
||||
# undef __undef_LINUX_TYPES_H
|
||||
#endif
|
||||
#ifdef __undef_LINUX_LIST_H
|
||||
# undef _LINUX_LIST_H
|
||||
# undef __undef_LINUX_LIST_H
|
||||
#endif
|
||||
#ifdef __undef__LINUX_COMPILER_H
|
||||
# undef __LINUX_COMPILER_H
|
||||
# undef __user
|
||||
# undef __undef__LINUX_COMPILER_H
|
||||
#endif
|
||||
|
||||
#include <bits/sysctl.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Read or write system parameters. */
|
||||
extern int sysctl (int *__name, int __nlen, void *__oldval,
|
||||
size_t *__oldlenp, void *__newval, size_t __newlen) __THROW
|
||||
__attribute_deprecated__;
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* _SYS_SYSCTL_H */
|
@ -1,4 +1,4 @@
|
||||
/* Read or write system information. Linux version.
|
||||
/* sysctl function stub.
|
||||
Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@ -17,25 +17,20 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <shlib-compat.h>
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
int
|
||||
__sysctl (int *name, int nlen, void *oldval, size_t *oldlenp,
|
||||
void *newval, size_t newlen)
|
||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_32)
|
||||
int attribute_compat_text_section
|
||||
___sysctl (int *name, int nlen, void *oldval, size_t *oldlenp,
|
||||
void *newval, size_t newlen)
|
||||
{
|
||||
struct __sysctl_args args =
|
||||
{
|
||||
.name = name,
|
||||
.nlen = nlen,
|
||||
.oldval = oldval,
|
||||
.oldlenp = oldlenp,
|
||||
.newval = newval,
|
||||
.newlen = newlen
|
||||
};
|
||||
|
||||
return INLINE_SYSCALL (_sysctl, 1, &args);
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
weak_alias (__sysctl, sysctl)
|
||||
compat_symbol (libc, ___sysctl, sysctl, GLIBC_2_0);
|
||||
|
||||
# if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17)
|
||||
strong_alias (___sysctl, ___sysctl2)
|
||||
compat_symbol (libc, ___sysctl2, __sysctl, GLIBC_2_2);
|
||||
# endif
|
||||
#endif
|
||||
|
@ -1,3 +0,0 @@
|
||||
# sysctl system call has been deprecated. It is provided for backward
|
||||
# compatility. New target shouldn't add it (see x86_64/x32/sysctl.mk).
|
||||
sysdep_routines += sysctl
|
2
sysdeps/unix/sysv/linux/x86_64/x32/sysctl.c
Normal file
2
sysdeps/unix/sysv/linux/x86_64/x32/sysctl.c
Normal file
@ -0,0 +1,2 @@
|
||||
/* Despite the old base symbol version, x32 does not have a sysctl
|
||||
function. */
|
@ -1 +0,0 @@
|
||||
# X32 doesn't support sysctl.
|
Loading…
Reference in New Issue
Block a user