some more harvesting from tshark

svn path=/trunk/; revision=50380
This commit is contained in:
Luis Ontanon 2013-07-04 05:34:25 +00:00
parent d85874c64c
commit 047c252e93
6 changed files with 239 additions and 71 deletions

View File

@ -42,21 +42,20 @@ LIBECHLD_INCLUDES = \
echld.h
LIBECHLD_MORE_SRC = \
../capture_ifinfo.c \
../capture_opts.c \
../capture_stop_conditions.c \
../capture-pcap-util.c \
../capture-pcap-util-unix.c \
../capture_stop_conditions.c \
../capture_sync.c \
../cfutils.c \
../clopts_common.c \
../sync_pipe_write.c \
../capture-pcap-util.c \
../capture-pcap-util.h \
../capture-pcap-util-int.h \
../conditions.c \
../disabled_protos.c \
../pcapio.c \
../ringbuffer.c \
../capture_sync.c \
../sync_pipe_write.c \
../version_info.c \
../capture_ifinfo.c \
../ws80211_utils.c
OTHER = \

View File

@ -51,7 +51,13 @@ typedef struct _child {
child_decoder_t* dec;
// epan stuff
//capture_file cfile;
char* cf_name;
char* cfilter;
char* dfilter;
// capture_file cfile;
dfilter_t* df;
} echld_child_t;
@ -224,16 +230,18 @@ static char* param_get_packet_count(char** err) {
}
static char* dfilter = NULL;
dfilter_t *df = NULL;
static echld_bool_t param_set_dfilter(char* val , char** err _U_) {
dfilter_t *dfn = NULL;
if ( dfilter_compile(val, &dfn) ) {
if (dfilter) g_free(dfilter);
if (df) dfilter_free(df);
df = dfn;
dfilter = g_strdup(val);
if (child.state != IDLE && child.state != DONE ) {
*err = g_strdup("Only while idle or done");
return FALSE;
} else if ( dfilter_compile(val, &dfn) ) {
if (child.dfilter) g_free(child.dfilter);
if (child.df) dfilter_free(child.df);
child.df = dfn;
child.dfilter = g_strdup(val);
return TRUE;
} else {
*err = g_strdup(dfilter_error_msg);
@ -241,7 +249,7 @@ static echld_bool_t param_set_dfilter(char* val , char** err _U_) {
}
}
static char* param_get_dfilter(char** err _U_) { return g_strdup(dfilter ? dfilter : ""); }
static char* param_get_dfilter(char** err _U_) { return g_strdup(child.dfilter ? child.dfilter : ""); }
char* param_profile = NULL;
@ -292,19 +300,38 @@ static char* param_get_file_list(char** err) {
PARAM_BOOL(quiet,FALSE);
static char* param_get_params(char** err _U_);
static param_t params[] = {
#ifdef DEBUG_CHILD
PARAM(dbg_level),
PARAM(dbg_level,"Debug Level (0<int<5)"),
# endif
PARAM(profile),
PARAM(cwd),
PARAM(dfilter),
RO_PARAM(packet_count),
RO_PARAM(file_list),
PARAM(quiet),
{NULL,NULL,NULL}
PARAM(profile,"Configuration Profile (str)"),
PARAM(cwd,"Current Directory (str)"),
PARAM(dfilter,"Dispay Filter (str)"),
RO_PARAM(packet_count,"Packets Read/Captured So Far (str)"),
RO_PARAM(file_list,"List of Files in the Current Dir"),
PARAM(quiet,"Quiet Mode"),
RO_PARAM(params,"This List"),
{NULL,NULL,NULL,NULL}
};
static char* param_get_params(char** err _U_) {
param_t* p = params;
GString* str = g_string_new("");
char* s;
for (;p->name;p++) {
g_string_append_printf(str,"%s(%s): %s\n",
p->name,((p->get && p->set)?"rw":(p->get?"ro":"wo")),p->desc);
}
s = str->str;
g_string_free(str,FALSE);
return s;
}
static param_t* get_paramset(char* name) {
int i;
for (i = 0; params[i].name != NULL;i++) {
@ -632,6 +659,7 @@ int echld_child_loop(void) {
FD_SET(disp_from,&efds);
FD_SET(disp_to,&efds);
if (child.fds.pipe_from_dumpcap > 0) {
FD_SET(child.fds.pipe_from_dumpcap,&rfds);
}
@ -640,9 +668,13 @@ int echld_child_loop(void) {
FD_SET(child.fds.file_being_read,&rfds);
}
CHILD_DBG((4,"child_loop: select()ing step=%d",step++));
#ifdef DEBUG_CHILD
if (step >= 100) CHILD_DBG((4,"child_loop: select()ing step=%d",step++));
#endif
nfds = select(FD_SETSIZE, &rfds, &wfds, &efds, &timeout);
CHILD_DBG((4,"child_loop: select()ed nfds=%d",nfds));
#ifdef DEBUG_CHILD
if (step >= 100) CHILD_DBG((4,"child_loop: select()ed nfds=%d",nfds));
#endif
if ( FD_ISSET(disp_from,&efds) ) {
CHILD_DBG((0,"Broken Parent Pipe 'From' step=%d",step));
@ -667,6 +699,10 @@ int echld_child_loop(void) {
if (FD_ISSET(disp_from, &rfds)) {
long st = echld_read_frame(&(child.parent), child_receive, &child);
#ifdef DEBUG_CHILD
step = 0;
#endif
if (st < 0) {
CHILD_DBG((0,"Read Frame Failed step=%d",step));
return (int)st;
@ -674,6 +710,10 @@ int echld_child_loop(void) {
}
if (child.fds.pipe_from_dumpcap > 0 && FD_ISSET(child.fds.pipe_from_dumpcap,&rfds) ) {
#ifdef DEBUG_CHILD
step = 0;
#endif
child_dumpcap_read();
}
} while(1);

View File

@ -316,9 +316,6 @@ long echld_read_frame(echld_reader_t* r, read_cb_t cb, void* cb_data) {
kaput: return -1;
}
long echld_write_frame(int fd, GByteArray* ba, guint16 chld_id, echld_msg_type_t type, guint16 reqh_id, void* data _U_) {
hdr_t h;
struct iovec iov[2];

View File

@ -60,6 +60,7 @@ struct dispatcher {
int dumpcap_pid;
gboolean closing;
capture_options capture_opts;
};
struct dispatcher* dispatcher;
@ -188,8 +189,7 @@ static void dispatcher_err(int errnum, const char* fmt, ...) {
/* interface listing */
static char* intflist2json(GList* if_list) {
/* blatantly stolen from print_machine_readable_interfaces in dumpcap.c */
static char* intflist2json(GList* if_list, char** if_cap_err) {
#define ADDRSTRLEN 46 /* Covers IPv4 & IPv6 */
int i;
@ -197,6 +197,7 @@ static char* intflist2json(GList* if_list) {
if_info_t *if_info;
GSList *addr;
if_addr_t *if_addr;
if_capabilities_t *caps;
char addr_str[ADDRSTRLEN];
GString *str = g_string_new("{ what='interfaces', interfaces={ \n");
char* s;
@ -248,7 +249,7 @@ static char* intflist2json(GList* if_list) {
}
g_string_truncate(str,str->len - 1); /* the last comma or space (on empty list) */
g_string_append(str," ],"); /* addrs */
g_string_append(str," ]"); /* addrs */
if (if_info->loopback)
@ -256,6 +257,52 @@ static char* intflist2json(GList* if_list) {
else
g_string_append(str,", loopback=0");
caps = capture_get_if_capabilities(if_info->name, 0, if_cap_err, NULL);
if (caps != NULL) {
if (caps->data_link_types != NULL) {
GList* lt_entry = caps->data_link_types;
data_link_info_t *data_link_info;
g_string_append(str,", data_link_types=[");
for (; lt_entry != NULL; lt_entry = g_list_next(lt_entry) ) {
data_link_info = (data_link_info_t *)lt_entry->data;
g_string_append_printf(str,"{ name='%s', desc='%s' }, ", data_link_info->name, (data_link_info->description) ? data_link_info->description : "" );
}
g_string_truncate(str,str->len - 2); /* the comma and space */
g_string_append(str,"]");
}
g_string_append_printf(str,", can_set_rfmon=%s", caps->can_set_rfmon ? "1" : "0");
if (caps->can_set_rfmon) {
free_if_capabilities(caps);
caps = capture_get_if_capabilities(if_info->name, 1, if_cap_err, NULL);
if (caps->data_link_types != NULL) {
GList* lt_entry = caps->data_link_types;
data_link_info_t *data_link_info;
g_string_append(str,", data_link_types_rfmon=[");
for (; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
data_link_info = (data_link_info_t *)lt_entry->data;
g_string_append_printf(str,"{ name='%s', desc='%s' }, ", data_link_info->name, (data_link_info->description) ? data_link_info->description : "" );
}
g_string_truncate(str,str->len - 2); /* the comma and space */
g_string_append(str,"]");
}
}
free_if_capabilities(caps);
}
g_string_append(str,"},\n");
}
@ -267,28 +314,30 @@ static char* intflist2json(GList* if_list) {
return s;
}
static char* param_get_interfaces(char** err) {
static char* intf_list;
static void get_interfaces(char** err) {
int err_no = 0;
GList* if_list;
char* s;
*err = NULL;
if (dispatcher->dumpcap_pid) {
*err = g_strdup_printf("Dumpcap already running");
return NULL;
}
err = NULL;
if_list = capture_interface_list(&err_no, err, NULL);
if (*err) {
return NULL;
if (err) {
DISP_DBG((1,"Could not get capture interface list: %s",err));
} else {
intf_list = intflist2json(if_list,err);
if (err) {
DISP_DBG((1,"get capabilities error: %s",err));
}
}
s = intflist2json(if_list);
free_interface_list(if_list);
}
return s;
static char* param_get_interfaces(char** err _U_) {
return g_strdup(intf_list ? intf_list : "");
}
static long disp_loop_timeout_usec = DISPATCHER_WAIT_INITIAL;
@ -333,15 +382,34 @@ static char* param_get_version(char** err _U_) {
return str;
}
static char* param_get_params(char** err _U_);
static param_t disp_params[] = {
#ifdef DEBUG_DISPATCHER
{"dbg_level", param_get_dbg_level, param_set_dbg_level},
{"dbg_level", param_get_dbg_level, param_set_dbg_level,"0>int>5"},
# endif
{"version",param_get_version,NULL},
{"loop_timeout",param_get_loop_to,param_set_loop_to},
{"interfaces",param_get_interfaces,NULL},
{NULL,NULL,NULL} };
{"version",param_get_version,NULL,"version string"},
{"loop_timeout",param_get_loop_to,param_set_loop_to,"main loop step timeout"},
{"interfaces",param_get_interfaces,NULL,"interface information"},
{"params",param_get_params,NULL,"this list"},
{NULL,NULL,NULL,NULL}
};
static char* param_get_params(char** err _U_) {
param_t* p = disp_params;
GString* str = g_string_new("");
char* s;
for (;p->name;p++) {
g_string_append_printf(str,"%s(%s): %s\n",
p->name,((p->get && p->set)?"rw":(p->get?"ro":"wo")),p->desc);
}
s = str->str;
g_string_free(str,FALSE);
return s;
}
static param_t* get_paramset(char* name) {
int i;
@ -383,7 +451,9 @@ static void set_dumpcap_pid(int pid) {
}
static void preinit_epan(char* argv0, int (*main)(int, char **)) {
char* init_progfile_dir_error = init_progfile_dir(argv0, main);
char* error;
error = init_progfile_dir(argv0, main);
comp_info_str = g_string_new("Compiled ");
get_compiled_version_info(comp_info_str, NULL, epan_get_compiled_version_info);
@ -391,9 +461,10 @@ static void preinit_epan(char* argv0, int (*main)(int, char **)) {
runtime_info_str = g_string_new("Running ");
get_runtime_version_info(runtime_info_str, NULL);
capture_opts_init(&dispatcher->capture_opts);
if (init_progfile_dir_error) {
DISP_FATAL((CANNOT_PREINIT_EPAN,"Failed epan_preinit: msg='%s'",init_progfile_dir_error));
if (error) {
DISP_FATAL((CANNOT_PREINIT_EPAN,"Failed epan_preinit: msg='%s'",error));
}
/* Add it to the information to be reported on a crash. */
@ -402,20 +473,23 @@ static void preinit_epan(char* argv0, int (*main)(int, char **)) {
capture_sync_set_fetch_dumpcap_pid_cb(set_dumpcap_pid);
#ifdef _WIN32
arg_list_utf_16to8(argc, argv);
create_app_running_mutex();
#if !GLIB_CHECK_VERSION(2,31,0)
g_thread_init(NULL);
#endif
#endif /* _WIN32 */
init_process_policies();
get_interfaces(&error);
if (error) {
DISP_FATAL((CANNOT_PREINIT_EPAN,"Error getting interfaces: %s", error));
}
init_process_policies();
prefs_apply_all();
/* Here we do initialization of parts of epan that will be the same for every child we fork */
/* disabled protocols as per configuration file */
set_disabled_protos_list();
DISP_DBG((2,"epan preinit"));
/* Here we do initialization of parts of epan that will be the same for every child we fork */
DISP_DBG((2,"epan preinit done"));
}

View File

@ -66,6 +66,8 @@
#include "wsutil/privileges.h"
#include "epan/filesystem.h"
#include "epan/epan.h"
#include "epan/prefs.h"
#include "disabled_protos.h"
#include "echld.h"
#ifdef __cplusplus
@ -143,7 +145,8 @@ extern void echld_reset_reader(echld_reader_t* r, int fd, size_t initial);
typedef struct _param {
const char* name;
char* (*get)(char** err );
echld_bool_t (*set)(char* val , char** err);
echld_bool_t (*set)(char* val , char** err);
const char* desc;
} param_t;
#define PARAM_STR(Name, Default) static char* param_ ## Name = Default; \
@ -158,9 +161,9 @@ typedef struct _param {
static char* param_get_ ## Name (char** err _U_ ) { return g_strdup_printf("%s",param_ ## Name ? "TRUE" : "FALSE"); } \
static echld_bool_t param_set_ ## Name (char* val , char** err _U_) { param_ ## Name = (*val == 'T' || *val == 't') ? TRUE : FALSE; return TRUE;}
#define PARAM(Name) {#Name, param_get_ ## Name, param_set_ ## Name}
#define RO_PARAM(Name) {#Name, param_get_ ## Name, NULL}
#define WO_PARAM(Name) {#Name, NULL, param_set_ ## Name}
#define PARAM(Name,Desc) {#Name, param_get_ ## Name, param_set_ ## Name, Desc}
#define RO_PARAM(Name,Desc) {#Name, param_get_ ## Name, NULL, Desc}
#define WO_PARAM(Name,Desc) {#Name, NULL, param_set_ ## Name, Desc}
/* the call_back used by read_frame() */
typedef long (*read_cb_t)(guint8*, size_t, echld_chld_id_t, echld_msg_type_t, echld_reqh_id_t, void*);

View File

@ -165,8 +165,54 @@ static char* quit_cmd(char** params _U_, char** err _U_) {
static char* help_cmd(char**, char**);
static char* nothing_at_last_cmd(char** pars _U_, char** err _U_) {
return g_strdup("");
static char* open_file_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* prepare_capture_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* start_capture_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* get_sum_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* get_tree_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* get_buf_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* stop_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* note_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* apply_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
static char* save_cmd(char** pars _U_, char** err _U_) {
*err = g_strdup("Not Implemented");
return NULL;
}
@ -178,7 +224,16 @@ cmd_t commands[] = {
{ "SET", set_cmd, 3, "SET child_id param_name param_val"},
{ "GET", get_cmd, 2, "GET child_id param_name"},
{ "CLOSE", close_cmd, 1, "CLOSE child_id"},
{ "", nothing_at_last_cmd,0,""},
{ "FILE", open_file_cmd, 2, "FILE child_id filename"},
{ "PREP", prepare_capture_cmd, 2, "PREP child_id intfname params"},
{ "START",start_capture_cmd,1,"START child_id"},
{ "SUM", get_sum_cmd,2,"SUM child_id packet_range"},
{ "TREE", get_tree_cmd,2,"TREE child_id packet_range"},
{ "BUFF", get_buf_cmd,2,"BUFF child_id buffer_name"},
{ "STOP", stop_cmd,1,"STOP child_id"},
{ "NOTE", note_cmd,1,"NOTE child_id framenum note..."},
{ "APPLY", apply_cmd,1,"APPLY child_id dfilter"},
{ "SAVE", save_cmd,1,"SAVE child_id filename params"},
{ NULL, NULL, 0, NULL }
};