aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2013-07-04 05:34:25 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2013-07-04 05:34:25 +0000
commit047c252e9377d9a8eddfb4bfaadbf5157260b553 (patch)
tree8a63454eb7a166e4e78049b0bbca7f720d8f83bd
parentd85874c64c451ce10730e12ae6523cb517215470 (diff)
some more harvesting from tshark
svn path=/trunk/; revision=50380
-rw-r--r--echld/Makefile.common13
-rw-r--r--echld/child.c78
-rw-r--r--echld/common.c3
-rw-r--r--echld/dispatcher.c144
-rw-r--r--echld/echld-int.h11
-rw-r--r--echld_test.c61
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 (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);
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 }
};