Annotation of embedaddon/quagga/ospf6d/ospf6_main.c, revision 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>