Annotation of embedaddon/quagga/pimd/pim_main.c, revision 1.1

1.1     ! misho       1: /*
        !             2:   PIM for Quagga
        !             3:   Copyright (C) 2008  Everton da Silva Marques
        !             4: 
        !             5:   This program is free software; you can redistribute it and/or modify
        !             6:   it under the terms of the GNU General Public License as published by
        !             7:   the Free Software Foundation; either version 2 of the License, or
        !             8:   (at your option) any later version.
        !             9: 
        !            10:   This program is distributed in the hope that it will be useful, but
        !            11:   WITHOUT ANY WARRANTY; without even the implied warranty of
        !            12:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            13:   General Public License for more details.
        !            14:   
        !            15:   You should have received a copy of the GNU General Public License
        !            16:   along with this program; see the file COPYING; if not, write to the
        !            17:   Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
        !            18:   MA 02110-1301 USA
        !            19:   
        !            20:   $QuaggaId: $Format:%an, %ai, %h$ $
        !            21: */
        !            22: 
        !            23: #include <zebra.h>
        !            24: 
        !            25: #include "log.h"
        !            26: #include "privs.h" 
        !            27: #include "version.h"
        !            28: #include <getopt.h>
        !            29: #include "command.h"
        !            30: #include "thread.h"
        !            31: #include <signal.h>
        !            32: 
        !            33: #include "memory.h"
        !            34: #include "vrf.h"
        !            35: #include "filter.h"
        !            36: #include "vty.h"
        !            37: #include "sigevent.h"
        !            38: #include "version.h"
        !            39: 
        !            40: #include "pimd.h"
        !            41: #include "pim_version.h"
        !            42: #include "pim_signals.h"
        !            43: #include "pim_zebra.h"
        !            44: 
        !            45: #ifdef PIM_ZCLIENT_DEBUG
        !            46: extern int zclient_debug;
        !            47: #endif
        !            48: 
        !            49: extern struct host host;
        !            50: 
        !            51: char config_default[] = SYSCONFDIR PIMD_DEFAULT_CONFIG;
        !            52: 
        !            53: struct option longopts[] = {
        !            54:   { "daemon",        no_argument,       NULL, 'd'},
        !            55:   { "config_file",   required_argument, NULL, 'f'},
        !            56:   { "pid_file",      required_argument, NULL, 'i'},
        !            57:   { "vty_addr",      required_argument, NULL, 'A'},
        !            58:   { "vty_port",      required_argument, NULL, 'P'},
        !            59:   { "version",       no_argument,       NULL, 'v'},
        !            60:   { "debug_zclient", no_argument,       NULL, 'Z'},
        !            61:   { "help",          no_argument,       NULL, 'h'},
        !            62:   { 0 }
        !            63: };
        !            64: 
        !            65: /* pimd privileges */
        !            66: zebra_capabilities_t _caps_p [] = 
        !            67: {
        !            68:   ZCAP_NET_ADMIN,
        !            69:   ZCAP_SYS_ADMIN,
        !            70:   ZCAP_NET_RAW,
        !            71: };
        !            72: 
        !            73: /* pimd privileges to run with */
        !            74: struct zebra_privs_t pimd_privs =
        !            75: {
        !            76: #if defined(QUAGGA_USER) && defined(QUAGGA_GROUP)
        !            77:   .user = QUAGGA_USER,
        !            78:   .group = QUAGGA_GROUP,
        !            79: #endif
        !            80: #ifdef VTY_GROUP
        !            81:   .vty_group = VTY_GROUP,
        !            82: #endif
        !            83:   .caps_p = _caps_p,
        !            84:   .cap_num_p = sizeof(_caps_p)/sizeof(_caps_p[0]),
        !            85:   .cap_num_i = 0
        !            86: };
        !            87: 
        !            88: char* progname;
        !            89: const char *pid_file = PATH_PIMD_PID;
        !            90: 
        !            91: static void usage(int status)
        !            92: {
        !            93:   if (status != 0)
        !            94:     fprintf (stderr, "Try `%s --help' for more information.\n", progname);
        !            95:   else {    
        !            96:     printf ("Usage : %s [OPTION...]\n\
        !            97: Daemon which manages PIM.\n\n\
        !            98: -d, --daemon         Run in daemon mode\n\
        !            99: -f, --config_file    Set configuration file name\n\
        !           100: -i, --pid_file       Set process identifier file name\n\
        !           101: -z, --socket         Set path of zebra socket\n\
        !           102: -A, --vty_addr       Set vty's bind address\n\
        !           103: -P, --vty_port       Set vty's port number\n\
        !           104: -v, --version        Print program version\n\
        !           105: "
        !           106: 
        !           107: #ifdef PIM_ZCLIENT_DEBUG
        !           108: "\
        !           109: -Z, --debug_zclient  Enable zclient debugging\n\
        !           110: "
        !           111: #endif
        !           112: 
        !           113: "\
        !           114: -h, --help           Display this help and exit\n\
        !           115: \n\
        !           116: Report bugs to %s\n", progname, PIMD_BUG_ADDRESS);
        !           117:   }
        !           118: 
        !           119:   exit (status);
        !           120: }
        !           121: 
        !           122: 
        !           123: int main(int argc, char** argv, char** envp) {
        !           124:   char *p;
        !           125:   char *vty_addr = NULL;
        !           126:   int vty_port = -1;
        !           127:   int daemon_mode = 0;
        !           128:   char *config_file = NULL;
        !           129:   char *zebra_sock_path = NULL;
        !           130:   struct thread thread;
        !           131:           
        !           132:   umask(0027);
        !           133:  
        !           134:   progname = ((p = strrchr(argv[0], '/')) ? ++p : argv[0]);
        !           135:  
        !           136:   zlog_default = openzlog(progname, ZLOG_PIM,
        !           137:                          LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
        !           138:      
        !           139:   /* this while just reads the options */                       
        !           140:   while (1) {
        !           141:     int opt;
        !           142:             
        !           143:     opt = getopt_long (argc, argv, "df:i:z:A:P:vZh", longopts, 0);
        !           144:                       
        !           145:     if (opt == EOF)
        !           146:       break;
        !           147:     
        !           148:     switch (opt) {
        !           149:     case 0:
        !           150:       break;
        !           151:     case 'd':
        !           152:       daemon_mode = 1;
        !           153:       break;
        !           154:     case 'f':
        !           155:       config_file = optarg;
        !           156:       break;
        !           157:     case 'i':
        !           158:       pid_file = optarg;
        !           159:       break;
        !           160:     case 'z':
        !           161:       zebra_sock_path = optarg;
        !           162:       break;
        !           163:     case 'A':
        !           164:       vty_addr = optarg;
        !           165:       break;
        !           166:     case 'P':
        !           167:       vty_port = atoi (optarg);
        !           168:       break;
        !           169:     case 'v':
        !           170:       printf(PIMD_PROGNAME " version %s\n", PIMD_VERSION);
        !           171:       print_version(QUAGGA_PROGNAME);
        !           172:       exit (0);
        !           173:       break;
        !           174: #ifdef PIM_ZCLIENT_DEBUG
        !           175:     case 'Z':
        !           176:       zclient_debug = 1;
        !           177:       break;
        !           178: #endif
        !           179:     case 'h':
        !           180:       usage (0);
        !           181:       break;
        !           182:     default:
        !           183:       usage (1);
        !           184:       break;
        !           185:     }
        !           186:   }
        !           187: 
        !           188:   master = thread_master_create();
        !           189: 
        !           190:   zlog_notice("Quagga %s " PIMD_PROGNAME " %s starting",
        !           191:              QUAGGA_VERSION, PIMD_VERSION);
        !           192: 
        !           193:   /* 
        !           194:    * Initializations
        !           195:    */
        !           196:   zprivs_init (&pimd_privs);
        !           197:   pim_signals_init();
        !           198:   cmd_init(1);
        !           199:   vty_init(master);
        !           200:   memory_init();
        !           201:   vrf_init();
        !           202:   access_list_init();
        !           203:   pim_init();
        !           204: 
        !           205:   /*
        !           206:    * Initialize zclient "update" and "lookup" sockets
        !           207:    */
        !           208:   pim_zebra_init (master, zebra_sock_path);
        !           209: 
        !           210:   zlog_notice("Loading configuration - begin");
        !           211: 
        !           212:   /* Get configuration file. */
        !           213:   vty_read_config(config_file, config_default);
        !           214: 
        !           215:   /*
        !           216:     Starting from here zlog_* functions will log according configuration
        !           217:    */
        !           218: 
        !           219:   zlog_notice("Loading configuration - end");
        !           220: 
        !           221:   /* Change to the daemon program. */
        !           222:   if (daemon_mode) {
        !           223:     if (daemon(0, 0)) {
        !           224:       zlog_warn("failed to daemonize");
        !           225:     }
        !           226:   }
        !           227: 
        !           228:   /* Process ID file creation. */
        !           229:   pid_output(pid_file);
        !           230: 
        !           231:   /* Create pimd VTY socket */
        !           232:   if (vty_port < 0)
        !           233:     vty_port = PIMD_VTY_PORT;
        !           234:   vty_serv_sock(vty_addr, vty_port, PIM_VTYSH_PATH);
        !           235: 
        !           236:   zlog_notice("Quagga %s " PIMD_PROGNAME " %s starting, VTY interface at port TCP %d",
        !           237:              QUAGGA_VERSION, PIMD_VERSION, vty_port);
        !           238: 
        !           239: #ifdef PIM_DEBUG_BYDEFAULT
        !           240:   zlog_notice("PIM_DEBUG_BYDEFAULT: Enabling all debug commands");
        !           241:   PIM_DO_DEBUG_PIM_EVENTS;
        !           242:   PIM_DO_DEBUG_PIM_PACKETS;
        !           243:   PIM_DO_DEBUG_PIM_TRACE;
        !           244:   PIM_DO_DEBUG_IGMP_EVENTS;
        !           245:   PIM_DO_DEBUG_IGMP_PACKETS;
        !           246:   PIM_DO_DEBUG_IGMP_TRACE;
        !           247:   PIM_DO_DEBUG_ZEBRA;
        !           248: #endif
        !           249: 
        !           250: #ifdef PIM_ZCLIENT_DEBUG
        !           251:   zlog_notice("PIM_ZCLIENT_DEBUG: zclient debugging is supported, mode is %s (see option -Z)",
        !           252:              zclient_debug ? "ON" : "OFF");
        !           253: #endif
        !           254: 
        !           255: #ifdef PIM_CHECK_RECV_IFINDEX_SANITY
        !           256:   zlog_notice("PIM_CHECK_RECV_IFINDEX_SANITY: will match sock/recv ifindex");
        !           257: #ifdef PIM_REPORT_RECV_IFINDEX_MISMATCH
        !           258:   zlog_notice("PIM_REPORT_RECV_IFINDEX_MISMATCH: will report sock/recv ifindex mismatch");
        !           259: #endif
        !           260: #endif
        !           261: 
        !           262: #ifdef PIM_UNEXPECTED_KERNEL_UPCALL
        !           263:   zlog_notice("PIM_UNEXPECTED_KERNEL_UPCALL: report unexpected kernel upcall");
        !           264: #endif
        !           265: 
        !           266: #ifdef HAVE_CLOCK_MONOTONIC
        !           267:   zlog_notice("HAVE_CLOCK_MONOTONIC");
        !           268: #else
        !           269:   zlog_notice("!HAVE_CLOCK_MONOTONIC");
        !           270: #endif
        !           271: 
        !           272:   while (thread_fetch(master, &thread))
        !           273:     thread_call(&thread);
        !           274: 
        !           275:   zlog_err("%s %s: thread_fetch() returned NULL, exiting",
        !           276:           __FILE__, __PRETTY_FUNCTION__);
        !           277: 
        !           278:   /* never reached */
        !           279:   return 0;
        !           280: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>