Sfoglia il codice sorgente

Unfinished parse changes

Serj Kalichev 1 anno fa
parent
commit
0c15d20035
3 ha cambiato i file con 82 aggiunte e 1 eliminazioni
  1. 1 0
      src/plugin.c
  2. 80 1
      src/syms.c
  3. 1 0
      src/syms.h

+ 1 - 0
src/plugin.c

@@ -34,6 +34,7 @@ int kplugin_sysrepo_init(kcontext_t *context)
 
 	// Symbols
 	kplugin_add_syms(plugin, ksym_new("srp_compl", srp_compl));
+	kplugin_add_syms(plugin, ksym_new("srp_set", srp_set));
 
 	return 0;
 }

+ 80 - 1
src/syms.c

@@ -61,6 +61,30 @@ static faux_argv_t *pargv2argv(const kpargv_t *pargv)
 }
 
 
+static faux_argv_t *param2argv(const kpargv_t *pargv, const char *entry_name)
+{
+	faux_list_node_t *iter = NULL;
+	faux_list_t *pargs = NULL;
+	faux_argv_t *args = NULL;
+	kparg_t *parg = NULL;
+
+	assert(pargv);
+	if (!pargv)
+		return NULL;
+
+	pargs = kpargv_find_multi(pargv, entry_name);
+	args = faux_argv_new();
+
+	iter = faux_list_head(pargs);
+syslog(LOG_DEBUG, "=======\n");
+	while ((parg = (kparg_t *)faux_list_each(&iter))) {
+syslog(LOG_DEBUG, "Val = %s\n", kparg_value(parg));
+		faux_argv_add(args, kparg_value(parg));
+	}
+	faux_list_free(pargs);
+
+	return args;
+}
 
 
 // Candidate from pargv contains possible begin of current word (that must be
@@ -72,6 +96,7 @@ int srp_compl(kcontext_t *context)
 	pline_t *pline = NULL;
 	sr_conn_ctx_t *conn = NULL;
 	sr_session_ctx_t *sess = NULL;
+	const char *entry_name = NULL;
 
 	assert(context);
 
@@ -82,7 +107,9 @@ int srp_compl(kcontext_t *context)
 		return -1;
 	}
 
-	args = pargv2argv(kcontext_parent_pargv(context));
+	entry_name = kentry_name(kcontext_candidate_entry(context));
+syslog(LOG_DEBUG, "Entry name = %s\n", entry_name);
+	args = param2argv(kcontext_parent_pargv(context), entry_name);
 	pline = pline_parse(sess, args, 0);
 	faux_argv_free(args);
 	pline_print_completions(pline, BOOL_FALSE);
@@ -92,3 +119,55 @@ int srp_compl(kcontext_t *context)
 
 	return 0;
 }
+
+
+int srp_set(kcontext_t *context)
+{
+	faux_argv_t *args = NULL;
+	pline_t *pline = NULL;
+	sr_conn_ctx_t *conn = NULL;
+	sr_session_ctx_t *sess = NULL;
+	faux_list_node_t *iter = NULL;
+	pexpr_t *expr = NULL;
+	size_t err_num = 0;
+return 0;
+	assert(context);
+
+	if (sr_connect(SR_CONN_DEFAULT, &conn))
+		return -1;
+	if (sr_session_start(conn, SR_DS_RUNNING, &sess)) {
+		sr_disconnect(conn);
+		return -1;
+	}
+
+	args = pargv2argv(kcontext_pargv(context));
+	pline = pline_parse(sess, args, 0);
+	faux_argv_free(args);
+
+	iter = faux_list_head(pline->exprs);
+	while ((expr = (pexpr_t *)faux_list_each(&iter))) {
+		if (!expr->active)
+			break;
+		if (sr_set_item_str(sess, expr->xpath, expr->value, NULL, 0) !=
+			SR_ERR_OK) {
+			err_num++;
+			fprintf(stderr, "Can't set data");
+			break;
+		}
+	}
+
+	if (sr_has_changes(sess)) {
+		if (err_num > 0)
+			sr_discard_changes(sess);
+		else
+			sr_apply_changes(sess, 0);
+	}
+
+	pline_free(pline);
+	sr_disconnect(conn);
+
+	if (err_num > 0)
+		return -1;
+
+	return 0;
+}

+ 1 - 0
src/syms.h

@@ -12,6 +12,7 @@
 C_DECL_BEGIN
 
 int srp_compl(kcontext_t *context);
+int srp_set(kcontext_t *context);
 
 C_DECL_END