From 047c252e9377d9a8eddfb4bfaadbf5157260b553 Mon Sep 17 00:00:00 2001 From: Luis Ontanon Date: Thu, 4 Jul 2013 05:34:25 +0000 Subject: some more harvesting from tshark svn path=/trunk/; revision=50380 --- echld/Makefile.common | 13 +++-- echld/child.c | 78 ++++++++++++++++++++------- echld/common.c | 3 -- echld/dispatcher.c | 144 ++++++++++++++++++++++++++++++++++++++------------ echld/echld-int.h | 11 ++-- echld_test.c | 61 +++++++++++++++++++-- 6 files changed, 239 insertions(+), 71 deletions(-) diff --git a/echld/Makefile.common b/echld/Makefile.common index cd19253c90..5e4f43c0e7 100644 --- a/echld/Makefile.common +++ b/echld/Makefile.common @@ -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 = \ diff --git a/echld/child.c b/echld/child.c index db0f6e395d..daa9e7c8a4 100644 --- a/echld/child.c +++ b/echld/child.c @@ -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 (0name;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); diff --git a/echld/common.c b/echld/common.c index 5670175cb1..b69c876c00 100644 --- a/echld/common.c +++ b/echld/common.c @@ -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]; diff --git a/echld/dispatcher.c b/echld/dispatcher.c index 910f54255c..39bb8bc34b 100644 --- a/echld/dispatcher.c +++ b/echld/dispatcher.c @@ -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(); - init_process_policies(); + /* 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 */ + /* 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")); } diff --git a/echld/echld-int.h b/echld/echld-int.h index 0bb9dd34fe..32fa26ed73 100644 --- a/echld/echld-int.h +++ b/echld/echld-int.h @@ -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*); diff --git a/echld_test.c b/echld_test.c index 3829518789..7890035fb6 100644 --- a/echld_test.c +++ b/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 } }; -- cgit v1.2.3