Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * sysctl.c: General linux system control interface
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 }