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