]>
Commit | Line | Data |
---|---|---|
718e3744 | 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 | * | |
896014f4 DL |
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 | |
718e3744 | 20 | */ |
21 | ||
22 | #include <zebra.h> | |
23 | ||
edd7c245 | 24 | #include "log.h" |
25 | #include "privs.h" | |
26 | ||
a1ac18c4 | 27 | #include "zebra/ipforward.h" |
28 | ||
edd7c245 | 29 | extern struct zebra_privs_t zserv_privs; |
30 | ||
718e3744 | 31 | char proc_net_snmp[] = "/proc/net/snmp"; |
32 | ||
d62a17ae | 33 | static void dropline(FILE *fp) |
718e3744 | 34 | { |
d62a17ae | 35 | int c; |
718e3744 | 36 | |
d62a17ae | 37 | while ((c = getc(fp)) != '\n') |
38 | ; | |
718e3744 | 39 | } |
40 | ||
d62a17ae | 41 | int ipforward(void) |
718e3744 | 42 | { |
d62a17ae | 43 | FILE *fp; |
44 | int ipforwarding = 0; | |
45 | char buf[10]; | |
46 | ||
47 | fp = fopen(proc_net_snmp, "r"); | |
48 | ||
49 | if (fp == NULL) | |
50 | return -1; | |
51 | ||
52 | /* We don't care about the first line. */ | |
53 | dropline(fp); | |
54 | ||
55 | /* Get ip_statistics.IpForwarding : | |
56 | 1 => ip forwarding enabled | |
57 | 2 => ip forwarding off. */ | |
58 | if (fgets(buf, 6, fp)) | |
59 | sscanf(buf, "Ip: %d", &ipforwarding); | |
60 | ||
61 | fclose(fp); | |
62 | ||
63 | if (ipforwarding == 1) | |
64 | return 1; | |
65 | ||
66 | return 0; | |
718e3744 | 67 | } |
68 | ||
69 | /* char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/conf/all/forwarding"; */ | |
70 | char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/ip_forward"; | |
71 | ||
d62a17ae | 72 | int ipforward_on(void) |
718e3744 | 73 | { |
d62a17ae | 74 | FILE *fp; |
75 | ||
76 | if (zserv_privs.change(ZPRIVS_RAISE)) | |
77 | zlog_err("Can't raise privileges, %s", safe_strerror(errno)); | |
718e3744 | 78 | |
d62a17ae | 79 | fp = fopen(proc_ipv4_forwarding, "w"); |
edd7c245 | 80 | |
d62a17ae | 81 | if (fp == NULL) { |
82 | if (zserv_privs.change(ZPRIVS_LOWER)) | |
83 | zlog_err("Can't lower privileges, %s", | |
84 | safe_strerror(errno)); | |
85 | return -1; | |
86 | } | |
718e3744 | 87 | |
d62a17ae | 88 | fprintf(fp, "1\n"); |
718e3744 | 89 | |
d62a17ae | 90 | fclose(fp); |
718e3744 | 91 | |
d62a17ae | 92 | if (zserv_privs.change(ZPRIVS_LOWER)) |
93 | zlog_err("Can't lower privileges, %s", safe_strerror(errno)); | |
41d3fc96 | 94 | |
d62a17ae | 95 | return ipforward(); |
718e3744 | 96 | } |
97 | ||
d62a17ae | 98 | int ipforward_off(void) |
718e3744 | 99 | { |
d62a17ae | 100 | FILE *fp; |
718e3744 | 101 | |
d62a17ae | 102 | if (zserv_privs.change(ZPRIVS_RAISE)) |
103 | zlog_err("Can't raise privileges, %s", safe_strerror(errno)); | |
edd7c245 | 104 | |
d62a17ae | 105 | fp = fopen(proc_ipv4_forwarding, "w"); |
edd7c245 | 106 | |
d62a17ae | 107 | if (fp == NULL) { |
108 | if (zserv_privs.change(ZPRIVS_LOWER)) | |
109 | zlog_err("Can't lower privileges, %s", | |
110 | safe_strerror(errno)); | |
111 | return -1; | |
112 | } | |
718e3744 | 113 | |
d62a17ae | 114 | fprintf(fp, "0\n"); |
718e3744 | 115 | |
d62a17ae | 116 | fclose(fp); |
718e3744 | 117 | |
d62a17ae | 118 | if (zserv_privs.change(ZPRIVS_LOWER)) |
119 | zlog_err("Can't lower privileges, %s", safe_strerror(errno)); | |
41d3fc96 | 120 | |
d62a17ae | 121 | return ipforward(); |
718e3744 | 122 | } |
718e3744 | 123 | |
124 | char proc_ipv6_forwarding[] = "/proc/sys/net/ipv6/conf/all/forwarding"; | |
125 | ||
d62a17ae | 126 | int ipforward_ipv6(void) |
718e3744 | 127 | { |
d62a17ae | 128 | FILE *fp; |
129 | char buf[5]; | |
130 | int ipforwarding = 0; | |
718e3744 | 131 | |
d62a17ae | 132 | fp = fopen(proc_ipv6_forwarding, "r"); |
718e3744 | 133 | |
d62a17ae | 134 | if (fp == NULL) |
135 | return -1; | |
718e3744 | 136 | |
d62a17ae | 137 | if (fgets(buf, 2, fp)) |
138 | sscanf(buf, "%d", &ipforwarding); | |
718e3744 | 139 | |
d62a17ae | 140 | fclose(fp); |
141 | return ipforwarding; | |
718e3744 | 142 | } |
143 | ||
d62a17ae | 144 | int ipforward_ipv6_on(void) |
718e3744 | 145 | { |
d62a17ae | 146 | FILE *fp; |
718e3744 | 147 | |
d62a17ae | 148 | if (zserv_privs.change(ZPRIVS_RAISE)) |
149 | zlog_err("Can't raise privileges, %s", safe_strerror(errno)); | |
edd7c245 | 150 | |
d62a17ae | 151 | fp = fopen(proc_ipv6_forwarding, "w"); |
edd7c245 | 152 | |
d62a17ae | 153 | if (fp == NULL) { |
154 | if (zserv_privs.change(ZPRIVS_LOWER)) | |
155 | zlog_err("Can't lower privileges, %s", | |
156 | safe_strerror(errno)); | |
157 | return -1; | |
158 | } | |
718e3744 | 159 | |
d62a17ae | 160 | fprintf(fp, "1\n"); |
718e3744 | 161 | |
d62a17ae | 162 | fclose(fp); |
718e3744 | 163 | |
d62a17ae | 164 | if (zserv_privs.change(ZPRIVS_LOWER)) |
165 | zlog_err("Can't lower privileges, %s", safe_strerror(errno)); | |
41d3fc96 | 166 | |
d62a17ae | 167 | return ipforward_ipv6(); |
718e3744 | 168 | } |
169 | ||
56c1f7d8 | 170 | |
d62a17ae | 171 | int ipforward_ipv6_off(void) |
718e3744 | 172 | { |
d62a17ae | 173 | FILE *fp; |
718e3744 | 174 | |
d62a17ae | 175 | if (zserv_privs.change(ZPRIVS_RAISE)) |
176 | zlog_err("Can't raise privileges, %s", safe_strerror(errno)); | |
edd7c245 | 177 | |
d62a17ae | 178 | fp = fopen(proc_ipv6_forwarding, "w"); |
edd7c245 | 179 | |
d62a17ae | 180 | if (fp == NULL) { |
181 | if (zserv_privs.change(ZPRIVS_LOWER)) | |
182 | zlog_err("Can't lower privileges, %s", | |
183 | safe_strerror(errno)); | |
184 | return -1; | |
185 | } | |
718e3744 | 186 | |
d62a17ae | 187 | fprintf(fp, "0\n"); |
718e3744 | 188 | |
d62a17ae | 189 | fclose(fp); |
718e3744 | 190 | |
d62a17ae | 191 | if (zserv_privs.change(ZPRIVS_LOWER)) |
192 | zlog_err("Can't lower privileges, %s", safe_strerror(errno)); | |
41d3fc96 | 193 | |
d62a17ae | 194 | return ipforward_ipv6(); |
718e3744 | 195 | } |