ca2a275571ce2bef1e3ec80ea80b22b37ae8e018
[olsrd.git] / gui / linux-gtk / src / main.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * (c) by the OLSR project
5  *
6  * See our Git repository to find out who worked on this file
7  * and thus is a copyright holder on it.
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * * Redistributions of source code must retain the above copyright
16  *   notice, this list of conditions and the following disclaimer.
17  * * Redistributions in binary form must reproduce the above copyright
18  *   notice, this list of conditions and the following disclaimer in
19  *   the documentation and/or other materials provided with the
20  *   distribution.
21  * * Neither the name of olsr.org, olsrd nor the names of its
22  *   contributors may be used to endorse or promote products derived
23  *   from this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  *
38  * Visit http://www.olsr.org for more information.
39  *
40  * If you find this software useful feel free to make a donation
41  * to the project. For more information see the website or contact
42  * the copyright holders.
43  *
44  */
45
46 #include "common.h"
47 #include "main.h"
48 #include "ipc.h"
49
50 struct sockaddr_in pin;
51
52 int
53 main(int argc, char *argv[])
54 {
55   struct hostent *hp;
56   struct in_addr in;
57
58 #ifdef _WIN32
59   WSADATA WsaData;
60 #endif /* _WIN32 */
61   GtkWidget *main_window;
62
63 #ifdef _WIN32
64   if (WSAStartup(0x0202, &WsaData)) {
65     fprintf(stderr, "Could not initialize WinSock.\n");
66     exit(EXIT_FAILURE);
67   }
68 #endif /* _WIN32 */
69
70   /* Get IP */
71   if ((hp = gethostbyname(argc > 1 ? argv[1] : "localhost")) == 0) {
72     fprintf(stderr, "Not a valid host \"%s\"\n", argv[1]);
73     exit(EXIT_FAILURE);
74   }
75
76   in.s_addr = ((struct in_addr *)(void *)(hp->h_addr))->s_addr;
77   printf("Address: %s\n", inet_ntoa(in));
78
79   /* fill in the socket structure with host information */
80   memset(&pin, 0, sizeof(pin));
81   pin.sin_family = AF_INET;
82   pin.sin_addr.s_addr = ((struct in_addr *)(void *)(hp->h_addr))->s_addr;
83   pin.sin_port = htons(IPC_PORT);
84
85   gtk_init(&argc, &argv);
86
87   init_nodes();
88
89   freeze_packets = 1;
90   display_dec = 1;
91
92   /* "Failsafe" values */
93   ipversion = AF_INET;
94   ipsize = sizeof(struct in_addr);
95
96   main_window = create_main_window();
97   gtk_widget_show(main_window);
98
99   printf("Done building GUI\n");
100
101   memset(&main_addr, 0, sizeof(union olsr_ip_addr));
102   memset(&null_addr, 0, sizeof(union olsr_ip_addr));
103
104   /* Terminate signal */
105   signal(SIGINT, shutdown_);
106
107   /* Init node timeout */
108   nodes_timeout = NEIGHB_HOLD_TIME_NW;
109   init_timer((olsr_u32_t) (nodes_timeout * 1000), &hold_time_nodes);
110
111   ipc_connect(&pin);
112
113   add_timeouts();
114
115   gtk_main();
116   return 0;
117 }
118
119 /*
120  *Timeouts
121  */
122
123 int
124 add_timeouts(void)
125 {
126
127   /*
128    *Check socket for messages every IPC_INTERVAL
129    *milliseconds
130    */
131   gtk_timeout_add(IPC_INTERVAL, ipc_timeout, NULL);
132
133   /*
134    *Time out nodes
135    */
136   timeouts = 5;                 /* Wait 5 times befor starting timing out nodes */
137   gtk_timeout_add(TOP_HOLD_TIME, time_out_nodes, NULL);
138
139   return 1;
140 }
141
142 gint
143 ipc_timeout(gpointer data __attribute__((unused)))
144 {
145
146   ipc_read();
147   return 1;
148 }
149
150 __attribute__((noreturn))
151 void
152 shutdown_(int sig)
153 {
154   int errNr = errno;
155   printf("Cleaning up...\n");
156
157   if (ipc_close() < 0)
158     printf("Could not close socket!\n");
159
160   printf("BYE-BYE!\n");
161   errno = errNr;
162   exit(sig);
163 }
164
165 /*
166  * Local Variables:
167  * c-basic-offset: 2
168  * indent-tabs-mode: nil
169  * End:
170  */