/*
fb2k到ytht的.PASSWD转换程序
ytht版本为ytht-0.0.9,2004-09-09
FB2000userec结构和define常数值取自当前fb2000代码,根据需要修改
同时完成:
把.PASSWORD truncate 成定义的大小
过滤掉fb2000PASSWD文件中的重复用户
happybird @岱北聆泉站 2004/12/09
happybird@mail.sdu.edu.cn
*/
#include "bbs.h"
#define FB_STRLEN 80 /* Length of most string data */
#define FB_NAMELEN 40 /* Length of username/realname */
#define FB_IDLEN 12 /* Length of userids */
#define FB_ENCPASSLEN 14 //ifdef MD5 should be 35
#define FB_PASSLEN 14 /* User's password length (13 chars) */
#define _TEMP_FILE "tmpuserfile"
struct FB2000userec { /* Structure used to hold information in */
char userid[FB_IDLEN+2]; /* PASSFILE */
time_t firstlogin;
char lasthost[16];
unsigned int numlogins;
unsigned int numposts;
unsigned int medals; /* 奖章数 */
unsigned int money; /* 金钱 */
unsigned int inbank; /* 存款 */
time_t banktime; /* 存入时间 */
char flags[2];
#ifdef ENCPASSLEN
char passwd[FB_ENCPASSLEN];
#else
char passwd[FB_PASSLEN];
#endif
char username[FB_NAMELEN];
char ident[FB_NAMELEN];
char termtype[16];
char reginfo[FB_STRLEN-16];
unsigned int userlevel;
time_t lastlogin;
time_t lastlogout;/* 最近离线时间 */
time_t stay;
char realname[FB_NAMELEN];
char address[FB_STRLEN];
char email[FB_STRLEN-12];
unsigned int nummails;
time_t lastjustify;
char gender;
unsigned char birthyear;
unsigned char birthmonth;
unsigned char birthday;
int signature;
unsigned int userdefine;
time_t notedate;
int noteline;
};
//copied from FB2000
int record_user_name(char *username)
{
FILE *fp;
fp = fopen(_TEMP_FILE,"a");
if(!fp) return 0;
fprintf(fp,"%s\n",username);
fclose(fp);
return 1;
}
int is_user_exist(char *username)
{
FILE *fp;
char buf[100];
fp = fopen(_TEMP_FILE,"r");
if(!fp) return 0;
while(fgets(buf,100,fp) >0){
buf[strlen(buf)-1] = 0;
if(!strcmp(buf,username)){
fclose(fp);
printf("warning:user %s already exist.\n",username);
return 1;
}
}
fclose(fp);
return 0;
}
void
upgradepasswd(char *fb2000_file,char *ytht_file)
{
FILE *fr, *fw;
struct FB2000userec fb2000;
struct old_userec oldrec;
struct userec rec;
struct userdata data;
struct in_addr in;
int num = 0;
char buf[20];
memset(&oldrec,0,sizeof(struct userec));
fr = fopen(fb2000_file, "r");
if (NULL == fr) {
printf("Can't open passwd file for read!\n");
exit(1);
}
fw = fopen(ytht_file, "w");
if (NULL == fw) {
printf("Can't open passwd file for write!\n");
fclose(fr);
exit(2);
}
oldrec.dietime = 0;
oldrec.notemode_nouse = 0;
bzero(oldrec.ip, 16);
bzero(oldrec.unuse, 32);
while (fread(&fb2000, sizeof (fb2000), 1, fr) == 1) {
if (!fb2000.userid[0])
continue;
if(is_user_exist(fb2000.userid)) continue;
record_user_name(fb2000.userid);
num++;
//先转换为老的ytht数据结构
snprintf(oldrec.userid, IDLEN + 2, "%s", fb2000.userid);
oldrec.firstlogin = fb2000.firstlogin;
snprintf(oldrec.lasthost, 16, "%s", fb2000.lasthost);
oldrec.numlogins = fb2000.numlogins;
oldrec.numposts = fb2000.numposts;
memcpy(oldrec.flags, fb2000.flags, 2);
memcpy(oldrec.passwd, fb2000.passwd, 16);
memcpy(oldrec.username, fb2000.username, NAMELEN);
oldrec.lastlogout = fb2000.lastlogout;
oldrec.lastlogin = fb2000.lastlogin;
oldrec.stay = fb2000.stay;
memcpy(oldrec.realname, fb2000.realname, NAMELEN);
oldrec.userlevel = fb2000.userlevel;
memcpy(oldrec.address, fb2000.address, STRLEN);
memcpy(oldrec.email, fb2000.email, STRLEN - 12);
oldrec.signature = fb2000.signature;
oldrec.userdefine = fb2000.userdefine;
oldrec.userlevel = fb2000.userlevel;
oldrec.notedate_nouse = fb2000.notedate;
oldrec.noteline_nouse = fb2000.noteline;
memcpy(oldrec.realmail, fb2000.reginfo, STRLEN - 16);
//再转换为新ytht数据结构
bzero(&rec, sizeof(rec));
bzero(&data, sizeof(data));
strcpy(rec.userid, oldrec.userid);
memcpy(rec.flags, oldrec.flags, 2);
rec.firstlogin = oldrec.firstlogin;
rec.lastlogin = oldrec.lastlogin;
rec.lastlogout = oldrec.lastlogout;
if (oldrec.dietime) {
rec.dieday = 1;
} else {
rec.dieday = 0;
}
if (oldrec.signature) {
sprintf(buf, "%d", oldrec.signature);
saveuservalue(oldrec.userid, "signature", buf);
}
if (inet_aton(oldrec.lasthost, &in))
rec.lasthost = in.s_addr;
strcpy(rec.username, oldrec.username);
rec.numdays = oldrec.numdays;
rec.numlogins = oldrec.numlogins;
rec.numposts = oldrec.numposts;
rec.stay = oldrec.stay;
rec.userlevel = oldrec.userlevel;
if (inet_aton(oldrec.ip, &in))
rec.ip = in.s_addr;
rec.userdefine = oldrec.userdefine;
memcpy(rec.passwd, oldrec.passwd, OLDPASSLEN);
strncpy(data.realmail, oldrec.realmail, 60);
data.realmail[59] = 0;
strncpy(data.email, oldrec.email, 60);
data.email[59] = 0;
strncpy(data.realname, oldrec.realname, 40);
data.realname[39] = 0;
strncpy(data.address, oldrec.address, 40);
data.address[39] = 0;
fwrite(&rec, sizeof (rec), 1, fw);
saveuserdata(rec.userid, &data);
}
fclose(fr);
fclose(fw);
if (truncate(ytht_file, MAXUSERS * sizeof (struct userec)) == -1) {
printf("truncate .PASSWDS error.\n");
return;
}
unlink(_TEMP_FILE);
printf("user num: %d\n",num);
printf("MAXUSERS: %d\n",MAXUSERS);
printf("struct userec size: %d\n",sizeof(struct userec));
printf("PASSWD file size: %d\n",MAXUSERS * sizeof (struct userec));
}
int
main(int argc, char *argv[])
{
if(argc <3){
printf("Usage:%s fb2000_PASSWD ytht_PASSWD\n",argv[0]);
exit(1);
}
upgradepasswd(argv[1],argv[2]);
return 1;
}
--
FROM 202.194.15.*