2011-12-03 | #1 |
高级会员
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望:
50
现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
重载efun
发信人: cloner (!!!!!!!), 信区: Mud_Builder 标 题: 重载efun 发信站: 一塌糊涂 BBS (Sat May 5 03:27:36 2001) 【 在 shure (韩姝儿) 的大作中提到: 】 : exec()这个函式的权力非常大, 不当地使用会危及 MUD 的 : 系统安全. 正确地限制使用此函式的方法是另外写一个同名的 : 模拟超越函式 (simulated emulated function, simul_efun) : , 并使用 valid_override(4) 来限制此一模拟超越函式的使 : 用. (意即 efun::exec() ) shure这段话好像宝岛那边的话啊,呵呵。 我解释一下吧,我估计新手不容易看明白,:P 嗯,打算灌点水了: mud里有efun和simul_efun的概念,efun就是所谓的超越函数, 其实就是mudos提供直接使用的函数。 simul_efun就是在mudlib里自己写的一套可以在整个lib 里使用的函数,对一般的ob来说,和efun没有什么区别。 而重载,就是在 lib里写的与efun同名的函数,(这个并不是非要 写在simul_efun_ob里不可的。) 而且还可以继续用父类的函数 ,这里就写成: efun::exec()...很好用的一个功能,使得我们写lib的时候 更加灵活。不过mudos并不允许在lib里随便重载efun, 事实上是不让随便得使用efun::的方法调用。 对于重载合法性的检查在master.c得valid_override()里 进行,一般只会允许特定的文件重载特定的efun。 重载efun得目的,一个是做增强,比如重载destruct()。 你可以在destruct()之前作协需要的处理。 另一个就是为了安全。比如exec(),shutdown(),重载 就可以作些权限判断了,比如只允许root_uid调用这样 的efun等等。 这套机制有点复杂,不过也挺有效,就是重载太多的 efun也是挺麻烦的事情,:P。很多lib就没有重载 shutdown,exec什么的。bind有专门的valid_bind() 就省事了,呵呵。 |
|