2
* IS-IS Rout(e)ing protocol - isis_main.c
4
* Copyright (C) 2001,2002 Sampo Saaristo
5
* Tampere University of Technology
6
* Institute of Communications Engineering
8
* This program is free software; you can redistribute it and/or modify it
9
* under the terms of the GNU General Public Licenseas published by the Free
10
* Software Foundation; either version 2 of the License, or (at your option)
13
* This program is distributed in the hope that it will be useful,but WITHOUT
14
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18
* You should have received a copy of the GNU General Public License along
19
* with this program; if not, write to the Free Software Foundation, Inc.,
20
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29
#include <lib/version.h>
39
#include "isisd/dict.h"
40
#include "include-netbsd/iso.h"
41
#include "isisd/isis_constants.h"
42
#include "isisd/isis_common.h"
43
#include "isisd/isis_flags.h"
44
#include "isisd/isis_circuit.h"
45
#include "isisd/isisd.h"
46
#include "isisd/isis_dynhn.h"
48
/* Default configuration file name */
49
#define ISISD_DEFAULT_CONFIG "isisd.conf"
50
/* Default vty port */
51
#define ISISD_VTY_PORT 2608
53
/* isisd privileges */
54
zebra_capabilities_t _caps_p[] = {
59
struct zebra_privs_t isisd_privs = {
60
#if defined(QUAGGA_USER)
63
#if defined QUAGGA_GROUP
64
.group = QUAGGA_GROUP,
67
.vty_group = VTY_GROUP,
75
struct option longopts[] = {
76
{"daemon", no_argument, NULL, 'd'},
77
{"config_file", required_argument, NULL, 'f'},
78
{"pid_file", required_argument, NULL, 'i'},
79
{"vty_addr", required_argument, NULL, 'A'},
80
{"vty_port", required_argument, NULL, 'P'},
81
{"user", required_argument, NULL, 'u'},
82
{"group", required_argument, NULL, 'g'},
83
{"version", no_argument, NULL, 'v'},
84
{"help", no_argument, NULL, 'h'},
88
/* Configuration file and directory. */
89
char config_default[] = SYSCONFDIR ISISD_DEFAULT_CONFIG;
90
char *config_file = NULL;
92
/* isisd program name. */
97
/* Master of threads. */
98
struct thread_master *master;
100
/* Process ID saved for use by init system */
101
const char *pid_file = PATH_ISISD_PID;
104
char _cwd[MAXPATHLEN];
105
char _progpath[MAXPATHLEN];
110
/* Help information display. */
115
fprintf (stderr, "Try `%s --help' for more information.\n", progname);
118
printf ("Usage : %s [OPTION...]\n\n\
119
Daemon which manages IS-IS routing\n\n\
120
-d, --daemon Runs in daemon mode\n\
121
-f, --config_file Set configuration file name\n\
122
-i, --pid_file Set process identifier file name\n\
123
-A, --vty_addr Set vty's bind address\n\
124
-P, --vty_port Set vty's port number\n\
125
-u, --user User to run as\n\
126
-g, --group Group to run as\n\
127
-v, --version Print program version\n\
128
-h, --help Display this help and exit\n\
130
Report bugs to http://bugzilla.quagga.net\n", progname);
140
zlog_debug ("Reload");
141
/* FIXME: Clean up func call here */
143
execve (_progpath, _argv, _envp);
159
zlog_debug ("SIGHUP received");
168
zlog_notice ("Terminating on signal SIGINT");
175
zlog_notice ("Terminating on signal SIGTERM");
182
zlog_debug ("SIGUSR1 received");
186
struct quagga_signal_t isisd_signals[] =
207
* Main routine of isisd. Parse arguments and handle IS-IS state machine.
210
main (int argc, char **argv, char **envp)
213
int opt, vty_port = ISISD_VTY_PORT;
214
struct thread thread;
215
char *config_file = NULL;
216
char *vty_addr = NULL;
218
/* Get the programname without the preceding path. */
219
progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
221
zlog_default = openzlog (progname, ZLOG_ISIS,
222
LOG_CONS | LOG_NDELAY | LOG_PID, LOG_DAEMON);
228
getcwd (_cwd, sizeof (_cwd));
230
snprintf (_progpath, sizeof (_progpath), "%s/%s", _cwd, _argv[0]);
232
snprintf (_progpath, sizeof (_progpath), "%s", argv[0]);
234
/* Command line argument treatment. */
237
opt = getopt_long (argc, argv, "df:i:hA:p:P:u:g:v", longopts, 0);
250
config_file = optarg;
259
/* Deal with atoi() returning 0 on failure, and isisd not
260
listening on isisd port... */
261
if (strcmp (optarg, "0") == 0)
266
vty_port = atoi (optarg);
267
vty_port = (vty_port ? vty_port : ISISD_VTY_PORT);
270
isisd_privs.user = optarg;
273
isisd_privs.group = optarg;
276
printf ("ISISd version %s\n", ISISD_VERSION);
277
printf ("Copyright (c) 2001-2002 Sampo Saaristo,"
278
" Ofer Wald and Hannes Gredler\n");
279
print_version ("Zebra");
292
master = thread_master_create ();
294
/* random seed from time */
300
zprivs_init (&isisd_privs);
301
signal_init (master, Q_SIGC (isisd_signals), isisd_signals);
310
/* parse config file */
311
/* this is needed three times! because we have interfaces before the areas */
312
vty_read_config (config_file, config_default);
313
vty_read_config (config_file, config_default);
314
vty_read_config (config_file, config_default);
320
/* Process ID file creation. */
321
pid_output (pid_file);
323
/* Make isis vty socket. */
324
vty_serv_sock (vty_addr, vty_port, ISIS_VTYSH_PATH);
327
zlog_notice ("Quagga-ISISd %s starting: vty@%d", QUAGGA_VERSION, vty_port);
329
zlog_debug ("IPv6 enabled");
331
/* Start finite state machine. */
332
while (thread_fetch (master, &thread))
333
thread_call (&thread);