Logo Search packages:      
Sourcecode: wireshark version File versions  Download package

stat_cmd_args.c

/* stat_cmd_args.c
 * Routines to register "-z" command-line argument handlers for stats
 *
 * $Id: stat_cmd_args.c 18197 2006-05-21 05:12:17Z sahlberg $
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

#include <stdio.h>

#include <string.h>

#include <glib.h>

#include <epan/stat_cmd_args.h>

/* structure to keep track of what stats have registered command-line
   arguments.
 */
00040 typedef struct _stat_cmd_arg {
      const char *cmd;
      void (*func)(const char *arg, void* userdata);
    void* userdata;
} stat_cmd_arg;

static GSList *stat_cmd_arg_list=NULL;

/* structure to keep track of what stats have been specified on the
   command line.
 */
00051 typedef struct {
      stat_cmd_arg *sca;
      char *arg;
} stat_requested;
static GSList *stats_requested = NULL;

/* **********************************************************************
 * Function called from stat to register the stat's command-line argument
 * and initialization routine
 * ********************************************************************** */
static gint
sort_by_name(gconstpointer a, gconstpointer b)
{
      return strcmp(((const stat_cmd_arg *)a)->cmd,
          ((const stat_cmd_arg *)b)->cmd);
}
void
register_stat_cmd_arg(const char *cmd, void (*func)(const char*, void*),void* userdata)
{
      stat_cmd_arg *newsca;

      newsca=g_malloc(sizeof(stat_cmd_arg));
      newsca->cmd=cmd;
      newsca->func=func;
    newsca->userdata=userdata;
      stat_cmd_arg_list=g_slist_insert_sorted(stat_cmd_arg_list, newsca,
          sort_by_name);
}

/* **********************************************************************
 * Function called for a stat command-line argument
 * ********************************************************************** */
gboolean
process_stat_cmd_arg(char *optarg)
{
      GSList *entry;
      stat_cmd_arg *sca;
      stat_requested *tr;

      for(entry=stat_cmd_arg_list;entry;entry=g_slist_next(entry)){
            sca=entry->data;
            if(!strncmp(sca->cmd,optarg,strlen(sca->cmd))){
                  tr=g_malloc(sizeof (stat_requested));
                  tr->sca = sca;
                  tr->arg=g_strdup(optarg);
                  stats_requested=g_slist_append(stats_requested, tr);
                  return TRUE;
            }
      }
      return FALSE;
}

/* **********************************************************************
 * Function to list all possible tap command-line arguments
 * ********************************************************************** */
void
list_stat_cmd_args(void)
{
      GSList *entry;
      stat_cmd_arg *sca;

      for(entry=stat_cmd_arg_list;entry;entry=g_slist_next(entry)){
            sca=entry->data;
            fprintf(stderr,"     %s\n",sca->cmd);
      }
}

/* **********************************************************************
 * Function to process stats requested with command-line arguments
 * ********************************************************************** */
void
start_requested_stats(void)
{
      stat_requested *sr;

      while(stats_requested){
            sr=stats_requested->data;
            (*sr->sca->func)(sr->arg,sr->sca->userdata);
            g_free(sr->arg);
            g_free(sr);
            stats_requested=g_slist_remove(stats_requested, sr);
      }
}

Generated by  Doxygen 1.6.0   Back to index