2 * basic test framework for echld
4 * Wireshark - Network traffic analyzer
5 * By Gerald Combs <gerald@wireshark.org>
6 * Copyright 1998 Gerald Combs
8 * Copyright (c) 2013 by Luis Ontanon <luis@ontanon.org>
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
31 #ifdef HAVE_SYS_TYPES_H
32 # include <sys/types.h>
48 #include <glib/gprintf.h>
50 #include "echld/echld.h"
51 #include "echld/echld-util.h"
53 #include "epan/epan.h"
54 #include "wsutil/str_util.h"
56 typedef char* (*cmd_cb_t)(char** params, char** err);
58 typedef struct _cmd_t {
66 #define MAX_PARAMSETS 16
68 static enc_msg_t* paramsets[MAX_PARAMSETS] = {
69 NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,
70 NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL
75 static char* ps_cmd(char** pars _U_, char** err _U_) {
78 if (n_id >= MAX_PARAMSETS) {
79 *err = g_strdup("Max Num of Paramsets reached");
83 paramsets[n_id] = echld_new_child_params();
85 return g_strdup_printf("New Paramset ps_id=%d",n_id);
88 static char* psadd_cmd(char** params _U_, char** err) {
89 int ps_id = (int) strtol(params[1], NULL, 10);
92 *err = g_strdup_printf("No paramset pd_is=%d",ps_id);
96 echld_new_child_params_add_params(paramsets[ps_id], params[2], params[3], NULL);
98 return g_strdup_printf("PSAdd ps_id=%d %s='%s'", ps_id, params[2], params[3]);
101 static char* psmerge_cmd(char** params, char** err) {
102 int ps1_id = (int) strtol(params[1], NULL, 10);
103 int ps2_id = (int) strtol(params[2], NULL, 10);
107 *err = g_strdup_printf("No paramset pd_is=%d",ps1_id);
112 *err = g_strdup_printf("No paramset pd_is=%d",ps2_id);
118 if (n_id >= MAX_PARAMSETS) {
119 *err = g_strdup_printf("Max Num of Paramsets reached");
123 paramsets[n_id] = echld_new_child_params_merge(paramsets[ps1_id],paramsets[ps2_id]);
125 return g_strdup_printf("Merged Paramset ps1_id=%d ps2_id=%d ps_id=%d",ps1_id, ps2_id, n_id);
128 static char* new_child_cmd(char** params, char** err) {
129 int ps_id = (int) strtol(params[1], NULL, 10);
133 *err = g_strdup_printf("No paramset pd_is=%d",ps_id);
137 child = echld_new(paramsets[ps_id],NULL);
140 *err = g_strdup("No child\n");
144 return g_strdup_printf("New chld_id=%d\n",child);
148 void ping_cb(long usec, void* data) {
149 int ping_id = *((int*)data);
152 fprintf(stdout, "Ping ping_id=%d returned in %dus\n",ping_id,(int)usec);
154 fprintf(stdout, "Ping ping_id=%d erored\n",ping_id);
161 static char* ping_cmd(char** params, char** err) {
162 int child = (int) strtol(params[1], NULL, 10);
163 static int ping_id = 0;
164 int* ping_data = g_new(int,1);
166 *ping_data = ping_id++;
168 if (!echld_ping(child,ping_cb,ping_data)) {
169 *err = g_strdup_printf("Could not send ping child=%d",child);
172 return g_strdup_printf("Ping sent child=%d",child);
176 void param_cb(const char* param, const char* value, const char* error, void* data _U_) {
178 fprintf(stdout, "Param Set Error msg=%s\n", error );
180 fprintf(stdout, "Param: param='%s' val='%s'\n", param, value );
184 static char* set_cmd(char** params, char** err) {
185 int child = (int) strtol(params[1], NULL, 10);
186 char* param = params[2];
187 char* value = params[3];
189 if ( ! echld_set_param(child,param,value,param_cb,NULL) ) {
190 *err = g_strdup_printf("Failed to SET child=%d param='%s' value='%s'",child,param,value);
193 return g_strdup_printf("Set command sent child=%d param='%s' value='%s'",child,param,value);
197 static char* get_cmd(char** params, char** err) {
198 int child = (int) strtol(params[1], NULL, 10);
199 char* param = params[2];
201 if ( ! echld_get_param(child,param,param_cb,NULL) ) {
202 *err = g_strdup_printf("Failed to GET child=%d param='%s'",child,param);
205 return g_strdup_printf("Get command sent child=%d param='%s'",child,param);
209 static void close_cb(const char* error, void* data) {
211 fprintf(stdout, "Close Error msg=%s\n", error );
213 fprintf(stdout, "Closed: child=%d\n", *((int*)data) );
217 static char* close_cmd(char** params, char** err) {
218 int child = (int) strtol(params[1], NULL, 10);
219 int* cmdp = g_new(int,1);
221 if ( ! echld_close(child,close_cb,cmdp) ) {
222 *err = g_strdup_printf("Could not close child=%d",child);
225 return g_strdup_printf("CLose command sent child=%d",child);
230 static char* quit_cmd(char** params _U_, char** err _U_) {
232 return g_strdup("Quitting");
235 static char* help_cmd(char**, char**);
237 static char* open_file_cmd(char** pars _U_, char** err _U_) {
238 *err = g_strdup("Not Implemented");
242 static char* prepare_capture_cmd(char** pars _U_, char** err _U_) {
243 *err = g_strdup("Not Implemented");
247 static char* start_capture_cmd(char** pars _U_, char** err _U_) {
248 *err = g_strdup("Not Implemented");
252 static char* get_sum_cmd(char** pars _U_, char** err _U_) {
253 *err = g_strdup("Not Implemented");
257 static char* get_tree_cmd(char** pars _U_, char** err _U_) {
258 *err = g_strdup("Not Implemented");
262 static char* get_buf_cmd(char** pars _U_, char** err _U_) {
263 *err = g_strdup("Not Implemented");
267 static char* stop_cmd(char** pars _U_, char** err _U_) {
268 *err = g_strdup("Not Implemented");
272 static char* note_cmd(char** pars _U_, char** err _U_) {
273 *err = g_strdup("Not Implemented");
277 static char* apply_cmd(char** pars _U_, char** err _U_) {
278 *err = g_strdup("Not Implemented");
282 static char* save_cmd(char** pars _U_, char** err _U_) {
283 *err = g_strdup("Not Implemented");
287 static char* run_cmd(char** pars, char** err _U_);
293 { "QUIT", quit_cmd, 0, "QUIT"},
294 { "HELP", help_cmd, 0, "HELP"},
295 { "RUN", run_cmd, 1, "RUN filename"},
296 { "PS", ps_cmd, 1, "PS [dummy]"},
297 { "PSADD", psadd_cmd, 4, "PSADD ps_id param value"},
298 { "PSMERGE", psmerge_cmd, 4, "PSMERGE ps_id ps_id"},
299 { "NEW", new_child_cmd, 1, "NEW ps_id"},
300 { "PING", ping_cmd, 1, "PING child_id"},
301 { "SET", set_cmd, 3, "SET child_id param_name param_val"},
302 { "GET", get_cmd, 2, "GET child_id param_name"},
303 { "CLOSE", close_cmd, 1, "CLOSE child_id"},
304 { "FILE", open_file_cmd, 2, "FILE child_id filename"},
305 { "PREP", prepare_capture_cmd, 2, "PREP child_id intfname params"},
306 { "START",start_capture_cmd,1,"START child_id"},
307 { "SUM", get_sum_cmd,2,"SUM child_id packet_range"},
308 { "TREE", get_tree_cmd,2,"TREE child_id packet_range"},
309 { "BUFF", get_buf_cmd,2,"BUFF child_id buffer_name"},
310 { "STOP", stop_cmd,1,"STOP child_id"},
311 { "NOTE", note_cmd,1,"NOTE child_id framenum note..."},
312 { "APPLY", apply_cmd,1,"APPLY child_id dfilter"},
313 { "SAVE", save_cmd,1,"SAVE child_id filename params"},
314 { NULL, NULL, 0, NULL }
317 static char* help_cmd(char** params _U_, char** err _U_) {
318 GString* out = g_string_new("Commands:\n");
323 g_string_append_printf(out,"%s\n",c->help);
326 g_string_free(out,FALSE);
331 static int invoke_cmd(FILE* in_fp) {
335 if(( cmd_line = fgetln(in_fp,&len) )) {
338 g_strchomp(cmd_line);
341 if ( strcasestr(cmd_line, c->txt) == cmd_line ) {
342 char** params = g_strsplit(cmd_line, " ", c->args_taken+1);
344 char* str = c->cb(params,&err);
347 fprintf(stdout, "Error: %s\n", err);
350 fprintf(stdout, "%s\n", str);
359 fprintf(stdout, "Error: no such command %s\n", cmd_line);
366 static char* run_cmd(char** pars, char** err _U_) {
367 FILE* fp = fopen(pars[1],"r");
368 while(invoke_cmd(fp)) { ; }
377 int main(int argc _U_, char** argv _U_) {
380 echld_init_t init = {ECHLD_ENCODING_JSON,argv[0],main,NULL,NULL,NULL,NULL};
386 echld_set_parent_dbg_level(5);
388 echld_initialize(&init);
400 nfds = echld_select(FD_SETSIZE, &rfds, NULL, &efds, &tv);
402 if (FD_ISSET(0,&rfds)) {
407 } while( keep_going );
409 fprintf(stderr, "Done: tot_cycles=%d\n", tot_cycles );