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