Browse Source

Add parent_context field to kcontext_t structure

Serj Kalichev 5 months ago
parent
commit
aa37ad2e4b

+ 5 - 0
klish/kcontext.h

@@ -46,6 +46,11 @@ const kpargv_t *kcontext_parent_pargv(const kcontext_t *context);
 FAUX_HIDDEN bool_t kcontext_set_parent_pargv(kcontext_t *context,
 	const kpargv_t *parent_pargv);
 
+// Parent context object
+const kcontext_t *kcontext_parent_context(const kcontext_t *context);
+FAUX_HIDDEN bool_t kcontext_set_parent_context(kcontext_t *context,
+	const kcontext_t *parent_context);
+
 // Action iterator
 faux_list_node_t *kcontext_action_iter(const kcontext_t *context);
 FAUX_HIDDEN bool_t kcontext_set_action_iter(kcontext_t *context, faux_list_node_t *action_iter);

+ 6 - 0
klish/ksession/kcontext.c

@@ -25,6 +25,7 @@ struct kcontext_s {
 	kplugin_t *plugin;
 	kpargv_t *pargv;
 	const kpargv_t *parent_pargv; // Parent
+	const kcontext_t *parent_context; // Parent context (if available)
 	faux_list_node_t *action_iter; // Current action
 	ksym_t *sym;
 	int stdin;
@@ -64,6 +65,10 @@ FAUX_HIDDEN KSET(context, kpargv_t *, pargv);
 KGET(context, const kpargv_t *, parent_pargv);
 FAUX_HIDDEN KSET(context, const kpargv_t *, parent_pargv);
 
+// Parent context
+KGET(context, const kcontext_t *, parent_context);
+FAUX_HIDDEN KSET(context, const kcontext_t *, parent_context);
+
 // Action iterator
 KGET(context, faux_list_node_t *, action_iter);
 FAUX_HIDDEN KSET(context, faux_list_node_t *, action_iter);
@@ -109,6 +114,7 @@ kcontext_t *kcontext_new(kcontext_type_e type)
 	context->plugin = NULL;
 	context->pargv = NULL;
 	context->parent_pargv = NULL; // Don't free
+	context->parent_context = NULL; // Don't free
 	context->action_iter = NULL;
 	context->sym = NULL;
 	context->stdin = -1;

+ 8 - 5
klish/ksession/ksession_parse.c

@@ -45,7 +45,7 @@ static bool_t ksession_validate_arg(ksession_t *session, kpargv_t *pargv)
 	if (!ptype_entry)
 		return BOOL_FALSE;
 
-	if (!ksession_exec_locally(session, ptype_entry, pargv,
+	if (!ksession_exec_locally(session, ptype_entry, pargv, NULL,
 		&retcode, &out)) {
 		return BOOL_FALSE;
 	}
@@ -638,8 +638,8 @@ kexec_t *ksession_parse_for_exec(ksession_t *session, const char *raw_line,
 }
 
 
-kexec_t *ksession_parse_for_local_exec(ksession_t *session,
-	const kentry_t *entry, const kpargv_t *parent_pargv)
+kexec_t *ksession_parse_for_local_exec(ksession_t *session, const kentry_t *entry,
+	const kpargv_t *parent_pargv, const kcontext_t *parent_context)
 {
 	faux_argv_node_t *argv_iter = NULL;
 	kpargv_t *pargv = NULL;
@@ -684,6 +684,7 @@ kexec_t *ksession_parse_for_local_exec(ksession_t *session,
 	kcontext_set_scheme(context, ksession_scheme(session));
 	kcontext_set_pargv(context, pargv);
 	kcontext_set_parent_pargv(context, parent_pargv);
+	kcontext_set_parent_context(context, parent_context);
 	kcontext_set_session(context, session);
 	kexec_add_contexts(exec, context);
 
@@ -788,7 +789,8 @@ static bool_t action_stdout_ev(faux_eloop_t *eloop, faux_eloop_type_e type,
 
 
 bool_t ksession_exec_locally(ksession_t *session, const kentry_t *entry,
-	kpargv_t *parent_pargv, int *retcode, char **out)
+	kpargv_t *parent_pargv, const kcontext_t *parent_context,
+	int *retcode, char **out)
 {
 	kexec_t *exec = NULL;
 	faux_eloop_t *eloop = NULL;
@@ -801,7 +803,8 @@ bool_t ksession_exec_locally(ksession_t *session, const kentry_t *entry,
 		return BOOL_FALSE;
 
 	// Parsing
-	exec = ksession_parse_for_local_exec(session, entry, parent_pargv);
+	exec = ksession_parse_for_local_exec(session, entry,
+		parent_pargv, parent_context);
 	if (!exec)
 		return BOOL_FALSE;
 

+ 4 - 3
klish/ksession_parse.h

@@ -20,10 +20,11 @@ kpargv_t *ksession_parse_for_completion(ksession_t *session,
 	const char *raw_line);
 kexec_t *ksession_parse_for_exec(ksession_t *session, const char *raw_line,
 	faux_error_t *error);
-kexec_t *ksession_parse_for_local_exec(ksession_t *session,
-	const kentry_t *entry, const kpargv_t *parent_pargv);
+kexec_t *ksession_parse_for_local_exec(ksession_t *session, const kentry_t *entry,
+	const kpargv_t *parent_pargv, const kcontext_t *parent_context);
 bool_t ksession_exec_locally(ksession_t *session, const kentry_t *entry,
-	kpargv_t *parent_pargv, int *retcode, char **out);
+	kpargv_t *parent_pargv, const kcontext_t *parent_context,
+	int *retcode, char **out);
 
 C_DECL_END
 

+ 3 - 3
klish/ktp/ktpd_session.c

@@ -167,7 +167,7 @@ static char *generate_prompt(ktpd_session_t *ktpd)
 			bool_t res = BOOL_FALSE;
 
 			res = ksession_exec_locally(ktpd->session,
-				prompt_entry, NULL, &rc, &prompt);
+				prompt_entry, NULL, NULL, &rc, &prompt);
 			if (!res || (rc < 0) || !prompt) {
 				if (prompt)
 					faux_str_free(prompt);
@@ -660,7 +660,7 @@ static bool_t ktpd_session_process_completion(ktpd_session_t *ktpd, faux_msg_t *
 			parg = kparg_new(candidate, prefix);
 			kpargv_set_candidate_parg(pargv, parg);
 			res = ksession_exec_locally(ktpd->session, completion,
-				pargv, &rc, &out);
+				pargv, NULL, &rc, &out);
 			kparg_free(parg);
 			if (!res || (rc < 0) || !out) {
 				if (out)
@@ -797,7 +797,7 @@ static bool_t ktpd_session_process_help(ktpd_session_t *ktpd, faux_msg_t *msg)
 				parg = kparg_new(candidate, prefix);
 				kpargv_set_candidate_parg(pargv, parg);
 				ksession_exec_locally(ktpd->session,
-					help, pargv, &rc, &out);
+					help, pargv, NULL, &rc, &out);
 				kparg_free(parg);
 
 				if (out) {