aboutsummaryrefslogtreecommitdiffstats
path: root/echld/parent.c
diff options
context:
space:
mode:
Diffstat (limited to 'echld/parent.c')
-rw-r--r--echld/parent.c59
1 files changed, 51 insertions, 8 deletions
diff --git a/echld/parent.c b/echld/parent.c
index 6c518907dd..2dad6a691d 100644
--- a/echld/parent.c
+++ b/echld/parent.c
@@ -183,13 +183,16 @@ void parent_reaper(int sig) {
}
/* will initialize epan registering protocols and taps */
-void echld_initialize(echld_encoding_t enc, char* argv0, int (*main)(int, char **)) {
+void echld_initialize(echld_init_t* init) {
int from_disp[2];
int to_disp[2];
-
PARENT_DBG((1,"Echld Starting"));
- if (enc != ECHLD_ENCODING_JSON) {
+ if (!init) {
+ PARENT_FATAL((NO_INITIALIZER,"Missing Initializer"));
+ }
+
+ if (init->encoding != ECHLD_ENCODING_JSON) {
PARENT_FATAL((UNIMPLEMENTED,"Only JSON implemented"));
}
@@ -213,7 +216,12 @@ void echld_initialize(echld_encoding_t enc, char* argv0, int (*main)(int, char *
#endif
/* child code */
echld_cleanup();
- echld_dispatcher_start(to_disp,from_disp,argv0,main);
+
+ if (init->after_fork_cb)
+ init->after_fork_cb(init->after_fork_cb_data);
+
+ echld_dispatcher_start(to_disp,from_disp,init->argv0,init->main);
+
PARENT_FATAL((SHOULD_HAVE_EXITED_BEFORE,"This shoudln't happen"));
} else {
/* parent code */
@@ -468,7 +476,7 @@ static int msgh_attach(echld_t* c, echld_msg_type_t t, echld_msg_cb_t resp_cb, v
static int next_chld_id = 1;
-extern int echld_new(void* child_data) {
+extern int echld_new(enc_msg_t* new_child_em, void* child_data) {
echld_t* c = get_child(-1);
if (!c) return -1;
@@ -477,12 +485,10 @@ extern int echld_new(void* child_data) {
c->data = child_data;
c->state = CREATING;
- g_byte_array_set_size(parent.snd,0);
-
PARENT_DBG((1,"Child[%d]: =>CREATING",c->chld_id));
msgh_attach(c,ECHLD_CHILD_DEAD, parent_dead_child , c);
- reqh_snd(c, ECHLD_NEW_CHILD, parent.snd, parent_get_hello, c);
+ reqh_snd(c, ECHLD_NEW_CHILD, (GByteArray*)new_child_em, parent_get_hello, c);
return c->chld_id;
}
@@ -806,3 +812,40 @@ extern echld_state_t echld_wait(struct timeval* timeout) {
return ECHLD_OK;
}
}
+
+enc_msg_t* echld_new_child_params(void) {
+ return (enc_msg_t*)g_byte_array_new();
+}
+
+enc_msg_t* echld_new_child_params_merge(enc_msg_t* em1, enc_msg_t* em2) {
+ GByteArray* ba = g_byte_array_new();
+ GByteArray* b1 = (GByteArray*)em1;
+ GByteArray* b2 = (GByteArray*)em2;
+
+ g_byte_array_append(ba,b1->data,b1->len);
+ g_byte_array_append(ba,b2->data,b2->len);
+
+ return (enc_msg_t*)ba;
+}
+
+WS_DLL_PUBLIC void echld_new_child_params_add_params(enc_msg_t* em, ...) {
+ GByteArray* ba = (GByteArray*) em;
+ va_list ap;
+
+ va_start(ap,em);
+ do {
+ char* param_str = va_arg(ap, char*);
+
+ if (param_str) {
+ char* val_str = va_arg(ap, char*);
+
+ g_byte_array_append(ba, (guint8*) param_str, (guint)strlen(param_str)+1);
+ g_byte_array_append(ba, (guint8*) val_str, (guint)strlen(val_str)+1);
+ continue;
+ }
+
+ break;
+ } while(1);
+ va_end(ap);
+
+}