1 /* -*- mode:C; indent-tabs-mode:t; tab-width:8; c-basic-offset:8; -*- */
2 
3 /* gnome-netinfo - A GUI Interface for network utilities
4  * Copyright (C) 2002, 2003 by German Poo-Caaman~o
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  */
20 
21 #ifdef HAVE_CONFIG_H
22 #  include <config.h>
23 #endif
24 
25 #include <string.h>
26 #include <glib/gi18n.h>
27 
28 #include <glibtop.h>
29 
30 #include "callbacks.h"
31 #include "ping.h"
32 #include "traceroute.h"
33 #include "info.h"
34 #include "netstat.h"
35 #include "scan.h"
36 #include "lookup.h"
37 #include "finger.h"
38 #include "whois.h"
39 #include "utils.h"
40 #include "gn-combo-history.h"
41 
42 Netinfo *load_ping_widgets_from_builder (GtkBuilder * builder);
43 Netinfo *load_traceroute_widgets_from_builder (GtkBuilder * builder);
44 Netinfo *load_netstat_widgets_from_builder (GtkBuilder * builder);
45 Netinfo *load_scan_widgets_from_builder (GtkBuilder * builder);
46 Netinfo *load_lookup_widgets_from_builder (GtkBuilder * builder);
47 Netinfo *load_finger_widgets_from_builder (GtkBuilder * builder);
48 Netinfo *load_whois_widgets_from_builder (GtkBuilder * builder);
49 Netinfo *load_info_widgets_from_builder (GtkBuilder * builder);
50 static gboolean start_initial_process_cb (gpointer data);
51 
52 int
main(int argc,char * argv[])53 main (int argc, char *argv[])
54 {
55 	GtkWidget *window;
56 	GtkAction *menu_beep;
57 	GtkBuilder *builder;
58 	GtkWidget *notebook;
59 	GtkWidget *statusbar;
60 	const gchar *dialog = UI_DIR "gnome-nettool.ui";
61 	Netinfo *pinger;
62 	Netinfo *tracer;
63 	Netinfo *netstat;
64 	Netinfo *info;
65 	Netinfo *scan;
66 	Netinfo *lookup;
67 	Netinfo *finger;
68 	Netinfo *whois;
69 	gint current_page = 0;
70 	static gchar *info_input = NULL;
71 	static gchar *ping_input = NULL;
72 	static gchar *netstat_input = NULL;
73 	static gchar *scan_input = NULL;
74 	static gchar *traceroute_input = NULL;
75 	static gchar *lookup_input = NULL;
76 	static gchar *finger_input = NULL;
77 	static gchar *whois_input = NULL;
78 	GError *error = NULL;
79 
80 	GOptionEntry options[] = {
81 		{ "info", 'i', 0, G_OPTION_ARG_STRING, &info_input,
82  		  N_("Load information for a network device"),
83  		  N_("DEVICE") },
84 
85 		{ "ping", 'p', 0, G_OPTION_ARG_STRING, &ping_input,
86  		  N_("Send a ping to a network address"),
87  		  N_("HOST") },
88 
89 		{ "netstat", 'n', 0, G_OPTION_ARG_STRING, &netstat_input,
90  		  N_("Get netstat information.  Valid options are: route, active, multicast."),
91  		  N_("COMMAND") },
92 
93 		{ "traceroute", 't', 0, G_OPTION_ARG_STRING, &traceroute_input,
94  		  N_("Trace a route to a network address"),
95  		  N_("HOST") },
96 
97 		{ "port-scan", 's', 0, G_OPTION_ARG_STRING, &scan_input,
98  		  N_("Port scan a network address"),
99  		  N_("HOST") },
100 
101 		{ "lookup", 'l', 0, G_OPTION_ARG_STRING, &lookup_input,
102  		  N_("Look up a network address"),
103  		  N_("HOST") },
104 
105 		{ "finger", 'f', 0, G_OPTION_ARG_STRING, &finger_input,
106  		  N_("Finger command to run"),
107  		  N_("USER") },
108 
109 		{ "whois", 'w', 0, G_OPTION_ARG_STRING, &whois_input,
110  		  N_("Perform a whois lookup for a network domain"),
111  		  N_("DOMAIN") },
112 
113 		{ NULL, '\0', 0, 0, NULL, NULL, NULL }
114  	};
115 
116 #ifdef ENABLE_NLS
117 	bindtextdomain (GETTEXT_PACKAGE, GNOME_NETTOOL_LOCALEDIR);
118 	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
119 	textdomain (GETTEXT_PACKAGE);
120 #endif
121 
122 	glibtop_init ();
123 
124 	if (!gtk_init_with_args (&argc, &argv, NULL, options, NULL, &error)) {
125 		g_print ("%s\n\n", error->message);
126 		return -1;
127 	}
128 
129 	if (!g_file_test (dialog, G_FILE_TEST_EXISTS)) {
130 		g_critical (_("The file %s doesn't exist, "
131 			      "please check if gnome-nettool is correctly installed"),
132 			    dialog);
133 		return -1;
134 	}
135 
136 	gtk_window_set_default_icon_name ("gnome-nettool");
137 
138 	builder = gtk_builder_new ();
139         gtk_builder_add_from_file (builder, dialog, NULL);
140 	window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
141 	statusbar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
142 	gtk_statusbar_push (GTK_STATUSBAR (statusbar), 0, _("Idle"));
143 
144 	g_signal_connect (G_OBJECT (window), "delete-event",
145 			  G_CALLBACK (gn_quit_app), NULL);
146 
147 	pinger = load_ping_widgets_from_builder (builder);
148 	tracer = load_traceroute_widgets_from_builder (builder);
149 	netstat = load_netstat_widgets_from_builder (builder);
150 	info = load_info_widgets_from_builder (builder);
151 	scan = load_scan_widgets_from_builder (builder);
152 	lookup = load_lookup_widgets_from_builder (builder);
153 	finger = load_finger_widgets_from_builder (builder);
154 	whois = load_whois_widgets_from_builder (builder);
155 
156 	if (info_input) {
157 		current_page = INFO;
158 		info_set_nic (info, info_input);
159 	}
160 	if (ping_input) {
161 		current_page = PING;
162 		netinfo_set_host (pinger, ping_input);
163 		g_idle_add (start_initial_process_cb, pinger);
164 	}
165 	if (netstat_input) {
166 		current_page = NETSTAT;
167 		if (! strcmp (netstat_input, "route"))
168 			gtk_toggle_button_set_active
169 				(GTK_TOGGLE_BUTTON (netstat->routing), TRUE);
170 		else if (! strcmp (netstat_input, "active"))
171 			gtk_toggle_button_set_active
172 				(GTK_TOGGLE_BUTTON (netstat->protocol), TRUE);
173 		else if (! strcmp (netstat_input, "multicast"))
174 			gtk_toggle_button_set_active
175 				(GTK_TOGGLE_BUTTON (netstat->multicast), TRUE);
176 		g_idle_add (start_initial_process_cb, netstat);
177 	}
178 	if (traceroute_input) {
179 		current_page = TRACEROUTE;
180 		netinfo_set_host (tracer, traceroute_input);
181 		g_idle_add (start_initial_process_cb, tracer);
182 	}
183 	if (scan_input) {
184 		current_page = PORTSCAN;
185 		netinfo_set_host (scan, scan_input);
186 		g_idle_add (start_initial_process_cb, scan);
187 	}
188 	if (lookup_input) {
189 		current_page = LOOKUP;
190 		netinfo_set_host (lookup, lookup_input);
191 		g_idle_add (start_initial_process_cb, lookup);
192 	}
193 	if (finger_input) {
194 		gchar **split_input = NULL;
195 		current_page = FINGER;
196 		split_input = g_strsplit (finger_input, "@", 2);
197 		if (split_input[0])
198 			netinfo_set_user (finger, split_input[0]);
199 		if (split_input[1])
200 			netinfo_set_host (finger, split_input[1]);
201 		g_strfreev (split_input);
202 		g_idle_add (start_initial_process_cb, finger);
203 	}
204 	if (whois_input) {
205 		current_page = WHOIS;
206 		netinfo_set_host (whois, whois_input);
207 		g_idle_add (start_initial_process_cb, whois);
208 	}
209 
210 	notebook = GTK_WIDGET (gtk_builder_get_object (builder, "notebook"));
211 	g_object_set_data (G_OBJECT (notebook), "pinger", pinger);
212 	g_object_set_data (G_OBJECT (notebook), "tracer", tracer);
213 	g_object_set_data (G_OBJECT (notebook), "netstat", netstat);
214 	g_object_set_data (G_OBJECT (notebook), "info", info);
215 	g_object_set_data (G_OBJECT (notebook), "scan", scan);
216 	g_object_set_data (G_OBJECT (notebook), "lookup", lookup);
217 	g_object_set_data (G_OBJECT (notebook), "finger", finger);
218 	g_object_set_data (G_OBJECT (notebook), "whois", whois);
219 
220 	menu_beep = GTK_ACTION (gtk_builder_get_object (builder, "m_beep"));
221 
222 	g_signal_connect (G_OBJECT (menu_beep), "activate",
223 			  G_CALLBACK (on_beep_activate),
224 			  (gpointer) pinger);
225 
226 	gtk_builder_connect_signals (builder, NULL);
227 	g_object_unref (G_OBJECT (builder));
228 
229 	gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), current_page);
230 
231 	gtk_widget_show (window);
232 
233 	gtk_main ();
234 
235 	glibtop_close ();
236 
237 	g_free (pinger);
238 	g_free (tracer);
239 	g_free (netstat);
240 	g_free (info);
241 	g_free (scan);
242 	g_free (lookup);
243 	g_free (finger);
244 	g_free (whois);
245 
246 	return 0;
247 }
248 
249 static gboolean
start_initial_process_cb(gpointer data)250 start_initial_process_cb (gpointer data)
251 {
252 	Netinfo *ni = data;
253 	NetinfoActivateFn fn_cb;
254 
255 	g_return_val_if_fail (data != NULL, FALSE);
256 
257 	fn_cb = (NetinfoActivateFn) ni->button_callback;
258 	if (fn_cb)
259 		(*fn_cb) (ni->button, data);
260 	return FALSE;
261 }
262 
263 /* The value returned must be released from memory */
264 Netinfo *
load_ping_widgets_from_builder(GtkBuilder * builder)265 load_ping_widgets_from_builder (GtkBuilder * builder)
266 {
267 	Netinfo *pinger;
268 	GtkWidget *label;
269 	GtkEntry  *entry_host;
270 	GtkTreeModel *model;
271 	GtkEntryCompletion *completion;
272 
273 	g_return_val_if_fail (builder != NULL, NULL);
274 
275 	pinger = g_new0 (Netinfo, 1);
276 
277 	pinger->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
278 	pinger->progress_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progress_bar"));
279 	pinger->page_label = GTK_WIDGET (gtk_builder_get_object (builder, "ping"));
280 	pinger->running = FALSE;
281 	pinger->toggle = TRUE;
282 	pinger->child_pid = 0;
283 	pinger->host = GTK_WIDGET (gtk_builder_get_object (builder, "ping_host"));
284 	pinger->count = GTK_WIDGET (gtk_builder_get_object (builder, "ping_count"));
285 	pinger->output = GTK_WIDGET (gtk_builder_get_object (builder, "ping_output"));
286 	pinger->limited = GTK_WIDGET (gtk_builder_get_object (builder, "ping_limited"));
287 	pinger->button = GTK_WIDGET (gtk_builder_get_object (builder, "ping_button"));
288 	pinger->graph = GTK_WIDGET (gtk_builder_get_object (builder, "ping_graph"));
289 	pinger->sensitive = pinger->host;
290 	pinger->label_run = _("Ping");
291 	pinger->label_stop = NULL;
292 	pinger->routing = NULL;
293 	pinger->protocol = NULL;
294 	pinger->multicast = NULL;
295 	pinger->min = GTK_WIDGET (gtk_builder_get_object (builder, "ping_minimum"));
296 	pinger->avg = GTK_WIDGET (gtk_builder_get_object (builder, "ping_average"));
297 	pinger->max = GTK_WIDGET (gtk_builder_get_object (builder, "ping_maximum"));
298 	pinger->packets_transmitted = GTK_WIDGET (gtk_builder_get_object (builder, "ping_packets_transmitted"));
299 	pinger->packets_received = GTK_WIDGET (gtk_builder_get_object (builder, "ping_packets_received"));
300 	pinger->packets_success = GTK_WIDGET (gtk_builder_get_object (builder, "ping_packets_success"));
301 
302 	pinger->status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
303 	pinger->stbar_text = NULL;
304 
305 	label = GTK_WIDGET (gtk_builder_get_object (builder, "ping_host_label"));
306 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), pinger->host);
307 
308 	pinger->button_callback = G_CALLBACK (on_ping_activate);
309 	pinger->process_line = NETINFO_FOREACH_FUNC (ping_foreach_with_tree);
310 	pinger->copy_output = NETINFO_COPY_FUNC (ping_copy_to_clipboard);
311 
312 	model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
313 	gtk_combo_box_set_model (GTK_COMBO_BOX (pinger->host), model);
314 	g_object_unref (model);
315 
316 	gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (pinger->host), 0);
317 
318 	entry_host = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (pinger->host)));
319 
320 	completion = gtk_entry_completion_new ();
321 	gtk_entry_set_completion (entry_host, completion);
322 	g_object_unref (completion);
323 	gtk_entry_completion_set_model (completion, model);
324 	gtk_entry_completion_set_text_column (completion, 0);
325 	g_object_unref (model);
326 
327 	pinger->history = gn_combo_history_new ();
328 	gn_combo_history_set_id (pinger->history, "hostnames");
329 	gn_combo_history_set_combo (pinger->history, GTK_COMBO_BOX (pinger->host));
330 
331 	g_signal_connect (G_OBJECT (entry_host), "activate",
332 			  G_CALLBACK (on_ping_activate),
333 			  pinger);
334 	g_signal_connect (G_OBJECT (pinger->limited), "toggled",
335 			  G_CALLBACK (on_ping_toggled),
336 			  pinger);
337 	g_signal_connect (G_OBJECT (pinger->button), "clicked",
338 			  pinger->button_callback,
339 			  pinger);
340 	g_signal_connect (G_OBJECT (pinger->graph), "draw",
341 			  G_CALLBACK (on_ping_graph_draw),
342 			  pinger);
343 
344 	return pinger;
345 }
346 
347 /* The value returned must be released from memory */
348 Netinfo *
load_traceroute_widgets_from_builder(GtkBuilder * builder)349 load_traceroute_widgets_from_builder (GtkBuilder * builder)
350 {
351 	Netinfo *tracer;
352 	GtkWidget *label;
353 	GtkEntry  *entry_host;
354 	GtkTreeModel *model;
355 	GtkEntryCompletion *completion;
356 
357 	g_return_val_if_fail (builder != NULL, NULL);
358 
359 	tracer = g_new0 (Netinfo, 1);
360 
361 	tracer->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
362 	tracer->progress_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progress_bar"));
363 	tracer->page_label = GTK_WIDGET (gtk_builder_get_object (builder, "traceroute"));
364 	tracer->running = FALSE;
365 	tracer->toggle = TRUE;
366 	tracer->use_tracepath = FALSE; /* It might be overriden on runtime
367 	                                  if tracepath is installed */
368 	tracer->child_pid = 0;
369 	tracer->host = GTK_WIDGET (gtk_builder_get_object (builder, "traceroute_host"));
370 	tracer->output = GTK_WIDGET (gtk_builder_get_object (builder, "traceroute_output"));
371 	tracer->button = GTK_WIDGET (gtk_builder_get_object (builder, "traceroute_button"));
372 	tracer->count = NULL;
373 	tracer->limited = NULL;
374 	tracer->sensitive = tracer->host;
375 	tracer->label_run = _("Trace");
376 	tracer->label_stop = NULL;
377 	tracer->routing = NULL;
378 	tracer->protocol = NULL;
379 	tracer->multicast = NULL;
380 
381 	tracer->status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
382 	tracer->stbar_text = NULL;
383 
384 	label = GTK_WIDGET (gtk_builder_get_object (builder, "traceroute_host_label"));
385 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), tracer->host);
386 
387 	tracer->button_callback = G_CALLBACK (on_traceroute_activate);
388 	tracer->process_line = NETINFO_FOREACH_FUNC (traceroute_foreach_with_tree);
389 	tracer->copy_output = NETINFO_COPY_FUNC (traceroute_copy_to_clipboard);
390 
391 	model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
392 	gtk_combo_box_set_model (GTK_COMBO_BOX (tracer->host), model);
393 	g_object_unref (model);
394 
395 	gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (tracer->host), 0);
396 
397 	entry_host = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (tracer->host)));
398 
399 	completion = gtk_entry_completion_new ();
400 	gtk_entry_set_completion (entry_host, completion);
401 	g_object_unref (completion);
402 	gtk_entry_completion_set_model (completion, model);
403 	gtk_entry_completion_set_text_column (completion, 0);
404 	g_object_unref (model);
405 
406 	tracer->history = gn_combo_history_new ();
407 	gn_combo_history_set_id (tracer->history, "hostnames");
408 	gn_combo_history_set_combo (tracer->history, GTK_COMBO_BOX (tracer->host));
409 
410 	g_signal_connect (G_OBJECT (entry_host), "activate",
411 			  G_CALLBACK (on_traceroute_activate),
412 			  tracer);
413 	g_signal_connect (G_OBJECT (tracer->button), "clicked",
414 			  tracer->button_callback,
415 			  tracer);
416 
417 	return tracer;
418 }
419 
420 Netinfo *
load_netstat_widgets_from_builder(GtkBuilder * builder)421 load_netstat_widgets_from_builder (GtkBuilder * builder)
422 {
423 	Netinfo *netstat;
424 
425 	g_return_val_if_fail (builder != NULL, NULL);
426 
427 	netstat = g_new0 (Netinfo, 1);
428 
429 	netstat->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
430 	netstat->progress_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progress_bar"));
431 	netstat->page_label = GTK_WIDGET (gtk_builder_get_object (builder, "netstat"));
432 	netstat->running = FALSE;
433 	netstat->toggle = TRUE;
434 	netstat->child_pid = 0;
435 	netstat->host = NULL;
436 	netstat->count = NULL;
437 	netstat->output = GTK_WIDGET (gtk_builder_get_object (builder, "netstat_output"));
438 	netstat->limited = NULL;
439 	netstat->button = GTK_WIDGET (gtk_builder_get_object (builder, "netstat_button"));
440 	netstat->routing = GTK_WIDGET (gtk_builder_get_object (builder, "netstat_routing"));
441 	netstat->protocol = GTK_WIDGET (gtk_builder_get_object (builder, "netstat_protocol"));
442 	netstat->multicast = GTK_WIDGET (gtk_builder_get_object (builder, "netstat_multicast"));
443 	netstat->sensitive = NULL;
444 	netstat->label_run = _("Netstat");
445 	netstat->label_stop = NULL;
446 
447 	netstat->status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
448 	netstat->stbar_text = NULL;
449 
450 	netstat->button_callback = G_CALLBACK (on_netstat_activate);
451 	netstat->process_line = NETINFO_FOREACH_FUNC (netstat_foreach_with_tree);
452 	netstat->copy_output = NETINFO_COPY_FUNC (netstat_copy_to_clipboard);
453 
454 	g_signal_connect (G_OBJECT (netstat->button), "clicked",
455 				  netstat->button_callback,
456 				  netstat);
457 /*
458 	g_signal_connect (G_OBJECT (netstat->protocol), "toggled",
459 				  G_CALLBACK (on_protocol_button_toggled),
460 				  netstat);
461 	g_signal_connect (G_OBJECT (netstat->routing), "toggled",
462 				  G_CALLBACK (on_protocol_button_toggled),
463 				  netstat);
464 	g_signal_connect (G_OBJECT (netstat->multicast), "toggled",
465 				  G_CALLBACK (on_protocol_button_toggled),
466 				  netstat);
467 */
468 	return netstat;
469 }
470 
471 static void
info_list_ip_addr_add_columns(GtkWidget * list_ip_addr)472 info_list_ip_addr_add_columns (GtkWidget *list_ip_addr)
473 {
474 	GtkTreeViewColumn *column;
475 	GtkCellRenderer   *renderer;
476 
477 	renderer = gtk_cell_renderer_text_new ();
478 	column = gtk_tree_view_column_new_with_attributes (_("Protocol"),
479 							   renderer,
480 							   "text", 0,
481 							   NULL);
482 	gtk_tree_view_insert_column (GTK_TREE_VIEW (list_ip_addr), column, 0);
483 
484 	renderer = gtk_cell_renderer_text_new ();
485 	column = gtk_tree_view_column_new_with_attributes (_("IP Address"),
486 							   renderer,
487 							   "text", 1,
488 							   NULL);
489 	gtk_tree_view_insert_column (GTK_TREE_VIEW (list_ip_addr), column, 1);
490 
491 	renderer = gtk_cell_renderer_text_new ();
492 	column = gtk_tree_view_column_new_with_attributes (_("Netmask / Prefix"),
493 							   renderer,
494 							   "text", 2,
495 							   NULL);
496 	gtk_tree_view_insert_column (GTK_TREE_VIEW (list_ip_addr), column, 2);
497 
498 	renderer = gtk_cell_renderer_text_new ();
499 	column = gtk_tree_view_column_new_with_attributes (_("Broadcast"),
500 							   renderer,
501 							   "text", 3,
502 							   NULL);
503 	gtk_tree_view_insert_column (GTK_TREE_VIEW (list_ip_addr), column, 3);
504 
505 	renderer = gtk_cell_renderer_text_new ();
506 	column = gtk_tree_view_column_new_with_attributes (_("Scope"),
507 							   renderer,
508 							   "text", 4,
509 							   NULL);
510 	gtk_tree_view_insert_column (GTK_TREE_VIEW (list_ip_addr), column, 4);
511 
512 
513 }
514 
515 /* The value returned must be released from memory */
516 Netinfo *
load_info_widgets_from_builder(GtkBuilder * builder)517 load_info_widgets_from_builder (GtkBuilder * builder)
518 {
519 	Netinfo      *info;
520 	GtkTreeModel *model;
521 	GtkWidget    *label1;
522 
523 	g_return_val_if_fail (builder != NULL, NULL);
524 
525 	info = g_malloc (sizeof (Netinfo));
526 
527 	info->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
528 	info->running = FALSE;
529 	info->toggle = TRUE;
530 	info->combo = GTK_WIDGET (gtk_builder_get_object (builder, "info_combo"));
531 	info->ipv6_frame = GTK_WIDGET (gtk_builder_get_object (builder, "info_ipv6_frame"));
532 	info->progress_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progress_bar"));
533 	info->page_label = GTK_WIDGET (gtk_builder_get_object (builder, "device"));
534 	info->hw_address = GTK_WIDGET (gtk_builder_get_object (builder, "info_hw_address"));
535 	info->ip_address = GTK_WIDGET (gtk_builder_get_object (builder, "info_ip_address"));
536 	info->netmask = GTK_WIDGET (gtk_builder_get_object (builder, "info_netmask"));
537 	info->broadcast = GTK_WIDGET (gtk_builder_get_object (builder, "info_broadcast"));
538 	info->multicast = GTK_WIDGET (gtk_builder_get_object (builder, "info_multicast"));
539 	info->link_speed = GTK_WIDGET (gtk_builder_get_object (builder, "info_link_speed"));
540 	info->state = GTK_WIDGET (gtk_builder_get_object (builder, "info_state"));
541 	info->mtu = GTK_WIDGET (gtk_builder_get_object (builder, "info_mtu"));
542 	info->tx_bytes = GTK_WIDGET (gtk_builder_get_object (builder, "info_tx_bytes"));
543 	info->tx = GTK_WIDGET (gtk_builder_get_object (builder, "info_tx"));
544 	info->tx_errors = GTK_WIDGET (gtk_builder_get_object (builder, "info_tx_errors"));
545 	info->rx_bytes = GTK_WIDGET (gtk_builder_get_object (builder, "info_rx_bytes"));
546 	info->rx = GTK_WIDGET (gtk_builder_get_object (builder, "info_rx"));
547 	info->rx_errors = GTK_WIDGET (gtk_builder_get_object (builder, "info_rx_errors"));
548 	info->collisions = GTK_WIDGET (gtk_builder_get_object (builder, "info_collisions"));
549 	info->list_ip_addr = GTK_WIDGET (gtk_builder_get_object (builder, "info_list_ip_addr"));
550 	info->configure_button = GTK_WIDGET (gtk_builder_get_object (builder, "info_configure_button"));
551 
552 	info->status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
553 	info->stbar_text = NULL;
554 
555 	model = GTK_TREE_MODEL (gtk_list_store_new (5, G_TYPE_STRING, G_TYPE_STRING,
556 						    G_TYPE_STRING, G_TYPE_STRING,
557 						    G_TYPE_STRING));
558 	gtk_tree_view_set_model (GTK_TREE_VIEW (info->list_ip_addr), model);
559 	g_object_unref (model);
560 
561 	info_list_ip_addr_add_columns (info->list_ip_addr);
562 
563 	label1 = GTK_WIDGET (gtk_builder_get_object (builder, "info_combo_label"));
564 	gtk_label_set_mnemonic_widget (GTK_LABEL (label1), info->combo);
565 
566 	model = GTK_TREE_MODEL (gtk_list_store_new (3, GDK_TYPE_PIXBUF,
567 						    G_TYPE_STRING,
568 						    G_TYPE_POINTER));
569 	gtk_combo_box_set_model (GTK_COMBO_BOX (info->combo), model);
570 
571 	g_object_unref (model);
572 
573 	g_signal_connect (G_OBJECT (info->configure_button), "clicked",
574 			  G_CALLBACK (on_configure_button_clicked),
575 			  info);
576 
577 	g_signal_connect (G_OBJECT (info->combo), "changed",
578 			  G_CALLBACK (info_nic_changed),
579 			  info);
580 
581 	info_load_iface (info);
582 	info->copy_output = NETINFO_COPY_FUNC (info_copy_to_clipboard);
583 
584 	return info;
585 }
586 
587 Netinfo *
load_scan_widgets_from_builder(GtkBuilder * builder)588 load_scan_widgets_from_builder (GtkBuilder * builder)
589 {
590 	Netinfo *scan;
591 	GtkEntry  *entry_host;
592 	GtkWidget *label;
593 	GtkTreeModel *model;
594 	GtkEntryCompletion *completion;
595 
596 	g_return_val_if_fail (builder != NULL, NULL);
597 
598 	scan = g_new0 (Netinfo, 1);
599 
600 	scan->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
601 	scan->progress_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progress_bar"));
602 	scan->page_label = GTK_WIDGET (gtk_builder_get_object (builder, "scan"));
603 	scan->running = FALSE;
604 	scan->toggle = TRUE;
605 	scan->child_pid = 0;
606 	scan->host = GTK_WIDGET (gtk_builder_get_object (builder, "scan_host"));
607 	scan->count = NULL;
608 	scan->output = GTK_WIDGET (gtk_builder_get_object (builder, "scan_output"));
609 	scan->limited = NULL;
610 	scan->button = GTK_WIDGET (gtk_builder_get_object (builder, "scan_button"));
611 	scan->routing = NULL;
612 	scan->protocol = NULL;
613 	scan->multicast = NULL;
614 	scan->sensitive = NULL;
615 	scan->label_run = _("Scan");
616 	scan->label_stop = NULL;
617 
618 	scan->status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
619 	scan->stbar_text = NULL;
620 
621 	label = GTK_WIDGET (gtk_builder_get_object (builder, "scan_host_label"));
622 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), scan->host);
623 
624 	scan->button_callback = G_CALLBACK (on_scan_activate);
625 	scan->copy_output = NETINFO_COPY_FUNC (scan_copy_to_clipboard);
626 	scan->process_line = NETINFO_FOREACH_FUNC (scan_foreach);
627 
628 	model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
629 	gtk_combo_box_set_model (GTK_COMBO_BOX (scan->host), model);
630 	g_object_unref (model);
631 
632 	gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (scan->host), 0);
633 
634 	entry_host = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (scan->host)));
635 
636 	completion = gtk_entry_completion_new ();
637 	gtk_entry_set_completion (entry_host, completion);
638 	g_object_unref (completion);
639 	gtk_entry_completion_set_model (completion, model);
640 	gtk_entry_completion_set_text_column (completion, 0);
641 	g_object_unref (model);
642 
643 	scan->history = gn_combo_history_new ();
644 	gn_combo_history_set_id (scan->history, "hostnames");
645 	gn_combo_history_set_combo (scan->history, GTK_COMBO_BOX (scan->host));
646 
647 	g_signal_connect (G_OBJECT (entry_host), "activate",
648 			  scan->button_callback,
649 			  scan);
650 	g_signal_connect (G_OBJECT (scan->button), "clicked",
651                           scan->button_callback,
652                           scan);
653 
654 	return scan;
655 }
656 
657 static void
nettool_lookup_setup_combo_type(Netinfo * lookup)658 nettool_lookup_setup_combo_type (Netinfo *lookup)
659 {
660 	gint i;
661 	GtkTreeModel *model;
662 	GtkTreeIter   iter;
663 	GtkCellRenderer *renderer;
664 	gchar *types[] = {
665 		N_("Default Information"),
666 		N_("Internet Address"),
667 		N_("Canonical Name"),
668 		N_("CPU / OS Type"),
669 		/* When asking for MX record in DNS context */
670 		N_("Mailbox Exchange"),
671 		N_("Mailbox Information"),
672 		/* When asking for NS record in DNS context */
673 		N_("Name Server"),
674 		N_("Host name for Address"),
675 		/* When asking for SOA record in DNS context.
676 		   It defines which server is the primary nameserver
677 		   for a domain */
678 		N_("Start of Authority"),
679 		N_("Text Information"),
680 		N_("Well Known Services"),
681 		N_("Any / All Information"),
682 		NULL
683 	};
684 
685 	model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
686 
687 	for (i=0; types[i]; i++) {
688 		gtk_list_store_append (GTK_LIST_STORE (model), &iter);
689 		gtk_list_store_set (GTK_LIST_STORE (model), &iter,
690 				    0, _(types[i]), -1);
691 	}
692 
693 	gtk_combo_box_set_model (GTK_COMBO_BOX (lookup->type), model);
694 
695 	g_object_unref (model);
696 
697 	gtk_cell_layout_clear (GTK_CELL_LAYOUT (lookup->type));
698 	renderer = gtk_cell_renderer_text_new ();
699 	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (lookup->type), renderer, TRUE);
700 	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (lookup->type), renderer,
701 					"text", 0, NULL);
702 
703 	gtk_combo_box_set_active (GTK_COMBO_BOX (lookup->type), 0);
704 }
705 
706 /* The value returned must be released from memory */
707 Netinfo *
load_lookup_widgets_from_builder(GtkBuilder * builder)708 load_lookup_widgets_from_builder (GtkBuilder * builder)
709 {
710 	Netinfo *lookup;
711 	GtkWidget *label;
712 	GtkEntry  *entry_host;
713 	GtkTreeModel *model;
714 	GtkEntryCompletion *completion;
715 
716 	g_return_val_if_fail (builder != NULL, NULL);
717 
718 	lookup = g_new0 (Netinfo, 1);
719 
720 	lookup->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
721 	lookup->progress_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progress_bar"));
722 	lookup->page_label = GTK_WIDGET (gtk_builder_get_object (builder, "lookup"));
723 	lookup->running = FALSE;
724 	lookup->toggle = TRUE;
725 	lookup->child_pid = 0;
726 	lookup->host = GTK_WIDGET (gtk_builder_get_object (builder, "lookup_host"));
727 	lookup->output = GTK_WIDGET (gtk_builder_get_object (builder, "lookup_output"));
728 	lookup->button = GTK_WIDGET (gtk_builder_get_object (builder, "lookup_button"));
729 	lookup->type = GTK_WIDGET (gtk_builder_get_object (builder, "lookup_type"));
730 	lookup->count = NULL;
731 	lookup->limited = NULL;
732 	lookup->sensitive = lookup->host;
733 	lookup->label_run = _("Lookup");
734 	lookup->label_stop = NULL;
735 	lookup->routing = NULL;
736 	lookup->protocol = NULL;
737 	lookup->multicast = NULL;
738 
739 	lookup->status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
740 	lookup->stbar_text = NULL;
741 
742 	label = GTK_WIDGET (gtk_builder_get_object (builder, "lookup_host_label"));
743 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), lookup->host);
744 	label = GTK_WIDGET (gtk_builder_get_object (builder, "lookup_type_label"));
745 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), lookup->type);
746 
747 	lookup->button_callback = G_CALLBACK (on_lookup_activate);
748 	lookup->process_line = NETINFO_FOREACH_FUNC (lookup_foreach_with_tree);
749 	lookup->copy_output = NETINFO_COPY_FUNC (lookup_copy_to_clipboard);
750 
751 	nettool_lookup_setup_combo_type (lookup);
752 
753 	model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
754 	gtk_combo_box_set_model (GTK_COMBO_BOX (lookup->host), model);
755 	g_object_unref (model);
756 
757 	gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (lookup->host), 0);
758 
759 	entry_host = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (lookup->host)));
760 
761 	completion = gtk_entry_completion_new ();
762 	gtk_entry_set_completion (entry_host, completion);
763 	g_object_unref (completion);
764 	gtk_entry_completion_set_model (completion, model);
765 	gtk_entry_completion_set_text_column (completion, 0);
766 	g_object_unref (model);
767 
768 	lookup->history = gn_combo_history_new ();
769 	gn_combo_history_set_id (lookup->history, "hostnames");
770 	gn_combo_history_set_combo (lookup->history, GTK_COMBO_BOX (lookup->host));
771 
772 	g_signal_connect (G_OBJECT (entry_host), "activate",
773 			  G_CALLBACK (on_lookup_activate),
774 			  lookup);
775 	g_signal_connect (G_OBJECT (lookup->button), "clicked",
776 			  lookup->button_callback,
777 			  lookup);
778 
779 	return lookup;
780 }
781 
782 /* The value returned must be released from memory */
783 Netinfo *
load_finger_widgets_from_builder(GtkBuilder * builder)784 load_finger_widgets_from_builder (GtkBuilder * builder)
785 {
786 	Netinfo *finger;
787 	GtkWidget *label;
788 	PangoFontDescription *font_desc;
789 	GtkEntry  *entry_host;
790 	GtkTreeModel *model;
791 	GtkEntryCompletion *completion;
792 
793 	g_return_val_if_fail (builder != NULL, NULL);
794 
795 	finger = g_new0 (Netinfo, 1);
796 
797 	finger->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
798 	finger->progress_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progress_bar"));
799 	finger->page_label = GTK_WIDGET (gtk_builder_get_object (builder, "finger"));
800 	finger->running = FALSE;
801 	finger->toggle = TRUE;
802 	finger->child_pid = 0;
803 	finger->user = GTK_WIDGET (gtk_builder_get_object (builder, "finger_user"));
804 	finger->host = GTK_WIDGET (gtk_builder_get_object (builder, "finger_host"));
805 	finger->output = GTK_WIDGET (gtk_builder_get_object (builder, "finger_output"));
806 	finger->button = GTK_WIDGET (gtk_builder_get_object (builder, "finger_button"));
807 	finger->type = GTK_WIDGET (gtk_builder_get_object (builder, "finger_type"));
808 	finger->count = NULL;
809 	finger->limited = NULL;
810 	finger->sensitive = GTK_WIDGET (gtk_builder_get_object (builder, "finger_input_box"));
811 	finger->label_run = _("Finger");
812 	finger->label_stop = NULL;
813 	finger->routing = NULL;
814 	finger->protocol = NULL;
815 	finger->multicast = NULL;
816 
817 	finger->status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
818 	finger->stbar_text = NULL;
819 
820 	label = GTK_WIDGET (gtk_builder_get_object (builder, "finger_user_label"));
821 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), finger->user);
822 	label = GTK_WIDGET (gtk_builder_get_object (builder, "finger_host_label"));
823 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), finger->host);
824 
825 	font_desc = pango_font_description_new ();
826 	pango_font_description_set_family (font_desc, "monospace");
827 	gtk_widget_modify_font (finger->output, font_desc);
828 	pango_font_description_free (font_desc);
829 
830 	finger->button_callback = G_CALLBACK (on_finger_activate);
831 	finger->process_line = NETINFO_FOREACH_FUNC (finger_foreach);
832 	finger->copy_output = NETINFO_COPY_FUNC (finger_copy_to_clipboard);
833 
834 	model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
835 	gtk_combo_box_set_model (GTK_COMBO_BOX (finger->user), model);
836 	g_object_unref (model);
837 
838 	gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (finger->user), 0);
839 
840 	entry_host = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (finger->user)));
841 
842 	completion = gtk_entry_completion_new ();
843 	gtk_entry_set_completion (entry_host, completion);
844 	g_object_unref (completion);
845 	gtk_entry_completion_set_model (completion, model);
846 	gtk_entry_completion_set_text_column (completion, 0);
847 	g_object_unref (model);
848 
849 	finger->history_user = gn_combo_history_new ();
850 	gn_combo_history_set_id (finger->history_user, "usernames");
851 	gn_combo_history_set_combo (finger->history_user, GTK_COMBO_BOX (finger->user));
852 
853 	g_signal_connect (G_OBJECT (entry_host), "activate",
854 			  G_CALLBACK (on_finger_activate),
855 			  finger);
856 
857 	model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
858 	gtk_combo_box_set_model (GTK_COMBO_BOX (finger->host), model);
859 	g_object_unref (model);
860 
861 	gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (finger->host), 0);
862 
863 	entry_host = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (finger->host)));
864 
865 	completion = gtk_entry_completion_new ();
866 	gtk_entry_set_completion (entry_host, completion);
867 	g_object_unref (completion);
868 	gtk_entry_completion_set_model (completion, model);
869 	gtk_entry_completion_set_text_column (completion, 0);
870 	g_object_unref (model);
871 
872 	finger->history = gn_combo_history_new ();
873 	gn_combo_history_set_id (finger->history, "hostnames");
874 	gn_combo_history_set_combo (finger->history, GTK_COMBO_BOX (finger->host));
875 
876 	g_signal_connect (G_OBJECT (entry_host), "activate",
877 			  G_CALLBACK (on_finger_activate),
878 			  finger);
879 
880 	g_signal_connect (G_OBJECT (finger->button), "clicked",
881 			  finger->button_callback,
882 			  finger);
883 
884 	return finger;
885 }
886 
887 /* The value returned must be released from memory */
888 Netinfo *
load_whois_widgets_from_builder(GtkBuilder * builder)889 load_whois_widgets_from_builder (GtkBuilder * builder)
890 {
891 	Netinfo *whois;
892 	GtkWidget *label;
893 	GtkEntry  *entry_host;
894 	GtkTreeModel *model;
895 	GtkEntryCompletion *completion;
896 	PangoFontDescription *font_desc;
897 
898 
899 	g_return_val_if_fail (builder != NULL, NULL);
900 
901 	whois = g_new0 (Netinfo, 1);
902 
903 	whois->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
904 	whois->progress_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progress_bar"));
905 	whois->page_label = GTK_WIDGET (gtk_builder_get_object (builder, "whois"));
906 	whois->running = FALSE;
907 	whois->toggle = TRUE;
908 	whois->child_pid = 0;
909 	whois->host = GTK_WIDGET (gtk_builder_get_object (builder, "whois_host"));
910 	whois->output = GTK_WIDGET (gtk_builder_get_object (builder, "whois_output"));
911 	whois->button = GTK_WIDGET (gtk_builder_get_object (builder, "whois_button"));
912 	whois->count = NULL;
913 	whois->limited = NULL;
914 	whois->sensitive = GTK_WIDGET (gtk_builder_get_object (builder, "whois_input_box"));
915 	whois->label_run = _("Whois");
916 	whois->label_stop = NULL;
917 	whois->routing = NULL;
918 	whois->protocol = NULL;
919 	whois->multicast = NULL;
920 
921 	whois->status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
922 	whois->stbar_text = NULL;
923 
924 	label = GTK_WIDGET (gtk_builder_get_object (builder, "whois_host_label"));
925 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), whois->host);
926 
927 	font_desc = pango_font_description_new ();
928 	pango_font_description_set_family (font_desc, "monospace");
929 	gtk_widget_modify_font (whois->output, font_desc);
930 	pango_font_description_free (font_desc);
931 
932 	whois->button_callback = G_CALLBACK (on_whois_activate);
933 	whois->process_line = NETINFO_FOREACH_FUNC (whois_foreach);
934 	whois->copy_output = NETINFO_COPY_FUNC (whois_copy_to_clipboard);
935 
936 	model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
937 	gtk_combo_box_set_model (GTK_COMBO_BOX (whois->host), model);
938 	g_object_unref (model);
939 
940 	gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (whois->host), 0);
941 
942 	entry_host = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (whois->host)));
943 
944 	completion = gtk_entry_completion_new ();
945 	gtk_entry_set_completion (entry_host, completion);
946 	g_object_unref (completion);
947 	gtk_entry_completion_set_model (completion, model);
948 	gtk_entry_completion_set_text_column (completion, 0);
949 	g_object_unref (model);
950 
951 	whois->history = gn_combo_history_new ();
952 	gn_combo_history_set_id (whois->history, "domains");
953 	gn_combo_history_set_combo (whois->history, GTK_COMBO_BOX (whois->host));
954 
955 	g_signal_connect (G_OBJECT (entry_host), "activate",
956 			  G_CALLBACK (on_whois_activate),
957 			  whois);
958 	g_signal_connect (G_OBJECT (whois->button), "clicked",
959 			  whois->button_callback,
960 			  whois);
961 
962 	return whois;
963 }
964