为什么转换后的.PASSWDS小了很多?而且除了guest好像其他账号不能登陆了。:(
那位老大再帮忙看看啊。多谢了!
convpasswd.c
-----------------------------------------
/*
* This program converts .PASSWD from Firebird 2000 to smth_bbs
*/
#include "bbs.h"
#define OLD_PASSWDS_FILE ".PASSWDS.OLD"
#define NEW_PASSWDS_FILE ".PASSWDS.NEW"
#undef printf
#undef perror
#define HAVE_BIRTHDAY 1
#define CONV_PASS 1
typedef struct olduserec { /* Structure used to hold information in */
char userid[IDLEN + 2]; /* PASSFILE */
char flags; /*一些标志,戒网,版面排序之类的*/
unsigned char title; /*用户级别*/
time_t firstlogin;
char lasthost[16];
unsigned int numlogins;
unsigned int numposts;
#ifdef CONV_PASS
char passwd[OLDPASSLEN];
char unused_padding[2];
#endif
char username[NAMELEN];
unsigned int club_read_rights[MAXCLUB>>5];
unsigned int club_write_rights[MAXCLUB>>5];
unsigned char md5passwd[MD5PASSLEN];
unsigned userlevel;
time_t lastlogin;
time_t stay;
int signature;
unsigned int userdefine[2];
time_t notedate;
int noteline;
int notemode;
time_t exittime;
/* 生日数据转移到 userdata 结构中 */
unsigned int usedspace; /* used space of user's mailbox, in bytes */
#ifdef HAVE_USERMONEY
int money;
int score;
char unused[20];
#endif
} olduserec;
static void convert_userec(struct olduserec *olduser, struct userec *user)
{
char useridtmp[IDLEN+2] = "newidname";
memcpy(user->userid, olduser->userid, IDLEN + 2);
if (strcmp(user->userid, "bad_idname") == 0) {
strcpy(user->userid, useridtmp);
printf("Found bad_idname, changed to violetntulip\n");
}
printf("Tranfering %s ....\n", user->userid);
user->flags = olduser->flags;
if (user->userlevel & 0x0400000000)
user->flags |= PCORP_FLAG;
user->flags |= CURSOR_FLAG;
user->flags &= ~CLOAK_FLAG;
user->flags &= ~GIVEUP_FLAG;
user->title = 0;
user->firstlogin = olduser->firstlogin;
memcpy(user->lasthost, olduser->lasthost, 16);
user->numlogins = olduser->numlogins;
user->numposts = olduser->numposts;
#ifdef CONV_PASS
memcpy(user->passwd, olduser->passwd, OLDPASSLEN);
bzero(user->unused_padding, 2);
#endif
memcpy(user->username, olduser->username, NAMELEN);
bzero(user->club_read_rights, sizeof(user->club_read_rights));
bzero(user->club_write_rights, sizeof(user->club_write_rights));
bzero(user->md5passwd, sizeof(user->md5passwd));
user->userlevel = olduser->userlevel;
user->userlevel &= ~PERM_ADMIN;
user->userlevel &= ~PERM_HORNOR;
user->userlevel &= ~PERM_JURY;
user->userlevel &= ~PERM_CHECKCD;
user->userlevel &= ~PERM_SUICIDE;
user->userlevel &= ~PERM_COLLECTIVE;
user->userlevel &= ~PERM_DISS;
user->userlevel &= ~PERM_DENYMAIL;
user->lastlogin = olduser->lastlogin;
user->stay = olduser->stay;
user->signature = olduser->signature;
user->userdefine[0] = olduser->userdefine;
user->userdefine[0] |= DEF_LOGININFORM;
user->userdefine[0] |= DEF_SHOWSCREEN;
user->userdefine[0] |= DEF_TITLECOLOR;
user->userdefine[0] |= DEF_UNREADMARK;
user->userdefine[0] &= ~DEF_NOTMSGFRIEND;
user->userdefine[0] |= DEF_USEGB;
user->userdefine[0] |= DEF_CHCHAR;
user->userdefine[0] |= DEF_IGNOREMSG;
user->userdefine[0] &= ~DEF_SHOWDETAILUSERDATA;
user->userdefine[0] &= ~DEF_SHOWREALUSERDATA;
user->notedate = olduser->notedate;
user->noteline = olduser->noteline;
user->notemode = -1;
user->exittime = olduser->exittime;
user->usedspace = 0;
#ifdef HAVE_USERMONEY
user->money = olduser->money;
#endif
if (strcasecmp(user->userid, "new") == 0)
return;
}
int main()
{
struct olduserec *olduser = NULL;
struct olduserec *ptr = NULL;
struct userec user;
int fd, fd2;
struct stat fs;
int records;
int i;
int allocid;
chdir(BBSHOME);
if ((fd = open(OLD_PASSWDS_FILE, O_RDONLY, 0644)) < 0) {
perror("open");
return -1;
}
if ((fd2 = open(NEW_PASSWDS_FILE, O_WRONLY | O_CREAT, 0644)) < 0) {
perror("open");
return -1;
}
fstat(fd, &fs);
olduser = mmap(NULL, fs.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd);
if (olduser == MAP_FAILED) {
perror("mmap");
return -1;
}
records = fs.st_size / sizeof(struct olduserec);
for (i = 0; i < records; i++) {
ptr = olduser + i;
if (ptr->userid[0] == '\0')
continue;
bzero(&user, sizeof(user));
convert_userec(ptr, &user);
write(fd2, &user, sizeof(user));
}
close(fd2);
munmap(olduser, fs.st_size);
return 0;
}
【 在 shutiao (nirvana) 的大作中提到: 】
: 是kbs吧?有没有程序,借我看看吧。 //bow
--
FROM 68.43.124.*
附件(4.5KB) convpasswd.c