소스 검색

kplugin: Functions to work with session init/fini

Serj Kalichev 1 년 전
부모
커밋
b9926072bd
2개의 변경된 파일50개의 추가작업 그리고 0개의 파일을 삭제
  1. 6 0
      klish/kplugin.h
  2. 44 0
      klish/kscheme/kplugin.c

+ 6 - 0
klish/kplugin.h

@@ -59,6 +59,12 @@ bool_t kplugin_set_minor(kplugin_t *plugin, uint8_t minor);
 void *kplugin_udata(const kplugin_t *plugin);
 bool_t kplugin_set_udata(kplugin_t *plugin, void *udata);
 bool_t kplugin_load(kplugin_t *plugin);
+ksym_fn kplugin_init_session_fn(const kplugin_t *plugin);
+bool_t kplugin_set_init_session_fn(kplugin_t *plugin, ksym_fn fn);
+ksym_fn kplugin_fini_session_fn(const kplugin_t *plugin);
+bool_t kplugin_set_fini_session_fn(kplugin_t *plugin, ksym_fn fn);
+int kplugin_init_session(kplugin_t *plugin, kcontext_t *context);
+int kplugin_fini_session(kplugin_t *plugin, kcontext_t *context);
 int kplugin_init(kplugin_t *plugin, kcontext_t *context);
 int kplugin_fini(kplugin_t *plugin, kcontext_t *context);
 

+ 44 - 0
klish/kscheme/kplugin.c

@@ -25,6 +25,8 @@ struct kplugin_s {
 	void *dlhan; // dlopen() handler
 	ksym_fn init_fn;
 	ksym_fn fini_fn;
+	ksym_fn init_session_fn;
+	ksym_fn fini_session_fn;
 	void *udata; // User data
 	faux_list_t *syms;
 };
@@ -59,6 +61,12 @@ KSET(plugin, uint8_t, minor);
 KGET(plugin, void *, udata);
 KSET(plugin, void *, udata);
 
+// Session init/fini functions
+KGET(plugin, ksym_fn, init_session_fn);
+KSET(plugin, ksym_fn, init_session_fn);
+KGET(plugin, ksym_fn, fini_session_fn);
+KSET(plugin, ksym_fn, fini_session_fn);
+
 // SYMs list
 KGET(plugin, faux_list_t *, syms);
 static KCMP_NESTED(plugin, sym, name);
@@ -249,3 +257,39 @@ int kplugin_fini(kplugin_t *plugin, kcontext_t *context)
 
 	return plugin->fini_fn(context);
 }
+
+
+int kplugin_init_session(kplugin_t *plugin, kcontext_t *context)
+{
+	assert(plugin);
+	if (!plugin)
+		return -1;
+	assert(context);
+	if (!context)
+		return -1;
+
+	if (!plugin->init_session_fn)
+		return 0;
+	// Be sure the context type is appropriate one
+	kcontext_set_type(context, KCONTEXT_TYPE_PLUGIN_INIT);
+
+	return plugin->init_session_fn(context);
+}
+
+
+int kplugin_fini_session(kplugin_t *plugin, kcontext_t *context)
+{
+	assert(plugin);
+	if (!plugin)
+		return -1;
+	assert(context);
+	if (!context)
+		return -1;
+
+	if (!plugin->fini_session_fn)
+		return 0; // Fini function is not mandatory so it's ok
+	// Be sure the context type is appropriate one
+	kcontext_set_type(context, KCONTEXT_TYPE_PLUGIN_FINI);
+
+	return plugin->fini_session_fn(context);
+}