Annotation of embedaddon/quagga/zebra/ipforward_proc.c, revision 1.1.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>