Annotation of embedaddon/quagga/ospfd/ospf_main.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * OSPFd main routine.
        !             3:  *   Copyright (C) 1998, 99 Kunihiro Ishiguro, Toshiaki Takada
        !             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 <lib/version.h>
        !            26: #include "getopt.h"
        !            27: #include "thread.h"
        !            28: #include "prefix.h"
        !            29: #include "linklist.h"
        !            30: #include "if.h"
        !            31: #include "vector.h"
        !            32: #include "vty.h"
        !            33: #include "command.h"
        !            34: #include "filter.h"
        !            35: #include "plist.h"
        !            36: #include "stream.h"
        !            37: #include "log.h"
        !            38: #include "memory.h"
        !            39: #include "privs.h"
        !            40: #include "sigevent.h"
        !            41: 
        !            42: #include "ospfd/ospfd.h"
        !            43: #include "ospfd/ospf_interface.h"
        !            44: #include "ospfd/ospf_asbr.h"
        !            45: #include "ospfd/ospf_lsa.h"
        !            46: #include "ospfd/ospf_lsdb.h"
        !            47: #include "ospfd/ospf_neighbor.h"
        !            48: #include "ospfd/ospf_dump.h"
        !            49: #include "ospfd/ospf_zebra.h"
        !            50: #include "ospfd/ospf_vty.h"
        !            51: 
        !            52: /* ospfd privileges */
        !            53: zebra_capabilities_t _caps_p [] = 
        !            54: {
        !            55:   ZCAP_NET_RAW,
        !            56:   ZCAP_BIND,
        !            57:   ZCAP_NET_ADMIN,
        !            58: };
        !            59: 
        !            60: struct zebra_privs_t ospfd_privs =
        !            61: {
        !            62: #if defined(QUAGGA_USER) && defined(QUAGGA_GROUP)
        !            63:   .user = QUAGGA_USER,
        !            64:   .group = QUAGGA_GROUP,
        !            65: #endif
        !            66: #if defined(VTY_GROUP)
        !            67:   .vty_group = VTY_GROUP,
        !            68: #endif
        !            69:   .caps_p = _caps_p,
        !            70:   .cap_num_p = sizeof(_caps_p)/sizeof(_caps_p[0]),
        !            71:   .cap_num_i = 0
        !            72: };
        !            73: 
        !            74: /* Configuration filename and directory. */
        !            75: char config_default[] = SYSCONFDIR OSPF_DEFAULT_CONFIG;
        !            76: 
        !            77: /* OSPFd options. */
        !            78: struct option longopts[] = 
        !            79: {
        !            80:   { "daemon",      no_argument,       NULL, 'd'},
        !            81:   { "config_file", required_argument, NULL, 'f'},
        !            82:   { "pid_file",    required_argument, NULL, 'i'},
        !            83:   { "dryrun",      no_argument,       NULL, 'C'},
        !            84:   { "help",        no_argument,       NULL, 'h'},
        !            85:   { "vty_addr",    required_argument, NULL, 'A'},
        !            86:   { "vty_port",    required_argument, NULL, 'P'},
        !            87:   { "user",        required_argument, NULL, 'u'},
        !            88:   { "group",       required_argument, NULL, 'g'},
        !            89:   { "apiserver",   no_argument,       NULL, 'a'},
        !            90:   { "version",     no_argument,       NULL, 'v'},
        !            91:   { 0 }
        !            92: };
        !            93: 
        !            94: /* OSPFd program name */
        !            95: 
        !            96: /* Master of threads. */
        !            97: struct thread_master *master;
        !            98: 
        !            99: /* Process ID saved for use by init system */
        !           100: const char *pid_file = PATH_OSPFD_PID;
        !           101: 
        !           102: #ifdef SUPPORT_OSPF_API
        !           103: extern int ospf_apiserver_enable;
        !           104: #endif /* SUPPORT_OSPF_API */
        !           105: 
        !           106: /* Help information display. */
        !           107: static void __attribute__ ((noreturn))
        !           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\
        !           115: Daemon which manages OSPF.\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\
        !           119: -A, --vty_addr     Set vty's bind address\n\
        !           120: -P, --vty_port     Set vty's port number\n\
        !           121: -u, --user         User to run as\n\
        !           122: -g, --group        Group to run as\n\
        !           123: -a. --apiserver    Enable OSPF apiserver\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 %s\n", progname, ZEBRA_BUG_ADDRESS);
        !           129:     }
        !           130:   exit (status);
        !           131: }
        !           132: 
        !           133: /* SIGHUP handler. */
        !           134: static void 
        !           135: sighup (void)
        !           136: {
        !           137:   zlog (NULL, LOG_INFO, "SIGHUP received");
        !           138: }
        !           139: 
        !           140: /* SIGINT / SIGTERM handler. */
        !           141: static void
        !           142: sigint (void)
        !           143: {
        !           144:   zlog_notice ("Terminating on signal");
        !           145:   ospf_terminate ();
        !           146: }
        !           147: 
        !           148: /* SIGUSR1 handler. */
        !           149: static void
        !           150: sigusr1 (void)
        !           151: {
        !           152:   zlog_rotate (NULL);
        !           153: }
        !           154: 
        !           155: struct quagga_signal_t ospf_signals[] =
        !           156: {
        !           157:   {
        !           158:     .signal = SIGHUP,
        !           159:     .handler = &sighup,
        !           160:   },
        !           161:   {
        !           162:     .signal = SIGUSR1,
        !           163:     .handler = &sigusr1,
        !           164:   },  
        !           165:   {
        !           166:     .signal = SIGINT,
        !           167:     .handler = &sigint,
        !           168:   },
        !           169:   {
        !           170:     .signal = SIGTERM,
        !           171:     .handler = &sigint,
        !           172:   },
        !           173: };
        !           174: 
        !           175: /* OSPFd main routine. */
        !           176: int
        !           177: main (int argc, char **argv)
        !           178: {
        !           179:   char *p;
        !           180:   char *vty_addr = NULL;
        !           181:   int vty_port = OSPF_VTY_PORT;
        !           182:   int daemon_mode = 0;
        !           183:   char *config_file = NULL;
        !           184:   char *progname;
        !           185:   struct thread thread;
        !           186:   int dryrun = 0;
        !           187: 
        !           188:   /* Set umask before anything for security */
        !           189:   umask (0027);
        !           190: 
        !           191:   /* get program name */
        !           192:   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
        !           193: 
        !           194:   /* Invoked by a priviledged user? -- endo. */
        !           195:   if (geteuid () != 0)
        !           196:     {
        !           197:       errno = EPERM;
        !           198:       perror (progname);
        !           199:       exit (1);
        !           200:     }
        !           201: 
        !           202:   zlog_default = openzlog (progname, ZLOG_OSPF,
        !           203:                           LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
        !           204: 
        !           205:   /* OSPF master init. */
        !           206:   ospf_master_init ();
        !           207: 
        !           208: #ifdef SUPPORT_OSPF_API
        !           209:   /* OSPF apiserver is disabled by default. */
        !           210:   ospf_apiserver_enable = 0;
        !           211: #endif /* SUPPORT_OSPF_API */
        !           212: 
        !           213:   while (1) 
        !           214:     {
        !           215:       int opt;
        !           216: 
        !           217:       opt = getopt_long (argc, argv, "df:i:hA:P:u:g:avC", longopts, 0);
        !           218:     
        !           219:       if (opt == EOF)
        !           220:        break;
        !           221: 
        !           222:       switch (opt) 
        !           223:        {
        !           224:        case 0:
        !           225:          break;
        !           226:        case 'd':
        !           227:          daemon_mode = 1;
        !           228:          break;
        !           229:        case 'f':
        !           230:          config_file = optarg;
        !           231:          break;
        !           232:        case 'A':
        !           233:          vty_addr = optarg;
        !           234:          break;
        !           235:         case 'i':
        !           236:           pid_file = optarg;
        !           237:           break;
        !           238:        case 'P':
        !           239:           /* Deal with atoi() returning 0 on failure, and ospfd not
        !           240:              listening on ospfd port... */
        !           241:           if (strcmp(optarg, "0") == 0) 
        !           242:             {
        !           243:               vty_port = 0;
        !           244:               break;
        !           245:             } 
        !           246:           vty_port = atoi (optarg);
        !           247:           if (vty_port <= 0 || vty_port > 0xffff)
        !           248:             vty_port = OSPF_VTY_PORT;
        !           249:          break;
        !           250:        case 'u':
        !           251:          ospfd_privs.user = optarg;
        !           252:          break;
        !           253:        case 'g':
        !           254:          ospfd_privs.group = optarg;
        !           255:          break;
        !           256: #ifdef SUPPORT_OSPF_API
        !           257:        case 'a':
        !           258:          ospf_apiserver_enable = 1;
        !           259:          break;
        !           260: #endif /* SUPPORT_OSPF_API */
        !           261:        case 'v':
        !           262:          print_version (progname);
        !           263:          exit (0);
        !           264:          break;
        !           265:        case 'C':
        !           266:          dryrun = 1;
        !           267:          break;
        !           268:        case 'h':
        !           269:          usage (progname, 0);
        !           270:          break;
        !           271:        default:
        !           272:          usage (progname, 1);
        !           273:          break;
        !           274:        }
        !           275:     }
        !           276: 
        !           277:   /* Initializations. */
        !           278:   master = om->master;
        !           279: 
        !           280:   /* Library inits. */
        !           281:   zprivs_init (&ospfd_privs);
        !           282:   signal_init (master, Q_SIGC(ospf_signals), ospf_signals);
        !           283:   cmd_init (1);
        !           284:   debug_init ();
        !           285:   vty_init (master);
        !           286:   memory_init ();
        !           287: 
        !           288:   access_list_init ();
        !           289:   prefix_list_init ();
        !           290: 
        !           291:   /* OSPFd inits. */
        !           292:   ospf_if_init ();
        !           293:   ospf_zebra_init ();
        !           294: 
        !           295:   /* OSPF vty inits. */
        !           296:   ospf_vty_init ();
        !           297:   ospf_vty_show_init ();
        !           298: 
        !           299:   ospf_route_map_init ();
        !           300: #ifdef HAVE_SNMP
        !           301:   ospf_snmp_init ();
        !           302: #endif /* HAVE_SNMP */
        !           303: #ifdef HAVE_OPAQUE_LSA
        !           304:   ospf_opaque_init ();
        !           305: #endif /* HAVE_OPAQUE_LSA */
        !           306:   
        !           307:   sort_node ();
        !           308: 
        !           309:   /* Get configuration file. */
        !           310:   vty_read_config (config_file, config_default);
        !           311: 
        !           312:   /* Start execution only if not in dry-run mode */
        !           313:   if (dryrun)
        !           314:     return(0);
        !           315:   
        !           316:   /* Change to the daemon program. */
        !           317:   if (daemon_mode && daemon (0, 0) < 0)
        !           318:     {
        !           319:       zlog_err("OSPFd daemon failed: %s", strerror(errno));
        !           320:       exit (1);
        !           321:     }
        !           322: 
        !           323:   /* Process id file create. */
        !           324:   pid_output (pid_file);
        !           325: 
        !           326:   /* Create VTY socket */
        !           327:   vty_serv_sock (vty_addr, vty_port, OSPF_VTYSH_PATH);
        !           328: 
        !           329:   /* Print banner. */
        !           330:   zlog_notice ("OSPFd %s starting: vty@%d", QUAGGA_VERSION, vty_port);
        !           331: 
        !           332:   /* Fetch next active thread. */
        !           333:   while (thread_fetch (master, &thread))
        !           334:     thread_call (&thread);
        !           335: 
        !           336:   /* Not reached. */
        !           337:   return (0);
        !           338: }
        !           339: 

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