Pārlūkot izejas kodu

scheme: Compilable kdb.c

Serj Kalichev 3 gadi atpakaļ
vecāks
revīzija
22d87b4d99
4 mainītis faili ar 65 papildinājumiem un 67 dzēšanām
  1. 2 1
      klish/Makefile.am
  2. 23 7
      klish/kdb.h
  3. 2 1
      klish/kscheme/Makefile.am
  4. 38 58
      klish/kscheme/kdb.c

+ 2 - 1
klish/Makefile.am

@@ -30,7 +30,8 @@ nobase_include_HEADERS += \
 	klish/kplugin.h \
 	klish/kaction.h \
 	klish/kptype.h \
-	klish/ksym.h
+	klish/ksym.h \
+	klish/kdb.h
 
 # Session
 nobase_include_HEADERS += \

+ 23 - 7
klish/kdb.h

@@ -8,6 +8,9 @@
 
 #include <stdint.h>
 
+#include <faux/ini.h>
+#include <klish/kscheme.h>
+
 // Current API version
 #define KDB_MAJOR 1
 #define KDB_MINOR 0
@@ -33,20 +36,33 @@
 
 typedef struct kdb_s kdb_t;
 
-typedef bool_t (*kdb_init_fn)(void **p_udata);
-typedef bool_t (*kdb_fini_fn)(void *udata);
-typedef kscheme_t *(*kdb_load_fn)(void *udata, const char *opts);
-typedef bool_t (*kdb_deploy_fn)(const kscheme_t *scheme, void *udata,
-	const char *opts);
+// DB plugin's entry points
+typedef bool_t (*kdb_init_fn)(kdb_t *db);
+typedef bool_t (*kdb_fini_fn)(kdb_t *db);
+typedef kscheme_t *(*kdb_load_fn)(kdb_t *db);
+typedef bool_t (*kdb_deploy_fn)(kdb_t *db, const kscheme_t *scheme);
 
 
 C_DECL_BEGIN
 
-kdb_t *kdb_new(const char *name, const char *sofile);
+kdb_t *kdb_new(const char *name, const char *file);
 void kdb_free(kdb_t *db);
 
 const char *kdb_name(const kdb_t *db);
-const char *kdb_sofile(const kdb_t *db);
+const char *kdb_file(const kdb_t *db);
+faux_ini_t *kdb_ini(const kdb_t *db);
+bool_t kdb_set_ini(kdb_t *db, faux_ini_t *ini);
+uint8_t kdb_major(const kdb_t *db);
+bool_t kdb_set_major(kdb_t *db, uint8_t major);
+uint8_t kdb_minor(const kdb_t *db);
+bool_t kdb_set_minor(kdb_t *db, uint8_t minor);
+void *kdb_udata(const kdb_t *db);
+bool_t kdb_set_udata(kdb_t *db, void *udata);
+bool_t kdb_load(kdb_t *db);
+int kdb_init(kdb_t *db);
+int kdb_fini(kdb_t *db);
+kscheme_t *kdb_load_scheme(kdb_t *db);
+bool_t kdb_deploy_scheme(kdb_t *db, const kscheme_t *scheme);
 
 C_DECL_END
 

+ 2 - 1
klish/kscheme/Makefile.am

@@ -7,4 +7,5 @@ libklish_la_SOURCES += \
 	klish/kscheme/kparam.c \
 	klish/kscheme/kcommand.c \
 	klish/kscheme/kview.c \
-	klish/kscheme/kscheme.c
+	klish/kscheme/kscheme.c \
+	klish/kscheme/kdb.c

+ 38 - 58
klish/kscheme/kdb.c

@@ -6,23 +6,23 @@
 #include <dlfcn.h>
 
 #include <faux/str.h>
-#include <faux/list.h>
+#include <faux/ini.h>
 #include <klish/khelper.h>
 #include <klish/kscheme.h>
 #include <klish/kdb.h>
 
 
 struct kdb_s {
-	char *name;
-	char *sofile;
-	char *options;
+	char *name; // Arbitrary name (can be used to generate SO file name)
+	char *file; // SO file name
+	faux_ini_t *ini;
 	uint8_t major;
 	uint8_t minor;
 	void *dlhan; // dlopen() handler
-	void *init_fn;
-	void *fini_fn;
-	void *load_fn;
-	void *deploy_fn;
+	kdb_init_fn init_fn;
+	kdb_fini_fn fini_fn;
+	kdb_load_fn load_fn;
+	kdb_load_fn deploy_fn;
 	void *udata; // User data
 };
 
