目录
概述
源代码
代码中数据结构与面向对象关系
使用
概述
strongswan是C语言实现的,但数据结构,函数接口都是面向对象的思想;
比如C++的基类和派生类,父类和子类,私有成员变量和公有成员函数等。
源代码
第一遍翻代码看很不习惯,通览整个工程后就觉得这种面向对象的封装特别适合处理网络数据包。
下面以library举例,下列代码中为减少篇幅,故意删节部分字段。
strongswan/src/libstrongswan/library.c strongswan/src/libstrongswan/library.h
strongswan/src/libstrongswan/library.c
//cut off many codes
typedef struct private_library_t private_library_t;
struct private_library_t {
library_t public;
hashtable_t *objects;
refcount_t ref;
};
void library_deinit()
{
private_library_t *this = (private_library_t*)lib;
if (!this || !ref_put(&this->ref))
{
return;
}
free(this->public.conf);
free((void*)this->public.ns);
free(this);
lib = NULL;
}
METHOD(library_t, get, void*,
private_library_t *this, char *name)
{
return this->objects->get(this->objects, name);
}
METHOD(library_t, set, bool,
private_library_t *this, char *name, void *object)
{
if (object)
{
if (this->objects->get(this->objects, name))
{
return FALSE;
}
this->objects->put(this->objects, name, object);
return TRUE;
}
return this->objects->remove(this->objects, name) != NULL;
}
bool library_init(char *settings, const char *namespace)
{
private_library_t *this;
if (lib)
{
this = (private_library_t*)lib;
ref_get(&this->ref);
return !this->init_failed;
}
INIT(this,
.public = {
.get = _get,
.set = _set,
.ns = strdup(namespace ?: "libstrongswan"),
.conf = strdupnull(settings ?: (getenv("STRONGSWAN_CONF") ?: STRONGSWAN_CONF)),
},
.ref = 1,
);
lib = &this->public;
return !this->init_failed;
}
strongswan/src/libstrongswan/library.h
typedef struct library_t library_t;
struct library_t {
void* (*get)(library_t *this, char *name);
bool (*set)(library_t *this, char *name, void *object);
char *conf;
settings_t *settings;
integrity_checker_t *integrity;
};
bool library_init(char *settings, const char *namespace);
void library_deinit();
extern library_t *lib;
代码中数据结构与面向对象关系
基类:
struct library_t
派生类:
struct private_library_t
构造函数:
bool library_init(char *settings, const char *namespace);
library_init函数内还有INIT,和成员的初始化等工作。
析构函数:
void library_deinit();
Public成员函数:
METHOD(library_t, get, void*, private_library_t *this, char *name); METHOD(library_t, set, bool, private_library_t *this, char *name, void *object);
Private成员变量:
refcount_t ref; 等
使用
以swanctl使用library为例,
int main(int argc, char *argv[])
{
atexit(cleanup);
if (!library_init(NULL, "swanctl"))
{
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
}
if (lib->integrity &&
!lib->integrity->check_file(lib->integrity, "swanctl", argv[0]))
{
fprintf(stderr, "integrity check of swanctl failedn");
exit(SS_RC_DAEMON_INTEGRITY);
}
if (!lib->plugins->load(lib->plugins,
lib->settings->get_str(lib->settings, "swanctl.load", PLUGINS)))
{
exit(SS_RC_INITIALIZATION_FAILED);
}
swanctl_dir = strdup(getenv("SWANCTL_DIR") ?: SWANCTLDIR);
dbg_default_set_level(0);
lib->processor->set_threads(lib->processor, 4);
dbg_default_set_level(1);
return command_dispatch(argc, argv);
}



