下面几个问题是dinger@YTHT在YTHT WWW cygwin下的几个解决方案
1. 解决用户登陆时的错误问题
问题:用户登陆时Error
应急解决:nju09/bbslogin.c
static char *
check_multi(char *id, int uid)
{
int i, uent, nsearch;
if (uid <= 0 || uid > MAXUSERS)
return NULL;
if (1 && strcasecmp(id, "guest")) {
//这种算法, wwwlogin必须限制登录窗口数目, 否则
//上线名单会被轻易冲爆
for (i = 3; i < 6; i++) {
uent = uindexshm->user[uid - 1][i]/* - 1*/;
2现象:使用WEB方式注册写不上.PASSWDS文件
分析:
adduser()[bbsdoreg.c]在打开.PASSWDS文件并加锁的的情况下
调用save_user_rec()[BBSLIB.c]
后者再次打开该文件,并试图写入 导致写入失败
其实adduser()在调用save_user_rec()之后
已经不再访问文件
所以解决方法是在调用save_user_rec()之前关闭该文件
此改法目前未见异常
解决:[bbsdoreg.c]
int
adduser(struct userec *x)
{
int i;
FILE *fp;
fp = fopen(".PASSWDS", "r+");
flock(fileno(fp), LOCK_EX);
if (getuser(x->userid)) {
flock(fileno(fp), LOCK_UN);
fclose(fp);
return -1;
}
flock(fileno(fp), LOCK_UN);
fclose(fp);
for (i = 0; i < MAXUSERS; i++) {
if (shm_ucache->userid[i][0] == 0) {
if (i + 1 > shm_ucache->number)
shm_ucache->number = i + 1;
strncpy(shm_ucache->userid[i], x->userid, 13);
insertuseridhash(uidhashshm->uhi, UCACHE_HASH_SIZE,
x->userid, i + 1);
save_user_rec(x);
break;
}
}
//flock(fileno(fp), LOCK_UN);
//fclose(fp);
return 0;
//utime(FLUSH, NULL);
}
3现象:刷新同一page有时出现Error
分析:cache_header()[BBSLIB.c]中
调用strptime()时使用了不被支持的"%Z"
导致strptime()失败
解决:定位cache_header()[BBSLIB.c]
修改前:
strptime(old, "%a, %d %b %Y %H:%M:%S %Z", &tm);
修改后:
strptime(old, "%a, %d %b %Y %H:%M:%S GMT", &tm);
本解决方案目前未见异常