应用程序通过将对Sysrepo的调用通过Sysrepo提供的相应的API接口访问方法,称为Syrepo的间接访问方法。该方法是应用程序通过创建Deamon进程,通过IPC Shm机制与Sysrepo通信。可以做到对Sysrepo的即插即用,最后由Sysrepo纳管,这就是Plugind,命名为sysrepo-plugind。要快速的使用Sysrepo,并快速开发出适配于Sysrepo的插件,就要先了解sysrepo-plugind的实现原理与机制,就需要先从实现sysrepo-plugind的源码处着手。Sysrepo源码路径:git clone https://github.com/sysrepo/sysrepo.git Sysrepo-plugind实现的路径为sysrepo/src/executables/sysrepo-plugind.c。下面也就从该文件开始说。
2.1 数据结构
struct srpd_plugin_s {
void *handle;
srp_init_cb_t init_cb;
srp_cleanup_cb_t cleanup_cb;
void *private_data;
};
/*结构参数说明*/
handle:动态库句柄,在load_plugin中细说
srp_init_cb_t:
/*Sysrepo plugin initialization callback.*/
typedef int (*srp_init_cb_t)(sr_session_ctx_t *session, void **private_data);
srp_cleanup_cb_t :
/*brief Sysrepo plugin cleanup callback.*/
typedef void (*srp_cleanup_cb_t)(sr_session_ctx_t *session, void *private_data);
private_data: Private context opaque to sysrepo
2.2 main函数实现
int
main(int argc, char** argv)
{
struct srpd_plugin_s *plugins = NULL; /*plugin结构*/
sr_conn_ctx_t *conn = NULL; /*sysrepo连接的上下文,该结构定义于common.h.in*/
sr_session_ctx_t *sess = NULL; /*sysrepo会话的上下文,该结构定义于common.h.in中*/
sr_log_level_t log_level = SR_LL_ERR; /*输出log等级,默认是ERR*/
int plugin_count = 0, i, r, rc = EXIT_FAILURE, opt, debug = 0;
struct option options[] = {
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{"verbosity", required_argument, NULL, 'v'},
{"debug", no_argument, NULL, 'd'},
{NULL, 0, NULL, 0},
}; /*命令行支持的参数*/
/* process options */
opterr = 0;
/*整个while循环是解析命令的参数,例如,在调试时,输入“sysrepo-plugind -d -v 4” 是debug模式
*下log级别DBG级,将会打印全部的调试信息
*/
while ((opt = getopt_long(argc, argv, "hVv:d", options, NULL)) != -1) {
switch (opt) {
case 'h':
version_print();
help_print();
rc = EXIT_SUCCESS;
goto cleanup;
case 'V':
version_print();
rc = EXIT_SUCCESS;
goto cleanup;
case 'v':
if (!strcmp(opt