]> git.proxmox.com Git - mirror_frr.git/blob - zebra/ipforward_proc.c
Merge pull request #1515 from donaldsharp/selected_to_front1
[mirror_frr.git] / zebra / ipforward_proc.c
1 /*
2 * Fetch ipforward value by reading /proc filesystem.
3 * Copyright (C) 1997 Kunihiro Ishiguro
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include <zebra.h>
23
24 #ifdef GNU_LINUX
25
26 #include "log.h"
27 #include "privs.h"
28
29 #include "zebra/ipforward.h"
30
31 extern struct zebra_privs_t zserv_privs;
32
33 char proc_net_snmp[] = "/proc/net/snmp";
34
35 static void dropline(FILE *fp)
36 {
37 int c;
38
39 while ((c = getc(fp)) != '\n')
40 ;
41 }
42
43 int ipforward(void)
44 {
45 int ret = 0;
46 FILE *fp;
47 int ipforwarding = 0;
48 char buf[10];
49
50 fp = fopen(proc_net_snmp, "r");
51
52 if (fp == NULL)
53 return -1;
54
55 /* We don't care about the first line. */
56 dropline(fp);
57
58 /* Get ip_statistics.IpForwarding :
59 1 => ip forwarding enabled
60 2 => ip forwarding off. */
61 if (fgets(buf, 6, fp))
62 ret = sscanf(buf, "Ip: %d", &ipforwarding);
63
64 fclose(fp);
65
66 if (ret == 1 && ipforwarding == 1)
67 return 1;
68
69 return 0;
70 }
71
72 /* char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/conf/all/forwarding"; */
73 char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/ip_forward";
74
75 int ipforward_on(void)
76 {
77 FILE *fp;
78
79 if (zserv_privs.change(ZPRIVS_RAISE))
80 zlog_err("Can't raise privileges, %s", safe_strerror(errno));
81
82 fp = fopen(proc_ipv4_forwarding, "w");
83
84 if (fp == NULL) {
85 if (zserv_privs.change(ZPRIVS_LOWER))
86 zlog_err("Can't lower privileges, %s",
87 safe_strerror(errno));
88 return -1;
89 }
90
91 fprintf(fp, "1\n");
92
93 fclose(fp);
94
95 if (zserv_privs.change(ZPRIVS_LOWER))
96 zlog_err("Can't lower privileges, %s", safe_strerror(errno));
97
98 return ipforward();
99 }
100
101 int ipforward_off(void)
102 {
103 FILE *fp;
104
105 if (zserv_privs.change(ZPRIVS_RAISE))
106 zlog_err("Can't raise privileges, %s", safe_strerror(errno));
107
108 fp = fopen(proc_ipv4_forwarding, "w");
109
110 if (fp == NULL) {
111 if (zserv_privs.change(ZPRIVS_LOWER))
112 zlog_err("Can't lower privileges, %s",
113 safe_strerror(errno));
114 return -1;
115 }
116
117 fprintf(fp, "0\n");
118
119 fclose(fp);
120
121 if (zserv_privs.change(ZPRIVS_LOWER))
122 zlog_err("Can't lower privileges, %s", safe_strerror(errno));
123
124 return ipforward();
125 }
126
127 char proc_ipv6_forwarding[] = "/proc/sys/net/ipv6/conf/all/forwarding";
128
129 int ipforward_ipv6(void)
130 {
131 int ret = 0;
132 FILE *fp;
133 char buf[5];
134 int ipforwarding = 0;
135
136 fp = fopen(proc_ipv6_forwarding, "r");
137
138 if (fp == NULL)
139 return -1;
140
141 if (fgets(buf, 2, fp))
142 ret = sscanf(buf, "%d", &ipforwarding);
143
144 fclose(fp);
145
146 if (ret != 1)
147 return 0;
148
149 return ipforwarding;
150 }
151
152 int ipforward_ipv6_on(void)
153 {
154 FILE *fp;
155
156 if (zserv_privs.change(ZPRIVS_RAISE))
157 zlog_err("Can't raise privileges, %s", safe_strerror(errno));
158
159 fp = fopen(proc_ipv6_forwarding, "w");
160
161 if (fp == NULL) {
162 if (zserv_privs.change(ZPRIVS_LOWER))
163 zlog_err("Can't lower privileges, %s",
164 safe_strerror(errno));
165 return -1;
166 }
167
168 fprintf(fp, "1\n");
169
170 fclose(fp);
171
172 if (zserv_privs.change(ZPRIVS_LOWER))
173 zlog_err("Can't lower privileges, %s", safe_strerror(errno));
174
175 return ipforward_ipv6();
176 }
177
178
179 int ipforward_ipv6_off(void)
180 {
181 FILE *fp;
182
183 if (zserv_privs.change(ZPRIVS_RAISE))
184 zlog_err("Can't raise privileges, %s", safe_strerror(errno));
185
186 fp = fopen(proc_ipv6_forwarding, "w");
187
188 if (fp == NULL) {
189 if (zserv_privs.change(ZPRIVS_LOWER))
190 zlog_err("Can't lower privileges, %s",
191 safe_strerror(errno));
192 return -1;
193 }
194
195 fprintf(fp, "0\n");
196
197 fclose(fp);
198
199 if (zserv_privs.change(ZPRIVS_LOWER))
200 zlog_err("Can't lower privileges, %s", safe_strerror(errno));
201
202 return ipforward_ipv6();
203 }
204
205 #endif /* GNU_LINUX */