strongswan面向对象
目录
概述
源代码
代码中数据结构与面向对象关系
使用
概述
strongswan是C语言实现的,但数据结构,函数接口都是面向对象的思想;
比如C++的基类和派生类,父类和子类,私有成员变量和公有成员函数等。
源代码
第一遍翻代码看很不习惯,通览整个工程后就觉得这种面向对象的封装特别适合处理网络数据包。
下面以library举例,下列代码中为减少篇幅,故意删节部分字段。
strongswan/src/libstrongswan/library.cstrongswan/src/libstrongswan/library.h
strongswan/src/libstrongswan/library.c
//cut off many codes
typedef struct private_library_t private_library_t;/*** private data of library*/
struct private_library_t {/*** public functions*/library_t public;/*** Hashtable with registered objects (name => object)*/hashtable_t *objects;/*** Number of times we have been initialized*/refcount_t ref;
};/*** Deinitialize library*/
void library_deinit()
{private_library_t *this = (private_library_t*)lib;if (!this || !ref_put(&this->ref)){ /* have more users */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){ /* already initialized, increase refcount */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;/*** Libstrongswan library context, contains library relevant globals.*/
struct library_t {/*** Get an arbitrary object registered by name.** @param name name of the object to get* @return object, NULL if none found*/void* (*get)(library_t *this, char *name);/*** (Un-)Register an arbitrary object using the given name.** @param name name to register object under* @param object object to register, NULL to unregister* @return TRUE if registered, FALSE if name already taken*/bool (*set)(library_t *this, char *name, void *object);/*** Main configuration file passed to library_init(), the default, or NULL*/char *conf;/*** various settings loaded from settings file*/settings_t *settings;/*** integrity checker to verify code integrity*/integrity_checker_t *integrity;};/*** Initialize library, creates "lib" instance.** library_init() may be called multiple times in a single process, but each* caller must call library_deinit() for each call to library_init().** The settings and namespace arguments are only used on the first call.** @param settings file to read settings from, may be NULL for default or* "" to not load any settings* @param namespace name of the binary that uses the library, determines* the first section name when reading config options.* Defaults to libstrongswan if NULL.* @return FALSE if integrity check failed or settings are invalid*/
bool library_init(char *settings, const char *namespace);/*** Deinitialize library, destroys "lib" instance.*/
void library_deinit();/*** Library instance, set after library_init() and before library_deinit() calls.*/
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为例,
/*** Library initialization and operation parsing*/
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 failed\n");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);
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
