0001
0002
0003
0004
0005
0006 #include <linux/sysctl.h>
0007 #include <linux/printk.h>
0008 #include <linux/capability.h>
0009 #include <linux/ratelimit.h>
0010 #include "internal.h"
0011
0012 static const int ten_thousand = 10000;
0013
0014 static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
0015 void *buffer, size_t *lenp, loff_t *ppos)
0016 {
0017 if (write && !capable(CAP_SYS_ADMIN))
0018 return -EPERM;
0019
0020 return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
0021 }
0022
0023 static struct ctl_table printk_sysctls[] = {
0024 {
0025 .procname = "printk",
0026 .data = &console_loglevel,
0027 .maxlen = 4*sizeof(int),
0028 .mode = 0644,
0029 .proc_handler = proc_dointvec,
0030 },
0031 {
0032 .procname = "printk_ratelimit",
0033 .data = &printk_ratelimit_state.interval,
0034 .maxlen = sizeof(int),
0035 .mode = 0644,
0036 .proc_handler = proc_dointvec_jiffies,
0037 },
0038 {
0039 .procname = "printk_ratelimit_burst",
0040 .data = &printk_ratelimit_state.burst,
0041 .maxlen = sizeof(int),
0042 .mode = 0644,
0043 .proc_handler = proc_dointvec,
0044 },
0045 {
0046 .procname = "printk_delay",
0047 .data = &printk_delay_msec,
0048 .maxlen = sizeof(int),
0049 .mode = 0644,
0050 .proc_handler = proc_dointvec_minmax,
0051 .extra1 = SYSCTL_ZERO,
0052 .extra2 = (void *)&ten_thousand,
0053 },
0054 {
0055 .procname = "printk_devkmsg",
0056 .data = devkmsg_log_str,
0057 .maxlen = DEVKMSG_STR_MAX_SIZE,
0058 .mode = 0644,
0059 .proc_handler = devkmsg_sysctl_set_loglvl,
0060 },
0061 {
0062 .procname = "dmesg_restrict",
0063 .data = &dmesg_restrict,
0064 .maxlen = sizeof(int),
0065 .mode = 0644,
0066 .proc_handler = proc_dointvec_minmax_sysadmin,
0067 .extra1 = SYSCTL_ZERO,
0068 .extra2 = SYSCTL_ONE,
0069 },
0070 {
0071 .procname = "kptr_restrict",
0072 .data = &kptr_restrict,
0073 .maxlen = sizeof(int),
0074 .mode = 0644,
0075 .proc_handler = proc_dointvec_minmax_sysadmin,
0076 .extra1 = SYSCTL_ZERO,
0077 .extra2 = SYSCTL_TWO,
0078 },
0079 {}
0080 };
0081
0082 void __init printk_sysctl_init(void)
0083 {
0084 register_sysctl_init("kernel", printk_sysctls);
0085 }