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

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'},
1.1.1.2 ! misho      80:   { "socket",      required_argument, NULL, 'z'},
1.1       misho      81:   { "vty_addr",    required_argument, NULL, 'A'},
                     82:   { "vty_port",    required_argument, NULL, 'P'},
                     83:   { "user",        required_argument, NULL, 'u'},
                     84:   { "group",       required_argument, NULL, 'g'},
                     85:   { "version",     no_argument,       NULL, 'v'},
                     86:   { "dryrun",      no_argument,       NULL, 'C'},
                     87:   { "help",        no_argument,       NULL, 'h'},
                     88:   { 0 }
                     89: };
                     90: 
                     91: /* Configuration file and directory. */
                     92: char config_default[] = SYSCONFDIR OSPF6_DEFAULT_CONFIG;
                     93: 
                     94: /* ospf6d program name. */
                     95: char *progname;
                     96: 
                     97: /* is daemon? */
                     98: int daemon_mode = 0;
                     99: 
                    100: /* Master of threads. */
                    101: struct thread_master *master;
                    102: 
                    103: /* Process ID saved for use by init system */
                    104: const char *pid_file = PATH_OSPF6D_PID;
                    105: 
                    106: /* Help information display. */
                    107: static void
                    108: usage (char *progname, int status)
                    109: {
                    110:   if (status != 0)
                    111:     fprintf (stderr, "Try `%s --help' for more information.\n", progname);
                    112:   else
                    113:     {    
                    114:       printf ("Usage : %s [OPTION...]\n\n\
                    115: Daemon which manages OSPF version 3.\n\n\
                    116: -d, --daemon       Runs in daemon mode\n\
                    117: -f, --config_file  Set configuration file name\n\
                    118: -i, --pid_file     Set process identifier file name\n\
1.1.1.2 ! misho     119: -z, --socket       Set path of zebra socket\n\
1.1       misho     120: -A, --vty_addr     Set vty's bind address\n\
                    121: -P, --vty_port     Set vty's port number\n\
                    122: -u, --user         User to run as\n\
                    123: -g, --group        Group to run as\n\
                    124: -v, --version      Print program version\n\
                    125: -C, --dryrun       Check configuration for validity and exit\n\
                    126: -h, --help         Display this help and exit\n\
                    127: \n\
                    128: Report bugs to zebra@zebra.org\n", progname);
                    129:     }
                    130: 
                    131:   exit (status);
                    132: }
                    133: 
