2519 lines · 58.8 KB · C
RawDownload
/* * sysctl.c: General linux system control interface * * Begun 24 March 1995, Stephen Tweedie * Added /proc support, Dec 1995 * Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas. * Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver. * Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver. * Dynamic registration fixes, Stephen Tweedie. * Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn. * Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris *  Horn. * Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer. * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer. * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill *  Wendling. * The list_for_each() macro wasn't appropriate for the sysctl loop. *  Removed it and replaced it with older style, 03/23/00, Bill Wendling */ #include <linux/config.h>#include <linux/module.h>#include <linux/mm.h>#include <linux/swap.h>#include <linux/slab.h>#include <linux/sysctl.h>#include <linux/proc_fs.h>#include <linux/capability.h>#include <linux/ctype.h>#include <linux/utsname.h>#include <linux/capability.h>#include <linux/smp_lock.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/kobject.h>#include <linux/net.h>#include <linux/sysrq.h>#include <linux/highuid.h>#include <linux/writeback.h>#include <linux/hugetlb.h>#include <linux/security.h>#include <linux/initrd.h>#include <linux/times.h>#include <linux/limits.h>#include <linux/dcache.h>#include <linux/syscalls.h>#include <linux/nfs_fs.h>#include <linux/acpi.h> #include <asm/uaccess.h>#include <asm/processor.h> extern int proc_nr_files(ctl_table *table, int write, struct file *filp,                     void __user *buffer, size_t *lenp, loff_t *ppos); #if defined(CONFIG_SYSCTL) /* External variables not in a header file. */extern int C_A_D;extern int sysctl_overcommit_memory;extern int sysctl_overcommit_ratio;extern int max_threads;extern int sysrq_enabled;extern int core_uses_pid;extern int suid_dumpable;extern char core_pattern[];extern int cad_pid;extern int pid_max;extern int min_free_kbytes;extern int printk_ratelimit_jiffies;extern int printk_ratelimit_burst;extern int pid_max_min, pid_max_max;extern int sysctl_drop_caches;extern int percpu_pagelist_fraction; #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86)int unknown_nmi_panic;extern int proc_unknown_nmi_panic(ctl_table *, int, struct file *,				  void __user *, size_t *, loff_t *);#endif /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */static int maxolduid = 65535;static int minolduid;static int min_percpu_pagelist_fract = 8; static int ngroups_max = NGROUPS_MAX; #ifdef CONFIG_KMODextern char modprobe_path[];#endif#ifdef CONFIG_CHR_DEV_SGextern int sg_big_buff;#endif#ifdef CONFIG_SYSVIPCextern size_t shm_ctlmax;extern size_t shm_ctlall;extern int shm_ctlmni;extern int msg_ctlmax;extern int msg_ctlmnb;extern int msg_ctlmni;extern int sem_ctls[];#endif #ifdef __sparc__extern char reboot_command [];extern int stop_a_enabled;extern int scons_pwroff;#endif #ifdef __hppa__extern int pwrsw_enabled;extern int unaligned_enabled;#endif #ifdef CONFIG_S390#ifdef CONFIG_MATHEMUextern int sysctl_ieee_emulation_warnings;#endifextern int sysctl_userprocess_debug;extern int spin_retry;#endif extern int sysctl_hz_timer; #ifdef CONFIG_BSD_PROCESS_ACCTextern int acct_parm[];#endif #ifdef CONFIG_IA64extern int no_unaligned_warning;#endif static int parse_table(int __user *, int, void __user *, size_t __user *, void __user *, size_t,		       ctl_table *, void **);static int proc_doutsstring(ctl_table *table, int write, struct file *filp,		  void __user *buffer, size_t *lenp, loff_t *ppos); static ctl_table root_table[];static struct ctl_table_header root_table_header =	{ root_table, LIST_HEAD_INIT(root_table_header.ctl_entry) }; static ctl_table kern_table[];static ctl_table vm_table[];static ctl_table proc_table[];static ctl_table fs_table[];static ctl_table debug_table[];static ctl_table dev_table[];extern ctl_table random_table[];#ifdef CONFIG_UNIX98_PTYSextern ctl_table pty_table[];#endif#ifdef CONFIG_INOTIFYextern ctl_table inotify_table[];#endif #ifdef HAVE_ARCH_PICK_MMAP_LAYOUTint sysctl_legacy_va_layout;#endif /* /proc declarations: */ #ifdef CONFIG_PROC_FS static ssize_t proc_readsys(struct file *, char __user *, size_t, loff_t *);static ssize_t proc_writesys(struct file *, const char __user *, size_t, loff_t *);static int proc_opensys(struct inode *, struct file *); struct file_operations proc_sys_file_operations = {	.open		= proc_opensys,	.read		= proc_readsys,	.write		= proc_writesys,}; extern struct proc_dir_entry *proc_sys_root; static void register_proc_table(ctl_table *, struct proc_dir_entry *, void *);static void unregister_proc_table(ctl_table *, struct proc_dir_entry *);#endif /* The default sysctl tables: */ static ctl_table root_table[] = {	{		.ctl_name	= CTL_KERN,		.procname	= "kernel",		.mode		= 0555,		.child		= kern_table,	},	{		.ctl_name	= CTL_VM,		.procname	= "vm",		.mode		= 0555,		.child		= vm_table,	},#ifdef CONFIG_NET	{		.ctl_name	= CTL_NET,		.procname	= "net",		.mode		= 0555,		.child		= net_table,	},#endif	{		.ctl_name	= CTL_PROC,		.procname	= "proc",		.mode		= 0555,		.child		= proc_table,	},	{		.ctl_name	= CTL_FS,		.procname	= "fs",		.mode		= 0555,		.child		= fs_table,	},	{		.ctl_name	= CTL_DEBUG,		.procname	= "debug",		.mode		= 0555,		.child		= debug_table,	},	{		.ctl_name	= CTL_DEV,		.procname	= "dev",		.mode		= 0555,		.child		= dev_table,	}, 	{ .ctl_name = 0 }}; static ctl_table kern_table[] = {	{		.ctl_name	= KERN_OSTYPE,		.procname	= "ostype",		.data		= system_utsname.sysname,		.maxlen		= sizeof(system_utsname.sysname),		.mode		= 0444,		.proc_handler	= &proc_doutsstring,		.strategy	= &sysctl_string,	},	{		.ctl_name	= KERN_OSRELEASE,		.procname	= "osrelease",		.data		= system_utsname.release,		.maxlen		= sizeof(system_utsname.release),		.mode		= 0444,		.proc_handler	= &proc_doutsstring,		.strategy	= &sysctl_string,	},	{		.ctl_name	= KERN_VERSION,		.procname	= "version",		.data		= system_utsname.version,		.maxlen		= sizeof(system_utsname.version),		.mode		= 0444,		.proc_handler	= &proc_doutsstring,		.strategy	= &sysctl_string,	},	{		.ctl_name	= KERN_NODENAME,		.procname	= "hostname",		.data		= system_utsname.nodename,		.maxlen		= sizeof(system_utsname.nodename),		.mode		= 0644,		.proc_handler	= &proc_doutsstring,		.strategy	= &sysctl_string,	},	{		.ctl_name	= KERN_DOMAINNAME,		.procname	= "domainname",		.data		= system_utsname.domainname,		.maxlen		= sizeof(system_utsname.domainname),		.mode		= 0644,		.proc_handler	= &proc_doutsstring,		.strategy	= &sysctl_string,	},	{		.ctl_name	= KERN_PANIC,		.procname	= "panic",		.data		= &panic_timeout,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_CORE_USES_PID,		.procname	= "core_uses_pid",		.data		= &core_uses_pid,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_CORE_PATTERN,		.procname	= "core_pattern",		.data		= core_pattern,		.maxlen		= 64,		.mode		= 0644,		.proc_handler	= &proc_dostring,		.strategy	= &sysctl_string,	},	{		.ctl_name	= KERN_TAINTED,		.procname	= "tainted",		.data		= &tainted,		.maxlen		= sizeof(int),		.mode		= 0444,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_CAP_BSET,		.procname	= "cap-bound",		.data		= &cap_bset,		.maxlen		= sizeof(kernel_cap_t),		.mode		= 0600,		.proc_handler	= &proc_dointvec_bset,	},#ifdef CONFIG_BLK_DEV_INITRD	{		.ctl_name	= KERN_REALROOTDEV,		.procname	= "real-root-dev",		.data		= &real_root_dev,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#endif#ifdef __sparc__	{		.ctl_name	= KERN_SPARC_REBOOT,		.procname	= "reboot-cmd",		.data		= reboot_command,		.maxlen		= 256,		.mode		= 0644,		.proc_handler	= &proc_dostring,		.strategy	= &sysctl_string,	},	{		.ctl_name	= KERN_SPARC_STOP_A,		.procname	= "stop-a",		.data		= &stop_a_enabled,		.maxlen		= sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_SPARC_SCONS_PWROFF,		.procname	= "scons-poweroff",		.data		= &scons_pwroff,		.maxlen		= sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#endif#ifdef __hppa__	{		.ctl_name	= KERN_HPPA_PWRSW,		.procname	= "soft-power",		.data		= &pwrsw_enabled,		.maxlen		= sizeof (int),	 	.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_HPPA_UNALIGNED,		.procname	= "unaligned-trap",		.data		= &unaligned_enabled,		.maxlen		= sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#endif	{		.ctl_name	= KERN_CTLALTDEL,		.procname	= "ctrl-alt-del",		.data		= &C_A_D,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_PRINTK,		.procname	= "printk",		.data		= &console_loglevel,		.maxlen		= 4*sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#ifdef CONFIG_KMOD	{		.ctl_name	= KERN_MODPROBE,		.procname	= "modprobe",		.data		= &modprobe_path,		.maxlen		= KMOD_PATH_LEN,		.mode		= 0644,		.proc_handler	= &proc_dostring,		.strategy	= &sysctl_string,	},#endif#ifdef CONFIG_HOTPLUG	{		.ctl_name	= KERN_HOTPLUG,		.procname	= "hotplug",		.data		= &uevent_helper,		.maxlen		= UEVENT_HELPER_PATH_LEN,		.mode		= 0644,		.proc_handler	= &proc_dostring,		.strategy	= &sysctl_string,	},#endif#ifdef CONFIG_CHR_DEV_SG	{		.ctl_name	= KERN_SG_BIG_BUFF,		.procname	= "sg-big-buff",		.data		= &sg_big_buff,		.maxlen		= sizeof (int),		.mode		= 0444,		.proc_handler	= &proc_dointvec,	},#endif#ifdef CONFIG_BSD_PROCESS_ACCT	{		.ctl_name	= KERN_ACCT,		.procname	= "acct",		.data		= &acct_parm,		.maxlen		= 3*sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#endif#ifdef CONFIG_SYSVIPC	{		.ctl_name	= KERN_SHMMAX,		.procname	= "shmmax",		.data		= &shm_ctlmax,		.maxlen		= sizeof (size_t),		.mode		= 0644,		.proc_handler	= &proc_doulongvec_minmax,	},	{		.ctl_name	= KERN_SHMALL,		.procname	= "shmall",		.data		= &shm_ctlall,		.maxlen		= sizeof (size_t),		.mode		= 0644,		.proc_handler	= &proc_doulongvec_minmax,	},	{		.ctl_name	= KERN_SHMMNI,		.procname	= "shmmni",		.data		= &shm_ctlmni,		.maxlen		= sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_MSGMAX,		.procname	= "msgmax",		.data		= &msg_ctlmax,		.maxlen		= sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_MSGMNI,		.procname	= "msgmni",		.data		= &msg_ctlmni,		.maxlen		= sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_MSGMNB,		.procname	=  "msgmnb",		.data		= &msg_ctlmnb,		.maxlen		= sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= KERN_SEM,		.procname	= "sem",		.data		= &sem_ctls,		.maxlen		= 4*sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#endif#ifdef CONFIG_MAGIC_SYSRQ	{		.ctl_name	= KERN_SYSRQ,		.procname	= "sysrq",		.data		= &sysrq_enabled,		.maxlen		= sizeof (int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#endif	{

Lines 1–500 of 2519.