Example #1
0
/* 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 */
Example #2
0
/* 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;
}
Example #3
0
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);
}
Example #4
0
/* 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 */
Example #5
0
                                    /* 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 */
Example #6
0
/* 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 */