int TagPruner(int bid) { boardheader_t *bp=NULL; char direct[PATHLEN]; assert(bid >= 0); /* bid == 0 means in mailbox */ if (bid && currstat != RMAIL) { bp = getbcache(bid); if (is_readonly_board(bp->brdname)) return DONOTHING; setbdir(direct, bp->brdname); } else if(currstat == RMAIL) { sethomedir(direct, cuser.userid); } else { vmsg("抱歉,程式異常 - 請至 " BN_BUGREPORT " 報告您剛的詳細步驟。"); return FULLUPDATE; } if (IsEmptyTagList() || (currstat == READING && !(currmode & MODE_BOARD))) return DONOTHING; if (vans("刪除所有標記[N]?") != 'y') return READ_REDRAW; // ready to start. outmsg("處理中,請稍後..."); refresh(); // first, delete and backup all files apply_record(direct, _iter_delete_tagged, sizeof(fileheader_t), direct); // now, delete the header #ifdef SAFE_ARTICLE_DELETE if(bp && !(currmode & MODE_DIGEST) && bp->nuser >= SAFE_ARTICLE_DELETE_NUSER) safe_delete_range(currdirect, 0, 0); else #endif delete_range(currdirect, 0, 0); TagNum = 0; if (bid) setbtotal(bid); else if(currstat == RMAIL) setupmailusage(); return NEWDIRECT; }
static int a_pastetagpost(menu_t * pm, int mode) { boardheader_t *bh = NULL; char dirname[PATHLEN]; _iter_paste_tag_param param = {0}; param.pm = pm; param.mode = mode; if (TagBoard == 0){ sethomedir(dirname, cuser.userid); } else{ bh = getbcache(TagBoard); setbdir(dirname, bh->brdname); param.bh = bh; } // prevent if anything wrong if (TagNum > MAXTAGS || TagNum < 0) { vmsg("內部錯誤。請把你剛剛進行的完整步驟貼到 " BN_BUGREPORT " 板。"); return 0; } if (IsEmptyTagList()) return 0; /* since we use different tag features, * copyqueue is not required/used. */ copyqueue_reset(); apply_record(dirname, _iter_paste_tag, sizeof(fileheader_t), ¶m); TagNum = 0; return param.copied; }
int Goodbye() { extern void movie(); char genbuf[200]; /* woju */ char ans[4]; setuserfile(genbuf, fn_writelog); if (more(genbuf, NA) != -1) { /* MH */ /* Àˬd¤ô²y°O¿ý®e¶q, ÁקK¦³¤H¡u¤Ù¿n¡v¤j¶q¤ô²y */ struct stat st; int writelog_limit; if (HAS_PERM(PERM_BM)) writelog_limit = MH_WRITELOGLIMIT_BM; else if (HAS_PERM(PERM_LOGINOK)) writelog_limit = MH_WRITELOGLIMIT_LOGINOK; else writelog_limit = MH_WRITELOGLIMIT_BASIC; do { char buf[80]; setuserfile(buf, fn_writelog); stat(buf, &st); if(!HAVE_PERM(PERM_SYSOP) && !HAVE_PERM(PERM_MAILLIMIT) && st.st_size / 1024 > writelog_limit) { my_outmsg_row("[1;41;37m±zªº¤ô²y°O¿ý¤w¶W¹L©w®e¶q¡AµLªk¿ï¾Ü¡u«O¯d¡v[0m", b_lines - 2); getdata(b_lines - 1, 0, "²M°£(C) ²¾¦Ü³Æ§Ñ¿ý(M) (C/M)?[M]", ans, 3, LCECHO, 0); } else { getdata(b_lines - 1, 0, "²M°£(C) ²¾¦Ü³Æ§Ñ¿ý(M) «O¯d(R) (C/M/R)?[R]", ans, 3, LCECHO, 0); } if (*ans == 'm') { fileheader mymail; char title[128], buf[80]; sethomepath(buf, cuser.userid); stampfile(buf, &mymail); mymail.savemode = 'H'; /* hold-mail flag */ mymail.filemode = FILE_READ; strcpy(mymail.owner, "[³Æ.§Ñ.¿ý]"); strcpy(mymail.title, "¼ö½u[37;41m°O¿ý[m"); if(mh_memoforward(cuser.userid, genbuf, &mymail, sizeof(mymail))) { sethomedir(title, cuser.userid); append_record(title, &mymail, sizeof(mymail)); /* MH: ³Æ§Ñ¿ý¥[¤W§@ªÌ¼ÐÃDµ¥¸ê°T...¤£µM¦b'x'Âà±H©Î¬Obuildirªº®ÉÔ ·|Äê±¼ */ #if 1 { FILE *src, *dst; char buf2[200]; time_t now; if((src = fopen(genbuf, "r")) == NULL) { sprintf(buf2, "errno: %d, genbuf:%s", errno, genbuf); log_usies("MH ", buf2); } if((dst = fopen(buf, "w")) == NULL) { sprintf(buf2, "errno: %d, buf:%s", errno, buf); log_usies("MH ", buf2); fclose(src); } now = time(NULL); sprintf(buf2, "§@ªÌ: %s\n¼ÐÃD: %s\n®É¶¡: %s\n", mymail.owner, mymail.title, ctime(&now)); fputs(buf2, dst); while(fgets(buf2, 199, src) != NULL) fputs(buf2, dst); fclose(src); fclose(dst); unlink(genbuf); } #else Rename(genbuf, buf); #endif } } else if (*ans == 'c') { char buf[80]; setuserfile(buf, fn_writelog); unlink(buf); } } while(!HAVE_PERM(PERM_SYSOP) && !HAVE_PERM(PERM_MAILLIMIT) && st.st_size / 1024 > writelog_limit && *ans != 'm' && *ans != 'c'); clear(); move(0, 0); prints("[1;44;33m °ª¶¯¤¤¾Ç-¬õ¼Ó¿v¹Ú [m"); movie(0); } /* */ getdata(b_lines - 1, 0, "±z½T©wnÂ÷¶}¡i " BOARDNAME " ¡j¶Ü(Y/N)¡H[N] ", genbuf, 3, LCECHO, 0); if (*genbuf != 'y') return 0; movie(999); if (cuser.userlevel) { getdata(b_lines - 1, 0, "(G)ÀH·¦Ó³u (M)¦«¹Ú¯¸ªø (N)¦X§@ªÀªº¨¥½×¼s³õ¡H[G] ", genbuf, 3, LCECHO, 0); if (genbuf[0] == 'm') mail_sysop(); else if (genbuf[0] == 'n') note(); } save_userrc(); #if 0 save_mailmsg(); #endif clear(); prints("[1;36m¿Ë·Rªº [33m%s(%s)[36m¡A§O§Ñ¤F¦A«×¥úÁ{[45;33m" " %s [40;36m¡I\n¥H¤U¬O±z¦b¯¸¤ºªºµù¥U¸ê®Æ:[0m\n", cuser.userid, cuser.username, BoardName); user_display(&cuser, 0); if (currmode) u_exit("EXIT "); pressanykey(); sleep(1); reset_tty(); exit(0); }
int x_love() { char buf1[200], save_title[TTLEN + 1]; char receiver[61], path[STRLEN] = "home/"; int x, y = 0, tline = 0, poem = 0; FILE *fp, *fpo; time_t timenow; struct tm *gtime; fileheader_t mhdr; setutmpmode(LOVE); time(&timenow); gtime = localtime(&timenow); sprintf(buf1,"%c/%s/love%d%d", cuser.userid[0], cuser.userid,gtime->tm_sec,gtime->tm_min); strcat(path,buf1); move(1,0); clrtobot(); outs("\n歡迎使用情書產生器 v0.00 版 \n"); outs("有何難以啟齒的話,交由系統幫你說吧.\n爸爸說 : 濫情不犯法.\n"); if(!getdata(7, 0, "收信人:", receiver, 60, DOECHO)) return 0; if(receiver[0] && !(searchuser(receiver) && getdata(8, 0, "主 題:", save_title, TTLEN, DOECHO))) { move(10, 0); outs("收信人或主題不正確, 情書無法傳遞. "); pressanykey(); return 0; } fpo = fopen(path, "w"); fprintf(fpo, "\n"); if((fp = fopen(DATA, "r"))) { while(fgets(buf1,100, fp)) { switch(buf1[0]) { case '#': break; case '@': if(!strncmp(buf1, "@begin", 6) || !strncmp(buf1, "@end", 4)) tline=3; else if(!strncmp(buf1,"@poem",5)) { poem = 1; tline = 1; fprintf(fpo, "\n\n"); } else tline=2; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': sscanf(buf1,"%d",&x); y = (rand() % (x - 1)) * tline; break; default: if(!poem) { if(y > 0) y = y - 1; else { if(tline > 0) { fprintf(fpo, "%s", buf1); tline--; } } } else { if(buf1[0] == '$') y--; else if(y == 0) fprintf(fpo,"%s",buf1); } } } fclose(fp); fclose(fpo); if(vedit(path, YEA, NULL) == -1) { unlink(path); clear(); outs("\n\n 放棄寄情書\n"); pressanykey(); return -2; } sethomepath(buf1, receiver); stampfile(buf1, &mhdr); Rename(path, buf1); strncpy(mhdr.title, save_title, TTLEN); strcpy(mhdr.owner, cuser.userid); mhdr.savemode = '\0'; sethomedir(path, receiver ); if(append_record(path, &mhdr, sizeof(mhdr)) == -1) return -1; hold_mail(buf1, receiver); return 1; } return 0; }
int m_sob(void) { char genbuf[256], buf[256], userid[25], passbuf[24], msg[2048]=""; int count=0, i, isimported=0, corrected; FILE *fp; sobuserec man; time4_t d; clear(); move(1,0); outs( " 請注意 這是只給陽光沙灘使用者!\n" " 讓沙灘的使用者轉移個人資產以及重要信用資料, 享有平等安全的環境.\n" " 如果您不需要, 請直離開.\n" " -----------------------------------------------------------------\n" " 特別叮嚀:\n" " 為了帳號安全,您只有連續十次密碼錯誤的機會,請小心輸入.\n" " 連續次錯誤您的變身功\能就會被開罰單並直接通知站長.\n" " 請不要在變身過程中不正常斷線, 刻意斷線變半獸人站長不救唷.\n" ); if(getkey("是否要繼續?(y/N)")!='y') return 0; if(search_ulistn(usernum,2)) {vmsg("請登出其他視窗, 以免變身失敗"); return 0;} do { if(!getdata(10,0, " 沙灘的ID [大小寫要完全正確]:", userid, 20, DOECHO)) return 0; if(bad_user_id(userid)) continue; sprintf(genbuf, "sob/passwd/%c/%s.inf",userid[0], userid); if(!(fp=fopen(genbuf, "r"))) { isimported = 1; strcat(genbuf, ".done"); if(!(fp=fopen(genbuf, "r"))) { vmsg("查無此人或已經匯入過..請注意大小寫 "); isimported = 0; continue; } } count = fread(&man, sizeof(man), 1, fp); fclose(fp); }while(!count); count = 0; do{ if(!getdata(11,0, " 沙灘的密碼:", passbuf, sizeof(passbuf), NOECHO)) return 0; if(++count>=10) { cuser.userlevel |= PERM_VIOLATELAW; cuser.vl_count++; passwd_update(usernum, &cuser); post_violatelaw(cuser.userid, "[PTT警察]", "測試帳號錯誤十次", "違法觀察"); mail_violatelaw(cuser.userid, "[PTT警察]", "測試帳號錯誤十次", "違法觀察"); return 0; } if(!(corrected = checkpasswd(man.passwd, passbuf))) vmsg("密碼錯誤"); } while(!corrected); move(12,0); clrtobot(); if(!isimported) { if(!dashf(genbuf)) // avoid multi-login { vmsg("請不要嘗試多重id踹匯入"); return 0; } sprintf(buf,"%s.done",genbuf); rename(genbuf,buf); #ifdef MERGEMONEY reload_money(); sprintf(buf, "您的沙灘鸚鵡螺 %10d 換算成 " MONEYNAME " 幣為 %9d (匯率 22:1), \n" " 沙灘貝殼有 %10d 換算為 " MONEYNAME " 幣為 %9d (匯率 222105:1), \n" " 原有 %10d 匯入後共有 %d\n", (int)man.goldmoney, (int)man.goldmoney/22, (int)man.silvermoney, (int)man.silvermoney/222105, cuser.money, (int)(cuser.money + man.goldmoney/22 + man.silvermoney/222105)); demoney(man.goldmoney/22 + man.silvermoney/222105 ); strcat(msg, buf); #endif i = cuser.exmailbox + man.exmailbox + man.exmailboxk/2000; if (i > MAX_EXKEEPMAIL) i = MAX_EXKEEPMAIL; sprintf(buf, "您的沙灘信箱有 %d (%dk), 原有 %d 匯入後共有 %d\n", man.exmailbox, man.exmailboxk, cuser.exmailbox, i); strcat(msg, buf); cuser.exmailbox = i; if(man.userlevel & PERM_MAILLIMIT) { sprintf(buf, "開啟信箱無上限\n"); strcat(msg, buf); cuser.userlevel |= PERM_MAILLIMIT; } if (cuser.firstlogin > man.firstlogin) d = man.firstlogin; else d = cuser.firstlogin; cuser.firstlogin = d; if (cuser.numlogins < man.numlogins) i = man.numlogins; else i = cuser.numlogins; sprintf(buf, "沙灘進站次數 %d 此帳號 %d 將取 %d \n", man.numlogins, cuser.numlogins, i); strcat(msg,buf); cuser.numlogins = i; if (cuser.numposts < man.numposts ) i = man.numposts; else i = cuser.numposts; sprintf(buf, "沙灘文章次數 %d 此帳號 %d 將取 %d\n", man.numposts,cuser.numposts,i); strcat(msg,buf); cuser.numposts = i; outs(msg); while (search_ulistn(usernum,2)) {vmsg("請將重覆上站其他線關閉! 再繼續");} passwd_update(usernum, &cuser); } sethomeman(genbuf, cuser.userid); mkdir(genbuf, 0755); sprintf(buf, "tar zxvf %c/%s.tar.gz>/dev/null", userid[0], userid); chdir("sob/home"); system(buf); chdir(BBSHOME); if (getans("是否匯入個人信箱? (Y/n)")!='n') { sethomedir(buf, cuser.userid); sprintf(genbuf, "sob/home/%c/%s/.DIR", userid[0], userid); merge_dir(buf, genbuf, 1); strcat(msg, "匯入個人信箱\n"); } if(getans("是否匯入個人信箱精華區(個人作品集)? (會覆蓋\現有設定) (y/N)")=='y') { fileheader_t fh; sprintf(buf, "rm -rd home/%c/%s/man>/dev/null ; " "mv sob/home/%c/%s/man home/%c/%s>/dev/null;" "mv sob/home/%c/%s/gem home/%c/%s/man>/dev/null", cuser.userid[0], cuser.userid, userid[0], userid, cuser.userid[0], cuser.userid, userid[0], userid, cuser.userid[0], cuser.userid); system(buf); strcat(msg, "匯入個人信箱精華區(個人作品集)\n"); sprintf(buf,"home/%c/%s/man/gem", cuser.userid[0], cuser.userid); if(dashd(buf)) { strcat(fh.title, "◆ 個人作品集"); strcat(fh.filename, "gem"); sprintf(fh.owner, cuser.userid); sprintf(buf, "home/%c/%s/man/.DIR", cuser.userid[0], cuser.userid); append_record(buf, &fh, sizeof(fh)); } }