BBS水木清华站∶精华区

发信人: forest (轻寒小楼~~33434), 信区: Unix        
标  题: unix环境下mail系统的简单扩容(二)[转载] 
发信站: BBS 水木清华站 (Thu Mar  4 16:14:04 1999) 
 
发信人: cpu (奔腾的心), 信区: Solaris 
标  题: unix环境下mail系统的简单扩容(二) 
发信站: 华南网木棉站 (Wed Mar  3 19:59:59 1999), 转信 
 
既然拿到了source就免不了要看一下哪些地方需要修改。 
 
先大概讲一下怎么修改sendmail。sendmail通过/etc/passwd文件来查找用户 
名,所以相关的函数很容易猜出来:getpwnam就是了。 
 
sendmail的原码在src子目录下面,简单地用grep getpwnam *.c|more看一下 
调用了getpwnam的模块,把各段原码大致分析一下发现有一个另外定义的取 
用户函数sw_getpwnam,函数实现在conf.c里面: 
 
 
struct passwd * 
sm_getpwnam(user) 
        char *user; 

#ifdef _AIX4 
        extern struct passwd *_getpwnam_shadow(const char *, const int); 
 
        return _getpwnam_shadow(user, 0); 
#else                                                
        return getpwnam(user); 
#endif 

 
就是这段东东了,sm_getpwnam是标准函数getpwnam的一个wrapper函数,也就是 
sendmail的取用户信息函数,当有smtp客户连进来发rcpt to: xxuser的时候 
sendmail就是会去调用sm_getpwnam("xxxuser")来验证有没这个用户. 
 
好了明白了,你现在就可以把conf.c里的sm_getpwnam改成自己所需要的样子: 
比如查数据库,或者查内存中的用户表,或者向另外一个独立的用户信息服务引 
擎发请求取得用户信息。。。 
 
光改了src目录下的sm_getpwnam还不行,src只是sendmail的原码部分,父目录 
下还有一个子目录叫mail.local,干什么用的一看名字就明白了,就是本地的 
邮递员,sendmail收信后把信件交给邮递员来投递,邮递员程序也涉及到取用 
户信息的操作,到mail.local下面grep getpwnam *就知道了。主要改mail.local.c 
里面的diliver函数。 
 
最后提一下改pop3,非常简单,有一个util.c,里面有个verify_user函数,该 
函数调用了getpwnam和getspnam函数来取得用户信息和对用户进行认证,改了它 
就完事了。                                                          
 
-- 
一些话想要对你说,始终没有说出口,那就不说也罢。 
一些信想要写给你,始终没有寄出去,那就不寄也罢。 
。。。。。。 
 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: argo.zsu.edu.cn] 

BBS水木清华站∶精华区