summaryrefslogtreecommitdiffstats
path: root/man/man2/sysctl.2
diff options
context:
space:
mode:
Diffstat (limited to 'man/man2/sysctl.2')
-rw-r--r--man/man2/sysctl.2160
1 files changed, 160 insertions, 0 deletions
diff --git a/man/man2/sysctl.2 b/man/man2/sysctl.2
new file mode 100644
index 000000000..3d91dc632
--- /dev/null
+++ b/man/man2/sysctl.2
@@ -0,0 +1,160 @@
+.\" Copyright (C) 1996 Andries Brouwer (aeb@cwi.nl)
+.\"
+.\" SPDX-License-Identifier: Linux-man-pages-copyleft
+.\"
+.\" Written 11 April 1996 by Andries Brouwer <aeb@cwi.nl>
+.\" 960412: Added comments from Stephen Tweedie
+.\" Modified Tue Oct 22 22:28:41 1996 by Eric S. Raymond <esr@thyrsus.com>
+.\" Modified Mon Jan 5 20:31:04 1998 by aeb.
+.\"
+.TH sysctl 2 (date) "Linux man-pages (unreleased)"
+.SH NAME
+sysctl \- read/write system parameters
+.SH SYNOPSIS
+.nf
+.B #include <unistd.h>
+.B #include <linux/sysctl.h>
+.P
+.BI "[[deprecated]] int _sysctl(struct __sysctl_args *" args );
+.fi
+.SH DESCRIPTION
+.B This system call no longer exists on current kernels!
+See NOTES.
+.P
+The
+.BR _sysctl ()
+call reads and/or writes kernel parameters.
+For example, the hostname,
+or the maximum number of open files.
+The argument has the form
+.P
+.in +4n
+.EX
+struct __sysctl_args {
+ int *name; /* integer vector describing variable */
+ int nlen; /* length of this vector */
+ void *oldval; /* 0 or address where to store old value */
+ size_t *oldlenp; /* available room for old value,
+ overwritten by actual size of old value */
+ void *newval; /* 0 or address of new value */
+ size_t newlen; /* size of new value */
+};
+.EE
+.in
+.P
+This call does a search in a tree structure, possibly resembling
+a directory tree under
+.IR /proc/sys ,
+and if the requested item is found calls some appropriate routine
+to read or modify the value.
+.SH RETURN VALUE
+Upon successful completion,
+.BR _sysctl ()
+returns 0.
+Otherwise, a value of \-1 is returned and
+.I errno
+is set to indicate the error.
+.SH ERRORS
+.TP
+.B EACCES
+.TQ
+.B EPERM
+No search permission for one of the encountered "directories",
+or no read permission where
+.I oldval
+was nonzero, or no write permission where
+.I newval
+was nonzero.
+.TP
+.B EFAULT
+The invocation asked for the previous value by setting
+.I oldval
+non-NULL, but allowed zero room in
+.IR oldlenp .
+.TP
+.B ENOTDIR
+.I name
+was not found.
+.SH STANDARDS
+Linux.
+.SH HISTORY
+Linux 1.3.57.
+Removed in Linux 5.5, glibc 2.32.
+.P
+It originated in
+4.4BSD.
+Only Linux has the
+.I /proc/sys
+mirror, and the object naming schemes differ between Linux and 4.4BSD,
+but the declaration of the
+.BR sysctl ()
+function is the same in both.
+.SH NOTES
+Use of this system call was long discouraged:
+since Linux 2.6.24,
+uses of this system call result in warnings in the kernel log,
+and in Linux 5.5, the system call was finally removed.
+Use the
+.I /proc/sys
+interface instead.
+.P
+Note that on older kernels where this system call still exists,
+it is available only if the kernel was configured with the
+.B CONFIG_SYSCTL_SYSCALL
+option.
+Furthermore, glibc does not provide a wrapper for this system call,
+necessitating the use of
+.BR syscall (2).
+.SH BUGS
+The object names vary between kernel versions,
+making this system call worthless for applications.
+.P
+Not all available objects are properly documented.
+.P
+It is not yet possible to change operating system by writing to
+.IR /proc/sys/kernel/ostype .
+.SH EXAMPLES
+.\" SRC BEGIN (sysctl.c)
+.EX
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+\&
+#include <linux/sysctl.h>
+\&
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+\&
+int _sysctl(struct __sysctl_args *args);
+\&
+#define OSNAMESZ 100
+\&
+int
+main(void)
+{
+ int name[] = { CTL_KERN, KERN_OSTYPE };
+ char osname[OSNAMESZ];
+ size_t osnamelth;
+ struct __sysctl_args args;
+\&
+ memset(&args, 0, sizeof(args));
+ args.name = name;
+ args.nlen = ARRAY_SIZE(name);
+ args.oldval = osname;
+ args.oldlenp = &osnamelth;
+\&
+ osnamelth = sizeof(osname);
+\&
+ if (syscall(SYS__sysctl, &args) == \-1) {
+ perror("_sysctl");
+ exit(EXIT_FAILURE);
+ }
+ printf("This machine is running %*s\en", (int) osnamelth, osname);
+ exit(EXIT_SUCCESS);
+}
+.EE
+.\" SRC END
+.SH SEE ALSO
+.BR proc (5)