1.1.1.2 ! misho     134: static void __attribute__ ((noreturn))
1.1       misho     135: ospf6_exit (int status)
                    136: {
                    137:   extern struct ospf6 *ospf6;
                    138:   extern struct zclient *zclient;
                    139: 
                    140:   if (ospf6)
                    141:     ospf6_delete (ospf6);
                    142: 
                    143:   ospf6_message_terminate ();
                    144:   ospf6_asbr_terminate ();
                    145:   ospf6_lsa_terminate ();
                    146: 
                    147:   if_terminate ();
                    148:   vty_terminate ();
                    149:   cmd_terminate ();
                    150: 
                    151:   if (zclient)
                    152:     zclient_free (zclient);
                    153: 
                    154:   if (master)
                    155:     thread_master_free (master);
                    156: 
                    157:   if (zlog_default)
                    158:     closezlog (zlog_default);
                    159: 
                    160:   exit (status);
                    161: }
                    162: 
                    163: /* SIGHUP handler. */
                    164: static void 
                    165: sighup (void)
                    166: {
                    167:   zlog_info ("SIGHUP received");
                    168: }
                    169: 
                    170: /* SIGINT handler. */
                    171: static void
                    172: sigint (void)
                    173: {
                    174:   zlog_notice ("Terminating on signal SIGINT");
                    175:   ospf6_exit (0);
                    176: }
                    177: 
                    178: /* SIGTERM handler. */
                    179: static void
                    180: sigterm (void)
                    181: {
                    182:   zlog_notice ("Terminating on signal SIGTERM");
1.1.1.2 ! misho     183:   ospf6_clean();
1.1       misho     184:   ospf6_exit (0);
                    185: }
                    186: 
                    187: /* SIGUSR1 handler. */
                    188: static void
                    189: sigusr1 (void)
                    190: {
                    191:   zlog_info ("SIGUSR1 received");
                    192:   zlog_rotate (NULL);
                    193: }
                    194: 
                    195: struct quagga_signal_t ospf6_signals[] =
                    196: {
                    197:   {
                    198:     .signal = SIGHUP,
                    199:     .handler = &sighup,
                    200:   },
                    201:   {
                    202:     .signal = SIGINT,
                    203:     .handler = &sigint,
                    204:   },
                    205:   {
                    206:     .signal = SIGTERM,
                    207:     .handler = &sigterm,
                    208:   },
                    209:   {
                    210:     .signal = SIGUSR1,
                    211:     .handler = &sigusr1,
                    212:   },
                    213: };
                    214: 
                    215: /* Main routine of ospf6d. Treatment of argument and starting ospf finite
                    216:    state machine is handled here. */
                    217: int
                    218: main (int argc, char *argv[], char *envp[])
                    219: {
                    220:   char *p;
                    221:   int opt;
                    222:   char *vty_addr = NULL;
                    223:   int vty_port = 0;
                    224:   char *config_file = NULL;
                    225:   struct thread thread;
                    226:   int dryrun = 0;
                    227: 
                    228:   /* Set umask before anything for security */
                    229:   umask (0027);
                    230: 
                    231:   /* Preserve name of myself. */
                    232:   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
                    233: 
                    234:   /* Command line argument treatment. */
                    235:   while (1) 
                    236:     {
1.1.1.2 ! misho     237:       opt = getopt_long (argc, argv, "df:i:z:hp:A:P:u:g:vC", longopts, 0);
1.1       misho     238:     
                    239:       if (opt == EOF)
                    240:         break;
                    241: 
                    242:       switch (opt) 
                    243:         {
                    244:         case 0:
                    245:           break;
                    246:         case 'd':
                    247:           daemon_mode = 1;
                    248:           break;
                    249:         case 'f':
                    250:           config_file = optarg;
                    251:           break;
                    252:         case 'A':
                    253:           vty_addr = optarg;
                    254:           break;
                    255:         case 'i':
                    256:           pid_file = optarg;
                    257:           break;
1.1.1.2 ! misho     258:         case 'z':
        !           259:           zclient_serv_path_set (optarg);
        !           260:           break;
1.1       misho     261:         case 'P':
                    262:          /* Deal with atoi() returning 0 on failure, and ospf6d not
                    263:              listening on ospf6d port... */
                    264:           if (strcmp(optarg, "0") == 0)
                    265:             {
                    266:               vty_port = 0;
                    267:               break;
                    268:             }
                    269:           vty_port = atoi (optarg);
                    270:           if (vty_port <= 0 || vty_port > 0xffff)
                    271:             vty_port = OSPF6_VTY_PORT;
                    272:           break;
                    273:         case 'u':
                    274:           ospf6d_privs.user = optarg;
                    275:           break;
                    276:        case 'g':
                    277:          ospf6d_privs.group = optarg;
                    278:          break;
                    279:         case 'v':
                    280:           print_version (progname);
                    281:           exit (0);
                    282:           break;
                    283:        case 'C':
                    284:          dryrun = 1;
                    285:          break;
                    286:         case 'h':
                    287:           usage (progname, 0);
                    288:           break;
                    289:         default:
                    290:           usage (progname, 1);
                    291:           break;
                    292:         }
                    293:     }
                    294: 
1.1.1.2 ! misho     295:   if (geteuid () != 0)
        !           296:     {
        !           297:       errno = EPERM;
        !           298:       perror (progname);
        !           299:       exit (1);
        !           300:     }
        !           301: 
1.1       misho     302:   /* thread master */
                    303:   master = thread_master_create ();
                    304: 
                    305:   /* Initializations. */
                    306:   zlog_default = openzlog (progname, ZLOG_OSPF6,
                    307:                            LOG_CONS|LOG_NDELAY|LOG_PID,
                    308:                            LOG_DAEMON);
                    309:   zprivs_init (&ospf6d_privs);
                    310:   /* initialize zebra libraries */
                    311:   signal_init (master, Q_SIGC(ospf6_signals), ospf6_signals);
                    312:   cmd_init (1);
                    313:   vty_init (master);
                    314:   memory_init ();
                    315:   if_init ();
                    316:   access_list_init ();
                    317:   prefix_list_init ();
                    318: 
                    319:   /* initialize ospf6 */
                    320:   ospf6_init ();
                    321: 
                    322:   /* sort command vector */
                    323:   sort_node ();
                    324: 
                    325:   /* parse config file */
                    326:   vty_read_config (config_file, config_default);
                    327: 
                    328:   /* Start execution only if not in dry-run mode */
                    329:   if (dryrun)
                    330:     return(0);
                    331:   
                    332:   if (daemon_mode && daemon (0, 0) < 0)
                    333:     {
                    334:       zlog_err("OSPF6d daemon failed: %s", strerror(errno));
                    335:       exit (1);
                    336:     }
                    337: 
                    338:   /* pid file create */
                    339:   pid_output (pid_file);
                    340: 
                    341:   /* Make ospf6 vty socket. */
                    342:   if (!vty_port)
                    343:     vty_port = OSPF6_VTY_PORT;
                    344:   vty_serv_sock (vty_addr, vty_port, OSPF6_VTYSH_PATH);
                    345: 
                    346:   /* Print start message */
                    347:   zlog_notice ("OSPF6d (Quagga-%s ospf6d-%s) starts: vty@%d",
                    348:                QUAGGA_VERSION, OSPF6_DAEMON_VERSION,vty_port);
                    349: 
                    350:   /* Start finite state machine, here we go! */
                    351:   while (thread_fetch (master, &thread))
                    352:     thread_call (&thread);
                    353: 
                    354:   /* Log in case thread failed */
                    355:   zlog_warn ("Thread failed");
                    356: 
                    357:   /* Not reached. */
                    358:   ospf6_exit (0);
                    359: }
                    360: 
                    361: 

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