Annotation of embedaddon/quagga/pimd/pim_main.c, revision 1.1.1.1
1.1 misho 1: /*
2: PIM for Quagga
3: Copyright (C) 2008 Everton da Silva Marques
4:
5: This program is free software; you can redistribute it and/or modify
6: it under the terms of the GNU General Public License as published by
7: the Free Software Foundation; either version 2 of the License, or
8: (at your option) any later version.
9:
10: This program is distributed in the hope that it will be useful, but
11: WITHOUT ANY WARRANTY; without even the implied warranty of
12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License
16: along with this program; see the file COPYING; if not, write to the
17: Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
18: MA 02110-1301 USA
19:
20: $QuaggaId: $Format:%an, %ai, %h$ $
21: */
22:
23: #include <zebra.h>
24:
25: #include "log.h"
26: #include "privs.h"
27: #include "version.h"
28: #include <getopt.h>
29: #include "command.h"
30: #include "thread.h"
31: #include <signal.h>
32:
33: #include "memory.h"
34: #include "vrf.h"
35: #include "filter.h"
36: #include "vty.h"
37: #include "sigevent.h"
38: #include "version.h"
39:
40: #include "pimd.h"
41: #include "pim_version.h"
42: #include "pim_signals.h"
43: #include "pim_zebra.h"
44:
45: #ifdef PIM_ZCLIENT_DEBUG
46: extern int zclient_debug;
47: #endif
48:
49: extern struct host host;
50:
51: char config_default[] = SYSCONFDIR PIMD_DEFAULT_CONFIG;
52:
53: struct option longopts[] = {
54: { "daemon", no_argument, NULL, 'd'},
55: { "config_file", required_argument, NULL, 'f'},
56: { "pid_file", required_argument, NULL, 'i'},
57: { "vty_addr", required_argument, NULL, 'A'},
58: { "vty_port", required_argument, NULL, 'P'},
59: { "version", no_argument, NULL, 'v'},
60: { "debug_zclient", no_argument, NULL, 'Z'},
61: { "help", no_argument, NULL, 'h'},
62: { 0 }
63: };
64:
65: /* pimd privileges */
66: zebra_capabilities_t _caps_p [] =
67: {
68: ZCAP_NET_ADMIN,
69: ZCAP_SYS_ADMIN,
70: ZCAP_NET_RAW,
71: };
72:
73: /* pimd privileges to run with */
74: struct zebra_privs_t pimd_privs =
75: {
76: #if defined(QUAGGA_USER) && defined(QUAGGA_GROUP)
77: .user = QUAGGA_USER,
78: .group = QUAGGA_GROUP,
79: #endif
80: #ifdef VTY_GROUP
81: .vty_group = VTY_GROUP,
82: #endif
83: .caps_p = _caps_p,
84: .cap_num_p = sizeof(_caps_p)/sizeof(_caps_p[0]),
85: .cap_num_i = 0
86: };
87:
88: char* progname;
89: const char *pid_file = PATH_PIMD_PID;
90:
91: static void usage(int status)
92: {
93: if (status != 0)
94: fprintf (stderr, "Try `%s --help' for more information.\n", progname);
95: else {
96: printf ("Usage : %s [OPTION...]\n\
97: Daemon which manages PIM.\n\n\
98: -d, --daemon Run in daemon mode\n\
99: -f, --config_file Set configuration file name\n\
100: -i, --pid_file Set process identifier file name\n\
101: -z, --socket Set path of zebra socket\n\
102: -A, --vty_addr Set vty's bind address\n\
103: -P, --vty_port Set vty's port number\n\
104: -v, --version Print program version\n\
105: "
106:
107: #ifdef PIM_ZCLIENT_DEBUG
108: "\
109: -Z, --debug_zclient Enable zclient debugging\n\
110: "
111: #endif
112:
113: "\
114: -h, --help Display this help and exit\n\
115: \n\
116: Report bugs to %s\n", progname, PIMD_BUG_ADDRESS);
117: }
118:
119: exit (status);
120: }
121:
122:
123: int main(int argc, char** argv, char** envp) {
124: char *p;
125: char *vty_addr = NULL;
126: int vty_port = -1;
127: int daemon_mode = 0;
128: char *config_file = NULL;
129: char *zebra_sock_path = NULL;
130: struct thread thread;
131:
132: umask(0027);
133:
134: progname = ((p = strrchr(argv[0], '/')) ? ++p : argv[0]);
135:
136: zlog_default = openzlog(progname, ZLOG_PIM,
137: LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
138:
139: /* this while just reads the options */
140: while (1) {
141: int opt;
142:
143: opt = getopt_long (argc, argv, "df:i:z:A:P:vZh", longopts, 0);
144:
145: if (opt == EOF)
146: break;
147:
148: switch (opt) {
149: case 0:
150: break;
151: case 'd':
152: daemon_mode = 1;
153: break;
154: case 'f':
155: config_file = optarg;
156: break;
157: case 'i':
158: pid_file = optarg;
159: break;
160: case 'z':
161: zebra_sock_path = optarg;
162: break;
163: case 'A':
164: vty_addr = optarg;
165: break;
166: case 'P':
167: vty_port = atoi (optarg);
168: break;
169: case 'v':
170: printf(PIMD_PROGNAME " version %s\n", PIMD_VERSION);
171: print_version(QUAGGA_PROGNAME);
172: exit (0);
173: break;
174: #ifdef PIM_ZCLIENT_DEBUG
175: case 'Z':
176: zclient_debug = 1;
177: break;
178: #endif
179: case 'h':
180: usage (0);
181: break;
182: default:
183: usage (1);
184: break;
185: }
186: }
187:
188: master = thread_master_create();
189:
190: zlog_notice("Quagga %s " PIMD_PROGNAME " %s starting",
191: QUAGGA_VERSION, PIMD_VERSION);
192:
193: /*
194: * Initializations
195: */
196: zprivs_init (&pimd_privs);
197: pim_signals_init();
198: cmd_init(1);
199: vty_init(master);
200: memory_init();
201: vrf_init();
202: access_list_init();
203: pim_init();
204:
205: /*
206: * Initialize zclient "update" and "lookup" sockets
207: */
208: pim_zebra_init (master, zebra_sock_path);
209:
210: zlog_notice("Loading configuration - begin");
211:
212: /* Get configuration file. */
213: vty_read_config(config_file, config_default);
214:
215: /*
216: Starting from here zlog_* functions will log according configuration
217: */
218:
219: zlog_notice("Loading configuration - end");
220:
221: /* Change to the daemon program. */
222: if (daemon_mode) {
223: if (daemon(0, 0)) {
224: zlog_warn("failed to daemonize");
225: }
226: }
227:
228: /* Process ID file creation. */
229: pid_output(pid_file);
230:
231: /* Create pimd VTY socket */
232: if (vty_port < 0)
233: vty_port = PIMD_VTY_PORT;
234: vty_serv_sock(vty_addr, vty_port, PIM_VTYSH_PATH);
235:
236: zlog_notice("Quagga %s " PIMD_PROGNAME " %s starting, VTY interface at port TCP %d",
237: QUAGGA_VERSION, PIMD_VERSION, vty_port);
238:
239: #ifdef PIM_DEBUG_BYDEFAULT
240: zlog_notice("PIM_DEBUG_BYDEFAULT: Enabling all debug commands");
241: PIM_DO_DEBUG_PIM_EVENTS;
242: PIM_DO_DEBUG_PIM_PACKETS;
243: PIM_DO_DEBUG_PIM_TRACE;
244: PIM_DO_DEBUG_IGMP_EVENTS;
245: PIM_DO_DEBUG_IGMP_PACKETS;
246: PIM_DO_DEBUG_IGMP_TRACE;
247: PIM_DO_DEBUG_ZEBRA;
248: #endif
249:
250: #ifdef PIM_ZCLIENT_DEBUG
251: zlog_notice("PIM_ZCLIENT_DEBUG: zclient debugging is supported, mode is %s (see option -Z)",
252: zclient_debug ? "ON" : "OFF");
253: #endif
254:
255: #ifdef PIM_CHECK_RECV_IFINDEX_SANITY
256: zlog_notice("PIM_CHECK_RECV_IFINDEX_SANITY: will match sock/recv ifindex");
257: #ifdef PIM_REPORT_RECV_IFINDEX_MISMATCH
258: zlog_notice("PIM_REPORT_RECV_IFINDEX_MISMATCH: will report sock/recv ifindex mismatch");
259: #endif
260: #endif
261:
262: #ifdef PIM_UNEXPECTED_KERNEL_UPCALL
263: zlog_notice("PIM_UNEXPECTED_KERNEL_UPCALL: report unexpected kernel upcall");
264: #endif
265:
266: #ifdef HAVE_CLOCK_MONOTONIC
267: zlog_notice("HAVE_CLOCK_MONOTONIC");
268: #else
269: zlog_notice("!HAVE_CLOCK_MONOTONIC");
270: #endif
271:
272: while (thread_fetch(master, &thread))
273: thread_call(&thread);
274:
275: zlog_err("%s %s: thread_fetch() returned NULL, exiting",
276: __FILE__, __PRETTY_FUNCTION__);
277:
278: /* never reached */
279: return 0;
280: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>