Blame view

kernel/utsname_sysctl.c 3.35 KB
39732acd9   Eric W. Biederman   [PATCH] sysctl: m...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  /*
   *  Copyright (C) 2007
   *
   *  Author: Eric Biederman <ebiederm@xmision.com>
   *
   *  This program is free software; you can redistribute it and/or
   *  modify it under the terms of the GNU General Public License as
   *  published by the Free Software Foundation, version 2 of the
   *  License.
   */
  
  #include <linux/module.h>
  #include <linux/uts.h>
  #include <linux/utsname.h>
39732acd9   Eric W. Biederman   [PATCH] sysctl: m...
15
16
17
18
19
  #include <linux/sysctl.h>
  
  static void *get_uts(ctl_table *table, int write)
  {
  	char *which = table->data;
32df81cbd   Pavel Emelyanov   Isolate the UTS n...
20
21
22
23
  	struct uts_namespace *uts_ns;
  
  	uts_ns = current->nsproxy->uts_ns;
  	which = (which - (char *)&init_uts_ns) + (char *)uts_ns;
7d69a1f4a   Cedric Le Goater   remove CONFIG_UTS...
24

39732acd9   Eric W. Biederman   [PATCH] sysctl: m...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  	if (!write)
  		down_read(&uts_sem);
  	else
  		down_write(&uts_sem);
  	return which;
  }
  
  static void put_uts(ctl_table *table, int write, void *which)
  {
  	if (!write)
  		up_read(&uts_sem);
  	else
  		up_write(&uts_sem);
  }
  
  #ifdef CONFIG_PROC_FS
  /*
   *	Special case of dostring for the UTS structure. This has locks
   *	to observe. Should this be in kernel/sys.c ????
   */
  static int proc_do_uts_string(ctl_table *table, int write, struct file *filp,
  		  void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	struct ctl_table uts_table;
  	int r;
  	memcpy(&uts_table, table, sizeof(uts_table));
  	uts_table.data = get_uts(table, write);
  	r = proc_dostring(&uts_table,write,filp,buffer,lenp, ppos);
  	put_uts(table, write, uts_table.data);
  	return r;
  }
  #else
  #define proc_do_uts_string NULL
  #endif
  
  
  #ifdef CONFIG_SYSCTL_SYSCALL
  /* The generic string strategy routine: */
f221e726b   Alexey Dobriyan   sysctl: simplify ...
63
  static int sysctl_uts_string(ctl_table *table,
39732acd9   Eric W. Biederman   [PATCH] sysctl: m...
64
65
66
67
68
69
70
71
  		  void __user *oldval, size_t __user *oldlenp,
  		  void __user *newval, size_t newlen)
  {
  	struct ctl_table uts_table;
  	int r, write;
  	write = newval && newlen;
  	memcpy(&uts_table, table, sizeof(uts_table));
  	uts_table.data = get_uts(table, write);
f221e726b   Alexey Dobriyan   sysctl: simplify ...
72
  	r = sysctl_string(&uts_table, oldval, oldlenp, newval, newlen);
39732acd9   Eric W. Biederman   [PATCH] sysctl: m...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  	put_uts(table, write, uts_table.data);
  	return r;
  }
  #else
  #define sysctl_uts_string NULL
  #endif
  
  static struct ctl_table uts_kern_table[] = {
  	{
  		.ctl_name	= KERN_OSTYPE,
  		.procname	= "ostype",
  		.data		= init_uts_ns.name.sysname,
  		.maxlen		= sizeof(init_uts_ns.name.sysname),
  		.mode		= 0444,
  		.proc_handler	= proc_do_uts_string,
  		.strategy	= sysctl_uts_string,
  	},
  	{
  		.ctl_name	= KERN_OSRELEASE,
  		.procname	= "osrelease",
  		.data		= init_uts_ns.name.release,
  		.maxlen		= sizeof(init_uts_ns.name.release),
  		.mode		= 0444,
  		.proc_handler	= proc_do_uts_string,
  		.strategy	= sysctl_uts_string,
  	},
  	{
  		.ctl_name	= KERN_VERSION,
  		.procname	= "version",
  		.data		= init_uts_ns.name.version,
  		.maxlen		= sizeof(init_uts_ns.name.version),
  		.mode		= 0444,
  		.proc_handler	= proc_do_uts_string,
  		.strategy	= sysctl_uts_string,
  	},
  	{
  		.ctl_name	= KERN_NODENAME,
  		.procname	= "hostname",
  		.data		= init_uts_ns.name.nodename,
  		.maxlen		= sizeof(init_uts_ns.name.nodename),
  		.mode		= 0644,
  		.proc_handler	= proc_do_uts_string,
  		.strategy	= sysctl_uts_string,
  	},
  	{
  		.ctl_name	= KERN_DOMAINNAME,
  		.procname	= "domainname",
  		.data		= init_uts_ns.name.domainname,
  		.maxlen		= sizeof(init_uts_ns.name.domainname),
  		.mode		= 0644,
  		.proc_handler	= proc_do_uts_string,
  		.strategy	= sysctl_uts_string,
  	},
  	{}
  };
  
  static struct ctl_table uts_root_table[] = {
  	{
  		.ctl_name	= CTL_KERN,
  		.procname	= "kernel",
  		.mode		= 0555,
  		.child		= uts_kern_table,
  	},
  	{}
  };
  
  static int __init utsname_sysctl_init(void)
  {
0b4d41471   Eric W. Biederman   [PATCH] sysctl: r...
141
  	register_sysctl_table(uts_root_table);
39732acd9   Eric W. Biederman   [PATCH] sysctl: m...
142
143
144
145
  	return 0;
  }
  
  __initcall(utsname_sysctl_init);