/* Allocates a new node structure */ node_t * node_create(const node_id_t * node_id) { node_t *node; gchar *name; guint i; g_assert(node_id); node = g_malloc (sizeof (node_t)); g_assert(node); node->node_id = *node_id; name = node_id_str(node_id); node->name = g_string_new(name); node->numeric_name = g_string_new(name); g_free(name); for (i = 0 ; i <= STACK_SIZE; ++i) node->main_prot[i] = NULL; traffic_stats_init(&node->node_stats); ++nodes_num; if (INFO_ENABLED) { gchar *msg = node_id_dump(&node->node_id); g_my_info(_("New node: %s. Number of nodes %d"), msg, nodes_num); g_free(msg); } return node; } /* create_node */
/* destroys a node */ void node_delete(node_t *node) { guint i; if (!node) return; /* nothing to do */ if (node->name) g_string_free (node->name, TRUE); node->name = NULL; if (node->numeric_name) g_string_free (node->numeric_name, TRUE); node->numeric_name = NULL; for (i = 0; i <= STACK_SIZE; ++i) if (node->main_prot[i]) { g_free (node->main_prot[i]); node->main_prot[i] = NULL; } traffic_stats_reset(&node->node_stats); if (INFO_ENABLED) { gchar *msg = node_id_dump(&node->node_id); g_my_info(_("delete node: %s. Number of nodes %d"), msg, nodes_num-1); g_free(msg); } g_free (node); --nodes_num; }
void dump_stats(guint32 diff_msecs) { gchar *status_string; long ipc=ipcache_active_entries(); status_string = g_strdup_printf ( _("Nodes: %d (on canvas: %d, shown: %u), Links: %d, Conversations: %ld, " "names %ld, protocols %ld. Total Packets seen: %lu (in memory: %ld, " "on list %ld). IP cache entries %ld. Canvas objs: %ld. Refreshed: %u ms"), node_count(), g_tree_nnodes(canvas_nodes), displayed_nodes, links_catalog_size(), active_conversations(), active_names(), protocol_summary_size(), appdata.n_packets, appdata.total_mem_packets, packet_list_item_count(), ipc, canvas_obj_count, (unsigned int) diff_msecs); g_my_info ("%s", status_string); g_free(status_string); }
/* Called for every event a node receives. Right now it's used to * set a message in the statusbar and launch the popup timeout */ static gint node_item_event (GnomeCanvasItem * item, GdkEvent * event, canvas_node_t * canvas_node) { gdouble item_x, item_y; const node_t *node = NULL; /* This is not used yet, but it will be. */ item_x = event->button.x; item_y = event->button.y; gnome_canvas_item_w2i (item->parent, &item_x, &item_y); switch (event->type) { case GDK_2BUTTON_PRESS: if (canvas_node) node = nodes_catalog_find(&canvas_node->canvas_node_id); if (node) { node_protocols_window_create( &canvas_node->canvas_node_id ); g_my_info ("Nodes: %d (shown %u)", nodes_catalog_size(), displayed_nodes); if (DEBUG_ENABLED) { gchar *msg = node_dump(node); g_my_debug("%s", msg); g_free(msg); } } break; default: break; } return FALSE; } /* node_item_event */
/* TODO this is probably this single piece of code I am most ashamed of. * I should learn how to use flex or yacc and do this The Right Way (TM)*/ void services_init(void) { FILE *services = NULL; gchar *line; gchar **t1 = NULL, **t2 = NULL; gchar *str; port_service_t *port_service; guint i; char filename[PATH_MAX]; port_type_t port_number; /* udp and tcp are the same */ if (tcp_services) return; /* already loaded */ safe_strncpy(filename, CONFDIR "/services", sizeof(filename)); if (!(services = fopen (filename, "r"))) { safe_strncpy(filename, "/etc/services", sizeof(filename)); if (!(services = fopen (filename, "r"))) { g_my_critical (_ ("Failed to open %s. No TCP or UDP services will be recognized"), filename); return; } } g_my_info (_("Reading TCP and UDP services from %s"), filename); service_names = g_tree_new_full(services_name_cmp, NULL, NULL, services_tree_free); tcp_services = g_tree_new_full(services_port_cmp, NULL, NULL, services_tree_free); udp_services = g_tree_new_full(services_port_cmp, NULL, NULL, services_tree_free); line = g_malloc (LINESIZE); g_assert(line); while (fgets (line, LINESIZE, services)) { if (line[0] != '#' && line[0] != ' ' && line[0] != '\n' && line[0] != '\t') { gboolean error = FALSE; if (!g_strdelimit (line, " \t\n", ' ')) error = TRUE; if (error || !(t1 = g_strsplit (line, " ", 0))) error = TRUE; if (!error && t1[0]) { gchar *told = t1[0]; t1[0] = g_ascii_strup (told, -1); g_free(told); } for (i = 1; t1[i] && !strcmp ("", t1[i]); i++) ; if (!error && (str = t1[i])) if (!(t2 = g_strsplit (str, "/", 0))) error = TRUE; if (error || !t2 || !t2[0]) error = TRUE; /* TODO The h here is not portable */ if (error || !sscanf (t2[0], "%hd", &port_number) || (port_number < 1)) error = TRUE; if (error || !t2[1]) error = TRUE; if (error || (g_ascii_strcasecmp ("udp", t2[1]) && g_ascii_strcasecmp ("tcp", t2[1]) && g_ascii_strcasecmp ("ddp", t2[1]) && g_ascii_strcasecmp ("sctp", t2[1]) )) error = TRUE; if (error) g_warning (_("Unable to parse line %s"), line); else { #if DEBUG g_my_debug ("Loading service %s %s %d", t2[1], t1[0], port_number); #endif if (!g_ascii_strcasecmp ("ddp", t2[1])) g_my_info (_("DDP protocols not supported in %s"), line); else if (!g_ascii_strcasecmp ("sctp", t2[1])) g_my_info (_("SCTP protocols not supported in %s"), line); else { /* map port to name, to two trees */ port_service = port_service_new(port_number, t1[0]); if (!g_ascii_strcasecmp ("tcp", t2[1])) g_tree_replace(tcp_services, &(port_service->port), port_service); else if (!g_ascii_strcasecmp ("udp", t2[1])) g_tree_replace(udp_services, &(port_service->port), port_service); } } g_strfreev (t2); t2 = NULL; g_strfreev (t1); t1 = NULL; } } fclose (services); g_free (line); /* now traverse port->name trees to fill the name->port tree */ g_tree_foreach(udp_services, services_port_trv, service_names); g_tree_foreach(tcp_services, services_port_trv, service_names); /* and finally assign preferred services */ services_fill_preferred(); } /* services_init */
/* It's not static since it will be called from the GUI */ void save_config(void) { gchar *pref_file; gchar *cfgdata; gchar *tmpstr; gboolean res; GError *error = NULL; GKeyFile *gkey; gkey = g_key_file_new(); g_key_file_set_boolean(gkey, pref_group, "diagram_only", pref.diagram_only); g_key_file_set_boolean(gkey, pref_group, "group_unk", pref.group_unk); g_key_file_set_boolean(gkey, pref_group, "name_res", pref.name_res); g_key_file_set_double(gkey, pref_group, "node_timeout_time", pref.node_timeout_time); g_key_file_set_double(gkey, pref_group, "gui_node_timeout_time", pref.gui_node_timeout_time); g_key_file_set_double(gkey, pref_group, "proto_node_timeout_time", pref.proto_node_timeout_time); g_key_file_set_double(gkey, pref_group, "link_timeout_time", pref.link_timeout_time); g_key_file_set_double(gkey, pref_group, "gui_link_timeout_time", pref.gui_link_timeout_time); g_key_file_set_double(gkey, pref_group, "proto_link_timeout_time", pref.proto_link_timeout_time); g_key_file_set_double(gkey, pref_group, "proto_timeout_time", pref.proto_timeout_time); g_key_file_set_double(gkey, pref_group, "averaging_time", pref.averaging_time); g_key_file_set_double(gkey, pref_group, "node_radius_multiplier", pref.node_radius_multiplier); g_key_file_set_double(gkey, pref_group, "link_node_ratio", pref.link_node_ratio); g_key_file_set_integer(gkey, pref_group, "refresh_period", pref.refresh_period); g_key_file_set_integer(gkey, pref_group, "size_mode", pref.size_mode); g_key_file_set_integer(gkey, pref_group, "node_size_variable", pref.node_size_variable); g_key_file_set_integer(gkey, pref_group, "stack_level", pref.stack_level); g_key_file_set_string(gkey, pref_group, "filter", pref.filter); g_key_file_set_string(gkey, pref_group, "fontname", pref.fontname); g_key_file_set_string(gkey, pref_group, "text_color", pref.text_color); g_key_file_set_string(gkey, pref_group, "center_node", pref.center_node); tmpstr = g_strjoinv(" ", pref.colors); g_key_file_set_string(gkey, pref_group, "colors", tmpstr); g_free(tmpstr); g_key_file_set_string(gkey, "General", "version", VERSION); /* write config to file */ cfgdata = g_key_file_to_data(gkey, NULL, NULL); pref_file = config_file_name(); res = g_file_set_contents(pref_file, cfgdata, -1, &error); g_free(cfgdata); if (res) g_my_info (_("Preferences saved to %s"), pref_file); else { GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Error saving preferences to '%s': %s"), pref_file, (error && error->message) ? error->message : ""); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } g_free(pref_file); } /* save_config */