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>