blob: eb8cef01f167b675c6462169432c69bda95544af [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/*
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
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 * 02111-1307, USA.
21 */
22
23#include <zebra.h>
24
25char proc_net_snmp[] = "/proc/net/snmp";
26
27static void
28dropline (FILE *fp)
29{
30 int c;
31
32 while ((c = getc (fp)) != '\n')
33 ;
34}
35
36int
37ipforward ()
38{
39 FILE *fp;
40 int ipforwarding = 0;
41 char *pnt;
42 char buf[10];
43
44 fp = fopen (proc_net_snmp, "r");
45
46 if (fp == NULL)
47 return -1;
48
49 /* We don't care about the first line. */
50 dropline (fp);
51
52 /* Get ip_statistics.IpForwarding :
53 1 => ip forwarding enabled
54 2 => ip forwarding off. */
55 pnt = fgets (buf, 6, fp);
56 sscanf (buf, "Ip: %d", &ipforwarding);
57
58 if (ipforwarding == 1)
59 return 1;
60
61 return 0;
62}
63
64/* char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/conf/all/forwarding"; */
65char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/ip_forward";
66
67int
68ipforward_on ()
69{
70 FILE *fp;
71
72 fp = fopen (proc_ipv4_forwarding, "w");
73
74 if (fp == NULL)
75 return -1;
76
77 fprintf (fp, "1\n");
78
79 fclose (fp);
80
81 return ipforward ();
82}
83
84int
85ipforward_off ()
86{
87 FILE *fp;
88
89 fp = fopen (proc_ipv4_forwarding, "w");
90
91 if (fp == NULL)
92 return -1;
93
94 fprintf (fp, "0\n");
95
96 fclose (fp);
97
98 return ipforward ();
99}
100#ifdef HAVE_IPV6
101
102char proc_ipv6_forwarding[] = "/proc/sys/net/ipv6/conf/all/forwarding";
103
104int
105ipforward_ipv6 ()
106{
107 FILE *fp;
108 char buf[5];
109 int ipforwarding = 0;
110
111 fp = fopen (proc_ipv6_forwarding, "r");
112
113 if (fp == NULL)
114 return -1;
115
116 fgets (buf, 2, fp);
117 sscanf (buf, "%d", &ipforwarding);
118
119 return ipforwarding;
120}
121
122int
123ipforward_ipv6_on ()
124{
125 FILE *fp;
126
127 fp = fopen (proc_ipv6_forwarding, "w");
128
129 if (fp == NULL)
130 return -1;
131
132 fprintf (fp, "1\n");
133
134 fclose (fp);
135
136 return ipforward_ipv6 ();
137}
138
139int
140ipforward_ipv6_off ()
141{
142 FILE *fp;
143
144 fp = fopen (proc_ipv6_forwarding, "w");
145
146 if (fp == NULL)
147 return -1;
148
149 fprintf (fp, "0\n");
150
151 fclose (fp);
152
153 return ipforward_ipv6 ();
154}
155#endif /* HAVE_IPV6 */