@@ -32,17 +32,12 @@ struct kdb_s {
 // Name
 KGET_STR(db, name);
 
-// ID
-KGET_STR(db, id);
-KSET_STR(db, id);
-
-// File
+// Shared object file
 KGET_STR(db, file);
-KSET_STR(db, file);
 
-// Conf
-KGET_STR(db, conf);
-KSET_STR(db, conf);
+// INI
+KGET(db, faux_ini_t *, ini);
+KSET(db, faux_ini_t *, ini);
 
 // Version major number
 KGET(db, uint8_t, major);
@@ -56,18 +51,8 @@ KSET(db, uint8_t, minor);
 KGET(db, void *, udata);
 KSET(db, void *, udata);
 
-// SYM list
-/*
-static KCMP_NESTED(db, sym, name);
-static KCMP_NESTED_BY_KEY(db, sym, name);
-KADD_NESTED(db, sym);
-KFIND_NESTED(db, sym);
-KNESTED_LEN(db, sym);
-KNESTED_ITER(db, sym);
-KNESTED_EACH(db, sym);
-*/
-
-kdb_t *kdb_new(const char *name)
+
+kdb_t *kdb_new(const char *name, const char *file)
 {
 	kdb_t *db = NULL;
 
@@ -81,22 +66,17 @@ kdb_t *kdb_new(const char *name)
 
 	// Initialize
 	db->name = faux_str_dup(name);
-	db->id = NULL;
-	db->file = NULL;
-	db->conf = NULL;
+	db->file = faux_str_dup(file);
+	db->ini = NULL;
 	db->major = 0;
 	db->minor = 0;
 	db->dlhan = NULL;
 	db->init_fn = NULL;
 	db->fini_fn = NULL;
+	db->load_fn = NULL;
+	db->deploy_fn = NULL;
 	db->udata = NULL;
 
-	// SYM list
-	db->syms = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
-		kdb_sym_compare, kdb_sym_kcompare,
-		(void (*)(void *))ksym_free);
-	assert(db->syms);
-
 	return db;
 }
 
@@ -107,10 +87,8 @@ void kdb_free(kdb_t *db)
 		return;
 
 	faux_str_free(db->name);
-	faux_str_free(db->id);
 	faux_str_free(db->file);
-	faux_str_free(db->conf);
-	faux_list_free(db->syms);
+	faux_ini_free(db->ini);
 
 	if (db->dlhan)
 		dlclose(db->dlhan);
@@ -121,13 +99,15 @@ void kdb_free(kdb_t *db)
 
 bool_t kdb_load(kdb_t *db)
 {
+	const char *name = NULL;
 	char *file_name = NULL;
 	char *init_name = NULL;
 	char *fini_name = NULL;
+	char *load_name = NULL;
+	char *deploy_name = NULL;
 	char *major_name = NULL;
 	char *minor_name = NULL;
 	int flag = RTLD_NOW | RTLD_LOCAL;
-	const char *id = NULL;
 	bool_t retcode = BOOL_FALSE;
 	uint8_t *ver = NULL;
 
@@ -135,22 +115,20 @@ bool_t kdb_load(kdb_t *db)
 	if (!db)
 		return BOOL_FALSE;
 
-	if (kdb_id(db))
-		id = kdb_id(db);
-	else
-		id = kdb_name(db);
-
 	// Shared object file name
+	name = kdb_name(db);
 	if (kdb_file(db))
 		file_name = faux_str_dup(kdb_file(db));
 	else
-		file_name = faux_str_sprintf(Kdb_SONAME_FMT, id);
+		file_name = faux_str_sprintf(KDB_SONAME_FMT, name);
 
 	// Symbol names
-	major_name = faux_str_sprintf(Kdb_MAJOR_FMT, id);
-	minor_name = faux_str_sprintf(Kdb_MINOR_FMT, id);
-	init_name = faux_str_sprintf(Kdb_INIT_FMT, id);
-	fini_name = faux_str_sprintf(Kdb_FINI_FMT, id);
+	major_name = faux_str_sprintf(KDB_MAJOR_FMT, name);
+	minor_name = faux_str_sprintf(KDB_MINOR_FMT, name);
+	init_name = faux_str_sprintf(KDB_INIT_FMT, name);
+	fini_name = faux_str_sprintf(KDB_FINI_FMT, name);
+	load_name = faux_str_sprintf(KDB_LOAD_FMT, name);
+	deploy_name = faux_str_sprintf(KDB_DEPLOY_FMT, name);
 
 	// Open shared object
 	db->dlhan = dlopen(file_name, flag);
@@ -172,15 +150,15 @@ bool_t kdb_load(kdb_t *db)
 
 	// Get db init function
 	db->init_fn = dlsym(db->dlhan, init_name);
-	if (!db->init_fn) {
-//		fprintf(stderr, "Error: Can't get db \"%s\" init function: %s\n",
-//			this->name, dlerror());
+	db->fini_fn = dlsym(db->dlhan, fini_name);
+	db->load_fn = dlsym(db->dlhan, load_name);
+	db->deploy_fn = dlsym(db->dlhan, deploy_name);
+	if (!db->load_fn && !db->deploy_fn) { // Strange DB plugin
+//		fprintf(stderr, "Error: DB plugin \"%s\" has no deploy and load functions\n",
+//			this->name);
 		goto err;
 	}
 
-	// Get db fini function
-	db->fini_fn = dlsym(db->dlhan, fini_name);
-
 	retcode = BOOL_TRUE;
 err:
 	faux_str_free(file_name);
@@ -188,6 +166,8 @@ err:
 	faux_str_free(minor_name);
 	faux_str_free(init_name);
 	faux_str_free(fini_name);
+	faux_str_free(load_name);
+	faux_str_free(deploy_name);
 
 	if (!retcode && db->dlhan)
 		dlclose(db->dlhan);