Browse Source

Add context to kexec while parsing for exec

Serj Kalichev 2 years ago
parent
commit
7aaf66595e
4 changed files with 28 additions and 4 deletions
  1. 6 4
      klish/kexec.h
  2. 7 0
      klish/ksession/kexec.c
  3. 8 0
      klish/ksession/ksession_parse.c
  4. 7 0
      klish/ktp/ktpd_session.c

+ 6 - 4
klish/kexec.h

@@ -19,10 +19,6 @@ C_DECL_BEGIN
 kexec_t *kexec_new(void);
 void kexec_free(kexec_t *exec);
 
-size_t kexec_len(const kexec_t *exec);
-size_t kexec_is_empty(const kexec_t *exec);
-bool_t kexec_add(kexec_t *exec, kcontext_t *context);
-
 // STDIN
 int kexec_stdin(const kexec_t *exec);
 bool_t kexec_set_stdin(kexec_t *exec, int stdin);
@@ -32,6 +28,12 @@ bool_t kexec_set_stdout(kexec_t *exec, int stdout);
 // STDERR
 int kexec_stderr(const kexec_t *exec);
 bool_t kexec_set_stderr(kexec_t *exec, int stderr);
+// CONTEXTs
+bool_t kexec_add_contexts(kexec_t *exec, kcontext_t *context);
+ssize_t kexec_contexts_len(const kexec_t *exec);
+bool_t kexec_contexts_is_empty(const kexec_t *exec);
+kexec_contexts_node_t *kexec_contexts_iter(const kexec_t *exec);
+kcontext_t *kexec_contexts_each(kexec_contexts_node_t **iter);
 
 C_DECL_END
 

+ 7 - 0
klish/ksession/kexec.c

@@ -30,6 +30,13 @@ KSET(exec, int, stdout);
 KGET(exec, int, stderr);
 KSET(exec, int, stderr);
 
+// CONTEXT list
+KADD_NESTED(exec, kcontext_t *, contexts);
+KNESTED_LEN(exec, contexts);
+KNESTED_IS_EMPTY(exec, contexts);
+KNESTED_ITER(exec, contexts);
+KNESTED_EACH(exec, kcontext_t *, contexts);
+
 
 kexec_t *kexec_new()
 {

+ 8 - 0
klish/ksession/ksession_parse.c

@@ -442,6 +442,8 @@ kexec_t *ksession_parse_for_exec(ksession_t *session, const char *raw_line,
 	iter = faux_list_head(split);
 	while (iter) {
 		faux_argv_t *argv = (faux_argv_t *)faux_list_data(iter);
+		kcontext_t *context = NULL;
+
 		pargv = ksession_parse_line(session, argv, KPURPOSE_EXEC);
 		// All components must be ready for execution
 		if (!pargv) {
@@ -467,6 +469,12 @@ kexec_t *ksession_parse_for_exec(ksession_t *session, const char *raw_line,
 			return NULL;
 		}
 
+		// Fill the kexec_t
+		context = kcontext_new(KCONTEXT_PLUGIN_ACTION);
+		assert(context);
+		kcontext_set_pargv(context, pargv);
+		kexec_add_contexts(exec, context);
+
 		// Next component
 		iter = faux_list_next_node(iter);
 	}

+ 7 - 0
klish/ktp/ktpd_session.c

@@ -82,6 +82,13 @@ static bool_t ktpd_session_process_cmd(ktpd_session_t *session, faux_msg_t *msg)
 	error = faux_error_new();
 	exec = ksession_parse_for_exec(session->ksession, line, error);
 	faux_str_free(line);
+
+	kexec_contexts_node_t *iter = kexec_contexts_iter(exec);
+	kcontext_t *context = NULL;
+	while ((context = kexec_contexts_each(&iter))) {
+		kpargv_debug(kcontext_pargv(context));
+	}
+
 //	kpargv_debug(pargv);
 //	if (kpargv_status(pargv) != KPARSE_OK) {
 //		char *error = NULL;