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>