xref: /linux/lib/test_sysctl.c (revision 9308f2f9e7f055cf3934645ec622bb5259dc1c14)
1*9308f2f9SLuis R. Rodriguez /*
2*9308f2f9SLuis R. Rodriguez  * proc sysctl test driver
3*9308f2f9SLuis R. Rodriguez  *
4*9308f2f9SLuis R. Rodriguez  * Copyright (C) 2017 Luis R. Rodriguez <mcgrof@kernel.org>
5*9308f2f9SLuis R. Rodriguez  *
6*9308f2f9SLuis R. Rodriguez  * This program is free software; you can redistribute it and/or modify it
7*9308f2f9SLuis R. Rodriguez  * under the terms of the GNU General Public License as published by the Free
8*9308f2f9SLuis R. Rodriguez  * Software Foundation; either version 2 of the License, or at your option any
9*9308f2f9SLuis R. Rodriguez  * later version; or, when distributed separately from the Linux kernel or
10*9308f2f9SLuis R. Rodriguez  * when incorporated into other software packages, subject to the following
11*9308f2f9SLuis R. Rodriguez  * license:
12*9308f2f9SLuis R. Rodriguez  *
13*9308f2f9SLuis R. Rodriguez  * This program is free software; you can redistribute it and/or modify it
14*9308f2f9SLuis R. Rodriguez  * under the terms of copyleft-next (version 0.3.1 or later) as published
15*9308f2f9SLuis R. Rodriguez  * at http://copyleft-next.org/.
16*9308f2f9SLuis R. Rodriguez  */
17*9308f2f9SLuis R. Rodriguez 
18*9308f2f9SLuis R. Rodriguez /*
19*9308f2f9SLuis R. Rodriguez  * This module provides an interface to the the proc sysctl interfaces.  This
20*9308f2f9SLuis R. Rodriguez  * driver requires CONFIG_PROC_SYSCTL. It will not normally be loaded by the
21*9308f2f9SLuis R. Rodriguez  * system unless explicitly requested by name. You can also build this driver
22*9308f2f9SLuis R. Rodriguez  * into your kernel.
23*9308f2f9SLuis R. Rodriguez  */
24*9308f2f9SLuis R. Rodriguez 
25*9308f2f9SLuis R. Rodriguez #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
26*9308f2f9SLuis R. Rodriguez 
27*9308f2f9SLuis R. Rodriguez #include <linux/init.h>
28*9308f2f9SLuis R. Rodriguez #include <linux/list.h>
29*9308f2f9SLuis R. Rodriguez #include <linux/module.h>
30*9308f2f9SLuis R. Rodriguez #include <linux/printk.h>
31*9308f2f9SLuis R. Rodriguez #include <linux/fs.h>
32*9308f2f9SLuis R. Rodriguez #include <linux/miscdevice.h>
33*9308f2f9SLuis R. Rodriguez #include <linux/slab.h>
34*9308f2f9SLuis R. Rodriguez #include <linux/uaccess.h>
35*9308f2f9SLuis R. Rodriguez #include <linux/async.h>
36*9308f2f9SLuis R. Rodriguez #include <linux/delay.h>
37*9308f2f9SLuis R. Rodriguez #include <linux/vmalloc.h>
38*9308f2f9SLuis R. Rodriguez 
39*9308f2f9SLuis R. Rodriguez static int i_zero;
40*9308f2f9SLuis R. Rodriguez static int i_one_hundred = 100;
41*9308f2f9SLuis R. Rodriguez 
42*9308f2f9SLuis R. Rodriguez struct test_sysctl_data {
43*9308f2f9SLuis R. Rodriguez 	int int_0001;
44*9308f2f9SLuis R. Rodriguez 	char string_0001[65];
45*9308f2f9SLuis R. Rodriguez };
46*9308f2f9SLuis R. Rodriguez 
47*9308f2f9SLuis R. Rodriguez static struct test_sysctl_data test_data = {
48*9308f2f9SLuis R. Rodriguez 	.int_0001 = 60,
49*9308f2f9SLuis R. Rodriguez 	.string_0001 = "(none)",
50*9308f2f9SLuis R. Rodriguez };
51*9308f2f9SLuis R. Rodriguez 
52*9308f2f9SLuis R. Rodriguez /* These are all under /proc/sys/debug/test_sysctl/ */
53*9308f2f9SLuis R. Rodriguez static struct ctl_table test_table[] = {
54*9308f2f9SLuis R. Rodriguez 	{
55*9308f2f9SLuis R. Rodriguez 		.procname	= "int_0001",
56*9308f2f9SLuis R. Rodriguez 		.data		= &test_data.int_0001,
57*9308f2f9SLuis R. Rodriguez 		.maxlen		= sizeof(int),
58*9308f2f9SLuis R. Rodriguez 		.mode		= 0644,
59*9308f2f9SLuis R. Rodriguez 		.proc_handler	= proc_dointvec_minmax,
60*9308f2f9SLuis R. Rodriguez 		.extra1		= &i_zero,
61*9308f2f9SLuis R. Rodriguez 		.extra2         = &i_one_hundred,
62*9308f2f9SLuis R. Rodriguez 	},
63*9308f2f9SLuis R. Rodriguez 	{
64*9308f2f9SLuis R. Rodriguez 		.procname	= "string_0001",
65*9308f2f9SLuis R. Rodriguez 		.data		= &test_data.string_0001,
66*9308f2f9SLuis R. Rodriguez 		.maxlen		= sizeof(test_data.string_0001),
67*9308f2f9SLuis R. Rodriguez 		.mode		= 0644,
68*9308f2f9SLuis R. Rodriguez 		.proc_handler	= proc_dostring,
69*9308f2f9SLuis R. Rodriguez 	},
70*9308f2f9SLuis R. Rodriguez 	{ }
71*9308f2f9SLuis R. Rodriguez };
72*9308f2f9SLuis R. Rodriguez 
73*9308f2f9SLuis R. Rodriguez static struct ctl_table test_sysctl_table[] = {
74*9308f2f9SLuis R. Rodriguez 	{
75*9308f2f9SLuis R. Rodriguez 		.procname	= "test_sysctl",
76*9308f2f9SLuis R. Rodriguez 		.maxlen		= 0,
77*9308f2f9SLuis R. Rodriguez 		.mode		= 0555,
78*9308f2f9SLuis R. Rodriguez 		.child		= test_table,
79*9308f2f9SLuis R. Rodriguez 	},
80*9308f2f9SLuis R. Rodriguez 	{ }
81*9308f2f9SLuis R. Rodriguez };
82*9308f2f9SLuis R. Rodriguez 
83*9308f2f9SLuis R. Rodriguez static struct ctl_table test_sysctl_root_table[] = {
84*9308f2f9SLuis R. Rodriguez 	{
85*9308f2f9SLuis R. Rodriguez 		.procname	= "debug",
86*9308f2f9SLuis R. Rodriguez 		.maxlen		= 0,
87*9308f2f9SLuis R. Rodriguez 		.mode		= 0555,
88*9308f2f9SLuis R. Rodriguez 		.child		= test_sysctl_table,
89*9308f2f9SLuis R. Rodriguez 	},
90*9308f2f9SLuis R. Rodriguez 	{ }
91*9308f2f9SLuis R. Rodriguez };
92*9308f2f9SLuis R. Rodriguez 
93*9308f2f9SLuis R. Rodriguez static struct ctl_table_header *test_sysctl_header;
94*9308f2f9SLuis R. Rodriguez 
95*9308f2f9SLuis R. Rodriguez static int __init test_sysctl_init(void)
96*9308f2f9SLuis R. Rodriguez {
97*9308f2f9SLuis R. Rodriguez 	test_sysctl_header = register_sysctl_table(test_sysctl_root_table);
98*9308f2f9SLuis R. Rodriguez 	if (!test_sysctl_header)
99*9308f2f9SLuis R. Rodriguez 		return -ENOMEM;
100*9308f2f9SLuis R. Rodriguez 	return 0;
101*9308f2f9SLuis R. Rodriguez }
102*9308f2f9SLuis R. Rodriguez late_initcall(test_sysctl_init);
103*9308f2f9SLuis R. Rodriguez 
104*9308f2f9SLuis R. Rodriguez static void __exit test_sysctl_exit(void)
105*9308f2f9SLuis R. Rodriguez {
106*9308f2f9SLuis R. Rodriguez 	if (test_sysctl_header)
107*9308f2f9SLuis R. Rodriguez 		unregister_sysctl_table(test_sysctl_header);
108*9308f2f9SLuis R. Rodriguez }
109*9308f2f9SLuis R. Rodriguez 
110*9308f2f9SLuis R. Rodriguez module_exit(test_sysctl_exit);
111*9308f2f9SLuis R. Rodriguez 
112*9308f2f9SLuis R. Rodriguez MODULE_AUTHOR("Luis R. Rodriguez <mcgrof@kernel.org>");
113*9308f2f9SLuis R. Rodriguez MODULE_LICENSE("GPL");
114