ospf6_main.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:6k
源码类别:

网络

开发平台:

Unix_Linux

  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. #include <zebra.h>
  22. #include "getopt.h"
  23. #include "thread.h"
  24. #include "log.h"
  25. #include "version.h"
  26. #include "command.h"
  27. #include "vty.h"
  28. #include "memory.h"
  29. #include "if.h"
  30. #include "filter.h"
  31. #include "prefix.h"
  32. #include "plist.h"
  33. #include "ospf6d.h"
  34. /* Default configuration file name for ospf6d. */
  35. #define OSPF6_DEFAULT_CONFIG       "ospf6d.conf"
  36. /* Default port values. */
  37. #define OSPF6_VTY_PORT             2606
  38. #define OSPF6_VTYSH_PATH           "/tmp/.ospf6d"
  39. /* ospf6d options, we use GNU getopt library. */
  40. struct option longopts[] = 
  41. {
  42.   { "daemon",      no_argument,       NULL, 'd'},
  43.   { "config_file", required_argument, NULL, 'f'},
  44.   { "pid_file",    required_argument, NULL, 'i'},
  45.   { "vty_addr",    required_argument, NULL, 'A'},
  46.   { "vty_port",    required_argument, NULL, 'P'},
  47.   { "version",     no_argument,       NULL, 'v'},
  48.   { "help",        no_argument,       NULL, 'h'},
  49.   { 0 }
  50. };
  51. /* Configuration file and directory. */
  52. char config_current[] = OSPF6_DEFAULT_CONFIG;
  53. char config_default[] = SYSCONFDIR OSPF6_DEFAULT_CONFIG;
  54. /* ospf6d program name. */
  55. char *progname;
  56. /* is daemon? */
  57. int daemon_mode = 0;
  58. /* Master of threads. */
  59. struct thread_master *master;
  60. /* Process ID saved for use by init system */
  61. char *pid_file = PATH_OSPF6D_PID;
  62. /* Help information display. */
  63. static void
  64. usage (char *progname, int status)
  65. {
  66.   if (status != 0)
  67.     fprintf (stderr, "Try `%s --help' for more information.n", progname);
  68.   else
  69.     {    
  70.       printf ("Usage : %s [OPTION...]nn
  71. Daemon which manages OSPF version 3.nn
  72. -d, --daemon       Runs in daemon moden
  73. -f, --config_file  Set configuration file namen
  74. -i, --pid_file     Set process identifier file namen
  75. -A, --vty_addr     Set vty's bind addressn
  76. -P, --vty_port     Set vty's port numbern
  77. -v, --version      Print program versionn
  78. -h, --help         Display this help and exitn
  79. n
  80. Report bugs to zebra@zebra.orgn", progname);
  81.     }
  82.   exit (status);
  83. }
  84. /* SIGHUP handler. */
  85. void 
  86. sighup (int sig)
  87. {
  88.   zlog_info ("SIGHUP received");
  89. }
  90. /* SIGINT handler. */
  91. void
  92. sigint (int sig)
  93. {
  94.   zlog_info ("SIGINT received");
  95.   exit (0);
  96. }
  97. /* SIGTERM handler. */
  98. void
  99. sigterm (int sig)
  100. {
  101.   zlog_info ("SIGTERM received");
  102.   exit (0);
  103. }
  104. /* SIGUSR1 handler. */
  105. void
  106. sigusr1 (int sig)
  107. {
  108.   zlog_info ("SIGUSR1 received");
  109.   zlog_rotate (NULL);
  110. }
  111. /* Signale wrapper. */
  112. RETSIGTYPE *
  113. signal_set (int signo, void (*func)(int))
  114. {
  115.   int ret;
  116.   struct sigaction sig;
  117.   struct sigaction osig;
  118.   sig.sa_handler = func;
  119.   sigemptyset (&sig.sa_mask);
  120.   sig.sa_flags = 0;
  121. #ifdef SA_RESTART
  122.   sig.sa_flags |= SA_RESTART;
  123. #endif /* SA_RESTART */
  124.   ret = sigaction (signo, &sig, &osig);
  125.   if (ret < 0) 
  126.     return (SIG_ERR);
  127.   else
  128.     return (osig.sa_handler);
  129. }
  130. /* Initialization of signal handles. */
  131. void
  132. signal_init ()
  133. {
  134.   signal_set (SIGHUP, sighup);
  135.   signal_set (SIGINT, sigint);
  136.   signal_set (SIGTERM, sigterm);
  137.   signal_set (SIGPIPE, SIG_IGN);
  138. #ifdef SIGTSTP
  139.   signal_set (SIGTSTP, SIG_IGN);
  140. #endif
  141. #ifdef SIGTTIN
  142.   signal_set (SIGTTIN, SIG_IGN);
  143. #endif
  144. #ifdef SIGTTOU
  145.   signal_set (SIGTTOU, SIG_IGN);
  146. #endif
  147.   signal_set (SIGUSR1, sigusr1);
  148. }
  149. /* Main routine of ospf6d. Treatment of argument and starting ospf finite
  150.    state machine is handled here. */
  151. int
  152. main (int argc, char *argv[], char *envp[])
  153. {
  154.   char *p;
  155.   int opt;
  156.   char *vty_addr = NULL;
  157.   int vty_port = 0;
  158.   char *config_file = NULL;
  159.   struct thread thread;
  160.   int flag;
  161.   /* Set umask before anything for security */
  162.   umask (0027);
  163.   /* Preserve name of myself. */
  164.   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
  165.   /* Command line argument treatment. */
  166.   while (1) 
  167.     {
  168.       opt = getopt_long (argc, argv, "df:hp:A:P:v", longopts, 0);
  169.     
  170.       if (opt == EOF)
  171.         break;
  172.       switch (opt) 
  173.         {
  174.         case 0:
  175.           break;
  176.         case 'd':
  177.           daemon_mode = 1;
  178.           break;
  179.         case 'f':
  180.           config_file = optarg;
  181.           break;
  182.         case 'A':
  183.           vty_addr = optarg;
  184.           break;
  185.         case 'i':
  186.           pid_file = optarg;
  187.           break;
  188.         case 'P':
  189.           vty_port = atoi (optarg);
  190.           break;
  191.         case 'v':
  192.           print_version (progname);
  193.           exit (0);
  194.           break;
  195.         case 'h':
  196.           usage (progname, 0);
  197.           break;
  198.         default:
  199.           usage (progname, 1);
  200.           break;
  201.         }
  202.     }
  203.   /* thread master */
  204.   master = thread_master_create ();
  205.   /* Initializations. */
  206.   if (! daemon_mode)
  207.     flag = ZLOG_STDOUT;
  208.   else
  209.     flag = 0;
  210.   zlog_default = openzlog (progname, flag, ZLOG_OSPF6,
  211.                            LOG_CONS|LOG_NDELAY|LOG_PERROR|LOG_PID,
  212.                            LOG_DAEMON);
  213.   /* initialize zebra libraries */
  214.   signal_init ();
  215.   cmd_init (1);
  216.   vty_init ();
  217.   memory_init ();
  218.   if_init ();
  219.   access_list_init ();
  220.   prefix_list_init ();
  221.   /* initialize ospf6 */
  222.   ospf6_init ();
  223.   /* sort command vector */
  224.   sort_node ();
  225.   /* parse config file */
  226.   vty_read_config (config_file, config_current, config_default);
  227.   if (daemon_mode)
  228.     daemon (0, 0);
  229.   /* pid file create */
  230. #if 0
  231.   pid_output_lock (pid_file);
  232. #else
  233.   pid_output (pid_file);
  234. #endif
  235.   /* Make ospf6 vty socket. */
  236.   vty_serv_sock (vty_addr,
  237.                  vty_port ? vty_port : OSPF6_VTY_PORT, OSPF6_VTYSH_PATH);
  238.   /* Print start message */
  239.   zlog_notice ("OSPF6d (Zebra-%s ospf6d-%s) starts",
  240.                ZEBRA_VERSION, OSPF6_DAEMON_VERSION);
  241.   /* Start finite state machine, here we go! */
  242.   while (thread_fetch (master, &thread))
  243.     thread_call (&thread);
  244.   /* Log in case thread failed */
  245.   zlog_warn ("Thread failed");
  246.   /* Not reached. */
  247.   exit (0);
  248. }