加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL插件hook机制

发布时间:2020-12-13 16:10:59 所属栏目:百科 来源:网络整理
导读:internal_load_library postgresql- PG_init = (PG_init_t) pg_dlsym(file_scanner-handle,"_PG_init"); if (PG_init) (*PG_init) (); internal_unload_library(const char *libname)- PG_fini = (PG_fini_t) pg_dlsym(file_scanner-handle,"_PG_fini"); if
internal_load_library postgresql-> PG_init = (PG_init_t) pg_dlsym(file_scanner->handle,"_PG_init"); if (PG_init) (*PG_init) (); internal_unload_library(const char *libname)-> PG_fini = (PG_fini_t) pg_dlsym(file_scanner->handle,"_PG_fini"); if (PG_fini) (*PG_fini) (); 以ClientAuthentication_hook_type为例 auth.h: //声明插件使用的函数 extern void ClientAuthentication(Port *port); /* Hook for plugins to get control in ClientAuthentication() */ typedef void (*ClientAuthentication_hook_type) (Port *,int); extern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook; auth.c: //全局变量初始化为NULL,在_PG_init函数中进行初始化赋值,如果该插件加载,则ClientAuthentication_hook为 ClientAuthentication_hook_type ClientAuthentication_hook = NULL; //如果ClientAuthentication_hook被赋值则执行植入的代码 InitPostgres->PerformAuthentication->ClientAuthentication-> if (ClientAuthentication_hook) (*ClientAuthentication_hook) (port,status); auth_delay.c: static ClientAuthentication_hook_type original_client_auth_hook = NULL; /* * Module Load Callback */ void _PG_init(void) { /* Define custom GUC variables */ DefineCustomIntVariable("auth_delay.milliseconds","Milliseconds to delay before reporting authentication failure",NULL,&auth_delay_milliseconds,INT_MAX / 1000,PGC_SIGHUP,GUC_UNIT_MS,NULL); /* Install Hooks */ original_client_auth_hook = ClientAuthentication_hook; ClientAuthentication_hook = auth_delay_checks; } /* 如果卸载则调用该函数,实际上是将ClientAuthentication_hook赋回原值 */ void _PG_fini(void) { ClientAuthentication_hook=original_client_auth_hook; } /* */ static void auth_delay_checks(Port *port,int status) { if (original_client_auth_hook) original_client_auth_hook(port,status); if (status != STATUS_OK){ pg_usleep(1000L * auth_delay_milliseconds); } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读