===============================================================================
4) 修改Domain Quota限制;
===============================================================================
qmailadmin源程序无法控制Domain Quota,邮件帐户可以设置任意大小的限制值而不受总
Quota的控制.如要限制邮件帐户的Quota数值不能大于总的Domain Quota值,就必须在编译
之前先修改qmailadmin的源程序.
-------------------------------------------------------------------------------
(a)如下是所需要修改的档案清单:
-------------------------------------------------------------------------------
所需修改的使用界面为:
html/add_user.html
html/mod_user.html
html/show_users.html
所需修改的各种语言的信息定义变量:
lang/en #英文语言的信息变量定义
lang/zh-cn #简体中文(gb2312)的信息变量定义
所需修改的原程序文件为:
limits.c
qmailadmin.c
qmailadminx.h
template.c
user.c #请注意新版中部分函数改名和参数调动问题
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
(b)修改使用界面;
-------------------------------------------------------------------------------
vi html/add_user.html; #第44行需添加支持Quota的标记:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<td align="left"><input type="text" size="16" name="quota" maxlength="128"> ##X901##+ ##X902##-</td>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi html/mod_user.html; #第98行(旧版为118行)改为如下:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
##X901##+ ##X902##-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi html/show_users.html; #第42行改为如下:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
##X901##+ ##X902##-[
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
请注意: 上述修改使用了+和-做Quota的标记,是因为新版(qmailadmin-1.2.11)在其源程序
(template.c)中已经使用了所有英语符号来做标记,所以必须使用别的符号来做配额的标记.
我们这里选择用+(Domain Quota)和-(Used Quota)来做标记,也就是在template.c中CASE中
选择了+和-来标记相关限额,上述修改中的所有涉及这个标记的修改,均是为了配合template.c
中的修改.
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
(c) 修改各种语言的信息定义变量:
-------------------------------------------------------------------------------
vi lang/en; #最后面添加五行如下:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
901 Whole storage:
902 Applied storage:
903 Over storage quota
904 Whole storage was totally used
905 setted storage must larger than the used storage
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi lang/zh-cn; #参照说明补充两行,在最后面添加5行如下(注意用简体中文字):
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
316 修改密码
317 你不能删除管理者帐户
#上述两个定义参照lang/en中的定义(可能原程序遗漏了):
901 整个域总容量:
902 已分配容量:
903 设置的容量超过可用容量
904 已分配的容量已达到整个域总容量
905 设置的容量一定要大于已使用容量
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
如果要修改其他所有语言信息定义文件,可以先建立一个lang_fixquota.patch文件:
vi lang_fixquota.patch;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
901 Whole storage:
902 Applied storage:
903 Over storage quota
904 Whole storage was totally used
905 setted storage must larger than the used storage
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
然后用 cat 命令将lang_fixquota.patch文件的内容添加到相关文件中:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cat fixquota.patch >> bg;
cat fixquota.patch >> cs;
cat fixquota.patch >> da;
cat fixquota.patch >> de;
cat fixquota.patch >> es;
cat fixquota.patch >> fi;
cat fixquota.patch >> fr;
cat fixquota.patch >> hu;
cat fixquota.patch >> it;
cat fixquota.patch >> ja;
cat fixquota.patch >> lt;
cat fixquota.patch >> nl;
cat fixquota.patch >> no;
cat fixquota.patch >> pl;
cat fixquota.patch >> pt-br;
cat fixquota.patch >> ru;
cat fixquota.patch >> sk;
cat fixquota.patch >> sv;
cat fixquota.patch >> tr;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
请注意: 上述语言信息定义格式采用阵列形式,左边数字是索引,右边文字为解释;在源程序
中,语言信息定义是用阵列html_text[]来储存,因为新版qmailadmin改用数字来做索引,而且
源程序中所定义的阵列长度是350。如果新添加的信息定义的索引数字大于350(例如我们上
述所添加的索引数字为901,902,903,904 和 905,均大于350), 在某些系统下可能无法
正确储存阵列(取决于C语言的编译特性),由此而导致调用到此语言定义信息的相关页面无法
正常显示,因此需要修正(增大)阵列长度.
vi qmailadmin.h; #此头文件定义系统环境变数
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define MAX_LANG_STR 350 // 找到定义MAX_LANG_STR的此行;
#define MAX_LANG_STR 950 // 将350修改为950;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
(d) 在limits.c, qmailadmin.c和qmailadminx.h中增加变量定义;
-------------------------------------------------------------------------------
vi limits.c; (旧程序46行附近插入如下行

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DefaultDomainQuota = Limits.diskquota;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi qmailadmin.c; (旧程序82行附近插入如下行

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int DefaultDomainQuota;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi qmailadminx.h; (旧程序61行附近插入如下行

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
extern int DefaultDomainQuota;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
(e) 修改template.c源程序;
-------------------------------------------------------------------------------
vi template.c;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(e.1) 第41行处增加一行如下:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#include "qmailadmin.h"
#include "qmailadminx.h"
#define NOLIMIT_STR get_html_text("229") #这是插入的新行
static char dchar[4];
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(e.2) 第53行处增加一行如下:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static char NTmpBuf[500];
float count_users_quota(); #这是插入的新行
/*
* send an html template to the browser
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(e.3) 第79行处增加一行如下(send_template_now子函数):
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
struct vqpasswd *vpw;
char value[MAX_BUFF];
float UsedQuota = (count_users_quota())/1048576.0; #这是插入的新行
if (strstr(filename, "/")!= NULL||strstr(filename,"..")!=NULL) {
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(e.4) 第578行处增加两个case(+和-)共16行,因为新版(qmailadmin-1.2.11)其源程序中已
经使用了所有文字符号来做标记,所以必须使用别的符号来做配额的标记.例如用+(Domain
Quota)和-(Used Quota)来做标记:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
case '+': #这是新增加的case
{
if (DefaultDomainQuota > 0) {
fprintf(actout, "%dM", DefaultDomainQuota);
} else {
fprintf(actout, "%s", NOLIMIT_STR);
}
}
break;
case '-': #这是新增加的case
{
if (UsedQuota > 0.0) fprintf(actout, "%-2.2lfM", UsedQuota);
else fprintf(actout, "%s", NOLIMIT_STR);
}
break;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
提示: 可用如下的grep命令可查看当前版本中使用了那些符号作标记: grep 'case' template.c;
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
(f) 修改user.c源程序;
-------------------------------------------------------------------------------
(f.1) 第56行处增加一行如下:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#endif
float count_users_quota(); #这是插入的新行
int show_users(char *Username, char *Domain, time_t Mytime)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -