#include "bbs.h"
// warning: if you changed userec_t, you must use the old version.
typedef struct {
unsigned int version; /* version number of this sturcture, we
* use revision number of project to denote.*/
char userid[IDLEN + 1]; /* ID */
char realname[20]; /* 真實姓名 */
char nickname[24]; /* 暱稱 */
char passwd[PASSLEN]; /* 密碼 */
char padx;
unsigned int uflag; /* 習慣1 , see uflags.h */
unsigned int uflag2; /* 習慣2 , see uflags.h */
unsigned int userlevel; /* 權限 */
unsigned int numlogins; /* 上站次數 */
unsigned int numposts; /* 文章篇數 */
time4_t firstlogin; /* 註冊時間 */
time4_t lastlogin; /* 最近上站時間 */
char lasthost[16]; /* 上次上站來源 */
int money; /* Ptt幣 */
char remoteuser[3]; /* 保留 目前沒用到的 */
char proverb; /* 座右銘 (unused) */
char email[50]; /* Email */
char address[50]; /* 住址 */
char justify[REGLEN + 1]; /* 審核資料 */
unsigned char month; /* 生日 月 */
unsigned char day; /* 生日 日 */
unsigned char year; /* 生日 年 */
unsigned char sex; /* 性別 */
unsigned char state; /* TODO unknown (unused ?) */
unsigned char pager; /* 呼叫器狀態 */
unsigned char invisible; /* 隱形狀態 */
char padxx[2];
unsigned int exmailbox; /* 購買信箱數 TODO short 就夠了 */
chicken_t mychicken; /* 寵物 */
time4_t lastsong; /* 上次點歌時間 */
unsigned int loginview; /* 進站畫面 */
unsigned char channel; /* TODO unused */
char padxxx;
unsigned short vl_count; /* 違法記錄 ViolateLaw counter */
unsigned short five_win; /* 五子棋戰績 勝 */
unsigned short five_lose; /* 五子棋戰績 敗 */
unsigned short five_tie; /* 五子棋戰績 和 */
unsigned short chc_win; /* 象棋戰績 勝 */
unsigned short chc_lose; /* 象棋戰績 敗 */
unsigned short chc_tie; /* 象棋戰績 和 */
int mobile; /* 手機號碼 */
char mind[4]; /* 心情 not a null-terminate string */
unsigned short go_win; /* 圍棋戰績 勝 */
unsigned short go_lose; /* 圍棋戰績 敗 */
unsigned short go_tie; /* 圍棋戰績 和 */
char pad0[5]; /* 從前放 ident 身份證字號,現在可以拿來做別的事了,
不過最好記得要先清成 0 */
unsigned char signature; /* 慣用簽名檔 */
unsigned char goodpost; /* 評價為好文章數 */
unsigned char badpost; /* 評價為壞文章數 */
unsigned char goodsale; /* 競標 好的評價 */
unsigned char badsale; /* 競標 壞的評價 */
char myangel[IDLEN+1]; /* 我的小天使 */
char pad2;
unsigned short chess_elo_rating; /* 象棋等級分 */
unsigned int withme; /* 我想找人下棋,聊天.... */
time4_t timeremovebadpost; /* 上次刪除劣文時間 */
time4_t timeviolatelaw; /* 被開罰單時間 */
char pad[28];
} old_userec_t;
int main()
{
FILE *fp = fopen(FN_PASSWD, "rb"), *fp2 = NULL;
char fn[PATHLEN];
old_userec_t u;
time4_t now=0;
int i, cusr;
if (!fp) {
printf("cannot load password file. abort.\n");
return -1;
}
now = time(NULL);
i = 0; cusr = 0;
while (fread(&u, sizeof(u), 1, fp) > 0)
{
/*
cusr ++;
if (cusr % (MAX_USERS / 100) == 0)
{
fprintf(stderr, "%3d%%\r", cusr/(MAX_USERS/100));
}
*/
if (!u.userid[0])
continue;
// if dead and no records, // not possible to revive,
// then abort.
if (!u.mychicken.name[0] &&
u.mychicken.cbirth == 0)
// u.lastvisit + 86400*7 < now
continue;
// now, write this data to user home.
// sethomefile(fn, u.userid, FN_CHICKEN);
sprintf(fn, BBSHOME "/home/%c/%s/" FN_CHICKEN,
u.userid[0], u.userid);
// ignore created entries (if you are running live upgrade)
if (access(fn, R_OK) == 0)//dashf(fn))
{
// printf("\nfound created entry, ignore: %s\n", u.userid);
continue;
}
/*
i++;
continue;
*/
fp2 = fopen(fn, "wb");
if (!fp2)
{
printf("ERROR: cannot create chicken data: %s.\n", u.userid);
continue;
}
if (fwrite(&u.mychicken, sizeof(u.mychicken), 1, fp2) < 1)
{
printf("ERROR: cannot write chicken data: %s.\n", u.userid);
unlink(fn);
}
else
{
// printf("Transferred chicken data OK: %s.\n", u.userid);
i++;
}
fclose(fp2); fp2 = NULL;
}
fclose(fp);
printf("\ntotal %d users updated.\n", i);
return 0;
}