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