当前位置: 首页 > news >正文

昆明微网站制作海口免费建站

昆明微网站制作,海口免费建站,电商外贸平台有哪些,营销策略理论接前一篇文章#xff1a;PAM从入门到精通#xff08;二十五#xff09; 本文参考#xff1a; 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构#xff1a; 更加形象的形式#xff1a; 七、PAM-API各函数源码详解 前边的文章讲解了各PAM-API…接前一篇文章PAM从入门到精通二十五 本文参考 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构 更加形象的形式 七、PAM-API各函数源码详解 前边的文章讲解了各PAM-API函数以及总体流程但是也只是从接口层面介绍的并没有深入到代码层面。从本篇文章开始将对于各个接口函数从源码级进行讲解以使大家不但知其然还要知其所以然。 1. pam_start函数 上回讲到_pam_start_internal函数的第五部分本文继续往下进行讲解。为了便于理解再次贴出_pam_start_internal函数源码。在libpam/pam_start.c中如下所示 static int _pam_start_internal (const char *service_name,const char *user,const struct pam_conv *pam_conversation,const char *confdir,pam_handle_t **pamh) {D((called pam_start: [%s] [%s] [%p] [%p],service_name, user, pam_conversation, pamh));if (pamh NULL) {pam_syslog(NULL, LOG_CRIT,pam_start: invalid argument: pamh NULL);return (PAM_SYSTEM_ERR);}if (service_name NULL) {pam_syslog(NULL, LOG_CRIT,pam_start: invalid argument: service NULL);return (PAM_SYSTEM_ERR);}if (pam_conversation NULL) {pam_syslog(NULL, LOG_CRIT,pam_start: invalid argument: conv NULL);return (PAM_SYSTEM_ERR);}if ((*pamh calloc(1, sizeof(**pamh))) NULL) {pam_syslog(NULL, LOG_CRIT, pam_start: calloc failed for *pamh);return (PAM_BUF_ERR);}/* All service names should be files below /etc/pam.d and nothingelse. Forbid paths. */if (strrchr(service_name, /) ! NULL)service_name strrchr(service_name, /) 1;/* Mark the caller as the application - permission to do certainthings is limited to a module or an application */__PAM_TO_APP(*pamh);if (((*pamh)-service_name _pam_strdup(service_name)) NULL) {pam_syslog(*pamh, LOG_CRIT,pam_start: _pam_strdup failed for service name);_pam_drop(*pamh);return (PAM_BUF_ERR);} else {char *tmp;for (tmp(*pamh)-service_name; *tmp; tmp)*tmp tolower(*tmp); /* require lower case */}if (user) {if (((*pamh)-user _pam_strdup(user)) NULL) {pam_syslog(*pamh, LOG_CRIT,pam_start: _pam_strdup failed for user);_pam_drop((*pamh)-service_name);_pam_drop(*pamh);return (PAM_BUF_ERR);}} else(*pamh)-user NULL;if (confdir) {if (((*pamh)-confdir _pam_strdup(confdir)) NULL) {pam_syslog(*pamh, LOG_CRIT,pam_start: _pam_strdup failed for confdir);_pam_drop((*pamh)-service_name);_pam_drop((*pamh)-user);_pam_drop(*pamh);return (PAM_BUF_ERR);}} else(*pamh)-confdir NULL;(*pamh)-tty NULL;(*pamh)-prompt NULL; /* prompt for pam_get_user() */(*pamh)-ruser NULL;(*pamh)-rhost NULL;(*pamh)-authtok NULL;(*pamh)-oldauthtok NULL;(*pamh)-fail_delay.delay_fn_ptr NULL;(*pamh)-former.choice PAM_NOT_STACKED;(*pamh)-former.substates NULL; #ifdef HAVE_LIBAUDIT(*pamh)-audit_state 0; #endif(*pamh)-xdisplay NULL;(*pamh)-authtok_type NULL;(*pamh)-authtok_verified 0;memset (((*pamh)-xauth), 0, sizeof ((*pamh)-xauth));if (((*pamh)-pam_conversation (struct pam_conv *)malloc(sizeof(struct pam_conv))) NULL) {pam_syslog(*pamh, LOG_CRIT, pam_start: malloc failed for pam_conv);_pam_drop((*pamh)-service_name);_pam_drop((*pamh)-user);_pam_drop((*pamh)-confdir);_pam_drop(*pamh);return (PAM_BUF_ERR);} else {memcpy((*pamh)-pam_conversation, pam_conversation,sizeof(struct pam_conv));}(*pamh)-data NULL;if ( _pam_make_env(*pamh) ! PAM_SUCCESS ) {pam_syslog(*pamh,LOG_ERR,pam_start: failed to initialize environment);_pam_drop((*pamh)-pam_conversation);_pam_drop((*pamh)-service_name);_pam_drop((*pamh)-user);_pam_drop((*pamh)-confdir);_pam_drop(*pamh);return PAM_ABORT;}_pam_reset_timer(*pamh); /* initialize timer support */_pam_start_handlers(*pamh); /* cannot fail *//* According to the SunOS man pages, loading modules and resolving* symbols happens on the first call from the application. */if ( _pam_init_handlers(*pamh) ! PAM_SUCCESS ) {pam_syslog(*pamh, LOG_ERR, pam_start: failed to initialize handlers);_pam_drop_env(*pamh); /* purge the environment */_pam_drop((*pamh)-pam_conversation);_pam_drop((*pamh)-service_name);_pam_drop((*pamh)-user);_pam_drop((*pamh)-confdir);_pam_drop(*pamh);return PAM_ABORT;}D((exiting pam_start successfully));return PAM_SUCCESS; } 接下来来到以下代码片段 _pam_reset_timer(*pamh); /* initialize timer support */ _pam_reset_timer函数在libpam/pam_delay.c中代码如下 /* *********************************************************************** initialize the time as unset, this is set on the return from the* authenticating pair of of the libpam pam_XXX calls.*/void _pam_reset_timer(pam_handle_t *pamh) {D((setting pamh-fail_delay.set to FALSE));pamh-fail_delay.set PAM_FALSE; } 函数本身很简单只有两句代码还有一句是提示信息真正的代码只有一句。_pam_reset_timer函数的功能是将time初始化为unset这是在libpam的pam_XXX调用的身份验证对返回时设置的。 来看一下pam_handle_t即struct pam_handle中的struct _pam_fail_delay fail_delay成员的定义在libpam/pam_private.h中如下 typedef enum { PAM_FALSE, PAM_TRUE } _pam_boolean;struct _pam_fail_delay {_pam_boolean set;unsigned int delay;time_t begin;const void *delay_fn_ptr; }; 其中的成员set实际上是一个布尔型变量在_pam_reset_timer函数中被设置为了PAM_FALSE。 接下来来到_pam_start_internal函数的以下代码片段 _pam_start_handlers(*pamh); /* cannot fail */ _pam_start_handlers函数在libpam/pam_handlers.c中代码如下 void _pam_start_handlers(pam_handle_t *pamh) {D((called.));/* NB. There is no check for a NULL pamh here, since no return* value to communicate the fact! *//* Indicate that handlers are not initialized for this pamh */pamh-handlers.handlers_loaded 0;pamh-handlers.modules_allocated 0;pamh-handlers.modules_used 0;pamh-handlers.module NULL;/* initialize the .conf and .other entries */pamh-handlers.conf.authenticate NULL;pamh-handlers.conf.setcred NULL;pamh-handlers.conf.acct_mgmt NULL;pamh-handlers.conf.open_session NULL;pamh-handlers.conf.close_session NULL;pamh-handlers.conf.chauthtok NULL;pamh-handlers.other.authenticate NULL;pamh-handlers.other.setcred NULL;pamh-handlers.other.acct_mgmt NULL;pamh-handlers.other.open_session NULL;pamh-handlers.other.close_session NULL;pamh-handlers.other.chauthtok NULL; } _pam_start_handlers函数也很好理解对于(*pamh)-handlers的各成员进行设置即初始化。 来看一下pam_handle_t即struct pam_handle中的struct service handlers成员的相关定义在libpam/pam_private.h中如下 struct handlers {struct handler *authenticate;struct handler *setcred;struct handler *acct_mgmt;struct handler *open_session;struct handler *close_session;struct handler *chauthtok; };struct service {struct loaded_module *module; /* Array of modules */int modules_allocated;int modules_used;int handlers_loaded;struct handlers conf; /* the configured handlers */struct handlers other; /* the default handlers */ };_pam_start_internal函数的其余部分将在后续文章中继续讲解。
http://www.pierceye.com/news/929224/

