all: fixes resulting from building with clang
[olsrd.git] / src / main.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in
14  *   the documentation and/or other materials provided with the
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its
17  *   contributors may be used to endorse or promote products derived
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 #include <arpa/inet.h>
42 #include <unistd.h>
43 #include <signal.h>
44 #include <sys/stat.h>
45 #include <assert.h>
46 #include <fcntl.h>
47
48 #include "cfgparser/olsrd_conf.h"
49 #include "ipcalc.h"
50 #include "defs.h"
51 #include "builddata.h"
52 #include "olsr.h"
53 #include "log.h"
54 #include "scheduler.h"
55 #include "parser.h"
56 #include "generate_msg.h"
57 #include "plugin_loader.h"
58 #include "apm.h"
59 #include "net_os.h"
60 #include "build_msg.h"
61 #include "net_olsr.h"
62 #include "mid_set.h"
63 #include "mpr_selector_set.h"
64 #include "gateway.h"
65 #include "olsr_niit.h"
66 #include "olsr_random.h"
67 #include "pid_file.h"
68 #include "lock_file.h"
69 #include "cli.h"
70
71 #ifdef __linux__
72 #include <linux/types.h>
73 #include <linux/rtnetlink.h>
74 #include "kernel_routes.h"
75
76 #endif /* __linux__ */
77
78 #ifdef _WIN32
79 #include <process.h>
80 #include <winbase.h>
81 #define olsr_shutdown(x) SignalHandler(x)
82 #define close(x) closesocket(x)
83 int __stdcall SignalHandler(unsigned long signo) __attribute__ ((noreturn));
84 void DisableIcmpRedirects(void);
85 #endif /* _WIN32 */
86
87 struct timer_entry * heartBeatTimer = NULL;
88
89 static char **olsr_argv = NULL;
90
91 struct olsr_cookie_info *def_timer_ci = NULL;
92
93 #ifndef _WIN32
94 /**
95  * Reconfigure olsrd. Currently kind of a hack...
96  *
97  *@param signo the signal that triggered this callback
98  */
99 __attribute__ ((noreturn))
100 static void olsr_reconfigure(int signo __attribute__ ((unused))) {
101 #ifndef _WIN32
102   int errNr = errno;
103 #endif
104   /* if we are started with -nofork, we do not want to go into the
105    * background here. So we can simply stop on -HUP
106    */
107   olsr_syslog(OLSR_LOG_INFO, "sot: olsr_reconfigure()\n");
108   if (!olsr_cnf->no_fork) {
109     if (!fork()) {
110       int i;
111       sigset_t sigs;
112
113       /* New process, wait a bit to let the old process exit */
114       sleep(3);
115       sigemptyset(&sigs);
116       sigaddset(&sigs, SIGHUP);
117       sigprocmask(SIG_UNBLOCK, &sigs, NULL);
118       for (i = sysconf(_SC_OPEN_MAX); --i > STDERR_FILENO;) {
119         close(i);
120       }
121       printf("Restarting %s", olsr_argv[0]);
122       olsr_syslog(OLSR_LOG_INFO, "Restarting %s", olsr_argv[0]);
123       execv(olsr_argv[0], olsr_argv);
124       olsr_syslog(OLSR_LOG_ERR, "execv(%s) failed: %s", olsr_argv[0], strerror(errno));
125     } else {
126       olsr_syslog(OLSR_LOG_INFO, "RECONFIGURING");
127     }
128   }
129 #ifndef _WIN32
130   errno = errNr;
131 #endif
132   olsr_exit(NULL, EXIT_SUCCESS);
133 }
134 #endif /* _WIN32 */
135
136 static void olsr_shutdown_messages(void) {
137   struct interface_olsr *ifn;
138
139   /* send TC reset */
140   for (ifn = ifnet; ifn; ifn = ifn->int_next) {
141     /* clean output buffer */
142     net_output(ifn);
143
144     /* send 'I'm gone' messages */
145     if (olsr_cnf->lq_level > 0) {
146       olsr_output_lq_tc(ifn);
147       olsr_output_lq_hello(ifn);
148     } else {
149       generate_tc(ifn);
150       generate_hello(ifn);
151     }
152     net_output(ifn);
153   }
154 }
155
156 /**
157  *Function called at shutdown. Signal handler
158  *
159  * @param signo the signal that triggered this call
160  */
161 __attribute__ ((noreturn))
162 #ifdef _WIN32
163 int __stdcall
164 SignalHandler(unsigned long signo)
165 #else /* _WIN32 */
166 static void olsr_shutdown(int signo __attribute__ ((unused)))
167 #endif /* _WIN32 */
168 {
169 #ifndef _WIN32
170   int errNr = errno;
171 #endif
172   struct interface_olsr *ifn;
173   int exit_value;
174
175   OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signo);
176
177   /* instruct the scheduler to stop */
178   olsr_scheduler_stop();
179
180   /* clear all links and send empty hellos/tcs */
181   olsr_reset_all_links();
182
183   /* deactivate fisheye and immediate TCs */
184   olsr_cnf->lq_fish = 0;
185   for (ifn = ifnet; ifn; ifn = ifn->int_next) {
186     ifn->immediate_send_tc = false;
187   }
188   increase_local_ansn();
189
190   /* send first shutdown message burst */
191   olsr_shutdown_messages();
192
193   /* delete all routes */
194   olsr_delete_all_kernel_routes();
195
196   /* send second shutdown message burst */
197   olsr_shutdown_messages();
198
199   /* now try to cleanup the rest of the mess */
200   olsr_delete_all_tc_entries();
201
202   olsr_delete_all_mid_entries();
203
204 #ifdef __linux__
205   /* trigger gateway selection */
206   if (olsr_cnf->smart_gw_active) {
207     olsr_shutdown_gateways();
208     olsr_cleanup_gateways();
209   }
210
211   /* trigger niit static route cleanup */
212   if (olsr_cnf->use_niit) {
213     olsr_cleanup_niit_routes();
214   }
215
216   /* cleanup lo:olsr interface */
217   if (olsr_cnf->use_src_ip_routes) {
218     olsr_os_localhost_if(&olsr_cnf->main_addr, false);
219   }
220 #endif /* __linux__ */
221
222   olsr_destroy_parser();
223
224   OLSR_PRINTF(1, "Closing sockets...\n");
225
226   /* front-end IPC socket */
227   if (olsr_cnf->ipc_connections > 0) {
228     shutdown_ipc();
229   }
230
231   /* OLSR sockets */
232   for (ifn = ifnet; ifn; ifn = ifn->int_next) {
233     close(ifn->olsr_socket);
234     close(ifn->send_socket);
235
236 #ifdef __linux__
237     if (DEF_RT_NONE != olsr_cnf->rt_table_defaultolsr_pri) {
238       olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default,
239           olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, false);
240     }
241 #endif /* __linux__ */
242   }
243
244   /* Closing plug-ins */
245   olsr_close_plugins();
246
247   /* Reset network settings */
248   net_os_restore_ifoptions();
249
250   /* ioctl socket */
251   close(olsr_cnf->ioctl_s);
252
253 #ifdef __linux__
254   if (DEF_RT_NONE != olsr_cnf->rt_table_pri) {
255     olsr_os_policy_rule(olsr_cnf->ip_version,
256         olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, false);
257   }
258   if (DEF_RT_NONE != olsr_cnf->rt_table_tunnel_pri) {
259     olsr_os_policy_rule(olsr_cnf->ip_version,
260         olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, false);
261   }
262   if (DEF_RT_NONE != olsr_cnf->rt_table_default_pri) {
263     olsr_os_policy_rule(olsr_cnf->ip_version,
264         olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, false);
265   }
266   close(olsr_cnf->rtnl_s);
267   close (olsr_cnf->rt_monitor_socket);
268 #endif /* __linux__ */
269
270 #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__
271   /* routing socket */
272   close(olsr_cnf->rts);
273 #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */
274
275   /* remove the lock file */
276   olsr_remove_lock_file();
277
278   /* stop heartbeat that is showing on stdout */
279 #if !defined WINCE
280   if (heartBeatTimer) {
281     olsr_stop_timer(heartBeatTimer);
282     heartBeatTimer = NULL;
283   }
284 #endif /* !defined WINCE */
285
286   /* Free cookies and memory pools attached. */
287   OLSR_PRINTF(0, "Free all memory...\n");
288   olsr_delete_all_cookies();
289
290   olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version);
291
292   OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n           http://www.olsr.org\n", olsrd_version);
293
294   exit_value = olsr_cnf->exit_value;
295   olsrd_free_cnf(&olsr_cnf);
296
297   /* close the log */
298   olsr_closelog();
299
300 #ifndef _WIN32
301   errno = errNr;
302 #endif
303   exit(exit_value);
304 }
305
306 /**
307  * Sets the provided configuration on all unconfigured
308  * interfaces
309  *
310  * @param ifs a linked list of interfaces to check and possible update
311  * @param cnf the default configuration to set on unconfigured interfaces
312  */
313 static int set_default_ifcnfs(struct olsr_if *ifs, struct if_config_options *cnf) {
314   int changes = 0;
315
316   while (ifs) {
317     if (ifs->cnf == NULL) {
318       ifs->cnf = olsr_malloc(sizeof(struct if_config_options),
319           "Set default config");
320       *ifs->cnf = *cnf;
321       changes++;
322     }
323     ifs = ifs->next;
324   }
325   return changes;
326 }
327
328 /**
329  * Main entrypoint
330  */
331
332 int main(int argc, char *argv[]) {
333   int argcLocal = argc;
334
335   /* Open syslog */
336   olsr_openlog("olsrd");
337
338   /*
339    * Initialisation
340    */
341
342   /* setup debug printf destination */
343   debug_handle = stdout;
344
345   /* set stdout and stderr to unbuffered output */
346   setbuf(stdout, NULL);
347   setbuf(stderr, NULL);
348
349   /* setup random seed */
350   srandom(time(NULL));
351
352   /* Init widely used statics */
353   memset(&all_zero, 0, sizeof(union olsr_ip_addr));
354
355   /* store the arguments for restart */
356   olsr_argv = argv;
357
358   /*
359    * Start
360    */
361
362   print_version();
363
364   if (argcLocal == 2) {
365     if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "/?")) {
366       /* help */
367       print_usage(false);
368       olsr_exit(NULL, EXIT_SUCCESS);
369     }
370     if (!strcmp(argv[1], "-v")) {
371       /* version */
372       olsr_exit(NULL, EXIT_SUCCESS);
373     }
374   }
375
376   /* Check root Privileges */
377 #ifndef _WIN32
378   if (geteuid()) {
379     olsr_exit("You must be root (uid = 0) to run olsrd", EXIT_FAILURE);
380   }
381 #else /* _WIN32 */
382   DisableIcmpRedirects();
383
384   {
385     WSADATA WsaData;
386     if (WSAStartup(0x0202, &WsaData)) {
387       char buf2[1024];
388       snprintf(buf2, sizeof(buf2), "%s: Could not initialise WinSock", __func__);
389       olsr_exit(buf2, EXIT_FAILURE);
390     }
391   }
392 #endif /* _WIN32 */
393
394   /* load the configuration */
395   if (!loadConfig(&argcLocal, argv)) {
396     olsr_exit(NULL, EXIT_FAILURE);
397   }
398
399   /* Process CLI Arguments */
400   {
401     char * error = NULL;
402     int exitCode = EXIT_FAILURE;
403
404     /* get the default interface config */
405     struct if_config_options *default_ifcnf = get_default_if_config();
406     if (!default_ifcnf) {
407       olsr_exit("No default ifconfig found", EXIT_FAILURE);
408     }
409
410     /* Process olsrd options */
411     exitCode = olsr_process_arguments(argcLocal, argv, olsr_cnf, default_ifcnf, &error);
412     if (exitCode != 0) {
413       free(default_ifcnf);
414       olsr_exit(error, EXIT_FAILURE);
415     }
416
417     /* Set configuration for command-line specified interfaces */
418     set_default_ifcnfs(olsr_cnf->interfaces, default_ifcnf);
419
420     /* free the default ifcnf */
421     free(default_ifcnf);
422   }
423
424   /* Sanity check configuration */
425   if (olsrd_sanity_check_cnf(olsr_cnf) < 0) {
426     char buf2[1024];
427     snprintf(buf2, sizeof(buf2), "%s: Bad configuration", __func__);
428     olsr_exit(buf2, EXIT_FAILURE);
429   }
430
431   /* Setup derived configuration */
432   set_derived_cnf(olsr_cnf);
433
434   /* Print configuration */
435   if (olsr_cnf->debug_level > 1) {
436     olsrd_print_cnf(olsr_cnf);
437   }
438
439   /* configuration loaded and sane */
440
441   /* initialise timers */
442   olsr_init_timers();
443
444   def_timer_ci = olsr_alloc_cookie("Default Timer Cookie", OLSR_COOKIE_TYPE_TIMER);
445
446   /* create a socket for ioctl calls */
447   olsr_cnf->ioctl_s = socket(olsr_cnf->ip_version, SOCK_DGRAM, 0);
448   if (olsr_cnf->ioctl_s < 0) {
449     char buf2[1024];
450     snprintf(buf2, sizeof(buf2), "ioctl socket: %s", strerror(errno));
451     olsr_exit(buf2, EXIT_FAILURE);
452   }
453
454   /* create a socket for netlink calls */
455 #ifdef __linux__
456   olsr_cnf->rtnl_s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
457   if (olsr_cnf->rtnl_s < 0) {
458     char buf2[1024];
459     snprintf(buf2, sizeof(buf2), "rtnetlink socket: %s", strerror(errno));
460     olsr_exit(buf2, EXIT_FAILURE);
461   }
462
463   if (fcntl(olsr_cnf->rtnl_s, F_SETFL, O_NONBLOCK)) {
464     olsr_syslog(OLSR_LOG_INFO, "rtnetlink could not be set to nonblocking");
465   }
466
467   if ((olsr_cnf->rt_monitor_socket = rtnetlink_register_socket(RTMGRP_LINK)) < 0) {
468     char buf2[1024];
469     snprintf(buf2, sizeof(buf2), "rtmonitor socket: %s", strerror(errno));
470     olsr_exit(buf2, EXIT_FAILURE);
471   }
472 #endif /* __linux__ */
473
474   /* create routing socket */
475 #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__
476   olsr_cnf->rts = socket(PF_ROUTE, SOCK_RAW, 0);
477   if (olsr_cnf->rts < 0) {
478     char buf2[1024];
479     snprintf(buf2, sizeof(buf2), "routing socket: %s", strerror(errno));
480     olsr_exit(buf2, EXIT_FAILURE);
481   }
482 #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */
483
484   /* initialise gateway system */
485 #ifdef __linux__
486   if (olsr_cnf->smart_gw_active && olsr_init_gateways()) {
487     olsr_exit("Cannot initialise gateway tunnels", EXIT_FAILURE);
488   }
489 #endif /* __linux__ */
490
491   /* initialise niit if index */
492 #ifdef __linux__
493   if (olsr_cnf->use_niit) {
494     olsr_init_niit();
495   }
496 #endif /* __linux__ */
497
498   /* initialise empty TC timer */
499   set_empty_tc_timer(GET_TIMESTAMP(0));
500
501   /* enable ip forwarding on host and disable redirects globally (not for WIN32) */
502   net_os_set_global_ifoptions();
503
504   /* initialise parser */
505   olsr_init_parser();
506
507   /* initialise route exporter */
508   olsr_init_export_route();
509
510   /* initialise message sequence number */
511   init_msg_seqno();
512
513   /* initialise dynamic willingness calculation */
514   olsr_init_willingness();
515
516   /* Set up willingness/APM */
517   if (olsr_cnf->willingness_auto) {
518     if (apm_init() < 0) {
519       OLSR_PRINTF(1, "Could not read APM info - setting default willingness(%d)\n", WILL_DEFAULT);
520
521       olsr_syslog(OLSR_LOG_ERR, "Could not read APM info - setting default willingness(%d)\n",
522       WILL_DEFAULT);
523
524       olsr_cnf->willingness_auto = 0;
525       olsr_cnf->willingness = WILL_DEFAULT;
526     } else {
527       olsr_cnf->willingness = olsr_calculate_willingness();
528
529       OLSR_PRINTF(1, "Willingness set to %d - next update in %.1f secs\n", olsr_cnf->willingness, (double )olsr_cnf->will_int);
530     }
531   }
532
533   /* initialise net */
534   init_net();
535
536   /* initialise network interfaces */
537   if (!olsr_init_interfacedb()) {
538     if (olsr_cnf->allow_no_interfaces) {
539       fprintf( stderr, "No interfaces detected! This might be intentional, but it also might mean"
540           " that your configuration is fubar.\nI will continue after 5 seconds...\n");
541       olsr_startup_sleep(5);
542     } else {
543       char buf2[1024];
544       snprintf(buf2, sizeof(buf2), "%s: No interfaces detected", __func__);
545       olsr_exit(buf2, EXIT_FAILURE);
546     }
547   }
548
549 #ifdef __linux__
550   /* startup gateway system */
551   if (olsr_cnf->smart_gw_active && olsr_startup_gateways()) {
552     olsr_exit("Cannot startup gateway tunnels", EXIT_FAILURE);
553   }
554 #endif /* __linux__ */
555
556   /* initialise the IPC socket */
557   if ((olsr_cnf->ipc_connections > 0) && ipc_init()) {
558     olsr_exit("ipc_init failure", EXIT_FAILURE);
559   }
560
561   /* Initialisation of different tables to be used. */
562   olsr_init_tables();
563
564   olsr_do_startup_sleep();
565
566   /* start heartbeat that is showing on stdout */
567 #if !defined WINCE
568   if ((olsr_cnf->debug_level > 0) && isatty(STDOUT_FILENO)) {
569     heartBeatTimer = olsr_start_timer(STDOUT_PULSE_INT, 0, OLSR_TIMER_PERIODIC, &generate_stdout_pulse, NULL, 0);
570   }
571 #endif /* !defined WINCE */
572
573   /* daemon mode */
574 #ifndef _WIN32
575   if ((olsr_cnf->debug_level == 0) && !olsr_cnf->no_fork) {
576     printf("%s detaching from the current process...\n", olsrd_version);
577     if (daemon(0, 0) < 0) {
578       char buf2[1024];
579       snprintf(buf2, sizeof(buf2), "daemon(3) failed: %s", strerror(errno));
580       olsr_exit(buf2, EXIT_FAILURE);
581     }
582   }
583 #endif /* _WIN32 */
584
585   if (!writePidFile()) {
586     olsr_exit(NULL, EXIT_FAILURE);
587   }
588
589   /* Create locking file for olsrd, will be cleared after olsrd exits */
590   if (!olsr_create_lock_file()) {
591     char buf2[1024];
592     snprintf(buf2, sizeof(buf2), "Error, cannot create OLSR lock file '%s'", olsr_cnf->lock_file);
593     olsr_exit(buf2, EXIT_FAILURE);
594   }
595
596   /* Load plugins */
597   olsr_load_plugins();
598
599   /* print the main address */
600   {
601     struct ipaddr_str buf;
602     OLSR_PRINTF(1, "Main address: %s\n\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
603   }
604
605   /* create policy routing rules with priorities if necessary */
606 #ifdef __linux__
607   if (DEF_RT_NONE != olsr_cnf->rt_table_pri) {
608     olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, true);
609   }
610
611   if (DEF_RT_NONE != olsr_cnf->rt_table_tunnel_pri) {
612     olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, true);
613   }
614
615   if (DEF_RT_NONE != olsr_cnf->rt_table_default_pri) {
616     olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, true);
617   }
618
619   /* rule to default table on all olsrd interfaces */
620   if (DEF_RT_NONE != olsr_cnf->rt_table_defaultolsr_pri) {
621     struct interface_olsr *ifn;
622     for (ifn = ifnet; ifn; ifn = ifn->int_next) {
623       olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, true);
624     }
625   }
626
627   /* trigger gateway selection */
628   if (olsr_cnf->smart_gw_active) {
629     olsr_trigger_inetgw_startup();
630   }
631
632   /* trigger niit static route setup */
633   if (olsr_cnf->use_niit) {
634     olsr_setup_niit_routes();
635   }
636
637   /* create lo:olsr interface */
638   if (olsr_cnf->use_src_ip_routes) {
639     olsr_os_localhost_if(&olsr_cnf->main_addr, true);
640   }
641 #endif /* __linux__ */
642
643   /* Start syslog entry */
644   olsr_syslog(OLSR_LOG_INFO, "%s successfully started", olsrd_version);
645
646   /* setup signal-handlers */
647 #ifdef _WIN32
648 #ifndef WINCE
649   SetConsoleCtrlHandler(SignalHandler, true);
650 #endif /* WINCE */
651 #else /* _WIN32 */
652   signal(SIGHUP, olsr_reconfigure);
653   signal(SIGINT, olsr_shutdown);
654   signal(SIGQUIT, olsr_shutdown);
655   signal(SIGILL, olsr_shutdown);
656   signal(SIGABRT, olsr_shutdown);
657   //  signal(SIGSEGV, olsr_shutdown);
658   signal(SIGTERM, olsr_shutdown);
659   signal(SIGPIPE, SIG_IGN);
660   // Ignoring SIGUSR1 and SIGUSR1 by default to be able to use them in plugins
661   signal(SIGUSR1, SIG_IGN);
662   signal(SIGUSR2, SIG_IGN);
663 #endif /* _WIN32 */
664
665   /* Starting scheduler */
666   olsr_scheduler();
667
668   /* We'll only get here when olsr_shutdown has stopped the scheduler */
669   sleep(30);
670
671   exit(EXIT_FAILURE);
672 } /* main */
673
674 /*
675  * Local Variables:
676  * c-basic-offset: 2
677  * indent-tabs-mode: nil
678  * End:
679  */