|
@@ -91,6 +91,73 @@ int srp_help(kcontext_t *context)
|
|
|
}
|
|
|
|
|
|
|
|
|
+static int srp_check_type(kcontext_t *context,
|
|
|
+ pt_e not_accepted_nodes,
|
|
|
+ size_t max_expr_num)
|
|
|
+{
|
|
|
+ faux_argv_t *args = NULL;
|
|
|
+ pline_t *pline = NULL;
|
|
|
+ sr_conn_ctx_t *conn = NULL;
|
|
|
+ sr_session_ctx_t *sess = NULL;
|
|
|
+ const char *entry_name = NULL;
|
|
|
+ const char *value = NULL;
|
|
|
+ pexpr_t *expr = NULL;
|
|
|
+ size_t expr_num = 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ entry_name = kentry_name(kcontext_candidate_entry(context));
|
|
|
+ value = kcontext_candidate_value(context);
|
|
|
+ args = param2argv(kcontext_parent_pargv(context), entry_name);
|
|
|
+ if (value)
|
|
|
+ faux_argv_add(args, value);
|
|
|
+ pline = pline_parse(sess, args, 0);
|
|
|
+ faux_argv_free(args);
|
|
|
+
|
|
|
+ if (pline->invalid)
|
|
|
+ return -1;
|
|
|
+ expr_num = faux_list_len(pline->exprs);
|
|
|
+ if (expr_num < 1)
|
|
|
+ return -1;
|
|
|
+ if ((max_expr_num > 0) &&
|
|
|
+ (expr_num > max_expr_num))
|
|
|
+ return -1;
|
|
|
+ expr = pline_current_expr(pline);
|
|
|
+ if (expr->pat & not_accepted_nodes)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ pline_free(pline);
|
|
|
+ sr_disconnect(conn);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int srp_PLINE_SET(kcontext_t *context)
|
|
|
+{
|
|
|
+ return srp_check_type(context, PT_NOT_SET, 0);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int srp_PLINE_DEL(kcontext_t *context)
|
|
|
+{
|
|
|
+ return srp_check_type(context, PT_NOT_DEL, 1);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int srp_PLINE_EDIT(kcontext_t *context)
|
|
|
+{
|
|
|
+ return srp_check_type(context, PT_NOT_EDIT, 1);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
int srp_set(kcontext_t *context)
|
|
|
{
|
|
|
int ret = 0;
|