Annotation of embedaddon/quagga/ospf6d/ospf6_main.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 1999 Yasuhiro Ohara
                      3:  *
                      4:  * This file is part of GNU Zebra.
                      5:  *
                      6:  * GNU Zebra is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2, or (at your option) any
                      9:  * later version.
                     10:  *
                     11:  * GNU Zebra is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     14:  * General Public License for more details.
                     15:  *
                     16:  * You should have received a copy of the GNU General Public License
                     17:  * along with GNU Zebra; see the file COPYING.  If not, write to the 
                     18:  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
                     19:  * Boston, MA 02111-1307, USA.  
                     20:  */
                     21: 
                     22: #include <zebra.h>
                     23: #include <lib/version.h>
                     24: 
                     25: #include "getopt.h"
                     26: #include "thread.h"
                     27: #include "log.h"
                     28: #include "command.h"
                     29: #include "vty.h"
                     30: #include "memory.h"
                     31: #include "if.h"
                     32: #include "filter.h"
                     33: #include "prefix.h"
                     34: #include "plist.h"
                     35: #include "privs.h"
                     36: #include "sigevent.h"
                     37: #include "zclient.h"
                     38: 
                     39: #include "ospf6d.h"
                     40: #include "ospf6_top.h"
                     41: #include "ospf6_message.h"
                     42: #include "ospf6_asbr.h"
                     43: #include "ospf6_lsa.h"
                     44: 
                     45: /* Default configuration file name for ospf6d. */
                     46: #define OSPF6_DEFAULT_CONFIG       "ospf6d.conf"
                     47: 
                     48: /* Default port values. */
                     49: #define OSPF6_VTY_PORT             2606
                     50: 
                     51: /* ospf6d privileges */
                     52: zebra_capabilities_t _caps_p [] =
                     53: {
                     54:   ZCAP_NET_RAW,
                     55:   ZCAP_BIND
                     56: };
                     57: 
                     58: struct zebra_privs_t ospf6d_privs =
                     59: {
                     60: #if defined(QUAGGA_USER)
                     61:   .user = QUAGGA_USER,
                     62: #endif
                     63: #if defined QUAGGA_GROUP
                     64:   .group = QUAGGA_GROUP,
                     65: #endif
                     66: #ifdef VTY_GROUP
                     67:   .vty_group = VTY_GROUP,
                     68: #endif
                     69:   .caps_p = _caps_p,
                     70:   .cap_num_p = 2,
                     71:   .cap_num_i = 0
                     72: };
                     73: 
                     74: /* ospf6d options, we use GNU getopt library. */
                     75: struct option longopts[] = 
                     76: {
                     77:   { "daemon",      no_argument,       NULL, 'd'},
                     78:   { "config_file", required_argument, NULL, 'f'},
                     79:   { "pid_file",    required_argument, NULL, 'i'},
                     80:   { "vty_addr",    required_argument, NULL, 'A'},
                     81:   { "vty_port",    required_argument, NULL, 'P'},
                     82:   { "user",        required_argument, NULL, 'u'},
                     83:   { "group",       required_argument, NULL, 'g'},
                     84:   { "version",     no_argument,       NULL, 'v'},
                     85:   { "dryrun",      no_argument,       NULL, 'C'},
                     86:   { "help",        no_argument,       NULL, 'h'},
                     87:   { 0 }
                     88: };
                     89: 
                     90: /* Configuration file and directory. */
                     91: char config_default[] = SYSCONFDIR OSPF6_DEFAULT_CONFIG;
                     92: 
                     93: /* ospf6d program name. */
                     94: char *progname;
                     95: 
                     96: /* is daemon? */
                     97: int daemon_mode = 0;
                     98: 
                     99: /* Master of threads. */
                    100: struct thread_master *master;
                    101: 
                    102: /* Process ID saved for use by init system */
                    103: const char *pid_file = PATH_OSPF6D_PID;
                    104: 
                    105: /* Help information display. */
                    106: static void
                    107: usage (char *progname, int status)
                    108: {
                    109:   if (status != 0)
                    110:     fprintf (stderr, "Try `%s --help' for more information.\n", progname);
                    111:   else
                    112:     {    
                    113:       printf ("Usage : %s [OPTION...]\n\n\
                    114: Daemon which manages OSPF version 3.\n\n\
                    115: -d, --daemon       Runs in daemon mode\n\
                    116: -f, --config_file  Set configuration file name\n\
                    117: -i, --pid_file     Set process identifier file name\n\
                    118: -A, --vty_addr     Set vty's bind address\n\
                    119: -P, --vty_port     Set vty's port number\n\
                    120: -u, --user         User to run as\n\
                    121: -g, --group        Group to run as\n\
                    122: -v, --version      Print program version\n\
                    123: -C, --dryrun       Check configuration for validity and exit\n\
                    124: -h, --help         Display this help and exit\n\
                    125: \n\
                    126: Report bugs to zebra@zebra.org\n", progname);
                    127:     }
                    128: 
                    129:   exit (status);
                    130: }
                    131: 
                    132: static void
                    133: ospf6_exit (int status)
                    134: {
                    135:   extern struct ospf6 *ospf6;
                    136:   extern struct zclient *zclient;
                    137: 
                    138:   if (ospf6)
                    139:     ospf6_delete (ospf6);
                    140: 
                    141:   ospf6_message_terminate ();
                    142:   ospf6_asbr_terminate ();
                    143:   ospf6_lsa_terminate ();
                    144: 
                    145:   if_terminate ();
                    146:   vty_terminate ();
                    147:   cmd_terminate ();
                    148: 
                    149:   if (zclient)
                    150:     zclient_free (zclient);
                    151: 
                    152:   if (master)
                    153:     thread_master_free (master);
                    154: 
                    155:   if (zlog_default)
                    156:     closezlog (zlog_default);
                    157: 
                    158:   exit (status);
                    159: }
                    160: 
                    161: /* SIGHUP handler. */
                    162: static void 
                    163: sighup (void)
                    164: {
                    165:   zlog_info ("SIGHUP received");
                    166: }
                    167: 
                    168: /* SIGINT handler. */
                    169: static void
                    170: sigint (void)
                    171: {
                    172:   zlog_notice ("Terminating on signal SIGINT");
                    173:   ospf6_exit (0);
                    174: }
                    175: 
                    176: /* SIGTERM handler. */
                    177: static void
                    178: sigterm (void)
                    179: {
                    180:   zlog_notice ("Terminating on signal SIGTERM");
                    181:   ospf6_exit (0);
                    182: }
                    183: 
                    184: /* SIGUSR1 handler. */
                    185: static void
                    186: sigusr1 (void)
                    187: {
                    188:   zlog_info ("SIGUSR1 received");
                    189:   zlog_rotate (NULL);
                    190: }
                    191: 
                    192: struct quagga_signal_t ospf6_signals[] =
                    193: {
                    194:   {
                    195:     .signal = SIGHUP,
                    196:     .handler = &sighup,
                    197:   },
                    198:   {
                    199:     .signal = SIGINT,
                    200:     .handler = &sigint,
                    201:   },
                    202:   {
                    203:     .signal = SIGTERM,
                    204:     .handler = &sigterm,
                    205:   },
                    206:   {
                    207:     .signal = SIGUSR1,
                    208:     .handler = &sigusr1,
                    209:   },
                    210: };
                    211: 
                    212: /* Main routine of ospf6d. Treatment of argument and starting ospf finite
                    213:    state machine is handled here. */
                    214: int
                    215: main (int argc, char *argv[], char *envp[])
                    216: {
                    217:   char *p;
                    218:   int opt;
                    219:   char *vty_addr = NULL;
                    220:   int vty_port = 0;
                    221:   char *config_file = NULL;
                    222:   struct thread thread;
                    223:   int dryrun = 0;
                    224: 
                    225:   /* Set umask before anything for security */
                    226:   umask (0027);
                    227: 
                    228:   /* Preserve name of myself. */
                    229:   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
                    230: 
                    231:   /* Command line argument treatment. */
                    232:   while (1) 
                    233:     {
                    234:       opt = getopt_long (argc, argv, "df:i:hp:A:P:u:g:vC", longopts, 0);
                    235:     
                    236:       if (opt == EOF)
                    237:         break;
                    238: 
                    239:       switch (opt) 
                    240:         {
                    241:         case 0:
                    242:           break;
                    243:         case 'd':
                    244:           daemon_mode = 1;
                    245:           break;
                    246:         case 'f':
                    247:           config_file = optarg;
                    248:           break;
                    249:         case 'A':
                    250:           vty_addr = optarg;
                    251:           break;
                    252:         case 'i':
                    253:           pid_file = optarg;
                    254:           break;
                    255:         case 'P':
                    256:          /* Deal with atoi() returning 0 on failure, and ospf6d not
                    257:              listening on ospf6d port... */
                    258:           if (strcmp(optarg, "0") == 0)
                    259:             {
                    260:               vty_port = 0;
                    261:               break;
                    262:             }
                    263:           vty_port = atoi (optarg);
                    264:           if (vty_port <= 0 || vty_port > 0xffff)
                    265:             vty_port = OSPF6_VTY_PORT;
                    266:           break;
                    267:         case 'u':
                    268:           ospf6d_privs.user = optarg;
                    269:           break;
                    270:        case 'g':
                    271:          ospf6d_privs.group = optarg;
                    272:          break;
                    273:         case 'v':
                    274:           print_version (progname);
                    275:           exit (0);
                    276:           break;
                    277:        case 'C':
                    278:          dryrun = 1;
                    279:          break;
                    280:         case 'h':
                    281:           usage (progname, 0);
                    282:           break;
                    283:         default:
                    284:           usage (progname, 1);
                    285:           break;
                    286:         }
                    287:     }
                    288: 
                    289:   /* thread master */
                    290:   master = thread_master_create ();
                    291: 
                    292:   /* Initializations. */
                    293:   zlog_default = openzlog (progname, ZLOG_OSPF6,
                    294:                            LOG_CONS|LOG_NDELAY|LOG_PID,
                    295:                            LOG_DAEMON);
                    296:   zprivs_init (&ospf6d_privs);
                    297:   /* initialize zebra libraries */
                    298:   signal_init (master, Q_SIGC(ospf6_signals), ospf6_signals);
                    299:   cmd_init (1);
                    300:   vty_init (master);
                    301:   memory_init ();
                    302:   if_init ();
                    303:   access_list_init ();
                    304:   prefix_list_init ();
                    305: 
                    306:   /* initialize ospf6 */
                    307:   ospf6_init ();
                    308: 
                    309:   /* sort command vector */
                    310:   sort_node ();
                    311: 
                    312:   /* parse config file */
                    313:   vty_read_config (config_file, config_default);
                    314: 
                    315:   /* Start execution only if not in dry-run mode */
                    316:   if (dryrun)
                    317:     return(0);
                    318:   
                    319:   if (daemon_mode && daemon (0, 0) < 0)
                    320:     {
                    321:       zlog_err("OSPF6d daemon failed: %s", strerror(errno));
                    322:       exit (1);
                    323:     }
                    324: 
                    325:   /* pid file create */
                    326:   pid_output (pid_file);
                    327: 
                    328:   /* Make ospf6 vty socket. */
                    329:   if (!vty_port)
                    330:     vty_port = OSPF6_VTY_PORT;
                    331:   vty_serv_sock (vty_addr, vty_port, OSPF6_VTYSH_PATH);
                    332: 
                    333:   /* Print start message */
                    334:   zlog_notice ("OSPF6d (Quagga-%s ospf6d-%s) starts: vty@%d",
                    335:                QUAGGA_VERSION, OSPF6_DAEMON_VERSION,vty_port);
                    336: 
                    337:   /* Start finite state machine, here we go! */
                    338:   while (thread_fetch (master, &thread))
                    339:     thread_call (&thread);
                    340: 
                    341:   /* Log in case thread failed */
                    342:   zlog_warn ("Thread failed");
                    343: 
                    344:   /* Not reached. */
                    345:   ospf6_exit (0);
                    346: }
                    347: 
                    348: 

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