PostgreSQL插件hook机制
2018-10-31 19:38
1251 查看
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, 0, 0, INT_MAX / 1000, PGC_SIGHUP, GUC_UNIT_MS, NULL, NULL, 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); } }
相关文章推荐
- PostgreSQL hook机制编写插件限制超级用户权限
- PostgreSQL hook机制编写插件限制超级用户权限
- WordPress 插件机制的简单用法和原理(Hook 钩子)
- 插件开发之360 DroidPlugin源码分析(二)Hook机制
- Discuz X2.0插件机制解析HOOK钩子程序
- php中的钩子(hook插件机制)
- Android 插件之Hook机制动态代理
- WordPress 插件机制的简单用法和原理(Hook 钩子)
- 插件开发之360 DroidPlugin源码分析(二)Hook机制
- php中的钩子,hook插件机制
- 插件开发之360 DroidPlugin源码分析(二)Hook机制
- PostgreSQL的hook机制初步学习
- Git hook (钩子文件)机制
- 绕过Copy-On-Write机制安装全局Hook
- JQuery插件机制
- [转]NopCommerce MVC 插件机制分析
- vue源码解析之插件入侵机制
- jQuery.fn.extend jQuery.extend插件机制 tab切换
- 分析支付宝客户端的插件机制
- Qt5的插件机制(6)--开发Qt插件时几个重要的宏