Ver código fonte

Don't fork() after sr_connect()

Serj Kalichev 1 ano atrás
pai
commit
dba9b40152
2 arquivos alterados com 15 adições e 26 exclusões
  1. 1 24
      src/plugin.c
  2. 14 2
      src/syms.c

+ 1 - 24
src/plugin.c

@@ -32,20 +32,6 @@ int kplugin_sysrepo_init(kcontext_t *context)
 	plugin = kcontext_plugin(context);
 	assert(plugin);
 
-	err = sr_connect(SR_CONN_DEFAULT, &conn);
-	if (err) {
-		fprintf(stderr, "Can't connect to Sysrepo\n");
-		return -1;;
-	}
-	err = sr_session_start(conn, SR_DS_RUNNING, &sess);
-	if (err) {
-		fprintf(stderr, "Can't start Sysrepo session\n");
-		sr_disconnect(conn);
-		return -1;
-	}
-
-	kplugin_set_udata(plugin, sess);
-
 	// Symbols
 	kplugin_add_syms(plugin, ksym_new("srp_compl", srp_compl));
 
@@ -55,16 +41,7 @@ int kplugin_sysrepo_init(kcontext_t *context)
 
 int kplugin_sysrepo_fini(kcontext_t *context)
 {
-	kplugin_t *plugin = NULL;
-	sr_session_ctx_t *sess = NULL;
-
-	if (!context)
-		return -1;
-
-	plugin = kcontext_plugin(context);
-	sess = (sr_session_ctx_t *)kplugin_udata(plugin);
-
-	sr_disconnect(sr_session_get_connection(sess));
+	context = context; // Happy compiler
 
 	return 0;
 }

+ 14 - 2
src/syms.c

@@ -60,6 +60,9 @@ static faux_argv_t *pargv2argv(const kpargv_t *pargv)
 	return args;
 }
 
+
+
+
 // Candidate from pargv contains possible begin of current word (that must be
 // completed). kpargv's list don't contain candidate but only already parsed
 // words.
@@ -67,16 +70,25 @@ int srp_compl(kcontext_t *context)
 {
 	faux_argv_t *args = NULL;
 	pline_t *pline = NULL;
+	sr_conn_ctx_t *conn = NULL;
 	sr_session_ctx_t *sess = NULL;
 
 	assert(context);
-	args = pargv2argv(kcontext_parent_pargv(context));
-	sess = (sr_session_ctx_t *)kplugin_udata(kcontext_plugin(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_parent_pargv(context));
 	pline = pline_parse(sess, args, 0);
 	faux_argv_free(args);
 	pline_print_completions(pline, BOOL_FALSE);
 	pline_free(pline);
 
+	sr_disconnect(conn);
+
 	return 0;
 }