summaryrefslogtreecommitdiffstats
path: root/upgrade/r3968_chicken.c
blob: 137629e44f09a06a12aa9b401d8e49d7933c6d39 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#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;
}