forked from osmocom/wireshark
some more harvesting from tshark
svn path=/trunk/; revision=50380
This commit is contained in:
parent
d85874c64c
commit
047c252e93
|
@ -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 = \
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
prefs_apply_all();
|
||||
|
||||
/* disabled protocols as per configuration file */
|
||||
set_disabled_protos_list();
|
||||
|
||||
/* Here we do initialization of parts of epan that will be the same for every child we fork */
|
||||
|
||||
DISP_DBG((2,"epan preinit"));
|
||||
DISP_DBG((2,"epan preinit done"));
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
@ -144,6 +146,7 @@ typedef struct _param {
|
|||
const char* name;
|
||||
char* (*get)(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*);
|
||||
|
|
61
echld_test.c
61
echld_test.c
|
@ -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 }
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue