aboutsummaryrefslogtreecommitdiffstats
path: root/epan/stat_cmd_args.c
blob: e1160320951747c420dd5761ef73e6c7ed2ab63c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* stat_cmd_args.c
 * Routines to register "-z" command-line argument handlers for stats
 *
 * $Id$
 *
 * Ethereal - Network traffic analyzer
 * By Gerald Combs <gerald@ethereal.com>
 * 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.
 */
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.
 */
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);
	}
}