[Ptt Update] 2015/02/24 水桶日期计算变更

楼主: HWBA (╭☆微风★╯)   2015-03-12 23:14:01
作者: HWBA.bbs@ptt2.cc (╭☆微风★╯) 看板: weifeng
标题: [Ptt Update] 2015/02/24 水桶日期计算变更
时间: Tue Feb 24 23:22:21 2015
[修正内容]
  更新水桶日期过多,导致溢位,造成水桶失效或错乱的问题。
  ❶ 原先为 uint32_t 储存字段,
    更新之后变为 uint64_t 储存字段。
  ❷ 小知识 by HWBA (2015.02.24)
    uint8_t 为 0~2^8-1 (0x00~0xFF)
    uint16_t 为 0~2^16-1 (0x0000~0xFFFF)
    uint32_t 为 0~2^32-1 (0x00000000~0xFFFFFFFF)
    uint64_t 为 0~2^64-1 (0x0000000000000000~0xFFFFFFFFFFFFFFFF)
    2^8=256=0x00
    2^16=(2^8)^2=65536
    2^32=(2^16)^2=4294967296
    2^64=(2^32)^2=18446744073709551616
[修正代码]
static int
ui_ban_user_for_board(const char *uid, const char *board) {
time4_t expire = now;
int y, x;
int result;
char ans[3];
char history_log[PATHLEN];
char reason[STRLEN];
char datebuf[STRLEN];
setbfile(history_log, board, FN_BANNED_HISTORY);
getyx(&y, &x);
if ((expire = is_user_banned_by_board(uid, board))) {
vmsgf("使用者之前已被禁言,尚有 %d 天;详情可用(S)或(L)查看",
(expire - now) / DAY_SECONDS+1);
return -1;
}
prints("将使用者 %s 加入看板 %s 的禁言名单。", uid, board);
move(y+3, 0);
syncnow();
outs("目前接受的格式是 [数字][单位]。 "
"单位有: 年(y), 月(m), 天(d)\n"
"范例: 3m (三个月), 120d (120天), 10y (10年)\n"
"注意不可混合输入(例:没有三个半月这种东西,请换算成天数)\n"
);
getdata(y+1, 0, "请以数字跟单位(默认为天)输入期限: ",
datebuf, 8, DOECHO);
trim(datebuf);
if (!*datebuf) {
vmsg("未输入期限,放弃。");
return -1;
} else {
int val = atoi(datebuf);
uint64_t long_now;
switch(tolower(datebuf[strlen(datebuf)-1])) {
case 'y':
val *= 365;
break;
case 'm':
val *= 30;
break;
case 'd':
default:
break;
}
if (val < 1) {
vmsg("日期格式输入错误或是小于一天无法处理。");
return -1;
}
long_now = (uint64_t)now + val * (uint64_t)DAY_SECONDS;
expire = long_now;
if ((uint64_t)expire != long_now) {
vmsg("日期过大或无法处理,请重新输入。");
return -1;
}
move(y+3, 0); clrtobot();
// sprintf(datebuf, "%s", Cdatelite(&expire));
sprintf(datebuf, "%d 天", val);
prints("期限将设定为 %s之后: %s\n",
datebuf, Cdatelite(&expire));
if (val > KEEP_DAYS_REGGED) {
mvprints(y+6, 0, ANSI_COLOR(1;31)
"注意: 超过 %d 天的设定有可能因为对方一直"
"未上站而导致帐号过期被重新注册,\n"
" 此时同名的新帐号由于不一定是同一人所以"
"不会被禁言。\n" ANSI_RESET,
KEEP_DAYS_REGGED);
}
}

Links booklink

Contact Us: admin [ a t ] ucptt.com