Blame view
net/phonet/sysctl.c
2.76 KB
87ab4e20b Phonet: proc inte... |
1 2 3 4 5 6 7 |
/* * File: sysctl.c * * Phonet /proc/sys/net/phonet interface implementation * * Copyright (C) 2008 Nokia Corporation. * |
31fdc5553 net: remove my fu... |
8 |
* Author: Rémi Denis-Courmont |
87ab4e20b Phonet: proc inte... |
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA */ #include <linux/seqlock.h> #include <linux/sysctl.h> #include <linux/errno.h> #include <linux/init.h> |
8e052e528 Phonet: missing h... |
29 30 31 |
#include <net/sock.h> #include <linux/phonet.h> #include <net/phonet/phonet.h> |
87ab4e20b Phonet: proc inte... |
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#define DYNAMIC_PORT_MIN 0x40 #define DYNAMIC_PORT_MAX 0x7f static DEFINE_SEQLOCK(local_port_range_lock); static int local_port_range_min[2] = {0, 0}; static int local_port_range_max[2] = {1023, 1023}; static int local_port_range[2] = {DYNAMIC_PORT_MIN, DYNAMIC_PORT_MAX}; static struct ctl_table_header *phonet_table_hrd; static void set_local_port_range(int range[2]) { write_seqlock(&local_port_range_lock); local_port_range[0] = range[0]; local_port_range[1] = range[1]; write_sequnlock(&local_port_range_lock); } void phonet_get_local_port_range(int *min, int *max) { |
95c961747 net: cleanup unsi... |
51 |
unsigned int seq; |
87ab4e20b Phonet: proc inte... |
52 53 54 55 56 57 58 59 |
do { seq = read_seqbegin(&local_port_range_lock); if (min) *min = local_port_range[0]; if (max) *max = local_port_range[1]; } while (read_seqretry(&local_port_range_lock, seq)); } |
fe2c6338f net: Convert uses... |
60 |
static int proc_local_port_range(struct ctl_table *table, int write, |
87ab4e20b Phonet: proc inte... |
61 62 63 64 65 |
void __user *buffer, size_t *lenp, loff_t *ppos) { int ret; int range[2] = {local_port_range[0], local_port_range[1]}; |
fe2c6338f net: Convert uses... |
66 |
struct ctl_table tmp = { |
87ab4e20b Phonet: proc inte... |
67 68 69 70 71 72 |
.data = &range, .maxlen = sizeof(range), .mode = table->mode, .extra1 = &local_port_range_min, .extra2 = &local_port_range_max, }; |
8d65af789 sysctl: remove "s... |
73 |
ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); |
87ab4e20b Phonet: proc inte... |
74 75 76 77 78 79 80 81 82 83 84 85 86 |
if (write && ret == 0) { if (range[1] < range[0]) ret = -EINVAL; else set_local_port_range(range); } return ret; } static struct ctl_table phonet_table[] = { { |
87ab4e20b Phonet: proc inte... |
87 88 89 90 |
.procname = "local_port_range", .data = &local_port_range, .maxlen = sizeof(local_port_range), .mode = 0644, |
6d9f239a1 net: '&' redux |
91 |
.proc_handler = proc_local_port_range, |
87ab4e20b Phonet: proc inte... |
92 |
}, |
f8572d8f2 sysctl net: Remov... |
93 |
{ } |
87ab4e20b Phonet: proc inte... |
94 |
}; |
87ab4e20b Phonet: proc inte... |
95 96 |
int __init phonet_sysctl_init(void) { |
ec8f23ce0 net: Convert all ... |
97 |
phonet_table_hrd = register_net_sysctl(&init_net, "net/phonet", phonet_table); |
87ab4e20b Phonet: proc inte... |
98 99 100 101 102 |
return phonet_table_hrd == NULL ? -ENOMEM : 0; } void phonet_sysctl_exit(void) { |
5dd3df105 net: Move all of ... |
103 |
unregister_net_sysctl_table(phonet_table_hrd); |
87ab4e20b Phonet: proc inte... |
104 |
} |