相关文章:

  • 手机网站静态动态珠海网页搜索排名提升
  • 旅游公司网站建设方案宁德市住房和城乡建设局新网站
  • 网站开发购物店网站营销策略
  • 福建省建设局网站安顺市哪里可以做网站
  • 网站服务设计仿《爱美眉》网站 dede
  • 茌平网站建设哪个地方可学习网站建设
  • 便民的网站app怎么做acg的wordpress主题
  • 外贸网站高端定做网络营销培训
  • 电子通讯录网站建设08影院wordpress影视主题源码
  • 电商设计素材网站推荐然后建设自营网站
  • 网站方案设计网页兼容性 网站开发
  • 做网站怎么申请域名游戏软件开发需要学什么
  • 做外贸网站需要什么卡创app开发 杭州app开发公司
  • 哪个网站可以做视频外链怎样退订3d卫星街景会员费用
  • 烟台做网站建设电话设置网站默认编码
  • seo官网制作规划绍兴seo整站优化
  • 怎么做网站广告设计学习
  • 邵东平台网站建设中山手机台app
  • 学什么可以做网站免费qq空间网站
  • 网站套餐到期啥意思电子商务电商网站饿建设
  • 电商网站零售客户重庆旅游景点
  • 建设银行成都官网招聘网站自主建网站
  • 云南省建设厅定额网站房地产开发公司是做什么的
  • 哪个网站卖自己做的手工艺品有哪些好的做网站公司好
  • 做电影网站用什么主机好最新网站域名
  • 唐山做网站公司汉狮价格搜索引擎禁止的方式优化网站
  • 做视频网站视频常见网站安全漏洞
  • 苏州企业名录黄页新乡网站自然优化
  • 有哪些建设网站公司网站建设需求单
  • 招聘网站做销售用手机网站做app