rtread_sysctl.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:2k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * Kernel routing table read by sysctl function.
  3.  * Copyright (C) 1997, 98 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. #include <zebra.h>
  23. #include "memory.h"
  24. #include "log.h"
  25. /* Kernel routing table read up by sysctl function. */
  26. int
  27. route_read ()
  28. {
  29.   caddr_t buf, end, ref;
  30.   size_t bufsiz;
  31.   struct rt_msghdr *rtm;
  32.   void rtm_read (struct rt_msghdr *);
  33.   
  34. #define MIBSIZ 6
  35.   int mib[MIBSIZ] = 
  36.   {
  37.     CTL_NET,
  38.     PF_ROUTE,
  39.     0,
  40.     0,
  41.     NET_RT_DUMP,
  42.     0
  43.   };
  44.       
  45.   /* Get buffer size. */
  46.   if (sysctl (mib, MIBSIZ, NULL, &bufsiz, NULL, 0) < 0) 
  47.     {
  48.       zlog_warn ("sysctl fail: %s", strerror (errno));
  49.       return -1;
  50.     }
  51.   /* Allocate buffer. */
  52.   ref = buf = XMALLOC (MTYPE_TMP, bufsiz);
  53.   
  54.   /* Read routing table information by calling sysctl(). */
  55.   if (sysctl (mib, MIBSIZ, buf, &bufsiz, NULL, 0) < 0) 
  56.     {
  57.       zlog_warn ("sysctl() fail by %s", strerror (errno));
  58.       return -1;
  59.     }
  60.   for (end = buf + bufsiz; buf < end; buf += rtm->rtm_msglen) 
  61.     {
  62.       rtm = (struct rt_msghdr *) buf;
  63.       rtm_read (rtm);
  64.     }
  65.   /* Free buffer. */
  66.   XFREE (MTYPE_TMP, ref);
  67.   return 0;
  68. }