diff options
author | scw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-05-16 19:30:16 +0800 |
---|---|---|
committer | scw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-05-16 19:30:16 +0800 |
commit | 280c2707ef087a032cd9a846f3fd9549e194fa19 (patch) | |
tree | d307be9b02e36ba3c132cdc73c33d04fb8eddf45 | |
parent | 3d0fa7c79b4d5d08868f32f44052392d03638074 (diff) | |
download | pttbbs-280c2707ef087a032cd9a846f3fd9549e194fa19.tar pttbbs-280c2707ef087a032cd9a846f3fd9549e194fa19.tar.gz pttbbs-280c2707ef087a032cd9a846f3fd9549e194fa19.tar.bz2 pttbbs-280c2707ef087a032cd9a846f3fd9549e194fa19.tar.lz pttbbs-280c2707ef087a032cd9a846f3fd9549e194fa19.tar.xz pttbbs-280c2707ef087a032cd9a846f3fd9549e194fa19.tar.zst pttbbs-280c2707ef087a032cd9a846f3fd9549e194fa19.zip |
merge from trunk.
git-svn-id: http://opensvn.csie.org/pttbbs/branches/scw.angel@1995 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
55 files changed, 1192 insertions, 1886 deletions
diff --git a/include/common.h b/include/common.h index 1b6826a7..1532131a 100644 --- a/include/common.h +++ b/include/common.h @@ -189,4 +189,17 @@ #define NOTREPLYING -1 #define REPLYING 0 #define RECVINREPLYING 1 + +#define LOG_CREAT 1 +#define LOG_VF 2 + + +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) + #define __builtin_expect(exp,c) (exp) + +#endif + +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + #endif diff --git a/include/config.h b/include/config.h index d44ce8a0..c1ec976c 100644 --- a/include/config.h +++ b/include/config.h @@ -25,6 +25,14 @@ #define MAX_CPULOAD (70) /* CPU ³Ì°ªload */ #endif +#ifndef MAX_LANG +#define MAX_LANG (1) /* ³Ì¦h¨Ï¥Î»y¨¥ */ +#endif + +#ifndef MAX_STRING +#define MAX_STRING (8000) /* ¨t²Î³Ì¦h¨Ï¥Î¦r¦ê */ +#endif + #ifndef MAX_POST_MONEY /* µoªí¤å³¹½Z¶Oªº¤W */ #define MAX_POST_MONEY 100 #endif @@ -101,6 +109,10 @@ #define HOTBOARDCACHE (0) /* ¼öªù¬ÝªO§Ö¨ú */ #endif +#ifndef INNTIMEZONE +#define INNTIMEZONE "+0800 (CST)" +#endif + /* ¥H¤UÁÙ¥¼¾ã²z */ #define MAX_FRIEND (256) /* ¸ü¤J cache ¤§³Ì¦hªB¤Í¼Æ¥Ø */ #define MAX_REJECT (32) /* ¸ü¤J cache ¤§³Ì¦hÃa¤H¼Æ¥Ø */ diff --git a/include/modes.h b/include/modes.h index 42c81d66..5fad422a 100644 --- a/include/modes.h +++ b/include/modes.h @@ -13,7 +13,8 @@ #define READ_REDRAW 9 #define PART_REDRAW 10 #define TITLE_REDRAW 11 -#define POS_NEXT 101 /* cursor_pos(locmem, locmem->crs_ln + 1, 1);*/ +#define READ_SKIP 12 +#define HEADERS_RELOAD 13 /* user ¾Þ§@ª¬ºA»P¼Ò¦¡ */ #define IDLE 0 @@ -110,7 +111,6 @@ #define MODE_BOARD 0x0008 /* ¬O§_¥i¥H¦b currboard §R°£¡Bmark¤å³¹ */ #define MODE_GROUPOP 0x0010 /* ¬O§_¬°¤p²Õªø (¥i¥H¦b MENU ¶}ªO) */ #define MODE_DIGEST 0x0020 /* ¬O§_¬° digest mode */ -#define MODE_ETC 0x0040 /* ¬O§_¬° etc mode */ #define MODE_SELECT 0x0080 /* ·j´M¨Ï¥ÎªÌ¼ÐÃD */ #define MODE_DIRTY 0x0100 /* ¬O§_§ó°Ê¹L userflag */ @@ -128,21 +128,24 @@ #define RS_FORWARD 0x01 /* backward */ #define RS_TITLE 0x02 /* author/title */ -#define RS_RELATED 0x04 +#define RS_KEYWORD 0x04 #define RS_FIRST 0x08 /* find first article */ #define RS_CURRENT 0x10 /* match current read article */ -#define RS_THREAD 0x20 /* search the first article */ +#define RS_MARK 0x20 /* search the first article */ #define RS_AUTHOR 0x40 /* search author's article */ #define RS_NEWPOST 0x80 /* search new posts */ -#define CURSOR_FIRST (RS_RELATED | RS_TITLE | RS_FIRST) -#define CURSOR_NEXT (RS_RELATED | RS_TITLE | RS_FORWARD) -#define CURSOR_PREV (RS_RELATED | RS_TITLE) -#define RELATE_FIRST (RS_RELATED | RS_TITLE | RS_FIRST | RS_CURRENT) -#define RELATE_NEXT (RS_RELATED | RS_TITLE | RS_FORWARD | RS_CURRENT) -#define RELATE_PREV (RS_RELATED | RS_TITLE | RS_CURRENT) -#define THREAD_NEXT (RS_THREAD | RS_FORWARD) -#define THREAD_PREV (RS_THREAD) +#define CURSOR_FIRST (RS_TITLE | RS_FIRST) +#define CURSOR_NEXT (RS_TITLE | RS_FORWARD) +#define CURSOR_PREV (RS_TITLE) +#define RELATE_FIRST (RS_TITLE | RS_FIRST | RS_CURRENT) +#define RELATE_NEXT (RS_TITLE | RS_FORWARD | RS_CURRENT) +#define RELATE_PREV (RS_TITLE | RS_CURRENT) +#define NEWPOST_NEXT (RS_NEWPOST | RS_FORWARD) +#define NEWPOST_PREV (RS_NEWPOST) +#define AUTHOR_NEXT (RS_AUTHOR | RS_FORWARD) +#define AUTHOR_PREV (RS_AUTHOR) + enum {STRIP_ALL = 0, ONLY_COLOR, NO_RELOAD}; diff --git a/include/proto.h b/include/proto.h index c4d401f0..fbbad672 100644 --- a/include/proto.h +++ b/include/proto.h @@ -58,7 +58,6 @@ int Select(void); void do_reply_title(int row, char *title); int cmpfmode(fileheader_t *fhdr); int cmpfilename(fileheader_t *fhdr); -int getindex(char *fpath, char *fname, int size); void outgo_post(fileheader_t *fh, char *board); int edit_title(int ent, fileheader_t *fhdr, char *direct); int whereami(int ent, fileheader_t *fhdr, char *direct); @@ -102,7 +101,7 @@ void brc_addlist(const char* fname); #define moneyof(uid) SHM->money[uid - 1] #define getbtotal(bid) SHM->total[bid - 1] #define getbottomtotal(bid) SHM->n_bottom[bid-1] - +void sort_bcache(void); int getuser(char *userid); void setuserid(int num, char *userid); int searchuser(char *userid); @@ -312,7 +311,6 @@ void init_alarm(void); int num_in_buf(void); int ochar(int c); int rget(int x,char *prompt); -char getans(char *prompt); /* kaede */ int Rename(char* src, char* dst); @@ -353,7 +351,6 @@ void my_send(char *uident); void show_call_in(int save, int which); void write_request (int sig); void log_usies(char *mode, char *mesg); -void log_user(char *msg); void system_abort(void); void abort_bbs(int sig); void del_distinct(char *fname, char *line); @@ -444,6 +441,8 @@ int apply_record(char *fpath, int (*fptr)(), int size); int search_rec(char* dirname, int (*filecheck)()); int append_record_forward(char *fpath, fileheader_t *record, int size); int get_sum_records(char* fpath, int size); +int substitute_ref_record(char* direct, fileheader_t *fhdr, int ent); +int getindex(char *fpath, fileheader_t *fh, int start); /* register */ int getnewuserid(void); @@ -454,13 +453,13 @@ void check_register(void); char *genpasswd(char *pw); /* screen */ +void mouts(int y, int x, char *str); void move(int y, int x); void outs(const char *str); void clrtoeol(void); void clear(void); void refresh(void); void clrtobot(void); -void mprints(int y, int x, char *str); void outmsg(char *msg); void region_scroll_up(int top, int bottom); void outc(unsigned char ch); @@ -480,11 +479,15 @@ void out_lines(const char *str, int line); #define isprint2(ch) ((ch & 0x80) || isprint(ch)) #define not_alpha(ch) (ch < 'A' || (ch > 'Z' && ch < 'a') || ch > 'z') #define not_alnum(ch) (ch < '0' || (ch > '9' && ch < 'A') || (ch > 'Z' && ch < 'a') || ch > 'z') +#define pressanykey() vmsg_lines(b_lines, NULL) +int vmsg_lines(int lines, const char *msg); +int log_user(const char *fmt, ...); time_t gettime(int line, time_t dt, char* head); void setcalfile(char *buf, char *userid); void stand_title(char *title); -void pressanykey(void); -int vmsg (const char *fmt,...) GCC_CHECK_FORMAT(1,2); +char getans(const char *fmt,...); +int getkey(const char *fmt,...) GCC_CHECK_FORMAT(1,2); +int vmsg(const char *fmt,...) GCC_CHECK_FORMAT(1,2); void trim(char *buf); void bell(void); void setbpath(char *buf, char *boardname); @@ -493,7 +496,7 @@ void sethomepath(char *buf, char *userid); void sethomedir(char *buf, char *userid); char *Cdate(time_t *clock); void sethomefile(char *buf, char *userid, char *fname); -int log_file(char *filename, char *buf, int flags); +int log_file(char *fn, int flag, const char *fmt,...); void str_lower(char *t, char *s); int strstr_lower(char *str, char *tag); int cursor_key(int row, int column); diff --git a/include/pttstruct.h b/include/pttstruct.h index 06e21f43..353b5b53 100644 --- a/include/pttstruct.h +++ b/include/pttstruct.h @@ -435,6 +435,15 @@ typedef struct { time_t Fuptime; time_t Ftouchtime; int Fbusystate; + +#ifdef I18N + /* i18n(internationlization) */ + char *i18nstrptr[MAX_LANG][MAX_STRING]; + char i18nstrbody[22 * MAX_LANG * MAX_STRING]; + /* Based on the statistis, we found the lengh of one string + is 22 bytes approximately. + */ +#endif } SHM_t; typedef struct { diff --git a/innbbsd/bbslib.c b/innbbsd/bbslib.c index d8ab6401..9436216e 100644 --- a/innbbsd/bbslib.c +++ b/innbbsd/bbslib.c @@ -7,6 +7,7 @@ #include "innbbsconf.h" #include "bbslib.h" #endif +#include "config.h" char INNBBSCONF[MAXPATHLEN]; char INNDHOME[MAXPATHLEN]; @@ -572,7 +573,7 @@ ascii_date(now) /* * time_t now; time(&now); */ - strftime(datebuf, sizeof(datebuf), "%d %b %Y %X GMT", gmtime(&now)); + strftime(datebuf, sizeof(datebuf), "%d %b %Y %X " INNTIMEZONE, gmtime(&now)); return datebuf; } diff --git a/innbbsd/echobbslib.c b/innbbsd/echobbslib.c index 8eb7a99b..667c30ab 100644 --- a/innbbsd/echobbslib.c +++ b/innbbsd/echobbslib.c @@ -7,6 +7,7 @@ #include "innbbsconf.h" #include "bbslib.h" #endif +#include "config.h" char INNBBSCONF[MAXPATHLEN]; char INNDHOME[MAXPATHLEN]; @@ -573,7 +574,7 @@ ascii_date(now) /* * time_t now; time(&now); */ - strftime(datebuf, sizeof(datebuf), "%d %b %Y %X GMT", gmtime(&now)); + strftime(datebuf, sizeof(datebuf), "%d %b %Y %X " INNTIMEZONE, gmtime(&now)); return datebuf; } diff --git a/innbbsd/receive_article.c b/innbbsd/receive_article.c index 02e1832b..c1d8c274 100644 --- a/innbbsd/receive_article.c +++ b/innbbsd/receive_article.c @@ -339,7 +339,7 @@ receive_article() { struct tm tmbuf; - strptime(DATE, "%d %b %Y %X GMT", &tmbuf); + strptime(DATE, "%d %b %Y %X ", &tmbuf); datevalue = timegm(&tmbuf); } diff --git a/mbbsd/admin.c b/mbbsd/admin.c index 53140e27..c5d94ca6 100644 --- a/mbbsd/admin.c +++ b/mbbsd/admin.c @@ -134,7 +134,6 @@ search_key_user(char *passwdfile, int mode) fclose(fp1); return 0; } else { - move(b_lines - 1, 0); getdata(0, 0, "¥Ø«eªº PASSWD ÀɨS¦³¦¹ ID¡A·s¼W¶Ü¡H[y/N]", genbuf, 3, LCECHO); @@ -232,9 +231,10 @@ setperms(unsigned int pbits, char *pstring[]) ((pbits >> (i + 16)) & 1 ? "£¾" : "¢æ")); } clrtobot(); - while (getdata(b_lines - 1, 0, "½Ð«ö [A-5] ¤Á´«³]©w¡A«ö [Return] µ²§ô¡G", - choice, sizeof(choice), LCECHO)) { - i = choice[0] - 'a'; + while ( + (i = getkey("½Ð«ö [A-5] ¤Á´«³]©w¡A«ö [Return] µ²§ô¡G"))!='\r') + { + i = i - 'a'; if (i < 0) i = choice[0] - '0' + 26; if (i >= NUMPERMS) @@ -263,6 +263,7 @@ void delete_symbolic_link(boardheader_t *bh, int bid) memset(bh, 0, sizeof(boardheader_t)); substitute_record(fn_board, bh, sizeof(boardheader_t), bid); reset_board(bid); + sort_bcache(); log_usies("DelLink", bh->brdname); } @@ -361,6 +362,7 @@ m_mod_board(char *bname) post_msg("Security", bh.title, "½Ðª`·N§R°£ªº¦Xªk©Ê", "[¨t²Î¦w¥þ§½]"); substitute_record(fn_board, &bh, sizeof(bh), bid); reset_board(bid); + sort_bcache(); log_usies("DelBoard", bh.title); outs("§RªO§¹²¦"); } @@ -448,6 +450,7 @@ m_mod_board(char *bname) setup_man(&newbh); substitute_record(fn_board, &newbh, sizeof(newbh), bid); reset_board(bid); + sort_bcache(); log_usies("SetBoard", newbh.brdname); } } @@ -607,6 +610,7 @@ static int add_board_record(boardheader_t *board) if ((bid = getbnum("")) > 0) { substitute_record(fn_board, board, sizeof(boardheader_t), bid); reset_board(bid); + sort_bcache(); } else if (append_record(fn_board, (fileheader_t *)board, sizeof(boardheader_t)) == -1) { return -1; } else { @@ -955,15 +959,13 @@ scan_register_form(char *regfile, int automode, int neednum) prints("%d.%-12s¡G%s\n", n - 2, finfo[n], fdata[n]); } if (muser.userlevel & PERM_LOGINOK) { - getdata(b_lines - 1, 0, "\033[1;32m¦¹±b¸¹¤w¸g§¹¦¨µù¥U, " - "§ó·s(Y/N/Skip)¡H\033[m[N] ", ans, sizeof(ans), LCECHO); + ans[0] = getkey("¦¹±b¸¹¤w¸g§¹¦¨µù¥U, " + "§ó·s(Y/N/Skip)¡H[N] "); if (ans[0] != 'y' && ans[0] != 's') ans[0] = 'd'; } else { - move(b_lines - 1, 0); - prints("¬O§_±µ¨ü¦¹¸ê®Æ(Y/N/Q/Del/Skip)¡H[S] "); if (search_ulist(unum) == NULL) - ans[0] = igetch(); + ans[0] = vmsg_lines(22, "¬O§_±µ¨ü¦¹¸ê®Æ(Y/N/Q/Del/Skip)¡H[S])"); else ans[0] = 's'; if ('A' <= ans[0] && ans[0] <= 'Z') @@ -1067,14 +1069,14 @@ scan_register_form(char *regfile, int automode, int neednum) strlcpy(muser.realname, fdata[2], sizeof(muser.realname)); strlcpy(muser.address, fdata[4], sizeof(muser.address)); strlcpy(muser.email, fdata[6], sizeof(muser.email)); - snprintf(genbuf, sizeof(genbuf), - "%s:%s:%s", fdata[5], fdata[3], uid); - strncpy(muser.justify, genbuf, REGLEN); - sethomefile(buf, muser.userid, "justify"); - strncat(genbuf, "\n", sizeof(genbuf)); - log_file(buf, genbuf, 1); + snprintf(genbuf, sizeof(genbuf), "%s:%s:%s", + fdata[5], fdata[3], uid); + strlcpy(muser.justify, genbuf, sizeof(muser.justify)); passwd_update(unum, &muser); + sethomefile(buf, muser.userid, "justify"); + log_file(buf, LOG_CREAT, genbuf); + if ((fout = fopen(logfile, "a"))) { for (n = 0; field[n]; n++) fprintf(fout, "%s: %s\n", field[n], fdata[n]); @@ -1161,10 +1163,9 @@ cat_register() { if (system("cat register.new.tmp >> register.new") == 0 && system("rm -f register.new.tmp") == 0) - mprints(22, 0, "OK ÂP~~ Ä~Äò¥h¾Ä°«§a!!"); + vmsg("OK ÂP~~ Ä~Äò¥h¾Ä°«§a!!"); else - mprints(22, 0, "¨S¿ìªkCAT¹L¥h©O ¥hÀˬd¤@¤U¨t²Î§a!!"); - pressanykey(); + vmsg("¨S¿ìªkCAT¹L¥h©O ¥hÀˬd¤@¤U¨t²Î§a!!"); return 0; } diff --git a/mbbsd/announce.c b/mbbsd/announce.c index 21696789..092723db 100644 --- a/mbbsd/announce.c +++ b/mbbsd/announce.c @@ -317,8 +317,7 @@ a_pasteitem(menu_t * pm, int mode) if (dashd(copyfile)) { for (i = 0; copyfile[i] && copyfile[i] == pm->path[i]; i++); if (!copyfile[i]) { - outs("±N¥Ø¿ý«þ¶i¦Û¤vªº¤l¥Ø¿ý¤¤¡A·|³y¦¨µL½a°j°é¡I"); - igetch(); + vmsg("±N¥Ø¿ý«þ¶i¦Û¤vªº¤l¥Ø¿ý¤¤¡A·|³y¦¨µL½a°j°é¡I"); return; } } @@ -682,9 +681,7 @@ a_showname(menu_t * pm) sym = 1; } if (sym) { - pressanykey(); - move(b_lines - 1, 1); - prints("¦¹ symbolic link «ü¦V %s\n", &buf[i + 1]); + vmsg("¦¹ symbolic link «ü¦V %s\n", &buf[i + 1]); } } } @@ -914,21 +911,19 @@ a_menu(char *maintitle, char *path, int lastlevel) Fexit = 1; if (currstat == OSONG) { /* XXX: ¥u¿ïºq¥¼ÂIºq¥iÄé±Æ¦æº] */ - char buf[128]; - snprintf(buf, sizeof(buf), + log_file(FN_USSONG, LOG_CREAT | LOG_VF, "%s\n", fhdr->title); - log_file(FN_USSONG, buf, 1); } free(me.header); return FULLUPDATE; } } - if (more_result == 1) { + if (more_result == READ_PREV) { if (--me.now < 0) { me.now = 0; break; } - } else if (more_result == 3) { + } else if (more_result == READ_NEXT) { if (++me.now >= me.num) { me.now = me.num - 1; break; diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c index 519ac5aa..e9d92805 100644 --- a/mbbsd/bbs.c +++ b/mbbsd/bbs.c @@ -1,6 +1,8 @@ /* $Id$ */ #include "bbs.h" +#define WHEREAMI_LEVEL 16 + static int recommend(int ent, fileheader_t * fhdr, char *direct); #ifdef ASSESS @@ -30,12 +32,9 @@ mail_by_link(char *owner, char *title, char *path) void anticrosspost() { - char buf[200]; - - snprintf(buf, sizeof(buf), - "\033[1;33;46m%s \033[37;45mcross post ¤å³¹ \033[37m %s\033[m\n", - cuser.userid, ctime(&now)); - log_file("etc/illegal_money", buf, 1); + log_file("etc/illegal_money", LOG_CREAT | LOG_VF, + "\033[1;33;46m%s \033[37;45mcross post ¤å³¹ \033[37m %s\033[m\n", + cuser.userid, ctime(&now)); post_violatelaw(cuser.userid, "Ptt¨t²Îĵ¹î", "Cross-post", "»@³æ³B¥÷"); cuser.userlevel |= PERM_VIOLATELAW; @@ -57,7 +56,7 @@ save_violatelaw() stand_title("ú»@³æ¤¤¤ß"); if (!(cuser.userlevel & PERM_VIOLATELAW)) { - mprints(22, 0, "\033[1;31m§AµL²á°Ú? §A¤S¨S¦³³Q¶}»@³æ~~\033[m"); + mouts(22, 0, "\033[1;31m§AµL²á°Ú? §A¤S¨S¦³³Q¶}»@³æ~~\033[m"); pressanykey(); return 0; } @@ -66,7 +65,7 @@ save_violatelaw() snprintf(buf, sizeof(buf), "\033[1;31m³o¬O§A²Ä %d ¦¸¹H¤Ï¥»¯¸ªk³W" "¥²¶·Ãº¥X %d $Ptt ,§A¥u¦³ %d ¤¸, ¿ú¤£°÷°Õ!!\033[m", (int)cuser.vl_count, (int)cuser.vl_count * 1000, cuser.money); - mprints(22, 0, buf); + mouts(22, 0, buf); pressanykey(); return 0; } @@ -77,19 +76,19 @@ save_violatelaw() if (!getdata(10, 0, "½T©w¶Ü¡H[y/n]:", ok, sizeof(ok), LCECHO) || ok[0] == 'n' || ok[0] == 'N') { - mprints(22, 0, "\033[1;31mµ¥§A·Q³q¤F¦A¨Ó§a!! " + mouts(22, 0, "\033[1;31mµ¥§A·Q³q¤F¦A¨Ó§a!! " "§Ú¬Û«H§A¤£·|ª¾¿ù¤£§ïªº~~~\033[m"); pressanykey(); return 0; } snprintf(buf, sizeof(buf), "³o¬O§A²Ä %d ¦¸¹Hªk ¥²¶·Ãº¥X %d $Ptt", cuser.vl_count, cuser.vl_count * 1000); - mprints(11, 0, buf); + mouts(11, 0, buf); if (!getdata(10, 0, "n¥I¿ú[y/n]:", ok, sizeof(ok), LCECHO) || ok[0] == 'N' || ok[0] == 'n') { - mprints(22, 0, "\033[1;31m ¶â ¦s°÷¿ú ¦A¨Ó§a!!!\033[m"); + mouts(22, 0, "\033[1;31m ¶â ¦s°÷¿ú ¦A¨Ó§a!!!\033[m"); pressanykey(); return 0; } @@ -215,6 +214,10 @@ readdoent(int num, fileheader_t * ent) sprintf(recom,"3m%2d",ent->recommend); else if(ent->recommend>0) sprintf(recom,"2m%2d",ent->recommend); + else if(ent->recommend<-99) + sprintf(recom,"0mXX"); + else if(ent->recommend<-10) + sprintf(recom,"0mX%d",-ent->recommend); else strcpy(recom,"0m "); prints( @@ -238,21 +241,9 @@ readdoent(int num, fileheader_t * ent) } int -cmpfilename(fileheader_t * fhdr) -{ - return (!strcmp(fhdr->filename, currfile)); -} - -int -cmpfmode(fileheader_t * fhdr) -{ - return (fhdr->filemode & currfmode); -} - -int whereami(int ent, fileheader_t * fhdr, char *direct) { - boardheader_t *bh, *p[32], *root; + boardheader_t *bh, *p[WHEREAMI_LEVEL], *root; int i, j; if (!currutmp->brc_id) @@ -263,7 +254,7 @@ whereami(int ent, fileheader_t * fhdr, char *direct) bh = getbcache(currutmp->brc_id); root = getbcache(1); p[0] = bh; - for (i = 0; i < 31 && p[i]->parent != root && p[i]->parent; i++) + for (i = 0; i < WHEREAMI_LEVEL && p[i]->parent != root && p[i]->parent; i++) p[i + 1] = p[i]->parent; j = i; prints("§Ú¦bþ?\n%-40.40s %.13s\n", p[j]->title + 7, p[j]->BM); @@ -276,27 +267,7 @@ whereami(int ent, fileheader_t * fhdr, char *direct) return FULLUPDATE; } -static int -substitute_check(fileheader_t * fhdr) -{ - fileheader_t hdr; - char genbuf[100]; - int num = 0; - - /* rocker.011018: ¦ê±µ¼Ò¦¡¥Îreference¼W¶i®Ä²v */ - if ((currmode & MODE_SELECT) && (fhdr->money & FHR_REFERENCE)) { - num = fhdr->money & ~FHR_REFERENCE; - setbdir(genbuf, currboard); - get_record(genbuf, &hdr, sizeof(hdr), num); - - /* ¦A³o¸Ìncheck¤@¤Uì¨Óªºdir¸Ì±¬O¤£¬O¦³³Q¤H°Ê¹L... */ - if (strcmp(hdr.filename, fhdr->filename)) - num = getindex(genbuf, fhdr->filename, sizeof(fileheader_t)); - substitute_record(genbuf, fhdr, sizeof(*fhdr), num); - } - return num; -} static int do_select(int ent, fileheader_t * fhdr, char *direct) { @@ -809,26 +780,6 @@ do_generalboardreply(fileheader_t * fhdr) *quote_file = 0; } -int -getindex(char *fpath, char *fname, int size) -{ -#define READSIZE 64 // 8192 / sizeof(fileheader_t) - int fd, i, len, now = 1; /* now starts from 1 */ - fileheader_t fhdrs[READSIZE]; - - if ((fd = open(fpath, O_RDONLY, 0)) != -1) { - while( (len = read(fd, fhdrs, sizeof(fhdrs))) > 0 ){ - len /= sizeof(fileheader_t); - for( i = 0 ; i < len ; ++i, ++now ) - if (!strcmp(fhdrs[i].filename, fname)) { - close(fd); - return now; - } - } - close(fd); - } - return 0; -} int invalid_brdname(char *brd) @@ -936,8 +887,7 @@ reply_post(int ent, fileheader_t * fhdr, char *direct) static int edit_post(int ent, fileheader_t * fhdr, char *direct) { - int num; - char fpath[80], fpath0[80]; + char fpath[80]; char genbuf[200]; fileheader_t postfile; boardheader_t *bp = getbcache(currbid); @@ -961,52 +911,19 @@ edit_post(int ent, fileheader_t * fhdr, char *direct) #endif setutmpmode(REEDIT); + setbpath(fpath, currboard); + stampfile(fpath, &postfile); setdirpath(genbuf, direct, fhdr->filename); local_article = fhdr->filemode & FILE_LOCAL; + Copy(genbuf, fpath); strlcpy(save_title, fhdr->title, sizeof(save_title)); - /* rocker.011018: ³o¸Ì¬O¤£¬O¸ÓÀˬd¤@¤Uקï¤å³¹«áªºmoney©M즳ªº¤ñ¸û? */ - if (vedit(genbuf, 0, NULL) != -1) { - substitute_record(direct, fhdr, sizeof(*fhdr), ent); - setbpath(fpath, currboard); - stampfile(fpath, &postfile); - strlcpy(genbuf, fhdr->filename, sizeof(genbuf)); - setbfile(fpath0, currboard, fhdr->filename); - - for(num = 2; genbuf[num] != 0; num++){ - if(genbuf[num] == '.'){ - genbuf[num] = 0; - break; - } - } - - sprintf(postfile.filename, "%s.A.%3.3X", genbuf, rand() & 0xFFF); - setdirpath(fpath, fpath, postfile.filename); - unlink(fpath); - - Rename(fpath0, fpath); - - /* rocker.011018: fix ¦ê±µ¼Ò¦¡§ï¤å³¹«á¤å³¹´N¤£¨£ªºbug */ - if ((currmode & MODE_SELECT) && (fhdr->money & FHR_REFERENCE)) { - fileheader_t hdr; - - num = fhdr->money & ~FHR_REFERENCE; - setbdir(fpath0, currboard); - get_record(fpath0, &hdr, sizeof(hdr), num); - - /* ¦A³o¸Ìncheck¤@¤Uì¨Óªºdir¸Ì±¬O¤£¬O¦³³Q¤H°Ê¹L... */ - if (!strcmp(hdr.filename, fhdr->filename)) { - strlcpy(hdr.filename, postfile.filename, sizeof(hdr.filename)); - strlcpy(hdr.title, save_title, sizeof(hdr.title)); - substitute_record(fpath0, &hdr, sizeof(hdr), num); - } - } - strlcpy(fhdr->filename, postfile.filename, sizeof(fhdr->filename)); - strlcpy(fhdr->title, save_title, sizeof(fhdr->title)); - brc_addlist(postfile.filename); - substitute_record(direct, fhdr, sizeof(*fhdr), ent); + if (vedit(fpath, 0, NULL) != -1) { + Rename(fpath, genbuf); +/* Ptt: The code is unnecessary now because use the same name as original name if (!(currbrdattr & BRD_HIDE) && (!bp->level || (currbrdattr & BRD_POSTMASK))) do_crosspost(ALLPOST, fhdr, fpath); +*/ } return FULLUPDATE; } @@ -1129,110 +1046,35 @@ read_post(int ent, fileheader_t * fhdr, char *direct) int more_result; if (fhdr->owner[0] == '-') - return DONOTHING; + return READ_SKIP; setdirpath(genbuf, direct, fhdr->filename); if ((more_result = more(genbuf, YEA)) == -1) - return FULLUPDATE; + return READ_SKIP; brc_addlist(fhdr->filename); strncpy(currtitle, subject(fhdr->title), TTLEN); - strncpy(currowner, subject(fhdr->owner), IDLEN + 2); - - switch (more_result) { - case 1: - return READ_PREV; - case 2: - return RELATE_PREV; - case 3: - return READ_NEXT; - case 4: - return RELATE_NEXT; - case 5: - return RELATE_FIRST; - case 6: - return FULLUPDATE; - case 7: - case 8: - if (CheckPostPerm()) { - strlcpy(quote_file, genbuf, sizeof(quote_file)); - do_reply(fhdr); - *quote_file = 0; - } - return FULLUPDATE; - case 9: - return 'A'; - case 10: - return 'a'; - case 11: - return '/'; - case 12: - return '?'; - } - - - outmsg("\033[34;46m ¾\\Ū¤å³¹ \033[31;47m (R/Y)\033[30m¦^«H \033[31m" - "(=[]<>)\033[30m¬ÛÃö¥DÃD \033[31m(¡ô¡õ)\033[30m¤W¤U«Ê \033[31m(¡ö)" - "\033[30mÂ÷¶} \033[m"); - - switch (egetch()) { - case 'q': - case 'Q': - case KEY_LEFT: - break; - - case ' ': - case KEY_RIGHT: - case KEY_DOWN: - case KEY_PGDN: - case 'n': - case Ctrl('N'): - return READ_NEXT; - - case KEY_UP: - case 'p': - case Ctrl('P'): - case KEY_PGUP: - return READ_PREV; - - case '=': - return RELATE_FIRST; - - case ']': - case 't': - return RELATE_NEXT; - - case '[': - return RELATE_PREV; - case '.': - case '>': - return THREAD_NEXT; - - case ',': - case '<': - return THREAD_PREV; - - case Ctrl('I'): - t_idle(); - return FULLUPDATE; - - case 'X': - recommend(ent, fhdr, direct); - return FULLUPDATE; - - case 'y': - case 'r': - case 'R': - case 'Y': - if (CheckPostPerm()) { - strlcpy(quote_file, genbuf, sizeof(quote_file)); - do_reply(fhdr); - *quote_file = 0; - } - } - return FULLUPDATE; + if (more_result) + { + if(more_result == 999) + { + if (CheckPostPerm()) { + strlcpy(quote_file, genbuf, sizeof(quote_file)); + do_reply(fhdr); + *quote_file = 0; + } + return FULLUPDATE; + } + if(more_result == 998) + { + recommend(ent, fhdr, direct); + return FULLUPDATE; + } + else return more_result; + } +return FULLUPDATE; } /* ----------------------------------------------------- */ @@ -1321,9 +1163,7 @@ hold_gamble(int ent, fileheader_t * fhdr, char *direct) openticket(currbid); return FULLUPDATE; } else if (dashf(genbuf)) { - move(b_lines - 1, 0); - prints(" ¥Ø«e¨t²Î¥¿¦b³B²z¶}¼ú¨Æ©y, ½Ðµ²ªG¥XÄl«á¦AÁ|¿ì......."); - pressanykey(); + vmsg(" ¥Ø«e¨t²Î¥¿¦b³B²z¶}¼ú¨Æ©y, ½Ðµ²ªG¥XÄl«á¦AÁ|¿ì......."); return FULLUPDATE; } getdata(b_lines - 2, 0, "nÁ|¿ì½ä½L (N/y):", yn, 3, LCECHO); @@ -1432,9 +1272,7 @@ edit_title(int ent, fileheader_t * fhdr, char *direct) getdata(b_lines - 1, 0, "½T©w(Y/N)?[n] ", genbuf, 3, DOECHO); if ((genbuf[0] == 'y' || genbuf[0] == 'Y') && dirty) { *fhdr = tmpfhdr; - substitute_record(direct, fhdr, sizeof(*fhdr), ent); - /* rocker.011018: ³o¸ÌÀ³¸Ó§ï¦¨¥Îreferenceªº¤è¦¡¨ú±oì¨ÓªºÀÉ®× */ - substitute_check(fhdr); + substitute_ref_record(direct, fhdr, ent); } return FULLUPDATE; } @@ -1446,7 +1284,7 @@ solve_post(int ent, fileheader_t * fhdr, char *direct) { if (HAS_PERM(PERM_SYSOP)) { fhdr->filemode ^= FILE_SOLVED; - substitute_record(direct, fhdr, sizeof(*fhdr), ent); + substitute_ref_record(direct, fhdr, ent); return PART_REDRAW; } return DONOTHING; @@ -1468,15 +1306,14 @@ recommend_cancel(int ent, fileheader_t * fhdr, char *direct) #endif fhdr->recommend = 0; - substitute_record(direct, fhdr, sizeof(*fhdr), ent); - substitute_check(fhdr); + substitute_ref_record(direct, fhdr, ent); return FULLUPDATE; } static int -do_add_recommend(char *direct, fileheader_t *fhdr, int ent, char *buf) +do_add_recommend(char *direct, fileheader_t *fhdr, int ent, char *buf, int type) { char path[256]; - int fd; + int update=0; /* race here: ¬°¤F´î¤Ö system calls , ²{¦bª½±µ¥Î·í«eªº±À¤å¼Æ +1 ¼g¤J .DIR ¤¤. @@ -1484,27 +1321,35 @@ do_add_recommend(char *direct, fileheader_t *fhdr, int ent, char *buf) 1.Y¸Ó¤åÀɦW³Q´«±¼ªº¸Ü, ±À¤å±N¼g¦ÜÂÂÀɦW¤¤ (³y¦¨«ÕÆFÀÉ) 2.¨S¦³«·sŪ¤@¦¸, ©Ò¥H±À¤å¼Æ¥i¯à³Q¤Öºâ 3.Y±Àªº®ÉÔ«e¤å³Q§R, ±N¥[¨ì«á¤åªº±À¤å¼Æ + */ setdirpath(path, direct, fhdr->filename); - if( log_file(path, buf, 0) == -1 ){ // ¤£ CREATE + if( log_file(path, 0, buf) == -1 ){ // ¤£ CREATE vmsg("±ÀÂË/Äv¼Ð¥¢±Ñ"); return -1; } - /* get_record(direct, fhdr, sizeof(fhdr), ent); - * This is a solution to avoid most racing (still some), but cost four + /* This is a solution to avoid most racing (still some), but cost four * system calls. */ - - if( fhdr->recommend < 100 ){ - fileheader_t t; - if( (fd = open(direct, O_WRONLY)) < 0 ) + if(type == 0 && fhdr->recommend < 100 ) + update = 1; + else if(type == 1 && fhdr->recommend > -100) + update = -1; + + if( update ){ + int fd; + //Ptt: update only necessary + if( (fd = open(direct, O_RDWR)) < 0 ) return -1; - - ++(fhdr->recommend); - if( lseek(fd, (off_t)(sizeof(*fhdr) * (ent - 1) + - (int)&t.recommend - (int)&t), SEEK_SET) >= 0) + if( lseek(fd, (off_t)(sizeof(fileheader_t) * (ent - 1) + + (int)&fhdr->recommend - (int)fhdr), SEEK_SET) >= 0) // ¦pªG lseek ¥¢±Ñ´N¤£·| write + { + read(fd, &fhdr->recommend, sizeof(char)); + fhdr->recommend += update; + lseek(fd, -1, SEEK_CUR); write(fd, &fhdr->recommend, sizeof(char)); + } close(fd); } @@ -1547,6 +1392,7 @@ do_bid(int ent, fileheader_t * fhdr, boardheader_t *bp, char *direct, struct t break; } bidinfo.flag |= SALE_COMMENTED; + substitute_record(fpath, &bidinfo, sizeof(bidinfo), 1); } } @@ -1610,7 +1456,7 @@ do_bid(int ent, fileheader_t * fhdr, boardheader_t *bp, char *direct, struct t money, next, fromhost, ptime->tm_mon + 1, ptime->tm_mday); - do_add_recommend(direct, fhdr, ent, genbuf); + do_add_recommend(direct, fhdr, ent, genbuf, 0); if(next > bidinfo.usermax) { bidinfo.usermax=mymax; @@ -1630,7 +1476,7 @@ do_bid(int ent, fileheader_t * fhdr, boardheader_t *bp, char *direct, struct t 20 - strlen(cuser.userid) , " ",money, bidinfo.high, ptime->tm_mon + 1, ptime->tm_mday); - do_add_recommend(direct, fhdr, ent, genbuf); + do_add_recommend(direct, fhdr, ent, genbuf, 0); } else { @@ -1644,7 +1490,7 @@ do_bid(int ent, fileheader_t * fhdr, boardheader_t *bp, char *direct, struct t 20 - strlen(bidinfo.userid) , " ", money, bidinfo.high, ptime->tm_mon + 1, ptime->tm_mday); - do_add_recommend(direct, fhdr, ent, genbuf); + do_add_recommend(direct, fhdr, ent, genbuf, 0); } substitute_record(fpath, &bidinfo, sizeof(bidinfo), 1); vmsg("®¥³ß±z! ¥H³Ì°ª»ù·m¼Ð§¹¦¨!"); @@ -1655,13 +1501,15 @@ static int recommend(int ent, fileheader_t * fhdr, char *direct) { struct tm *ptime = localtime(&now); - char buf[200], path[200], yn[5]; + char buf[200], path[200], + *ctype[3] = {"37m±À","31m¼N","31m¡÷"}; + int type; boardheader_t *bp; static time_t lastrecommend = 0; bp = getbcache(currbid); - if( bp->brdattr & BRD_NORECOMMEND ){ - vmsg("©êºp, ¥»ªO¸T¤î±ÀÂË©ÎÄv¼Ð"); + if( bp->brdattr & BRD_NORECOMMEND){ + vmsg("©êºp, ¦¹³B¸T¤î±ÀÂË©ÎÄv¼Ð"); return FULLUPDATE; } if (!CheckPostPerm() || bp->brdattr & BRD_VOTEBOARD || fhdr->filemode & FILE_VOTE) { @@ -1680,37 +1528,37 @@ recommend(int ent, fileheader_t * fhdr, char *direct) } setdirpath(path, direct, fhdr->filename); + type = vmsg_lines(b_lines-2, "±zn¹ï³o½g¤å³¹ 1.±ÀÂË 2.¼NÁn [1]?") - '1'; + if (fhdr->recommend == 0 && strcmp(cuser.userid, fhdr->owner) == 0){ - vmsg("ĵ§i! ¥»¤H¤£¯à±ÀÂ˲Ĥ@¦¸!"); - return FULLUPDATE; - } + mouts(b_lines-1, 0, "¥»¤H±ÀÂ˩μN²Ä¤@¦¸, §ï¥H ¡÷ ¥[µù¤è¦¡"); + type = 2; + } #ifndef DEBUG - if (!(currmode & MODE_BOARD) && getuser(cuser.userid) && - now - lastrecommend < 40) { - move(b_lines - 1, 0); - prints("Â÷¤W¦¸±ÀÂˮɶ¡¤ÓªñÅo, ½Ð¦hªáÂI®É¶¡¥J²Ó¾\\Ū¤å³¹!"); - pressanykey(); - return FULLUPDATE; + if (!(currmode & MODE_BOARD)&& now - lastrecommend < 90) { + mouts(b_lines-1, 0,"±ÀÂˮɶ¡¤Óªñ, §ï¥H ¡÷ ¥[µù¤è¦¡"); + type = 2; } #endif - - - if (!getdata(b_lines - 2, 0, "±ÀÂË»y:", path, 40, DOECHO) || - path == NULL || - !getdata(b_lines - 1, 0, "½T©wn±ÀÂË, ½Ð¥J²Ó¦Ò¼{(Y/N)?[n] ", - yn, 5, LCECHO) - || yn[0] != 'y') + if(type > 2 || type < 0) type = 0; + + if (!getdata(b_lines - 2, 0, "n»¡ªº¸Ü:", path, 40, DOECHO) || + path == NULL || getans("½T©wn\033[%s\033[m¶Ü? ½Ð¥J²Ó¦Ò¼{(Y/N)?[n]", ctype[type])!='y') return FULLUPDATE; snprintf(buf, sizeof(buf), - "\033[1;31m¡÷ \033[33m%s\033[m\033[33m:%s\033[m%*s±À%15s %02d/%02d\n", - cuser.userid, path, - 51 - strlen(cuser.userid) - strlen(path), " ", fromhost, + "\033[1;%s \033[33m%s\033[m\033[33m:%s\033[m%*s%15s %02d/%02d\n", + ctype[type], + cuser.userid, + path, + 53 - strlen(cuser.userid) - strlen(path) , + " ", + fromhost, ptime->tm_mon + 1, ptime->tm_mday); - do_add_recommend(direct, fhdr, ent, buf); + do_add_recommend(direct, fhdr, ent, buf, type); #ifdef ASSESS /* ¨C 10 ¦¸±À¤å ¥[¤@¦¸ goodpost */ - if ((fhdr->filemode & FILE_MARKED) && fhdr->recommend % 10 == 0) { + if (type ==0 && (fhdr->filemode & FILE_MARKED) && fhdr->recommend % 10 == 0) { int uid = searchuser(fhdr->owner); if (uid > 0) inc_goodpost(uid, 1); @@ -1747,9 +1595,8 @@ mark_post(int ent, fileheader_t * fhdr, char *direct) inc_goodpost(searchuser(fhdr->owner), -1 * (fhdr->recommend / 10)); } #endif - - substitute_record(direct, fhdr, sizeof(*fhdr), ent); - substitute_check(fhdr); + + substitute_ref_record(direct, fhdr, ent); return PART_REDRAW; } @@ -1790,33 +1637,8 @@ del_range(int ent, fileheader_t *fhdr, char *direct) if (*num1 == 'y') { outmsg("³B²z¤¤,½Ðµy«á..."); refresh(); - if (currmode & MODE_SELECT) { - int fd, size = sizeof(fileheader_t); - char genbuf[100]; - fileheader_t rsfh; - int i = inum1, now; - if (currstat == RMAIL) - sethomedir(genbuf, cuser.userid); - else - setbdir(genbuf, currboard); - if ((fd = (open(direct, O_RDONLY, 0))) != -1) { - if (lseek(fd, (off_t) (size * (inum1 - 1)), SEEK_SET) != - -1) { - while (read(fd, &rsfh, size) == size) { - if (i > inum2) - break; - now = getindex(genbuf, rsfh.filename, size); - strlcpy(currfile, rsfh.filename, sizeof(currfile)); - delete_record(genbuf, sizeof(fileheader_t), now); - // cmpfilename); - i++; - } - } - close(fd); - } - } #ifdef SAFE_ARTICLE_DELETE - if(bp && bp->nuser > 20 ) + if(bp && !(currmode & MODE_DIGEST) && bp->nuser > 20 ) safe_article_delete_range(direct, inum1, inum2); else delete_range(direct, inum1, inum2); @@ -1839,7 +1661,7 @@ static int del_post(int ent, fileheader_t * fhdr, char *direct) { char genbuf[100], newpath[256]; - int not_owned; + int num, not_owned; boardheader_t *bp; bp = getbcache(currbid); @@ -1856,35 +1678,19 @@ del_post(int ent, fileheader_t * fhdr, char *direct) !strcmp(cuser.userid, STR_GUEST)) return DONOTHING; + if (currmode & MODE_SELECT) { + vmsg("½Ð¦^¨ì¤@¯ë¼Ò¦¡¦A§R°£¤å³¹"); + return DONOTHING; + } getdata(1, 0, msg_del_ny, genbuf, 3, LCECHO); if (genbuf[0] == 'y') { - strlcpy(currfile, fhdr->filename, sizeof(currfile)); if( #ifdef SAFE_ARTICLE_DELETE - (bp->nuser>20 && !safe_article_delete(ent, fhdr, direct)) || + (bp->nuser>20 && !(currmode & MODE_DIGEST) && + !safe_article_delete(ent, fhdr, direct)) || #endif !delete_record(direct, sizeof(fileheader_t), ent) ) { - int num; - if (currmode & MODE_SELECT) { - /* rocker.011018: §Q¥Îreference´î§Cloading */ - fileheader_t hdr; - - /* fhdr->money is not real money now, it's a reference instead. - * see select_read() in read.c */ - num = fhdr->money & ~FHR_REFERENCE; - setbdir(genbuf, currboard); - get_record(genbuf, &hdr, sizeof(hdr), num); - - /* ¦A³o¸Ìncheck¤@¤Uì¨Óªºdir¸Ì±¬O¤£¬O¦³³Q¤H°Ê¹L... */ - if (strcmp(hdr.filename, fhdr->filename)) { - num = getindex(genbuf, fhdr->filename, sizeof(fileheader_t)); - get_record(genbuf, &hdr, sizeof(hdr), num); - } - /* rocker.011018: ³o¸ÌnÁÙì³Q¯}Ãaªºmoney */ - fhdr->money = hdr.money; - delete_record(genbuf, sizeof(fileheader_t), num); - } cancelpost(fhdr, not_owned, newpath); if(fhdr->filemode & FILE_ANONYMOUS) @@ -1933,13 +1739,9 @@ del_post(int ent, fileheader_t * fhdr, char *direct) if (cuser.numposts) cuser.numposts--; if (!(currmode & MODE_DIGEST && currmode & MODE_BOARD)){ - move(b_lines - 1, 0); - clrtoeol(); demoney(-fhdr->money); - prints("%s¡A±zªº¤å³¹´î¬° %d ½g¡A¤ä¥I²M¼ä¶O %d »È", msg_del_ok, + vmsg("±zªº¤å³¹´î¬° %d ½g¡A¤ä¥I²M¼ä¶O %d »È", cuser.numposts, fhdr->money); - refresh(); - pressanykey(); } } return DIRCHANGED; @@ -1953,30 +1755,24 @@ show_filename(int ent, fileheader_t * fhdr, char *direct) { if(!HAS_PERM(PERM_SYSOP)) return DONOTHING; - move(b_lines - 1, 0); - prints("ÀɮצWºÙ: %s ", fhdr->filename); - pressanykey(); + vmsg("ÀɮצWºÙ: %s ", fhdr->filename); return PART_REDRAW; } static int view_postmoney(int ent, fileheader_t * fhdr, char *direct) { - move(b_lines - 1, 0); if(currmode & MODE_SELECT){ vmsg("½Ð¦bÂ÷¶}¥Ø«eªº¿ï¾Ü¼Ò¦¡¦A¬d¸ß"); return FULLUPDATE; } - clrtoeol(); if(fhdr->filemode & FILE_ANONYMOUS) /* When the file is anonymous posted, fhdr->money is author. * see do_general() */ - prints("°Î¦WºÞ²z½s¸¹: %d (¦P¤@¤H³Q¬d¸ß®É½s¸¹¬Û¦P, ¦¹½s¸¹¨C¤H¬Ý¨ì¤£¬Û¦P)", + vmsg("°Î¦WºÞ²z½s¸¹: %d (¦P¤@¤H¸¹½X·|¤@¼Ë)", fhdr->money + currutmp->pid); else - prints("³o¤@½g¤å³¹È %d »È", fhdr->money); - refresh(); - pressanykey(); + vmsg("³o¤@½g¤å³¹È %d »È", fhdr->money); return FULLUPDATE; } @@ -2078,7 +1874,7 @@ sequent_messages(fileheader_t * fptr) "\033[30m¤U¤@«Ê \033[31m(¡ö,q)\033[30mÂ÷¶} \033[m"); continue_flag = 0; - switch (egetch()) { + switch (igetch()) { case KEY_LEFT: case 'e': case 'q': @@ -2291,20 +2087,6 @@ board_digest() return NEWDIRECT; } -int -board_etc() -{ - if (!HAS_PERM(PERM_SYSOP)) - return DONOTHING; - currmode ^= MODE_ETC; - if (currmode & MODE_ETC) - currmode &= ~MODE_POST; - else if (haspostperm(currboard)) - currmode |= MODE_POST; - - setbdir(currdirect, currboard); - return NEWDIRECT; -} static int push_bottom(int ent, fileheader_t * fhdr, char *direct) @@ -2313,13 +2095,13 @@ push_bottom(int ent, fileheader_t * fhdr, char *direct) char buf[256]; if ((currmode & MODE_DIGEST) || !(currmode & MODE_BOARD)) return DONOTHING; - setbottomtotal(currbid); // Ptt : will be remove when stable + setbottomtotal(currbid); // <- Ptt : will be remove when stable num = getbottomtotal(currbid); if(getans(fhdr->filemode & FILE_BOTTOM ? "¨ú®ø¸m©³¤½§i?(y/N)": "¥[¤J¸m©³¤½§i?(y/N)")!='y') return READ_REDRAW; fhdr->filemode ^= FILE_BOTTOM; - if(fhdr->filemode & FILE_BOTTOM) + if(fhdr->filemode & FILE_BOTTOM ) { sprintf(buf, "%s.bottom", direct); if(num >= 5) @@ -2327,7 +2109,9 @@ push_bottom(int ent, fileheader_t * fhdr, char *direct) vmsg("¤£±o¶W¹L 5 ½g«n¤½§i ½Ðºë²!"); return READ_REDRAW; } + fhdr->money = ent | FHR_REFERENCE; append_record(buf, fhdr, sizeof(fileheader_t)); + } else { @@ -2401,26 +2185,7 @@ good_post(int ent, fileheader_t * fhdr, char *direct) delta = 1000; } } - substitute_record(direct, fhdr, sizeof(*fhdr), ent); - /* rocker.011018: ¦ê±µ¼Ò¦¡¥Îreference¼W¶i®Ä²v */ - if ((currmode & MODE_SELECT) && (fhdr->money & FHR_REFERENCE)) { - fileheader_t hdr; - char genbuf[100]; - int num; - - num = fhdr->money & ~FHR_REFERENCE; - setbdir(genbuf, currboard); - get_record(genbuf, &hdr, sizeof(hdr), num); - - /* ¦A³o¸Ìncheck¤@¤Uì¨Óªºdir¸Ì±¬O¤£¬O¦³³Q¤H°Ê¹L... */ - if (strcmp(hdr.filename, fhdr->filename)) { - num = getindex(genbuf, fhdr->filename, sizeof(fileheader_t)); - get_record(genbuf, &hdr, sizeof(hdr), num); - } - fhdr->money = hdr.money + delta; - - substitute_record(genbuf, fhdr, sizeof(*fhdr), num); - } + substitute_ref_record(direct, fhdr, ent); return FULLUPDATE; } @@ -2490,7 +2255,7 @@ change_hidden(int ent, fileheader_t * fhdr, char *direct) bp = getbcache(currbid); if (((bp->brdattr & BRD_HIDE) && (bp->brdattr & BRD_POSTMASK))) { - if (getans("¥Ø«eªO¦bÁô§Îª¬ºA, n¸ÑÁô§Î¹À(Y/N)?[N]") != 'y') + if (getans("¥Ø«eªO¦bÁô§Îª¬ºA, n¸ÑÁô§Î¹À(y/N)?") != 'y') return FULLUPDATE; bp->brdattr &= ~BRD_HIDE; bp->brdattr &= ~BRD_POSTMASK; @@ -2498,7 +2263,7 @@ change_hidden(int ent, fileheader_t * fhdr, char *direct) board_hidden_status = 0; hbflreload(currbid); } else { - if (getans("¥Ø«eªO¦b²{§Îª¬ºA, nÁô§Î¹À(Y/N)?[N]") != 'y') + if (getans("¥Ø«eªO¦b²{§Îª¬ºA, nÁô§Î¹À(y/N)?") != 'y') return FULLUPDATE; bp->brdattr |= BRD_HIDE; bp->brdattr |= BRD_POSTMASK; @@ -2585,7 +2350,7 @@ onekey_t read_comms[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 'A' 65 bh_title_edit, // 'B' - board_etc, // 'C' + NULL, // 'C' del_range, // 'D' edit_post, // 'E' NULL, // 'F' @@ -2708,12 +2473,10 @@ ReadSelect() static void log_board(char *mode, time_t usetime) { - char buf[256]; - if (usetime > 30) { - snprintf(buf, sizeof(buf), "USE %-20.20s Stay: %5ld (%s) %s\n", - mode, usetime, cuser.userid, ctime(&now)); - log_file(FN_USEBOARD, buf, 1); + log_file(FN_USEBOARD, LOG_CREAT | LOG_VF, + "USE %-20.20s Stay: %5ld (%s) %s\n", + mode, usetime, cuser.userid, ctime(&now)); } } #endif diff --git a/mbbsd/board.c b/mbbsd/board.c index 7cfeabd1..c7968d67 100644 --- a/mbbsd/board.c +++ b/mbbsd/board.c @@ -131,8 +131,7 @@ load_uidofgid(const int gid, const int type) int n, childcount = 0; currbptr = &bcache[gid - 1]; for (n = 0; n < numboards; ++n) { - bptr = SHM->bsorted[type][n]; - if (bptr->brdname[0] == '\0') + if( !(bptr = SHM->bsorted[type][n]) || bptr->brdname[0] == '\0' ) continue; if (bptr->gid == gid) { if (currbptr == &bcache[gid - 1]) @@ -300,8 +299,9 @@ load_boards(char *key) } addnewbrdstat(n, state); } - if(childcount != brdnum) //fix soon - getbcache(class_bid)->childcount = brdnum; + if(childcount < brdnum) //Ptt: dirty fix fix soon + getbcache(class_bid)->childcount = 0; + } } @@ -390,11 +390,26 @@ brdlist_foot() yank_flag == 0 ? "³Ì·R" : yank_flag == 1 ? "³¡¥÷" : "¥þ³¡"); } + +static inline char * +make_class_color(char *name) +{ + char *colorset[8] = {"", "\033[32m", + "\033[33m", "\033[36m", "\033[34m", "\033[1m", + "\033[1;32m", "\033[1;33m"}; + + return colorset[(unsigned int) + (name[0] + name[1] + + name[2] + name[3]) & 07]; +} + +#define HILIGHT_COLOR "\033[1;36m" + static void show_brdlist(int head, int clsflag, int newflag) { int myrow = 2; - if (class_bid == 1) { + if (unlikely(class_bid == 1)) { currstat = CLASS; myrow = 6; showtitle("¤ÀÃþ¬ÝªO", BBSName); @@ -428,11 +443,12 @@ show_brdlist(int head, int clsflag, int newflag) char *color[8] = {"", "\033[32m", "\033[33m", "\033[36m", "\033[34m", "\033[1m", "\033[1;32m", "\033[1;33m"}; - char *unread[2] = {"\33[37m \033[m", "\033[1;31m£¾\033[m"}; - - if (yank_flag == 0 && get_fav_type(&nbrd[0]) == 0){ + char *unread[2] = {"\33[37m \033[m", "\033[1;31m£¾\033[m"}; + + if (yank_flag == 0 && get_data_number(get_current_fav()) == 0){ + // brdnum > 0 ??? move(3, 0); - prints(" --- ªÅ¥Ø¿ý ---"); + outs(" --- ªÅ¥Ø¿ý ---"); return; } @@ -577,8 +593,9 @@ paste_taged_brds(int gid) getans("¶K¤W¼Ð°Oªº¬ÝªO?(y/N)")=='n') return 0; fav = get_current_fav(); for (tmp = 0; tmp < fav->DataTail; tmp++) { - bid = fav_getid(&fav->favh[tmp]); - boardheader_t *bh = getbcache(bid); + boardheader_t *bh; + bid = fav_getid(&fav->favh[tmp]); + bh = getbcache(bid); if( !is_set_attr(&fav->favh[tmp], FAVH_ADM_TAG)) continue; set_attr(&fav->favh[tmp], FAVH_ADM_TAG, 0); @@ -590,6 +607,7 @@ paste_taged_brds(int gid) log_usies("SetBoardGID", bh->brdname); } } + sort_bcache(); return 1; } @@ -614,9 +632,8 @@ choose_board(int newflag) load_boards(keyword); if (brdnum <= 0 && yank_flag > 0) { if (keyword[0] != 0) { - mprints(b_lines - 1, 0, "¨S¦³¥ô¦ó¬ÝªO¼ÐÃD¦³¦¹ÃöÁä¦r " + vmsg("¨S¦³¥ô¦ó¬ÝªO¼ÐÃD¦³¦¹ÃöÁä¦r " "(ªO¥DÀ³ª`·N¬ÝªO¼ÐÃD©R¦W)"); - pressanykey(); keyword[0] = 0; brdnum = -1; continue; diff --git a/mbbsd/cache.c b/mbbsd/cache.c index 15398ece..842cedad 100644 --- a/mbbsd/cache.c +++ b/mbbsd/cache.c @@ -471,13 +471,9 @@ setutmpmode(unsigned int mode) { if (currstat != mode) currutmp->mode = currstat = mode; - /* °lÂÜ¨Ï¥ÎªÌ */ if (HAS_PERM(PERM_LOGUSER)) { - char msg[200]; - snprintf(msg, sizeof(msg), "%s setutmpmode to %s(%d) at %s", - cuser.userid, modestring(currutmp, 0), mode, Cdate(&COMMON_TIME)); - log_user(msg); + log_user("setutmpmode to %s(%d)", modestring(currutmp, 0), mode); } } #endif @@ -504,11 +500,15 @@ cmpboardclass(boardheader_t ** brd, boardheader_t ** tmp) strcasecmp((*brd)->brdname, (*tmp)->brdname); } -static void +void sort_bcache(void) { int i; - /* critical section ¤£¯à³æ¿W©I¥s ©I¥sreload_bcache or reset_board */ + /* critical section ºÉ¶q¤£n©I¥s */ + /* ¥u¦³·s¼W ©Î²¾°£¬ÝªO »Ýn©I¥s¨ì */ + if(SHM->Bbusystate) + { sleep(1); return; } + SHM->Bbusystate = 1; for (i = 0; i < SHM->Bnumber; i++) { SHM->bsorted[1][i] = SHM->bsorted[0][i] = &bcache[i]; } @@ -516,6 +516,12 @@ sort_bcache(void) (QCAST) cmpboardname); qsort(SHM->bsorted[1], SHM->Bnumber, sizeof(boardheader_t *), (QCAST) cmpboardclass); + + for (i = 0; i < SHM->Bnumber; i++) { + bcache[i].firstchild[0] = NULL; + bcache[i].firstchild[1] = NULL; + } + SHM->Bbusystate = 0; } void @@ -525,7 +531,7 @@ reload_bcache(void) safe_sleep(1); } else { - int fd, i; + int fd; SHM->Bbusystate = 1; if ((fd = open(fn_board, O_RDONLY)) > 0) { @@ -538,12 +544,8 @@ reload_bcache(void) /* µ¥©Ò¦³ boards ¸ê®Æ§ó·s«á¦A³]©w uptime */ SHM->Buptime = SHM->Btouchtime; log_usies("CACHE", "reload bcache"); - sort_bcache(); - for (i = 0; i < SHM->Bnumber; ++i) { - bcache[i].firstchild[0] = NULL; - bcache[i].firstchild[1] = NULL; - } SHM->Bbusystate = 0; + sort_bcache(); } } @@ -566,12 +568,13 @@ void addbrd_touchcache(void) SHM->Bnumber++; numboards = SHM->Bnumber; reset_board(numboards); + sort_bcache(); } void reset_board(int bid) /* XXXbid: from 1 */ { /* Ptt: ³o¼Ë´N¤£¥Î¦Ñ¬Otouch board¤F */ - int fd, i, nuser; + int fd, nuser; boardheader_t *bhdr; if (--bid < 0) @@ -589,11 +592,6 @@ reset_board(int bid) /* XXXbid: from 1 */ read(fd, bhdr, sizeof(boardheader_t)); close(fd); } - sort_bcache(); - for (i = 0; i < SHM->Bnumber; i++) { - bcache[i].firstchild[0] = NULL; - bcache[i].firstchild[1] = NULL; - } SHM->busystate_b[bid] = 0; buildBMcache(bid + 1); /* XXXbid */ @@ -628,6 +626,9 @@ setbottomtotal(int bid) n = get_num_records(genbuf, sizeof(fileheader_t)); if(n>5) { +#ifdef DEBUG_BOTTOM + log_file("fix_bottom", LOG_CREAT | LOG_VF, "%s n:%d\n", genbuf, n); +#endif unlink(genbuf); SHM->n_bottom[bid-1]=0; } @@ -877,7 +878,7 @@ reload_fcache(void) buf[0] != '\n') { sscanf(buf, "%s", SHM->domain[SHM->top]); // XXX check buffer size po = buf + strlen(SHM->domain[SHM->top]); - while (*po == ' ') + while (*po == ' ' || *po == '\t') po++; strncpy(SHM->replace[SHM->top], po, 49); SHM->replace[SHM->top] diff --git a/mbbsd/cal.c b/mbbsd/cal.c index dca13c4d..a59eb9f9 100644 --- a/mbbsd/cal.c +++ b/mbbsd/cal.c @@ -59,13 +59,12 @@ unlockutmpmode() int vice(int money, char *item) { - char buf[128], vice[12]; + char buf[128]; unsigned int viceserial = (currutmp->lastact % 1000000) * 100 + rand() % 100; demoney(-money); setuserfile(buf, VICE_NEW); - sprintf(vice,"%8.8d\n", viceserial); - log_file(buf, vice, 1); + log_file(buf, LOG_CREAT | LOG_VF, "%8.8d\n", viceserial); snprintf(buf, sizeof(buf), "%s ªá¤F%d$ ½s¸¹[%08d]", item, money, viceserial); mail_id(cuser.userid, buf, "etc/vice.txt", "Ptt¸gÀÙ³¡"); @@ -96,18 +95,13 @@ osong(char *defaultid) /* Jaky ¤@¤H¤@¤ÑÂI¤@º */ if (!strcmp(buf, Cdatedate(&cuser.lastsong)) && !HAS_PERM(PERM_SYSOP)) { move(22, 0); - outs("§A¤µ¤Ñ¤w¸gÂI¹LÅo¡A©ú¤Ñ¦AÂI§a...."); - refresh(); - pressanykey(); - + vmsg("§A¤µ¤Ñ¤w¸gÂI¹LÅo¡A©ú¤Ñ¦AÂI§a...."); unlockutmpmode(); return 0; } if (cuser.money < 200) { move(22, 0); - outs("ÂIºqn200»Èò!...."); - refresh(); - pressanykey(); + vmsg("ÂIºqn200»Èò!...."); unlockutmpmode(); return 0; } @@ -262,18 +256,12 @@ inmailbox(int m) int p_cloak() { - char buf[4]; - getdata(b_lines - 1, 0, - currutmp->invisible ? "½T©wn²{¨?[y/N]" : "½T©wnÁô¨?[y/N]", - buf, sizeof(buf), LCECHO); - if (buf[0] != 'y') + if (getans(currutmp->invisible ? "½T©wn²{¨?[y/N]" : "½T©wnÁô¨?[y/N]") != 'y') return 0; if (cuser.money >= 19) { vice(19, "¥I¶OÁô¨"); currutmp->invisible %= 2; - outs((currutmp->invisible ^= 1) ? MSG_CLOAKED : MSG_UNCLOAK); - refresh(); - safe_sleep(1); + vmsg((currutmp->invisible ^= 1) ? MSG_CLOAKED : MSG_UNCLOAK); } return 0; } @@ -282,10 +270,7 @@ p_cloak() int p_from() { - char ans[4]; - - getdata(b_lines - 2, 0, "½T©wn§ï¬G¶m?[y/N]", ans, sizeof(ans), LCECHO); - if (ans[0] != 'y') + if (getans("½T©wn§ï¬G¶m?[y/N]") != 'y') return 0; reload_money(); if (cuser.money < 49) @@ -305,8 +290,7 @@ p_exmail() int n; if (cuser.exmailbox >= MAX_EXKEEPMAIL) { - prints("®e¶q³Ì¦h¼W¥[ %d «Ê¡A¤£¯à¦A¶R¤F¡C", MAX_EXKEEPMAIL); - refresh(); + vmsg("®e¶q³Ì¦h¼W¥[ %d «Ê¡A¤£¯à¦A¶R¤F¡C", MAX_EXKEEPMAIL); return 0; } snprintf(buf, sizeof(buf), @@ -375,14 +359,14 @@ int p_give() { int money, tax; - char id[IDLEN + 1], genbuf[90]; + char id[IDLEN + 1], money_buf[20]; move(1, 0); usercomplete("³o¦ì©¯¹B¨àªºid:", id); if (!id[0] || !strcmp(cuser.userid, id) || - !getdata(2, 0, "nµ¹¦h¤Ö¿ú:", genbuf, 7, LCECHO)) + !getdata(2, 0, "nµ¹¦h¤Ö¿ú:", money_buf, 7, LCECHO)) return 0; - money = atoi(genbuf); + money = atoi(money_buf); reload_money(); if (money > 0 && cuser.money >= money) { tax = give_tax(money); @@ -390,12 +374,9 @@ p_give() return 0; /* ú§¹µ|´N¨S¿úµ¹¤F */ deumoney(searchuser(id), money - tax); demoney(-money); - snprintf(genbuf, sizeof(genbuf), "%s\tµ¹%s\t%d\t%s", - cuser.userid, id, money - tax, ctime(&now)); - log_file(FN_MONEY, genbuf, 1); - genbuf[0] = 'n'; - getdata(3, 0, "n¦Û¦æ®Ñ¼g¬õ¥]³U¶Ü¡H[y/N]", genbuf, 2, LCECHO); - mail_redenvelop(cuser.userid, id, money - tax, genbuf[0]); + log_file(FN_MONEY, LOG_CREAT | LOG_VF, "%s\tµ¹%s\t%d\t%s", + cuser.userid, id, money - tax, ctime(&now)); + mail_redenvelop(cuser.userid, id, money - tax, getans("n¦Û¦æ®Ñ¼g¬õ¥]³U¶Ü¡H[y/N]")); } return 0; } @@ -444,26 +425,3 @@ p_sysinfo(void) return 0; } -/* ¤ppºâ¾÷ */ -#if 0 -static void -ccount(float *a, float b, int cmode) -{ - switch (cmode) { - case 0: - case 1: - case 2: - *a += b; - break; - case 3: - *a -= b; - break; - case 4: - *a *= b; - break; - case 5: - *a /= b; - break; - } -} -#endif diff --git a/mbbsd/calendar.c b/mbbsd/calendar.c index 5cb644c2..7928f8a2 100644 --- a/mbbsd/calendar.c +++ b/mbbsd/calendar.c @@ -116,6 +116,7 @@ FreeEvent(event_t * e) while (e) { n = e->next; + free(e->content); /* from strdup() */ free(e); e = n; } diff --git a/mbbsd/card.c b/mbbsd/card.c index 2ed12260..b46ce2bc 100644 --- a/mbbsd/card.c +++ b/mbbsd/card.c @@ -41,7 +41,7 @@ card_select(int *now) (*now == 2) ? cc[1] : cc[0], (*now == 3) ? cc[1] : cc[0], (*now == 4) ? cc[1] : cc[0]); - switch (egetch()) { + switch (igetch()) { case 'Q': case 'q': return 0; @@ -450,16 +450,12 @@ card_jack(int *db) if ((card_number(me[0]) == 0 && card_number(me[1]) == 12) || (card_number(me[1]) == 0 && card_number(me[0]) == 12)) { if (card_flower(me[0]) == 0 && card_flower(me[1]) == 0) { - move(b_lines - 1, 0); - prints("«D±`¤£¿ùò! (¶W¯Å¶Â³Ç§J!! ¥[ %d ¤¸)", JACK * 10); game_log(JACK, JACK * 10); - pressanykey(); + vmsg("«D±`¤£¿ùò! (¶W¯Å¶Â³Ç§J!! ¥[ %d ¤¸)", JACK * 10); return 0; } else { - move(b_lines - 1, 0); - prints("«Ü¤£¿ùò! (¶Â³Ç§J!! ¥[ %d ¤¸)", JACK * 5); game_log(JACK, JACK * 5); - pressanykey(); + vmsg("«Ü¤£¿ùò! (¶Â³Ç§J!! ¥[ %d ¤¸)", JACK * 5); return 0; } } @@ -467,10 +463,8 @@ card_jack(int *db) (card_number(cpu[1]) == 0 && card_number(cpu[0]) == 12)) { c[0] = 1; card_show(cpu, c, me, m); - move(b_lines - 1, 0); - prints("¼K¼K...¤£¦n·N«ä....¶Â³Ç§J!!"); game_log(JACK, 0); - pressanykey(); + vmsg("¼K¼K...¤£¦n·N«ä....¶Â³Ç§J!!"); return 0; } if ((*db < 0) && (card_number(me[0]) == card_number(me[1])) && @@ -485,27 +479,21 @@ card_jack(int *db) m[i] = 1; card_show(cpu, c, me, m); if (card_alls_lower(me) > 21) { - move(b_lines - 1, 0); - prints("¶ã¶ã...Ãz±¼¤F!"); game_log(JACK, 0); - pressanykey(); + vmsg("¶ã¶ã...Ãz±¼¤F!"); return 0; } i++; if ((i == 3) && (card_number(me[0]) == 7) && (card_number(me[1]) == 7) && (card_number(me[2]) == 7)) { - move(b_lines - 1, 0); - prints("«Ü¤£¿ùò! (©¯¹B¤C¸¹!! ¥[ %d ¤¸)", JACK * 7); game_log(JACK, JACK * 7); - pressanykey(); + vmsg("«Ü¤£¿ùò! (©¯¹B¤C¸¹!! ¥[ %d ¤¸)", JACK * 7); return 0; } } if (i == 5) { /* ¹L¤Ãö */ - move(b_lines - 1, 0); - prints("¦n¼F®`ò! ¹L¤Ãö¹Æ! ¥[P¹ô %d ¤¸!", 5 * JACK); game_log(JACK, JACK * 5); - pressanykey(); + vmsg("¦n¼F®`ò! ¹L¤Ãö¹Æ! ¥[P¹ô %d ¤¸!", 5 * JACK); return 0; } j = 2; @@ -516,19 +504,15 @@ card_jack(int *db) c[j] = 1; if (card_alls_lower(cpu) > 21) { card_show(cpu, c, me, m); - move(b_lines - 1, 0); - prints("¨þ¨þ...¹q¸£Ãz±¼¤F! §AŤF! ¥i±oP¹ô %d ¤¸", JACK * 2); game_log(JACK, JACK * 2); - pressanykey(); + vmsg("¨þ¨þ...¹q¸£Ãz±¼¤F! §AŤF! ¥i±oP¹ô %d ¤¸", JACK * 2); return 0; } j++; } card_show(cpu, c, me, m); - move(b_lines - 1, 0); - prints("«z«z...¹q¸£Ä¹¤F!"); game_log(JACK, 0); - pressanykey(); + vmsg("«z«z...¹q¸£Ä¹¤F!"); return 0; } @@ -595,19 +579,15 @@ ten_helf() m[i] = 1; card_show(cpu, c, me, m); if (card_all(me) > 21) { - move(b_lines - 1, 0); - prints("¶ã¶ã...Ãz±¼¤F!"); game_log(TEN_HALF, 0); - pressanykey(); + vmsg("¶ã¶ã...Ãz±¼¤F!"); return 0; } i++; } if (i == 5) { /* ¹L¤Ãö */ - move(b_lines - 1, 0); - prints("¦n¼F®`ò! ¹L¤Ãö¹Æ! ¥[P¹ô %d ¤¸!", 5 * PMONEY); game_log(TEN_HALF, PMONEY * 5); - pressanykey(); + vmsg("¦n¼F®`ò! ¹L¤Ãö¹Æ! ¥[P¹ô %d ¤¸!", 5 * PMONEY); return 0; } j = 1; @@ -618,19 +598,15 @@ ten_helf() c[j] = 1; if (card_all(cpu) > 21) { card_show(cpu, c, me, m); - move(b_lines - 1, 0); - prints("¨þ¨þ...¹q¸£Ãz±¼¤F! §AŤF! ¥i±oP¹ô %d ¤¸", PMONEY * 2); game_log(TEN_HALF, PMONEY * 2); - pressanykey(); + vmsg("¨þ¨þ...¹q¸£Ãz±¼¤F! §AŤF! ¥i±oP¹ô %d ¤¸", PMONEY * 2); return 0; } j++; } card_show(cpu, c, me, m); - move(b_lines - 1, 0); - prints("«z«z...¹q¸£Ä¹¤F!"); game_log(TEN_HALF, 0); - pressanykey(); + vmsg("«z«z...¹q¸£Ä¹¤F!"); return 0; } diff --git a/mbbsd/chat.c b/mbbsd/chat.c index f94cfc5f..06f706c3 100644 --- a/mbbsd/chat.c +++ b/mbbsd/chat.c @@ -386,7 +386,7 @@ t_chat() while (chatting) { move(b_lines - 1, currchar + chatid_len); - ch = igetkey(); + ch = igetch(); switch (ch) { case KEY_DOWN: diff --git a/mbbsd/chc.c b/mbbsd/chc.c index 12aed0ad..d80cf276 100644 --- a/mbbsd/chc.c +++ b/mbbsd/chc.c @@ -575,14 +575,14 @@ hisplay(int s, chcusr_t *user1, chcusr_t *user2, board_t board, board_t tmpbrd) if (chc_lefttime < 0) { chc_lefttime = 0; - /* to make him break out igetkey() */ + /* to make him break out igetch() */ chc_from.r = -2; chc_broadcast_send(act_list, board); } chc_drawline(board, user1, user2, TIME_ROW); move(1, 0); oflush(); - switch (igetkey()) { + switch (igetch()) { case 'q': endgame = 2; endturn = 1; @@ -653,7 +653,7 @@ myplay(int s, chcusr_t *user1, chcusr_t *user2, board_t board, board_t tmpbrd) chc_drawline(board, user1, user2, TIME_ROW); chc_movecur(chc_cursor.r, chc_cursor.c); oflush(); - ch = igetkey(); + ch = igetch(); chc_lefttime = CHC_TIMEOUT - (now - start_time); if (chc_lefttime < 0) ch = 'q'; diff --git a/mbbsd/chicken.c b/mbbsd/chicken.c index 1685d842..78bcf358 100644 --- a/mbbsd/chicken.c +++ b/mbbsd/chicken.c @@ -102,8 +102,7 @@ static int new_chicken() { chicken_t *mychicken = &cuser.mychicken; - char buf[150]; - int price; + int price, i; clear(); move(2, 0); @@ -116,19 +115,18 @@ new_chicken() "(k)§ÔªÌ $85 (l)ªü«ó $200 (m)°¨^¤E $200 (n)´N¥i¤H$100 " "[o]ù²ú $77\n" "[0]¦Û¤v $0\n"); - getdata_str(7, 0, "½Ð¿ï¾Ü§An¾iªº°Êª«¡G", buf, 3, LCECHO, "0"); + i = getans("½Ð¿ï¾Ü§An¾iªº°Êª«¡G"); - buf[0] -= 'a'; - if (buf[0] < 0 || buf[0] > NUM_KINDS - 1) + i -= 'a'; + if (i < 0 || i > NUM_KINDS - 1) return 0; - mychicken->type = buf[0]; + mychicken->type = i; reload_money(); price = egg_price[(int)mychicken->type]; if (cuser.money < price) { - prints("\n ¿ú¤£°÷¶R³J³J,³J³Jn %d ¤¸", price); - refresh(); + vmsg("\n ¿ú¤£°÷¶R³J³J,³J³Jn %d ¤¸", price); return 0; } vice(price, "Ãdª«³J"); @@ -136,11 +134,10 @@ new_chicken() getdata(8, 0, "À°¨e¨úÓ¦n¦W¦r¡G", mychicken->name, sizeof(mychicken->name), DOECHO); - snprintf(buf, sizeof(buf), - "\033[31m%s \033[m¾i¤F¤@°¦¥s\033[33m %s \033[mªº " - "\033[32m%s\033[m ©ó %s\n", cuser.userid, - mychicken->name, chicken_type[(int)mychicken->type], ctime(&now)); - log_file(CHICKENLOG, buf, 1); + log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + "\033[31m%s \033[m¾i¤F¤@°¦¥s\033[33m %s \033[mªº " + "\033[32m%s\033[m ©ó %s\n", cuser.userid, + mychicken->name, chicken_type[(int)mychicken->type], ctime(&now)); mychicken->lastvisit = mychicken->birthday = mychicken->cbirth = now; mychicken->food = 0; mychicken->weight = time_change[(int)mychicken->type][WEIGHT] / 3; @@ -400,12 +397,10 @@ ch_buyitem(int money, char *picture, int *item, int haveticket) else demoney(-money * num); show_file(picture, 5, 14, NO_RELOAD); + pressanykey(); } else { - move(b_lines - 1, 0); - clrtoeol(); - outs("²{ª÷¤£°÷ !!!"); + vmsg("²{ª÷¤£°÷ !!!"); } - pressanykey(); } static void @@ -443,20 +438,17 @@ static void ch_kill() { chicken_t *mychicken = &cuser.mychicken; - char buf[150], ans[4]; + int ans; - snprintf(buf, sizeof(buf), "±ó¾i³o%sn³Q»@ 100 ¤¸, ¬O§_n±ó¾i?(y/N)", - chicken_type[(int)mychicken->type]); - getdata_str(23, 0, buf, ans, sizeof(ans), DOECHO, "N"); - if (ans[0] == 'y') { + ans = getans("±ó¾in³Q»@ 100 ¤¸, ¬O§_n±ó¾i?(y/N)"); + if (ans == 'y') { vice(100, "±ó¾iÃdª«¶O"); more(CHICKEN_PIC "/deadth", YEA); - snprintf(buf, sizeof(buf), + log_file(CHICKENLOG, LOG_CREAT | LOG_VF, "\033[31m%s \033[m§â \033[33m%s\033[m\033[32m %s " "\033[m®_¤F ©ó %s\n", cuser.userid, mychicken->name, chicken_type[(int)mychicken->type], ctime(&now)); - log_file(CHICKENLOG, buf, 1); mychicken->name[0] = 0; } } @@ -485,8 +477,7 @@ ch_sell() int money = (age * food_price[(int)mychicken->type] * 3 + (mychicken->hp_max * 10 + mychicken->weight) / time_change[(int)mychicken->type][HP_MAX]) * 3 / 2 - - mychicken->sick; - char buf[150], ans[4]; + mychicken->sick, ans; if (money < 0) money = 0; @@ -508,15 +499,14 @@ ch_sell() pressanykey(); return 0; } - snprintf(buf, sizeof(buf), "³o°¦%d·³%s¥i¥H½æ %d ¤¸, ¬O§_n½æ?(y/N)", age, - chicken_type[(int)mychicken->type], money); - getdata_str(23, 0, buf, ans, sizeof(ans), DOECHO, "N"); - if (ans[0] == 'y') { - snprintf(buf, sizeof(buf), "\033[31m%s\033[m §â \033[33m%s\033[m " - "\033[32m%s\033[m ¥Î \033[36m%d\033[m ½æ¤F ©ó %s\n", - cuser.userid, mychicken->name, - chicken_type[(int)mychicken->type], money, ctime(&now)); - log_file(CHICKENLOG, buf, 1); + ans = getans("³o°¦%d·³%s¥i¥H½æ %d ¤¸, ¬O§_n½æ?(y/N)", age, + chicken_type[(int)mychicken->type], money); + if (ans == 'y') { + log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + "\033[31m%s\033[m §â \033[33m%s\033[m " + "\033[32m%s\033[m ¥Î \033[36m%d\033[m ½æ¤F ©ó %s\n", + cuser.userid, mychicken->name, + chicken_type[(int)mychicken->type], money, ctime(&now)); mychicken->lastvisit = mychicken->name[0] = 0; passwd_update(usernum, &cuser); more(CHICKEN_PIC "/sell", YEA); @@ -653,7 +643,6 @@ deadtype(chicken_t * thechicken) { chicken_t *mychicken = &cuser.mychicken; int i; - char buf[150]; if (thechicken->hp <= 0) /* hp¥ÎºÉ */ i = 1; @@ -670,13 +659,10 @@ deadtype(chicken_t * thechicken) return 0; if (thechicken == mychicken) { - snprintf(buf, sizeof(buf), - "\033[31m%s\033[m ©Ò¯k·Rªº\033[33m %s\033[32m %s " - "\033[m±¾¤F ©ó %s\n", - cuser.userid, thechicken->name, - chicken_type[(int)thechicken->type], - ctime(&now)); - log_file(CHICKENLOG, buf, 1); + log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + "\033[31m%s\033[m ©Ò¯k·Rªº\033[33m %s\033[32m %s " + "\033[m±¾¤F ©ó %s\n", cuser.userid, thechicken->name, + chicken_type[(int)thechicken->type], ctime(&now)); mychicken->name[0] = 0; passwd_update(usernum, &cuser); } @@ -723,20 +709,18 @@ static void ch_changename() { chicken_t *mychicken = &cuser.mychicken; - char buf[150], newname[20] = ""; + char newname[20] = ""; getdata_str(b_lines - 1, 0, "¶â..§ïÓ¦n¦W¦r§a:", newname, 18, DOECHO, mychicken->name); if (strlen(newname) >= 3 && strcmp(newname, mychicken->name)) { - snprintf(buf, sizeof(buf), - "\033[31m%s\033[m §â¯k·Rªº\033[33m %s\033[32m %s " - "\033[m§ï¦W¬°\033[33m %s\033[m ©ó %s\n", - cuser.userid, mychicken->name, - chicken_type[(int)mychicken->type], - newname, ctime(&now)); strlcpy(mychicken->name, newname, sizeof(mychicken->name)); - log_file(CHICKENLOG, buf, 1); + log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + "\033[31m%s\033[m §â¯k·Rªº\033[33m %s\033[32m %s " + "\033[m§ï¦W¬°\033[33m %s\033[m ©ó %s\n", + cuser.userid, mychicken->name, + chicken_type[(int)mychicken->type], newname, ctime(&now)); } } @@ -928,20 +912,18 @@ chickenpk(int fd) memcpy(&ouser, &xuser, sizeof(userec_t)); reload_chicken(); if (!ochicken->name[0] || !mychicken->name[0]) { - outmsg("¦³¤@¤è¨S¦³Ãdª«"); /* Ptt:§«¤îpage®É§âÃdª«½æ±¼ */ bell(); - refresh(); + vmsg("¦³¤@¤è¨S¦³Ãdª«"); /* Ptt:§«¤îpage®É§âÃdª«½æ±¼ */ add_io(0, 0); close(fd); unlockutmpmode(); - sleep(1); return 0; } show_chicken_data(ochicken, mychicken); add_io(fd, 3); /* §âfd¥[¨ìigetchºÊµø */ while (1) { r = rand(); - ch = igetkey(); + ch = igetch(); getuser(mateid); memcpy(&ouser, &xuser, sizeof(userec_t)); reload_chicken(); diff --git a/mbbsd/dark.c b/mbbsd/dark.c index 4c9c6486..e26dd890 100644 --- a/mbbsd/dark.c +++ b/mbbsd/dark.c @@ -1,4 +1,4 @@ -/* $Id: dark.c,v 1.8 2002/07/22 19:02:00 in2 Exp $ */ +/* $Id$ */ #include "bbs.h" #define RED 1 @@ -33,14 +33,6 @@ brdswap(sint y, sint x, sint ly, sint lx) brd[ly][lx].value = -1; } -static void -pprints(sint y, sint x, char *s) -{ - move(y, x); - clrtoeol(); - prints("%s", s); -} - static sint Is_win(item att, item det, sint y, sint x, sint ly, sint lx) { @@ -370,11 +362,11 @@ main_dark(int fd, userinfo_t * uin) if (currutmp->turn) { brd_rand(); send(fd, &brd, sizeof(brd), 0); - pprints(21, 0, " [1;37m[1;33m¡»[1;37m§A¬O¥ý¤â[m"); - pprints(22, 0, " [1;33m¡»[5;35m½ü¨ì§A¤U¤F[m"); + mouts(21, 0, " [1;37m[1;33m¡»[1;37m§A¬O¥ý¤â[m"); + mouts(22, 0, " [1;33m¡»[5;35m½ü¨ì§A¤U¤F[m"); } else { recv(fd, &brd, sizeof(brd), 0); - pprints(21, 0, " [1;33m¡»[1;37m§A¬O«á¤â[m"); + mouts(21, 0, " [1;33m¡»[1;37m§A¬O«á¤â[m"); } move(12, 3); prints("%s[0³Ó0±Ñ][5;31m¢þ¢û[1;37m.[m%s[0³Ó0±Ñ]", currutmp->userid, currutmp->mateid); @@ -396,7 +388,7 @@ main_dark(int fd, userinfo_t * uin) end = -1; break; } - ch = igetkey(); + ch = igetch(); if (ch == I_OTHERDATA) { ch = recv(fd, &curr, sizeof(curr), 0); if (ch != sizeof(curr)) { @@ -412,20 +404,20 @@ main_dark(int fd, userinfo_t * uin) break; } if (curr.end == -3) - pprints(23, 30, "\033[33mn¨D¦X´Ñ\033[m"); + mouts(23, 30, "\033[33mn¨D¦X´Ñ\033[m"); else if (curr.end == -4) - pprints(23, 30, "\033[33mn¨D´«Ãä\033[m"); + mouts(23, 30, "\033[33mn¨D´«Ãä\033[m"); else if (curr.end == -5) - pprints(23, 30, "\033[33mn¨D³s¦Y\033[m"); + mouts(23, 30, "\033[33mn¨D³s¦Y\033[m"); else - pprints(23, 30, ""); + mouts(23, 30, ""); recv(fd, &brd, sizeof(brd), 0); my = curr.y; mx = curr.x; redraw(); if (curr.end) - pprints(22, 0, " [1;33m¡»[5;35m½ü¨ì§A¤U¤F[m"); + mouts(22, 0, " [1;33m¡»[5;35m½ü¨ì§A¤U¤F[m"); move(cury[my], curx[mx]); } else { if (currutmp->turn == 'p') { @@ -434,7 +426,7 @@ main_dark(int fd, userinfo_t * uin) currutmp->turn = 'e'; break; } else { - pprints(23, 30, ""); + mouts(23, 30, ""); *buf = 0; currutmp->turn = (uin->turn) ? 0 : 1; } @@ -442,17 +434,17 @@ main_dark(int fd, userinfo_t * uin) if (ch == 'y') { currutmp->color = (currutmp->color == '1') ? '0' : '1'; uin->color = (uin->color == '1') ? '0' : '1'; - pprints(21, 0, (currutmp->color == '1') ? " \033[1;33m¡»[1;31m§A«ù¬õ¦â´Ñ\033[m" : " \033[1;33m¡»[1;36m§A«ù¶Â¦â´Ñ\033[m"); + mouts(21, 0, (currutmp->color == '1') ? " \033[1;33m¡»[1;31m§A«ù¬õ¦â´Ñ\033[m" : " \033[1;33m¡»[1;36m§A«ù¶Â¦â´Ñ\033[m"); } else { - pprints(23, 30, ""); + mouts(23, 30, ""); currutmp->turn = (uin->turn) ? 0 : 1; } } else if (currutmp->turn == 'g') { if (ch == 'y') { cont = 1; - pprints(21, 0, " \033[1;33m¡»[1;31m§A«ù¬õ¦â´Ñ\033[m ¥i³s¦Y"); + mouts(21, 0, " \033[1;33m¡»[1;31m§A«ù¬õ¦â´Ñ\033[m ¥i³s¦Y"); } else { - pprints(23, 30, ""); + mouts(23, 30, ""); currutmp->turn = (uin->turn) ? 0 : 1; } } @@ -460,7 +452,7 @@ main_dark(int fd, userinfo_t * uin) if (uin->turn == 'g') { cont = 1; uin->turn = (currutmp->turn) ? 0 : 1; - pprints(21, 10, "¥i³s¦Y"); + mouts(21, 10, "¥i³s¦Y"); } end = playing(fd, currutmp->color - '0', ch, &go_on, uin); @@ -493,12 +485,12 @@ main_dark(int fd, userinfo_t * uin) continue; } if (!i && currutmp->color == '1') { - pprints(21, 0, " \033[1;33m¡»[1;31m§A«ù¬õ¦â´Ñ\033[m"); + mouts(21, 0, " \033[1;33m¡»[1;31m§A«ù¬õ¦â´Ñ\033[m"); i++; move(cury[my], curx[mx]); } if (!i && currutmp->color == '0') { - pprints(21, 0, " \033[1;33m¡»[1;36m§A«ù¶Â¦â´Ñ\033[m"); + mouts(21, 0, " \033[1;33m¡»[1;36m§A«ù¶Â¦â´Ñ\033[m"); i++; move(cury[my], curx[mx]); } @@ -540,7 +532,7 @@ main_dark(int fd, userinfo_t * uin) } break; case -3: - pprints(22, 0, "[1;31m¦X´Ñò!! ¤U¦¸¦b¤À°ª¤U§a ^_^[m"); + mouts(22, 0, "[1;31m¦X´Ñò!! ¤U¦¸¦b¤À°ª¤U§a ^_^[m"); break; default: add_io(0, 0); diff --git a/mbbsd/edit.c b/mbbsd/edit.c index acc7bac0..d8f376fc 100644 --- a/mbbsd/edit.c +++ b/mbbsd/edit.c @@ -258,7 +258,7 @@ ask(char *prompt) standout(); prints("%s", prompt); standend(); - ch = igetkey(); + ch = igetch(); move(0, 0); clrtoeol(); return (ch); @@ -966,7 +966,6 @@ write_file(char *fpath, int saveheader, int *islocal) switch (ans[0]) { case 'a': outs("¤å³¹\033[1m ¨S¦³ \033[m¦s¤J"); - safe_sleep(1); aborted = -1; break; case 'r': @@ -1051,7 +1050,7 @@ write_file(char *fpath, int saveheader, int *islocal) } currline = NULL; - if (postrecord.times > MAX_CROSSNUM - 1) + if (postrecord.times > MAX_CROSSNUM-1 && hbflcheck(currbid, currutmp->uid)) anticrosspost(); if (po && sum == 3) { @@ -1682,7 +1681,7 @@ vedit(char *fpath, int saveheader, int *islocal) move(curr_window_line, ch); if (!line_dirty && strcmp(line, currline->data)) strcpy(line, currline->data); - ch = igetkey(); + ch = igetch(); /* jochang debug */ if ((interval = (now - th))) { th = now; @@ -1697,19 +1696,6 @@ vedit(char *fpath, int saveheader, int *islocal) count = 0; tin = interval; } - /* ³sÄò240Óinterval¤@¼Ë , ¤À©ú¬O¦bÀÄ°] - if (count >= 240) { - char buf[200]; - snprintf(buf, sizeof(buf), "\033[1;33;46m%s\033[37m¦b\033[37;45m%s\n" - "\033[37mªO¹HªkÁÈ¿ú , %s\033[m", cuser.userid, - currboard, ctime(&now)); - log_file("etc/illegal_money", buf, 1); - money = 0; - post_violatelaw(cuser.userid, "Ptt ¨t²Îĵ¹î", "¹HªkÁÈ¿ú", "¦©°£¤£ªk©Ò±o"); - mail_violatelaw(cuser.userid, "Ptt ¨t²Îĵ¹î", "¹HªkÁÈ¿ú", "¦©°£¤£ªk©Ò±o"); - demoney(10000); - abort_bbs(0); - } */ if (raw_mode) switch (ch) { case Ctrl('S'): @@ -1836,28 +1822,27 @@ vedit(char *fpath, int saveheader, int *islocal) char *tmp, *apos = ans; int fg, bg; - strlcpy(color, "\033[", sizeof(color)); + strcpy(color, "\033["); if (isdigit(*apos)) { - snprintf(color, sizeof(color), - "%s%c", color, *(apos++)); + sprintf(color,"%s%c", color, *(apos++)); if (*apos) - snprintf(color, sizeof(color), "%s;", color); + strcat(color, ";"); } if (*apos) { if ((tmp = strchr(t, toupper(*(apos++))))) fg = tmp - t + 30; else fg = 37; - snprintf(color, sizeof(color), "%s%d", color, fg); + sprintf(color, "%s%d", color, fg); } if (*apos) { if ((tmp = strchr(t, toupper(*(apos++))))) bg = tmp - t + 40; else bg = 40; - snprintf(color, sizeof(color), "%s;%d", color, bg); + sprintf(color, "%s;%d", color, bg); } - snprintf(color, sizeof(color), "%sm", color); + strcat(color, "m"); insert_string(color); } else insert_string(reset_color); @@ -2023,7 +2008,7 @@ vedit(char *fpath, int saveheader, int *islocal) case '\n': #ifdef MAX_EDIT_LINE if( totaln == MAX_EDIT_LINE ){ - vmsg("MAX_EDIT_LINE exceed"); + outs("MAX_EDIT_LINE exceed"); break; } #endif diff --git a/mbbsd/fav.c b/mbbsd/fav.c index 8d1381cb..c5bd6c0d 100644 --- a/mbbsd/fav.c +++ b/mbbsd/fav.c @@ -456,10 +456,9 @@ int fav_save(void) write_favrec(fd, fp); close(fd); if (dashs(buf) == 4) { - char buf3[128]; time_t now = time(NULL); - sprintf(buf3, "%s %s", cuser.userid, ctime(&now)); - log_file(BBSHOME"/dirty.hack", buf3, 1); + log_file(BBSHOME "/dirty.hack", LOG_CREAT | LOG_VF, + "%s %s", cuser.userid, ctime(&now)); return -1; } Rename(buf, buf2); diff --git a/mbbsd/gamble.c b/mbbsd/gamble.c index 33e67bb8..512df7f2 100644 --- a/mbbsd/gamble.c +++ b/mbbsd/gamble.c @@ -159,9 +159,7 @@ ticket(int bid) ch_buyitem(price, "etc/buyticket", &n, 0); if (bid && !dashf(fn_ticket)) { - move(b_lines - 1, 0); - prints("«z!! @£«®º...ªO¥D¤w¸g°±¤î¤Uª`¤F ¤£¯à½äÂP"); - pressanykey(); + vmsg("«z!! @£«®º...ªO¥D¤w¸g°±¤î¤Uª`¤F ¤£¯à½äÂP"); break; } diff --git a/mbbsd/gomo.c b/mbbsd/gomo.c index 55060b67..82e9af8f 100644 --- a/mbbsd/gomo.c +++ b/mbbsd/gomo.c @@ -371,7 +371,7 @@ gomoku(int fd) } else clrtoeol(); BGOTOCUR(mv.x, mv.y); - ch = igetkey(); + ch = igetch(); if (ch != I_OTHERDATA) iwantpass = 0; if (ch == 'q') { @@ -174,6 +174,7 @@ dogetch() if (len == 0 || errno != EINTR) abort_bbs(0); /* raise(SIGHUP); */ + } #ifdef SKIP_TELNET_CONTROL_SIGNAL } while( inbuf[0] == -1 ); @@ -198,9 +199,31 @@ static int water_which_flag = 0; int igetch() { - register int ch; - while ((ch = dogetch())) { + register int ch, mode = 0, last = 0; + while ((ch = dogetch())) { + if (mode == 0 && ch == KEY_ESC) // here is state machine for 2 bytes key + mode = 1; + else if (mode == 1) { /* Escape sequence */ + if (ch == '[' || ch == 'O') + mode = 2; + else if (ch == '1' || ch == '4') + { mode = 3; last = ch; } + else + { + KEY_ESC_arg = ch; + return KEY_ESC; + } + } else if (mode == 2 && ch >= 'A' && ch <= 'D') /* Cursor key */ + return KEY_UP + (ch - 'A'); + else if (mode == 2 && ch >= '1' && ch <= '6') + { mode = 3; last = ch; } + else if (mode == 3 && ch == '~') { /* Ins Del Home End PgUp PgDn */ + return KEY_HOME + (last - '1'); + } + else // here is switch for default keys switch (ch) { + case IAC: /* filters */ + continue; #ifdef DEBUG case Ctrl('Q'):{ struct rusage ru; @@ -234,8 +257,8 @@ igetch() free(screen0); redoscr(); continue; - } else - return (ch); + } + return ch; case KEY_TAB: if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW)) if (currutmp != NULL && watermode > 0) { @@ -244,8 +267,7 @@ igetch() t_display_new(); continue; } - return ch; - break; + return ch; case Ctrl('R'): if (currutmp == NULL) @@ -334,7 +356,7 @@ igetch() continue; } } - return (ch); + return ch; case Ctrl('F'): if (WATERMODE(WATER_NEW)) { @@ -353,7 +375,7 @@ igetch() continue; } } - return ch; + return ch; case Ctrl('G'): if (WATERMODE(WATER_NEW)) { @@ -376,13 +398,8 @@ igetch() #endif continue; - case IAC: - // disallow user input telnet protocol leading char IAC chr(255) - // TODO parse telnet protocol - continue; - default: - return ch; + return ch; } } return 0; @@ -508,7 +525,7 @@ oldgetdata(int line, int col, char *prompt, char *buf, int len, int echo) edit_outs(buf); clen = currchar = strlen(buf); - while (move(y, x + currchar), (ch = igetkey()) != '\r') { + while (move(y, x + currchar), (ch = igetch()) != '\r') { switch (ch) { case KEY_DOWN: case Ctrl('N'): case KEY_UP: case Ctrl('P'): @@ -610,14 +627,6 @@ getdata_buf(int line, int col, char *prompt, char *buf, int len, int echo) return oldgetdata(line, col, prompt, buf, len, echo); } -char -getans(char *prompt) -{ - char ans[5]; - - getdata(b_lines, 0, prompt, ans, sizeof(ans), LCECHO); - return ans[0]; -} int getdata_str(int line, int col, char *prompt, char *buf, int len, int echo, char *defaultstr) @@ -634,61 +643,4 @@ getdata(int line, int col, char *prompt, char *buf, int len, int echo) return oldgetdata(line, col, prompt, buf, len, echo); } -int -rget(int x, char *prompt) -{ - register int ch; - - move(x, 0); - clrtobot(); - outs(prompt); - refresh(); - - ch = igetch(); - if (ch >= 'A' && ch <= 'Z') - ch = tolower(ch); - - return ch; -} - - -int -igetkey() -{ - int mode; - int ch, last; - mode = last = 0; - while (1) { - if( !(ch = igetch()) ) - continue; - if (mode == 0) { - if (ch == KEY_ESC) - mode = 1; - else - return ch; /* Normal Key */ - } else if (mode == 1) { /* Escape sequence */ - if (ch == '[' || ch == 'O') - mode = 2; - else if (ch == '1' || ch == '4') - mode = 3; - else { - KEY_ESC_arg = ch; - return KEY_ESC; - } - } else if (mode == 2) { /* Cursor key */ - if (ch >= 'A' && ch <= 'D') - return KEY_UP + (ch - 'A'); - else if (ch >= '1' && ch <= '6') - mode = 3; - else - return ch; - } else if (mode == 3) { /* Ins Del Home End PgUp PgDn */ - if (ch == '~') - return KEY_HOME + (last - '1'); - else - return ch; - } - last = ch; - } -} diff --git a/mbbsd/mail.c b/mbbsd/mail.c index f3e7a855..b8da8226 100644 --- a/mbbsd/mail.c +++ b/mbbsd/mail.c @@ -24,20 +24,14 @@ setforward() getdata(b_lines, 0, "½T©w¶}±Ò¦Û°ÊÂà«H¥\\¯à?(Y/n)", yn, sizeof(yn), LCECHO); if (yn[0] != 'n' && (fp = fopen(buf, "w"))) { - move(b_lines, 0); - clrtoeol(); fprintf(fp, "%s", ip); fclose(fp); - outs("³]©w§¹¦¨!"); - refresh(); + vmsg("³]©w§¹¦¨!"); return 0; } } - move(b_lines, 0); - clrtoeol(); - outs("¨ú®ø¦Û°ÊÂà«H!"); unlink(buf); - refresh(); + vmsg("¨ú®ø¦Û°ÊÂà«H!"); return 0; } @@ -163,27 +157,13 @@ chkmailbox() mailmaxkeep = max_keepmail + cuser.exmailbox; m_init(); if ((mailkeep = get_num_records(currmaildir, sizeof(fileheader_t))) > - mailmaxkeep) { - move(b_lines, 0); - clrtoeol(); + mailmaxkeep || + (mailsum = get_sum_records(currmaildir, sizeof(fileheader_t))) > + mailsumlimit) { bell(); - prints("±z«O¦s«H¥ó¼Æ¥Ø %d ¶W¥X¤W %d, ½Ð¾ã²z", - mailkeep, mailmaxkeep); bell(); - refresh(); - igetch(); - return mailkeep; - } - if ((mailsum = get_sum_records(currmaildir, sizeof(fileheader_t))) > - mailsumlimit) { - move(b_lines, 0); - clrtoeol(); - bell(); - prints("±z«O¦s«H¥ó®e¶q %d(k)¶W¥X¤W %d(k), ½Ð¾ã²z", - mailsum, mailsumlimit); - bell(); - refresh(); - igetch(); + vmsg("±z«O¦s«H¥ó¼Æ¥Ø©Î®e¶q %d ¶W¥X¤W %d, ½Ð¾ã²z", + mailkeep, mailmaxkeep); return mailkeep; } } @@ -498,13 +478,9 @@ multi_send(char *title) if (vedit(fpath, YEA, NULL) == -1) { unlink(fpath); curredit = 0; - outs(msg_cancel); - pressanykey(); + vmsg(msg_cancel); return; } - stand_title("±H«H¤¤..."); - refresh(); - listing = 80; for (p = toplev; p; p = p->next) { @@ -530,15 +506,14 @@ multi_send(char *title) mymail.filemode |= FILE_MULTI; /* multi-send flag */ sethomedir(genbuf, p->word); if (append_record_forward(genbuf, &mymail, sizeof(mymail)) == -1) - outs(err_uid); + vmsg(err_uid); mailalert(p->word); } hold_mail(fpath, NULL); unlink(fpath); curredit = 0; } else - outs(msg_cancel); - pressanykey(); + vmsg(msg_cancel); } static int @@ -636,8 +611,7 @@ mail_all() outs(err_uid); snprintf(genbuf, sizeof(genbuf), "%*s %5d / %5d", IDLEN + 1, userid, i + 1, unum); - outmsg(genbuf); - refresh(); + vmsg(genbuf); } } return 0; @@ -726,32 +700,21 @@ read_new_mail(fileheader_t * fptr) while (!done) { int more_result = more(fname, YEA); - switch (more_result) { - case 1: - return READ_PREV; - case 2: - return RELATE_PREV; - case 3: - return READ_NEXT; - case 4: - return RELATE_NEXT; - case 5: - return RELATE_FIRST; - case 6: - return 0; - case 7: + switch (more_result) { + case 999: mail_reply(idc, fptr, currmaildir); - return FULLUPDATE; - case 8: - multi_reply(idc, fptr, currmaildir); - return FULLUPDATE; - } - move(b_lines, 0); - clrtoeol(); - outs(msg_mailer); - refresh(); - - switch (egetch()) { + return FULLUPDATE; + case -1: + return READ_SKIP; + case 0: + break; + default: + return more_result; + } + + outmsg(msg_mailer); + + switch (igetch()) { case 'r': case 'R': mail_reply(idc, fptr, currmaildir); @@ -860,22 +823,19 @@ mail_del(int ent, fileheader_t * fhdr, char *direct) if (fhdr->filemode & FILE_MARKED) return DONOTHING; - getdata(1, 0, msg_del_ny, genbuf, 3, LCECHO); - if (genbuf[0] == 'y') { - strlcpy(currfile, fhdr->filename, sizeof(currfile)); + if (currmode & MODE_SELECT) { + vmsg("½Ð¥ý¦^¨ì¥¿±`¼Ò¦¡«á¦A¶i¦æ§R°£..."); + return READ_REDRAW; + } + + if (getans(msg_del_ny) == 'y') { if (!delete_record(direct, sizeof(*fhdr), ent)) { setdirpath(genbuf, direct, fhdr->filename); unlink(genbuf); - if ((currmode & MODE_SELECT)) { - int index; - sethomedir(genbuf, cuser.userid); - index = getindex(genbuf, fhdr->filename, sizeof(fileheader_t)); - delete_record(genbuf, sizeof(fileheader_t), index); - } return DIRCHANGED; } } - return TITLE_REDRAW; + return READ_REDRAW; } static int @@ -893,42 +853,22 @@ mail_read(int ent, fileheader_t * fhdr, char *direct) if (more_result != -1) { fhdr->filemode |= FILE_READ; - if ((currmode & MODE_SELECT)) { - int index; - - index = getindex(currmaildir, fhdr->filename, - sizeof(fileheader_t)); - substitute_record(currmaildir, fhdr, sizeof(*fhdr), index); - substitute_record(direct, fhdr, sizeof(*fhdr), ent); - } else - substitute_record(currmaildir, fhdr, sizeof(*fhdr), ent); + substitute_ref_record(direct, fhdr, ent); } switch (more_result) { - case 1: - return READ_PREV; - case 2: - return RELATE_PREV; - case 3: - return READ_NEXT; - case 4: - return RELATE_NEXT; - case 5: - return RELATE_FIRST; - case 6: - return FULLUPDATE; - case 7: + case 999: mail_reply(ent, fhdr, direct); return FULLUPDATE; - case 8: - multi_reply(ent, fhdr, direct); - return FULLUPDATE; + case -1: + return READ_SKIP; + case 0: + break; + default: + return more_result; } - move(b_lines, 0); - clrtoeol(); - refresh(); - outs(msg_mailer); + outmsg(msg_mailer); - switch (egetch()) { + switch (igetch()) { case 'r': case 'R': replied = YEA; @@ -950,14 +890,7 @@ mail_read(int ent, fileheader_t * fhdr, char *direct) mail_del(ent, fhdr, direct); else { fhdr->filemode |= FILE_READ; - if ((currmode & MODE_SELECT)) { - int index; - - index = getindex(currmaildir, fhdr->filename, sizeof(fileheader_t)); - substitute_record(currmaildir, fhdr, sizeof(*fhdr), index); - substitute_record(direct, fhdr, sizeof(*fhdr), ent); - } else - substitute_record(currmaildir, fhdr, sizeof(*fhdr), ent); + substitute_ref_record(direct, fhdr, ent); } return FULLUPDATE; } @@ -1049,14 +982,7 @@ mail_mark(int ent, fileheader_t * fhdr, char *direct) { fhdr->filemode ^= FILE_MARKED; - if ((currmode & MODE_SELECT)) { - int index; - - index = getindex(currmaildir, fhdr->filename, sizeof(fileheader_t)); - substitute_record(currmaildir, fhdr, sizeof(*fhdr), index); - substitute_record(direct, fhdr, sizeof(*fhdr), ent); - } else - substitute_record(currmaildir, fhdr, sizeof(*fhdr), ent); + substitute_ref_record(direct, fhdr, ent); return PART_REDRAW; } @@ -1606,8 +1532,7 @@ doforward(char *direct, fileheader_t * fh, int mode) strlcpy(address, cuser.email, sizeof(address)); if( mode == 'U' ){ - move(b_lines, 0); - prints("±N¶i¦æ uuencode ¡CY±z¤£²M·¡¤°»ò¬O uuencode ½Ð§ï¥Î FÂà±H¡C"); + vmsg("±N¶i¦æ uuencode ¡CY±z¤£²M·¡¤°»ò¬O uuencode ½Ð§ï¥Î FÂà±H¡C"); } if (address[0]) { @@ -1632,7 +1557,7 @@ doforward(char *direct, fileheader_t * fh, int mode) snprintf(address, sizeof(address), "%s.bbs@%s", fname, MYHOSTNAME); } else { - outmsg("¨ú®øÂà±H"); + vmsg("¨ú®øÂà±H"); return 1; } } while (mode == 'Z' && strstr(address, MYHOSTNAME)); @@ -1640,19 +1565,12 @@ doforward(char *direct, fileheader_t * fh, int mode) if (invalidaddr(address)) return -2; - snprintf(fname, sizeof(fname), "¥¿Âà±Hµ¹ %s, ½ÐµyÔ...", address); - outmsg(fname); - move(b_lines, 0); + outmsg("¥¿Âà±H½ÐµyÔ..."); refresh(); /* °lÂÜ¨Ï¥ÎªÌ */ - if (HAS_PERM(PERM_LOGUSER)) { - char msg[200]; - - snprintf(msg, sizeof(msg), "%s mailforward to %s at %s", - cuser.userid, address, Cdate(&now)); - log_user(msg); - } + if (HAS_PERM(PERM_LOGUSER)) + log_user("mailforward to %s ",address); if (mode == 'Z') { snprintf(fname, sizeof(fname), TAR_PATH " cfz /tmp/home.%s.tgz home/%c/%s; " diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c index f8d2dc31..8fef76de 100644 --- a/mbbsd/mbbsd.c +++ b/mbbsd/mbbsd.c @@ -98,36 +98,22 @@ reapchild(int sig) } void -log_user(char *msg) -{ - char filename[200], buf[200]; - - snprintf(filename, sizeof(filename), BBSHOME "/home/%c/%s/USERLOG", - cuser.userid[0], cuser.userid); - snprintf(buf, sizeof(buf), "%s\n", msg); - log_file(filename, msg, 1); -} - - -void log_usies(char *mode, char *mesg) { - char genbuf[200]; if (!mesg) - snprintf(genbuf, sizeof(genbuf), + log_file(FN_USIES, LOG_CREAT | LOG_VF, "%s %s %-12s Stay:%d (%s)\n", Cdate(&now), mode, cuser.userid , (int)(now - login_start_time) / 60, cuser.username); else - snprintf(genbuf, sizeof(genbuf), + log_file(FN_USIES, LOG_CREAT | LOG_VF, "%s %s %-12s %s\n", Cdate(&now), mode, cuser.userid, mesg); - log_file(FN_USIES, genbuf, 1); /* °lÂÜ¨Ï¥ÎªÌ */ if (HAS_PERM(PERM_LOGUSER)) - log_user(genbuf); + log_user("logout"); } @@ -183,18 +169,6 @@ u_exit(char *mode) } void -system_abort() -{ - if (currmode) - u_exit("ABORT"); - - clear(); - refresh(); - fprintf(stdout, "ÁÂÁÂ¥úÁ{, °O±o±`¨Ó³á !\n"); - exit(0); -} - -void abort_bbs(int sig) { if (currmode) @@ -429,7 +403,7 @@ write_request(int sig) memmove(&currutmp->msgs[0], &currutmp->msgs[1], sizeof(msgque_t) * currutmp->msgcount); - igetkey(); + igetch(); } } @@ -478,14 +452,12 @@ multi_user_check() log_usies("KICK ", cuser.username); } else { if (search_ulistn(usernum, 3) != NULL) - system_abort(); /* Goodbye(); */ + abort_bbs(0); /* Goodbye(); */ } } else { /* allow multiple guest user */ if (search_ulistn(usernum, 100) != NULL) { - outs("\n©êºp¡A¥Ø«e¤w¦³¤Ó¦h guest ¦b¯¸¤W, ½Ð¥Înewµù¥U¡C\n"); - pressanykey(); - oflush(); + vmsg("\n©êºp¡A¥Ø«e¤w¦³¤Ó¦h guest ¦b¯¸¤W, ½Ð¥Înewµù¥U¡C\n"); exit(1); } } @@ -880,7 +852,7 @@ static void init_guest_info(void) currutmp->pager = 2; } -#ifdef FOREIGN_REG +#ifdef FOREIGN_REG_DAY inline static void foreign_warning(void){ if ((cuser.uflag2 & FOREIGN) && !(cuser.uflag2 & LIVERIGHT)){ if (login_start_time - cuser.firstlogin > (FOREIGN_REG_DAY - 5) * 24 * 3600){ @@ -988,7 +960,7 @@ user_login() if (!PERM_HIDE(currutmp)) cuser.lastlogin = login_start_time; -#ifdef FOREIGN_REG +#ifdef FOREIGN_REG_DAY foreign_warning(); #endif passwd_update(usernum, &cuser); diff --git a/mbbsd/menu.c b/mbbsd/menu.c index bafff3fb..3db2800b 100644 --- a/mbbsd/menu.c +++ b/mbbsd/menu.c @@ -5,25 +5,6 @@ static int refscreen = NA; extern char *boardprefix; extern struct utmpfile_t *utmpshm; - -int -egetch() -{ - int rval; - - while (1) { - rval = igetkey(); - if (talkrequest) { - talkreply(); - refscreen = YEA; - return rval; - } - if (rval != Ctrl('L')) - return rval; - redoscr(); - } -} - extern char *fn_board; extern char board_hidden_status; @@ -70,7 +51,7 @@ showtitle(char *title, char *mid) clear(); prints(TITLE_COLOR "¡i%s¡j%s\033[33m%s%s%s\033[3%s¡m", title, buf, mid, buf, " " + pad, - currmode & MODE_SELECT ? "6m¨t¦C" : currmode & MODE_ETC ? "5m¨ä¥L" : + currmode & MODE_SELECT ? "6m¨t¦C" : currmode & MODE_DIGEST ? "2m¤åºK" : "7m¬ÝªO"); if (strcmp(currboard, lastboard)) { /* change board */ @@ -87,7 +68,7 @@ showtitle(char *title, char *mid) else prints("%s", currboard); prints("\033[3%dm¡n\033[0m\n", currmode & MODE_SELECT ? 6 : - currmode & MODE_ETC ? 5 : currmode & MODE_DIGEST ? 2 : 7); + currmode & MODE_DIGEST ? 2 : 7); } /* °Êµe³B²z */ @@ -314,7 +295,7 @@ domenu(int cmdmode, char *cmdtitle, int cmd, commands_t cmdtable[]) pos++; cursor_show(menu_row + pos, menu_column); - } while (((cmd = egetch()) != EOF) || refscreen); + } while (((cmd = igetch()) != EOF) || refscreen); abort_bbs(0); } @@ -399,7 +380,7 @@ static commands_t namelist[] = { static commands_t userlist[] = { {u_info, PERM_LOGINOK, "IInfo ³]©wÓ¤H¸ê®Æ»P±K½X"}, {calendar, PERM_LOGINOK, "CCalendar Ó¤H¦æ¨Æ¾ä"}, - {u_editcalendar, PERM_LOGINOK, "EEditCalendar ½s¿èÓ¤H¦æ¨Æ¾ä"}, + {u_editcalendar, PERM_LOGINOK, "CDEditCalendar ½s¿èÓ¤H¦æ¨Æ¾ä"}, {u_loginview, PERM_LOGINOK, "LLogin View ¿ï¾Ü¶i¯¸µe±"}, {u_ansi, 0, "AANSI ¤Á´« ANSI \033[36m±m\033[35m¦â\033[37m/" "\033[30;47m¶Â\033[1;37m¥Õ\033[m¼Ò¥Ü"}, @@ -410,9 +391,9 @@ static commands_t userlist[] = { {u_editplan, PERM_LOGINOK, "QQueryEdit ½s¿è¦W¤ùÀÉ"}, {u_editsig, PERM_LOGINOK, "SSignature ½s¿èñ¦WÀÉ"}, #if HAVE_FREECLOAK - {u_cloak, PERM_LOGINOK, "CCloak Áô¨³N"}, + {u_cloak, PERM_LOGINOK, "KKCloak Áô¨³N"}, #else - {u_cloak, PERM_CLOAK, "CCloak Áô¨³N"}, + {u_cloak, PERM_CLOAK, "KKCloak Áô¨³N"}, #endif {u_register, PERM_BASIC, "RRegister ¶ñ¼g¡mµù¥U¥Ó½Ð³æ¡n"}, {u_list, PERM_SYSOP, "UUsers ¦C¥Xµù¥U¦W³æ"}, diff --git a/mbbsd/more.c b/mbbsd/more.c index 5e3c993a..c55d6220 100644 --- a/mbbsd/more.c +++ b/mbbsd/more.c @@ -26,7 +26,6 @@ static char *more_help[] = { "(a/A) ¸õ¦Ü¦P¤@§@ªÌ¤U/¤W½g", "([/]) ¥DÃD¦¡¾\\Ū ¤W/¤U", "(t) ¥DÃD¦¡´`§Ç¾\\Ū", - "(Ctrl-C) ¤ppºâ¾÷", "(q)(¡ö) µ²§ô", "(h)(H)(?) »²§U»¡©úµe±", NULL @@ -329,7 +328,7 @@ more(char *fpath, int promptend) while (line == b_lines || (line > 0 && viewed == fsize)) { - switch ((ch = egetch())) { + switch ((ch = igetch())) { case ':': { char buf[10]; @@ -382,47 +381,42 @@ more(char *fpath, int promptend) lino = line = 0; } break; - case 'r': + case 'r': // Ptt: put all reply/recommend function here case 'R': case 'Y': - close(fd); - return 7; case 'y': close(fd); - return 8; + return 999; + case 'X': + close(fd); + return 998; case 'A': close(fd); - return 9; + return AUTHOR_PREV; case 'a': close(fd); - return 10; + return AUTHOR_NEXT; case 'F': + case 'f': close(fd); - return 11; + return READ_NEXT; case 'B': + case 'b': close(fd); - return 12; + return READ_PREV; case KEY_LEFT: - close(fd); - return 6; case 'q': close(fd); - return 0; - case 'b': - close(fd); - return 1; - case 'f': - close(fd); - return 3; + return FULLUPDATE; case ']': /* Kaede ¬°¤F¥DÃD¾\Ū¤è«K */ close(fd); - return 4; + return RELATE_NEXT; case '[': /* Kaede ¬°¤F¥DÃD¾\Ū¤è«K */ close(fd); - return 2; + return RELATE_PREV; case '=': /* Kaede ¬°¤F¥DÃD¾\Ū¤è«K */ close(fd); - return 5; + return RELATE_FIRST; case Ctrl('F'): case KEY_PGDN: line = 1; @@ -430,14 +424,14 @@ more(char *fpath, int promptend) case 't': if (viewed == fsize) { close(fd); - return 4; + return RELATE_NEXT; } line = 1; break; case ' ': if (viewed == fsize) { close(fd); - return 3; + return READ_NEXT; } line = 1; break; @@ -454,7 +448,7 @@ more(char *fpath, int promptend) if (viewed == fsize || (promptend == 2 && (ch == '\r' || ch == '\n'))) { close(fd); - return 3; + return READ_NEXT; } line = t_lines - 2; break; @@ -489,12 +483,8 @@ more(char *fpath, int promptend) getdata(b_lines - 2, 0, "§â³o½g¤å³¹¦¬¤J¨ì¼È¦sÀÉ¡H[y/N] ", buf, 4, LCECHO); if (buf[0] == 'y') { - char tmpbuf[128]; - - setuserfile(tmpbuf, ask_tmpbuf(b_lines - 1)); - snprintf(buf, sizeof(buf), - "cp -f %s %s", fpath, tmpbuf); - system(buf); + setuserfile(buf, ask_tmpbuf(b_lines - 1)); + Copy(fpath, buf); } if (pageno) pageno--; @@ -525,7 +515,7 @@ more(char *fpath, int promptend) pageno = line = 0; else { close(fd); - return 1; + return READ_PREV; } } } @@ -538,7 +528,7 @@ more(char *fpath, int promptend) if (pageno <= 1) { if (lino == 1 || !pageno) { close(fd); - return 1; + return READ_PREV; } if (header && lino <= 5) { more_goto(fd, viewed = pagebreak[scrollup = lino = diff --git a/mbbsd/name.c b/mbbsd/name.c index 9d467352..3cb2b698 100644 --- a/mbbsd/name.c +++ b/mbbsd/name.c @@ -264,7 +264,6 @@ namecomplete(char *prompt, char *data) prints("%*s", IDLEN + 1, ""); standend(); move(y, x); - refresh(); while ((ch = igetch()) != EOF) { if (ch == '\n' || ch == '\r') { @@ -309,8 +308,7 @@ namecomplete(char *prompt, char *data) len = MaxLen(morelist, p_lines); } if (morelist) { - move(b_lines, 0); - outs(msg_more); + vmsg(msg_more); } move(y, x); continue; @@ -356,7 +354,6 @@ namecomplete(char *prompt, char *data) raise(SIGHUP); /* jochang: don't know if this is * necessary... */ outc('\n'); - refresh(); if (clearbot) { move(2, 0); clrtobot(); @@ -434,8 +431,7 @@ usercomplete(char *prompt, char *data) len = UserMaxLen((arrptr) cwlist, cwnum, morenum, p_lines); } if (morenum < cwnum) { - move(b_lines, 0); - outs(msg_more); + vmsg(msg_more); } else morenum = 0; move(y, x); @@ -478,7 +474,6 @@ usercomplete(char *prompt, char *data) /* longjmp(byebye, -1); */ raise(SIGHUP); /* jochang: don't know if this is necessary */ outc('\n'); - refresh(); if (clearbot) { move(2, 0); clrtobot(); @@ -561,7 +556,6 @@ generalnamecomplete(char *prompt, char *data, int len, size_t nmemb, prints("%*s", IDLEN + 1, ""); standend(); move(y, x); - refresh(); ptr = 0; data[ptr] = 0; @@ -611,8 +605,7 @@ generalnamecomplete(char *prompt, char *data, int len, size_t nmemb, col += len + 2; } if (morelist != end + 1) { - move(b_lines, 0); - outs(msg_more); + vmsg(msg_more); } move(y, x); continue; @@ -651,7 +644,6 @@ generalnamecomplete(char *prompt, char *data, int len, size_t nmemb, } outc('\n'); - refresh(); if (clearbot) { move(2, 0); clrtobot(); diff --git a/mbbsd/othello.c b/mbbsd/othello.c index 96fea2e2..eba90375 100644 --- a/mbbsd/othello.c +++ b/mbbsd/othello.c @@ -124,7 +124,7 @@ get_key(char nowx, char nowy) int ch; move(STARTX - 1 + nowx * 2, STARTY - 1 + nowy * 4); - ch = igetkey(); + ch = igetch(); move(STARTX - 1 + nowx * 2, STARTY - 2 + nowy * 4); if (nowboard[(int)nowx][(int)nowy] != HINT || if_hint == 1) outs(CHESS_TYPE[(int)nowboard[(int)nowx][(int)nowy]]); @@ -274,7 +274,7 @@ end_of_game(int quit) if (fp) fclose(fp); move(1, 1); - igetkey(); + igetch(); } static void diff --git a/mbbsd/read.c b/mbbsd/read.c index 59eae987..58ec63ca 100644 --- a/mbbsd/read.c +++ b/mbbsd/read.c @@ -3,7 +3,6 @@ static fileheader_t *headers = NULL; static int last_line; // PTT: last_line ´å¼Ð¥i«üªº³Ì«á¤@Ó -static int hit_thread; #include <sys/mman.h> @@ -95,7 +94,7 @@ AskTag(char *msg) num = TagNum; snprintf(buf, sizeof(buf), "¡» %s A)¤å³¹ T)¼Ð°O Q)uit?", msg); - switch (rget(b_lines - 1, buf)) { + switch (getans(buf)) { case 'q': num = -1; break; @@ -172,7 +171,7 @@ TagPruner(int bid) if (getans("§R°£©Ò¦³¼Ð°O[N]?") != 'y') return READ_REDRAW; #ifdef SAFE_ARTICLE_DELETE - if(bp && bp->nuser>20) + if(bp && !(currmode & MODE_DIGEST) && bp->nuser>20 ) safe_delete_range(currdirect, 0, 0); else #endif @@ -230,182 +229,77 @@ fixkeep(char *s, int first) /* calc cursor pos and show cursor correctly */ static int -cursor_pos(keeploc_t * locmem, int val, int from_top) +cursor_pos(keeploc_t * locmem, int val, int from_top, int isshow) { int top=locmem->top_ln; - if (!last_line) - { - cursor_show(3 , 0); - return DONOTHING; - } - if (val > last_line) { - bell(); + if (!last_line){ + cursor_show(3 , 0); + return DONOTHING; + } + if (val > last_line){ + bell(); val = last_line; } - if (val <= 0) { - bell(); + if (val <= 0){ + bell(); val = 1; } if (val >= top && val < top + p_lines) { - cursor_clear(3 + locmem->crs_ln - top, 0); + if(isshow){ + cursor_clear(3 + locmem->crs_ln - top, 0); + cursor_show(3 + val - top, 0); + } locmem->crs_ln = val; - cursor_show(3 + val - top, 0); return DONOTHING; } locmem->top_ln = val - from_top; if (locmem->top_ln <= 0) locmem->top_ln = 1; locmem->crs_ln = val; - return PARTUPDATE; + return isshow ? PARTUPDATE : HEADERS_RELOAD; } - static int -thread(keeploc_t * locmem, int stype, int *new_ln) +thread(keeploc_t * locmem, int stypen) { - static char a_ans[32], t_ans[32]; - char ans[32], s_pmt[64]; - register char *tag, *query = NULL; - register int now, pos, match, near = 0; - fileheader_t fh; - int circulate_flag = 1; /* circulate at end or begin */ - int fd = -1; - - match = hit_thread = 0; - now = pos = locmem->crs_ln; - if (stype == 'A') { - if (!*currowner) - return DONOTHING; - str_lower(a_ans, currowner); - query = a_ans; - circulate_flag = 0; - stype = 0; - } else if (stype == 'a') { - if (!*currowner) - return DONOTHING; - str_lower(a_ans, currowner); - query = a_ans; - circulate_flag = 0; - stype = RS_FORWARD; - } else if (stype == '/') { - if (!*t_ans) - return DONOTHING; - query = t_ans; - circulate_flag = 0; - stype = RS_TITLE | RS_FORWARD; - } else if (stype == '?') { - if (!*t_ans) - return DONOTHING; - circulate_flag = 0; - query = t_ans; - stype = RS_TITLE; - } else if (stype & RS_RELATED) { - tag = headers[pos - locmem->top_ln].title; - if (stype & RS_CURRENT) { - if (stype & RS_FIRST) { - if (!strncmp(currtitle, tag, TTLEN)) - return DONOTHING; - near = 0; + fileheader_t fh; + int pos = locmem->crs_ln, jump = 200, new_ln; + int fd = -1, step = stypen & RS_FORWARD ? 1 : -1; + char *key = + (stypen & RS_AUTHOR ? headers[pos - locmem->top_ln].owner : + (subject( stypen & RS_CURRENT ? + currtitle : + headers[pos - locmem->top_ln].title ))); + + for(new_ln = pos + step ; + new_ln > 0 && new_ln <= last_line && --jump>0; + new_ln += step) { + get_record_keep(currdirect, &fh, sizeof(fileheader_t), new_ln, &fd); + if(stypen & RS_TITLE){ + if(stypen & RS_FIRST) { + if(!strcmp(fh.title, key)) break; } - query = currtitle; - } else { - query = subject(tag); - if (stype & RS_FIRST) { - if (query == tag) - return DONOTHING; - near = 0; - } - } - } else if (!(stype & RS_THREAD)) { - query = (stype & RS_TITLE) ? t_ans : a_ans; - if (!*query && query == a_ans) { - if (*currowner) - strlcpy(a_ans, currowner, sizeof(a_ans)); - else if (*currauthor) - strlcpy(a_ans, currauthor, sizeof(a_ans)); - } - snprintf(s_pmt, sizeof(s_pmt), - "%s·j´M%s [%s] ", (stype & RS_FORWARD) ? "©¹«á" : "©¹«e", - (stype & RS_TITLE) ? "¼ÐÃD" : "§@ªÌ", query); - getdata(b_lines - 1, 0, s_pmt, ans, sizeof(ans), DOECHO); - if (*ans) - strcpy(query, ans); - else if (*query == '\0') - return DONOTHING; - } - tag = fh.owner; - - do { - if (!circulate_flag || stype & RS_RELATED) { - if (stype & RS_FORWARD) { - if (++now > last_line){ - if( fd != -1 ) - close(fd); - return DONOTHING; - } - } else { - if (--now <= 0 || now < pos - 200) { - if( fd ) - close(fd); - if ((stype & RS_FIRST) && (near)) { - hit_thread = 1; - *new_ln = near; - } - return DONOTHING; - } - } - } else { - if (stype & RS_FORWARD) { - if (++now > last_line) - now = 1; - } else if (--now <= 0) - now = last_line; + else + if(!strcmp(subject(fh.title), key)) break; } - - get_record_keep(currdirect, &fh, sizeof(fileheader_t), now, &fd); - - if (fh.owner[0] == '-') - continue; - - if (stype & RS_THREAD) { - if (strncasecmp(fh.title, str_reply, 3)) { - hit_thread = 1; - if( fd ) - close(fd); - *new_ln = now; - return DONOTHING; - } - continue; + else if(stypen & RS_NEWPOST){ + if(strncmp(fh.title,"Re:",3)) break; } - if (stype & RS_TITLE) - tag = subject(fh.title); - - if (((stype & RS_RELATED) && !strncmp(tag, query, 40)) || - (!(stype & RS_RELATED) && ((query == currowner) ? - !strcmp(tag, query) : - strstr_lower(tag, query)))) { - if ((stype & RS_FIRST) && tag != fh.title) { - near = now; - continue; - } - hit_thread = 1; - *new_ln = now; - if ((!(stype & RS_CURRENT)) && - (stype & RS_RELATED) && - strncmp(currtitle, query, TTLEN)) { - strncpy(currtitle, query, TTLEN); - match = PARTUPDATE; - } - break; + else{ // RS_AUTHOR + if(!strcmp(subject(fh.owner), key)) break; } - } while (now != pos); - + } if( fd != -1 ) close(fd); - return match; + if( jump <=0 || new_ln<=0 || new_ln > last_line ) + new_ln = pos; //didn't find + else{ + strncpy(currtitle, fh.title, TTLEN); + strncpy(currtitle, fh.title, TTLEN); + } + return new_ln; } - #ifdef INTERNET_EMAIL static void mail_forward(fileheader_t * fhdr, char *direct, int mode) @@ -419,19 +313,17 @@ mail_forward(fileheader_t * fhdr, char *direct, int mode) *p = '\0'; switch (i = doforward(buf, fhdr, mode)) { case 0: - outmsg(msg_fwd_ok); + vmsg(msg_fwd_ok); break; case -1: - outmsg(msg_fwd_err1); + vmsg(msg_fwd_err1); break; case -2: - outmsg(msg_fwd_err2); + vmsg(msg_fwd_err2); break; default: break; } - refresh(); - sleep(1); } #endif @@ -439,301 +331,297 @@ static int select_read(keeploc_t * locmem, int sr_mode) { #define READSIZE 64 // 8192 / sizeof(fileheader_t) - char *tag, *query = NULL, *temp; - fileheader_t fhs[READSIZE]; - char fpath[80], genbuf[MAXPATHLEN], buf3[5]; - static char t_ans[TTLEN + 1] = ""; - static char a_ans[TTLEN + 1] = ""; - int fd, fr, size = sizeof(fileheader_t), i, len; - struct stat st; - /* rocker.011018: make a reference number for process article */ - int reference = 0; - - if ((currmode & MODE_SELECT)) - return -1; - if (sr_mode == RS_TITLE) - query = subject(headers[locmem->crs_ln - locmem->top_ln].title); - else if (sr_mode == RS_NEWPOST) { - strlcpy(buf3, "Re: ", sizeof(buf3)); - query = buf3; - } - else if (sr_mode == RS_THREAD) { - - } else { - char buff[80]; - char newdata[35]; - - query = (sr_mode == RS_RELATED) ? t_ans : a_ans; - snprintf(buff, sizeof(buff), "·j´M%s [%s] ", - (sr_mode == RS_RELATED) ? "¼ÐÃD" : "§@ªÌ", query); - getdata(b_lines, 0, buff, newdata, sizeof(newdata), DOECHO); - if (newdata[0]) - strcpy(query, newdata); - if (!(*query)) - return DONOTHING; + fileheader_t fhs[READSIZE]; + char newdirect[MAXPATHLEN]; + char keyword[TTLEN + 1] = ""; + char genbuf[MAXPATHLEN], *p = strstr(currdirect, "SR"); + static int _mode = 0; + int len, fd, fr, i, count=0, reference = 0; + + fileheader_t *fh = &headers[locmem->crs_ln - locmem->top_ln]; + if(sr_mode & RS_AUTHOR) + { + if(!getdata(b_lines, 0, + currmode & MODE_SELECT ? "¼W¥[±ø¥ó §@ªÌ:":"·j´M§@ªÌ:", + keyword, IDLEN+1, LCECHO)) + return READ_REDRAW; + } + else if(sr_mode & RS_KEYWORD) + { + if(!getdata(b_lines, 0, + currmode & MODE_SELECT ? "¼W¥[±ø¥ó ¼ÐÃD:":"·j´M¼ÐÃD:", + keyword, TTLEN, DOECHO)) + return READ_REDRAW; +#ifdef KEYWORD_LOG + log_file("keyword_search_log", LOG_CREAT | LOG_VF, + "%s:%s\n", currboard, keyword); +#endif + } + else + { + if(p && _mode & sr_mode & (RS_TITLE | RS_NEWPOST | RS_MARK)) + return DONOTHING; + // Ptt: only once for these modes. + if(sr_mode & RS_TITLE) + strcpy(keyword, subject(fh->title)); } - if ((fd = open(currdirect, O_RDONLY, 0)) != -1) { - snprintf(genbuf, sizeof(genbuf), "SR.%s", cuser.userid); - if (currstat == RMAIL) - sethomefile(fpath, cuser.userid, genbuf); - else - setbfile(fpath, currboard, genbuf); - if (((fr = open(fpath, O_WRONLY | O_CREAT | O_TRUNC, 0600)) != -1)) { - switch (sr_mode) { - case RS_TITLE: - while( (len = read(fd, fhs, sizeof(fhs))) > 0 ){ - len /= sizeof(fileheader_t); - for( i = 0 ; i < len ; ++i ){ - ++reference; - tag = subject(fhs[i].title); - if (!strncmp(tag, query, 40)) { - fhs[i].money = reference | FHR_REFERENCE; - write(fr, &fhs[i], size); - } - } - } - break; - case RS_RELATED: - while( (len = read(fd, fhs, sizeof(fhs))) > 0 ){ - len /= sizeof(fileheader_t); - for( i = 0 ; i < len ; ++i ){ - ++reference; - tag = fhs[i].title; - if (strcasestr(tag, query)) { - fhs[i].money = reference | FHR_REFERENCE; - write(fr, &fhs[i], size); - } - } - } - break; - case RS_NEWPOST: - while( (len = read(fd, fhs, sizeof(fhs))) > 0 ){ - len /= sizeof(fileheader_t); - for( i = 0 ; i < len ; ++i ){ - ++reference; - tag = fhs[i].title; - temp = strstr(tag, query); - if (temp == NULL || temp != tag) { - fhs[i].money = reference | FHR_REFERENCE; - write(fr, &fhs[i], size); - } - } - } - break; - case RS_AUTHOR: - while( (len = read(fd, fhs, sizeof(fhs))) > 0 ){ - len /= sizeof(fileheader_t); - for( i = 0 ; i < len ; ++i ){ - ++reference; - tag = fhs[i].owner; - if (strcasestr(tag, query)) { - fhs[i].money = reference | FHR_REFERENCE; - write(fr, &fhs[i], size); - } - } - } - break; - case RS_THREAD: - while( (len = read(fd, fhs, sizeof(fhs))) > 0 ){ - len /= sizeof(fileheader_t); - for( i = 0 ; i < len ; ++i ){ - ++reference; - if (fhs[i].filemode & FILE_MARKED) { - fhs[i].money = reference | FHR_REFERENCE; - write(fr, &fhs[i], size); - } - } - } - break; - } - fstat(fr, &st); - close(fr); - } - close(fd); - if (st.st_size) { - currmode |= MODE_SELECT; - strlcpy(currdirect, fpath, sizeof(currdirect)); - } - } - return READ_REDRAW; + if(p == NULL) + _mode = sr_mode; + else + _mode |= sr_mode; + + snprintf(genbuf, sizeof(genbuf), "%s.%X.%X.%X", + p ? p : "SR", + sr_mode, strlen(keyword), StringHash(keyword)); + if( strlen(genbuf) > MAXPATHLEN - 50 ) + return READ_REDRAW; // avoid overflow + + if (currstat == RMAIL) + sethomefile(newdirect, cuser.userid, genbuf); + else + setbfile(newdirect, currboard, genbuf); + + if( now - dasht(newdirect) < 3600 ) + count = dashs(newdirect); + else { + if( (fd = open(newdirect, O_CREAT | O_RDWR, 0600)) == -1 ) + return READ_REDRAW; + if( (fr = open(currdirect, O_RDONLY, 0)) != -1 ) { + while( (len = read(fr, fhs, sizeof(fhs))) > 0 ){ + len /= sizeof(fileheader_t); + for( i = 0 ; i < len ; ++i ){ + reference++; + if( sr_mode & RS_MARK && + !(fhs[i].filemode & FILE_MARKED) ) + continue; + else if(sr_mode & RS_NEWPOST && + !strncmp(fhs[i].title, "Re:", 3)) + continue; + else if(sr_mode & RS_AUTHOR && + !strcasestr(fhs[i].owner, keyword)) + continue; + else if(sr_mode & RS_KEYWORD && + !strcasestr(fhs[i].title, keyword)) + continue; + else if(sr_mode & RS_TITLE && + strcmp(subject(fhs[i].title), keyword)) + continue; + ++count; + if(p == NULL) + fhs[i].money = reference | FHR_REFERENCE; + write(fd, &fhs[i], sizeof(fileheader_t)); + } + } // end while + close(fr); + } + close(fd); + } + + if(count) { + strlcpy(currdirect, newdirect, sizeof(currdirect)); + currmode |= MODE_SELECT; + return NEWDIRECT; + } + return READ_REDRAW; } -#define select_read_mode(m) select_read(locmem, m) ? NEWDIRECT:READ_REDRAW static int -i_read_key(onekey_t * rcmdlist, char default_ch, keeploc_t * locmem, +i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int bid, int bottom_line) { - int mode = DONOTHING; - int num; - char direct[60]; - int ch, new_ln= locmem->crs_ln; + int mode = DONOTHING, num, new_top=10; + int ch, new_ln = locmem->crs_ln, lastmode=0; + char direct[60]; + static char default_ch = 0; do { - if(default_ch) - { - ch = default_ch; - default_ch=0; - } - else - { - if((mode=cursor_pos(locmem, new_ln, 10))!=DONOTHING) - return mode; - ch = egetch(); - } - switch (ch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if((num = search_num(ch, last_line))!=-1) - new_ln = num; - break; + if( (mode = cursor_pos(locmem, new_ln, new_top, default_ch ? 0 : 1)) + != DONOTHING ) + return mode; + + if( !default_ch ) + ch = igetch(); + else{ + if(new_ln != locmem->crs_ln) {// move fault + default_ch=0; + return FULLUPDATE; + } + ch = default_ch; + } + + new_top = 10; // default 10 + switch (ch) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if( (num = search_num(ch, last_line)) != -1 ) + new_ln = num + 1; + break; case 'q': case 'e': case KEY_LEFT: - if(currmode & MODE_SELECT){ - char genbuf[256]; - fileheader_t *fhdr = &headers[locmem->crs_ln - locmem->top_ln]; - board_select(); - setbdir(genbuf, currboard); - locmem = getkeep(genbuf, 0, 1); - locmem->crs_ln = - getindex(genbuf, fhdr->filename, sizeof(fileheader_t)); - num = locmem->crs_ln - p_lines + 1; - locmem->top_ln = num < 1 ? 1 : num; - - return NEWDIRECT; - } - return (currmode & MODE_ETC) ? board_etc() : - (currmode & MODE_DIGEST) ? board_digest() : DOQUIT; - case Ctrl('L'): - redoscr(); - break; + if(currmode & MODE_SELECT){ + char genbuf[256]; + fileheader_t *fhdr = &headers[locmem->crs_ln - locmem->top_ln]; + board_select(); + setbdir(genbuf, currboard); + locmem = getkeep(genbuf, 0, 1); + locmem->crs_ln = fhdr->money & ~FHR_REFERENCE; + num = locmem->crs_ln - p_lines + 1; + locmem->top_ln = num < 1 ? 1 : num; + mode = NEWDIRECT; + } + else + mode = + (currmode & MODE_DIGEST) ? board_digest() : DOQUIT; + break; + case Ctrl('L'): + redoscr(); + break; - case Ctrl('H'): - mode = select_read_mode(RS_NEWPOST); + case Ctrl('H'): + mode = select_read(locmem, RS_NEWPOST); break; - case 'a': - case 'A': - mode = select_read_mode(RS_AUTHOR); - break; - case 'G': - mode = select_read_mode(RS_THREAD); - break; - case '/': - case '?': - mode = select_read_mode(RS_RELATED); - break; - case 'S': - mode = select_read_mode(RS_TITLE); - break; - case '=': - mode = thread(locmem, RELATE_FIRST, &new_ln); - break; - case '\\': - mode = thread(locmem, CURSOR_FIRST, &new_ln); - break; - case ']': - mode = thread(locmem, RELATE_NEXT, &new_ln); - break; - case '+': - mode = thread(locmem, CURSOR_NEXT, &new_ln); - break; - case '[': - mode = thread(locmem, RELATE_PREV, &new_ln); - break; - case '-': - mode = thread(locmem, CURSOR_PREV, &new_ln); - break; + + case 'a': + case 'A': + mode = select_read(locmem, RS_AUTHOR); + break; + + case 'G': + mode = select_read(locmem, RS_MARK); + break; + + case '/': + case '?': + mode = select_read(locmem, RS_KEYWORD); + break; + + case 'S': + mode = select_read(locmem, RS_TITLE); + break; + + case '=': + new_ln = thread(locmem, RELATE_FIRST); + break; + + case '\\': + new_ln = thread(locmem, CURSOR_FIRST); + break; + + case ']': + new_ln = thread(locmem, RELATE_NEXT); + break; + + case '+': + new_ln = thread(locmem, CURSOR_NEXT); + break; + + case '[': + new_ln = thread(locmem, RELATE_PREV); + break; + + case '-': + new_ln = thread(locmem, CURSOR_PREV); + break; + case '<': case ',': - mode = thread(locmem, THREAD_PREV, &new_ln); - break; + new_ln = thread(locmem, NEWPOST_PREV); + break; + case '.': case '>': - mode = thread(locmem, THREAD_NEXT, &new_ln); - break; + new_ln = thread(locmem, NEWPOST_NEXT); + break; + case 'p': case 'k': - case KEY_UP: - new_ln = locmem->crs_ln - 1; - break; - case 'n': - case 'j': - case KEY_DOWN: - new_ln = locmem->crs_ln + 1; - break; - case ' ': - case KEY_PGDN: - case 'N': - case Ctrl('F'): - new_ln = locmem->crs_ln + p_lines; - break; - case KEY_PGUP: - case Ctrl('B'): - case 'P': - new_ln = locmem->crs_ln - p_lines; - break; - case KEY_END: - case '$': - new_ln = last_line; - break; - case 'F': - case 'U': - if (HAS_PERM(PERM_FORWARD)) { - mail_forward(&headers[locmem->crs_ln - locmem->top_ln], - currdirect, ch /* == 'U' */ ); - /* by CharlieL */ - mode = READ_REDRAW; - } - break; - case Ctrl('Q'): - mode = my_query(headers[locmem->crs_ln - locmem->top_ln].owner); - case Ctrl('S'): - if (HAS_PERM(PERM_ACCOUNTS)) { - int id; - userec_t muser; - - strlcpy(currauthor, - headers[locmem->crs_ln - locmem->top_ln].owner, - sizeof(currauthor)); - stand_title("¨Ï¥ÎªÌ³]©w"); - move(1, 0); - if ((id = getuser(headers[locmem->crs_ln - locmem->top_ln].owner))) - { - memcpy(&muser, &xuser, sizeof(muser)); - user_display(&muser, 1); - uinfo_query(&muser, 1, id); + case KEY_UP: + new_ln = locmem->crs_ln - 1; + new_top = p_lines - 2; + break; + + case 'n': + case 'j': + case KEY_DOWN: + new_ln = locmem->crs_ln + 1; + new_top = 1; + break; + + case ' ': + case KEY_PGDN: + case 'N': + case Ctrl('F'): + new_ln = locmem->top_ln + p_lines; + new_top = 0; + break; + + case KEY_PGUP: + case Ctrl('B'): + case 'P': + new_ln = locmem->top_ln - p_lines; + new_top = 0; + break; + + case KEY_END: + case '$': + new_ln = last_line; + new_top = p_lines-1; + break; + + case 'F': + case 'U': + if (HAS_PERM(PERM_FORWARD)) { + mail_forward(&headers[locmem->crs_ln - locmem->top_ln], + currdirect, ch /* == 'U' */ ); + /* by CharlieL */ + mode = READ_REDRAW; } - mode = FULLUPDATE; - } - break; + break; + + case Ctrl('Q'): + mode = my_query(headers[locmem->crs_ln - locmem->top_ln].owner); + break; - /* rocker.011018: ±Ä¥Î·sªºtag¼Ò¦¡ */ - case 't': - /* ±N쥻¦b Read() ¸Ì±ªº "TagNum = 0" ²¾¦Ü¦¹³B */ - if ((currstat & RMAIL && TagBoard != 0) || + case Ctrl('S'): + if (HAS_PERM(PERM_ACCOUNTS)) { + int id; + userec_t muser; + + strlcpy(currauthor, + headers[locmem->crs_ln - locmem->top_ln].owner, + sizeof(currauthor)); + stand_title("¨Ï¥ÎªÌ³]©w"); + move(1, 0); + if ((id = getuser(headers[locmem->crs_ln - locmem->top_ln].owner))) { + memcpy(&muser, &xuser, sizeof(muser)); + user_display(&muser, 1); + uinfo_query(&muser, 1, id); + } + mode = FULLUPDATE; + } + break; + + /* rocker.011018: ±Ä¥Î·sªºtag¼Ò¦¡ */ + case 't': + /* ±N쥻¦b Read() ¸Ì±ªº "TagNum = 0" ²¾¦Ü¦¹³B */ + if ((currstat & RMAIL && TagBoard != 0) || (!(currstat & RMAIL) && TagBoard != bid)) { - if (currstat & RMAIL) - TagBoard = 0; - else - TagBoard = bid; - TagNum = 0; - } - /* rocker.011112: ¸Ñ¨M¦Aselect mode¼Ð°O¤å³¹ªº°ÝÃD */ - if (Tagger(atoi(headers[locmem->crs_ln - locmem->top_ln].filename + 2), - (currmode & MODE_SELECT) ? - (headers[locmem->crs_ln - locmem->top_ln].money & ~FHR_REFERENCE) : - locmem->crs_ln, TAG_TOGGLE)) - new_ln = locmem->crs_ln + 1; - break; + if (currstat & RMAIL) + TagBoard = 0; + else + TagBoard = bid; + TagNum = 0; + } + /* rocker.011112: ¸Ñ¨M¦Aselect mode¼Ð°O¤å³¹ªº°ÝÃD */ + if (Tagger(atoi(headers[locmem->crs_ln - locmem->top_ln].filename + 2), + (currmode & MODE_SELECT) ? + (headers[locmem->crs_ln - locmem->top_ln].money & ~FHR_REFERENCE) : + locmem->crs_ln, TAG_TOGGLE)) + locmem->crs_ln = locmem->crs_ln + 1; + mode = PART_REDRAW; + break; case Ctrl('C'): if (TagNum) { @@ -745,38 +633,82 @@ i_read_key(onekey_t * rcmdlist, char default_ch, keeploc_t * locmem, case Ctrl('T'): mode = TagThread(currdirect); break; + case Ctrl('D'): mode = TagPruner(bid); break; + case '\n': case '\r': case 'l': case KEY_RIGHT: ch = 'r'; default: - if( ch == 'h' && currmode & (MODE_ETC | MODE_DIGEST) ) + if( ch == 'h' && currmode & (MODE_DIGEST) ) break; if (ch > 0 && ch <= onekey_size) { int (*func)() = rcmdlist[ch - 1]; - if (func != NULL) - { - num = locmem->crs_ln - bottom_line; + if (func != NULL){ + num = locmem->crs_ln - bottom_line; - if (num>0) - { + if( num > 0 ){ sprintf(direct,"%s.bottom", currdirect); - mode= (*func)(num, &headers[locmem->crs_ln-locmem->top_ln], - direct); - } - else + mode= (*func)(num, &headers[locmem->crs_ln-locmem->top_ln], + direct); + } + else mode = (*func)(locmem->crs_ln, - &headers[locmem->crs_ln - locmem->top_ln], currdirect); - } - } + &headers[locmem->crs_ln - locmem->top_ln], + currdirect); + if(mode == READ_SKIP) + mode = lastmode; + + // ¥H¤U³o´XºØ mode n¦A³B²z´å¼Ð + if(mode == READ_PREV || mode == READ_NEXT || + mode == RELATE_PREV || mode == RELATE_FIRST || + mode == AUTHOR_NEXT || mode == AUTHOR_PREV || + mode == RELATE_NEXT){ + lastmode = mode; + + switch(mode){ + case READ_PREV: + new_ln = locmem->crs_ln - 1; + break; + case READ_NEXT: + new_ln = locmem->crs_ln + 1; + break; + case RELATE_PREV: + new_ln = thread(locmem, RELATE_PREV); + break; + case RELATE_NEXT: + new_ln = thread(locmem, RELATE_NEXT); + /* XXX: Ū¨ì³Ì«á¤@½gn¸õ¥X¨Ó */ + if( new_ln == locmem->crs_ln ){ + default_ch = 0; + return FULLUPDATE; + } + break; + case RELATE_FIRST: + new_ln = thread(locmem, RELATE_FIRST); + break; + case AUTHOR_PREV: + new_ln = thread(locmem, AUTHOR_PREV); + break; + case AUTHOR_NEXT: + new_ln = thread(locmem, AUTHOR_NEXT); + break; + } + mode = DONOTHING; default_ch = 'r'; + } + else { + default_ch = 0; + lastmode = 0; + } + } //end if (func != NULL) + } // ch > 0 && ch <= onekey_size break; - } // end switch - } - while (mode == DONOTHING); + } // end switch + } while (mode == DONOTHING); return mode; } @@ -784,37 +716,39 @@ int get_records_and_bottom(char *direct, fileheader_t* headers, int recbase, int p_lines, int last_line, int bottom_line) { - int n = bottom_line - recbase + 1, rv; - char directbottom[60]; + int n = bottom_line - recbase + 1, rv; + char directbottom[60]; - if(!last_line) return 0; - if(n>=p_lines || (currmode & (MODE_SELECT | MODE_DIGEST))) - return get_records(direct, headers, sizeof(fileheader_t), recbase, - p_lines); + if( !last_line ) + return 0; + if( n >= p_lines || (currmode & (MODE_SELECT | MODE_DIGEST)) ) + return get_records(direct, headers, sizeof(fileheader_t), recbase, + p_lines); sprintf(directbottom, "%s.bottom", direct); - if (n<=0) - return get_records(directbottom, headers, sizeof(fileheader_t), 1-n, - last_line-recbase + 1); + if( n <= 0 ) + return get_records(directbottom, headers, sizeof(fileheader_t), 1-n, + last_line-recbase + 1); - rv = get_records(direct, headers, sizeof(fileheader_t), recbase, n); + rv = get_records(direct, headers, sizeof(fileheader_t), recbase, n); + + if( bottom_line < last_line ) + rv += get_records(directbottom, headers+n, sizeof(fileheader_t), 1, + p_lines - n ); + return rv; +} - if(bottom_line<last_line) - rv += get_records(directbottom, headers+n, sizeof(fileheader_t), 1, - p_lines - n ); - return rv; -} void -i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey_t * rcmdlist, int bidcache) +i_read(int cmdmode, char *direct, void (*dotitle) (), + void (*doentry) (), onekey_t * rcmdlist, int bidcache) { keeploc_t *locmem = NULL; int recbase = 0, mode; int num = 0, entries = 0, n_bottom=0; int i; - char currdirect0[64], default_ch = 0; + char currdirect0[64]; int last_line0 = last_line; int bottom_line = 0; - int hit_thread0 = hit_thread; fileheader_t *headers0 = headers; strlcpy(currdirect0, currdirect, sizeof(currdirect0)); @@ -853,11 +787,10 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey case PARTUPDATE: if (last_line < locmem->top_ln + p_lines) { - if (bidcache > 0 && !(currmode & (MODE_SELECT | MODE_DIGEST))) - { - bottom_line = getbtotal(currbid); - num = bottom_line+getbottomtotal(currbid); - } + if (bidcache > 0 && !(currmode & (MODE_SELECT | MODE_DIGEST))){ + bottom_line = getbtotal(currbid); + num = bottom_line+getbottomtotal(currbid); + } else num = get_num_records(currdirect, FHSZ); @@ -866,7 +799,7 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey recbase = -1; } } - if (recbase != locmem->top_ln) { + if (recbase != locmem->top_ln) { //headers reload recbase = locmem->top_ln; if (recbase > last_line) { recbase = last_line - p_lines + 1; @@ -883,11 +816,11 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey clrtobot(); case PART_REDRAW: move(3, 0); - if(last_line==0) + if( last_line == 0 ) outs(" ¨S¦³¤å³¹..."); else - for (i = 0; i < entries; i++) - (*doentry) (locmem->top_ln + i, &headers[i]); + for( i = 0; i < entries ; i++ ) + (*doentry) (locmem->top_ln + i, &headers[i]); case READ_REDRAW: outmsg(curredit & EDIT_ITEM ? "\033[44m ¨p¤H¦¬Âà \033[30;47m Ä~Äò? \033[m" : @@ -895,50 +828,29 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey break; case TITLE_REDRAW: (*dotitle) (); - break; - } - - mode = i_read_key(rcmdlist, default_ch, locmem, currbid, - bottom_line); - switch(mode) // ¥H¤U³o´XºØ mode n¦A³B²z´å¼Ð - { - case READ_PREV: - default_ch = 'r'; - mode = cursor_pos(locmem, locmem->crs_ln - 1, 10); - break; - case READ_NEXT: - default_ch = 'r'; - mode = cursor_pos(locmem, locmem->crs_ln + 1, 10); - break; - case RELATE_PREV: - default_ch = 'r'; - mode = thread(locmem, RELATE_PREV, &locmem->crs_ln); - break; - case RELATE_NEXT: - default_ch = 'r'; - mode = thread(locmem, RELATE_NEXT, &locmem->crs_ln); - break; - case RELATE_FIRST: - default_ch = 'r'; - mode = thread(locmem, RELATE_FIRST, &locmem->crs_ln); - break; - case 'A': - default_ch = 'r'; - mode = thread(locmem, 'A', &locmem->crs_ln); - break; - case 'a': - default_ch = 'r'; - mode = thread(locmem, 'a', &locmem->crs_ln); - break; - default: - default_ch=0; - } + break; + + case HEADERS_RELOAD: + if (recbase != locmem->top_ln) { + recbase = locmem->top_ln; + if (recbase > last_line) { + recbase = last_line - p_lines + 1; + if (recbase < 1) + recbase = 1; + locmem->top_ln = recbase; + } + entries = + get_records_and_bottom(currdirect, headers, recbase, + p_lines, last_line, bottom_line); + } + break; + } //end switch + mode = i_read_key(rcmdlist, locmem, currbid, bottom_line); } while (mode != DOQUIT); #undef FHSZ free(headers); last_line = last_line0; - hit_thread = hit_thread0; headers = headers0; strlcpy(currdirect, currdirect0, sizeof(currdirect)); return; diff --git a/mbbsd/record.c b/mbbsd/record.c index efc1089c..c8393f6f 100644 --- a/mbbsd/record.c +++ b/mbbsd/record.c @@ -127,6 +127,66 @@ substitute_record(char *fpath, void *rptr, int size, int id) return 0; } +int +substitute_ref_record(char *direct, fileheader_t * fhdr, int ent) +{ + fileheader_t hdr; + char genbuf[256]; + int num = 0; + + /* rocker.011018: ¦ê±µ¼Ò¦¡¥Îreference¼W¶i®Ä²v */ + if ((fhdr->money & FHR_REFERENCE) && + (num = fhdr->money & ~FHR_REFERENCE)){ + setdirpath(genbuf, direct, ".DIR"); + get_record(genbuf, &hdr, sizeof(hdr), num); + if (strcmp(hdr.filename, fhdr->filename)) + { + if((num = getindex(genbuf, fhdr, num))>0) + { + substitute_record(genbuf, fhdr, sizeof(*fhdr), num); + } + } + else if(num>0) + { + fhdr->money = hdr.money; + substitute_record(genbuf, fhdr, sizeof(*fhdr), num); + } + fhdr->money = FHR_REFERENCE | num ; // Ptt: update now! + } + substitute_record(direct, fhdr, sizeof(*fhdr), ent); + return num; +} + +int +getindex(char *direct, fileheader_t *fh_o, int end) +{ // Ptt: ±q«e±§ä«Ü¶O¤O ¤Ó¼É¤O + int fd=-1, begin=1, i, stamp, s; + fileheader_t fh; + + i = get_num_records(direct, sizeof(fileheader_t)); + if(end>i) end = i; + stamp = atoi(fh_o->filename+2); + i=(begin+end)/2; + for(; end>begin+1; i=(begin+end)/2) + { + if(get_record_keep(direct, &fh, sizeof(fileheader_t), i, &fd)==-1) + break; + if(!fh.filename[0]) break; + s = atoi(fh.filename+2); + if (s > stamp) end = i+1; + else if(s == stamp) + { + close(fd); + fh_o->money = fh.money; + return i; + } + else begin = i; + } + if(fd==-1) close(fd); + return 0; +} + + /* rocker.011022: ÁקKlockÀɶ}±Ò®É¤£¥¿±`Â_½u,³y¦¨¥Ã¤[lock */ #ifndef _BBS_UTIL_C_ static int diff --git a/mbbsd/register.c b/mbbsd/register.c index 9e6c60b3..71d653a2 100644 --- a/mbbsd/register.c +++ b/mbbsd/register.c @@ -175,9 +175,7 @@ getnewuserid() i = searchnewuser(1); if ((i <= 0) || (i > MAX_USERS)) { passwd_unlock(); - if (more("etc/user_full", NA) == -1) - fprintf(stdout, "©êºp¡A¨Ï¥ÎªÌ±b¸¹¤w¸gº¡¤F¡AµLªkµù¥U·sªº±b¸¹\n\r"); - safe_sleep(2); + vmsg("©êºp¡A¨Ï¥ÎªÌ±b¸¹¤w¸gº¡¤F¡AµLªkµù¥U·sªº±b¸¹"); exit(1); } snprintf(genbuf, sizeof(genbuf), "uid %d", i); @@ -203,10 +201,7 @@ new_register() if( passbuf[0] == 'y' ) break; if( passbuf[0] == 'n' ){ - clear(); - outs("\n©êºp, ±z¶·n±µ¨ü¨Ï¥ÎªÌ±ø´Ú¤~¯àµù¥U±b¸¹¨É¨ü§Ú̪ºªA°Èò!"); - pressanykey(); - oflush(); + vmsg("\n©êºp, ±z¶·n±µ¨ü¨Ï¥ÎªÌ±ø´Ú¤~¯àµù¥U±b¸¹¨É¨ü§Ú̪ºªA°Èò!"); exit(1); } vmsg("½Ð¿é¤J yªí¥Ü±µ¨ü, nªí¥Ü¤£±µ¨ü"); @@ -217,11 +212,7 @@ new_register() try = 0; while (1) { if (++try >= 6) { - outs("\n±z¹Á¸Õ¿ù»~ªº¿é¤J¤Ó¦h¡A½Ð¤U¦¸¦A¨Ó§a\n"); - refresh(); - - pressanykey(); - oflush(); + vmsg("\n±z¹Á¸Õ¿ù»~ªº¿é¤J¤Ó¦h¡A½Ð¤U¦¸¦A¨Ó§a\n"); exit(1); } getdata(17, 0, msg_uid, newuser.userid, @@ -243,11 +234,7 @@ new_register() try = 0; while (1) { if (++try >= 6) { - outs("\n±z¹Á¸Õ¿ù»~ªº¿é¤J¤Ó¦h¡A½Ð¤U¦¸¦A¨Ó§a\n"); - refresh(); - - pressanykey(); - oflush(); + vmsg("\n±z¹Á¸Õ¿ù»~ªº¿é¤J¤Ó¦h¡A½Ð¤U¦¸¦A¨Ó§a\n"); exit(1); } if ((getdata(19, 0, "½Ð³]©w±K½X¡G", passbuf, diff --git a/mbbsd/screen.c b/mbbsd/screen.c index 94a42d60..04dcec40 100644 --- a/mbbsd/screen.c +++ b/mbbsd/screen.c @@ -445,7 +445,7 @@ prints(char *fmt,...) } void -mprints(int y, int x, char *str) +mouts(int y, int x, char *str) { move(y, x); clrtoeol(); diff --git a/mbbsd/stuff.c b/mbbsd/stuff.c index 7ce5e720..10e6d69b 100644 --- a/mbbsd/stuff.c +++ b/mbbsd/stuff.c @@ -64,7 +64,6 @@ void setbdir(char *buf, char *boardname) { sprintf(buf, str_board_file, boardname[0], boardname, - currmode & MODE_ETC ? ".ETC" : (currmode & MODE_DIGEST ? fn_mandex : str_dotdir)); } @@ -401,25 +400,28 @@ capture_screen() } } -void -pressanykey() +int +vmsg_lines(const int lines, const char msg[]) { int ch; - outmsg("\033[37;45;1m " - "¡´ ½Ð«ö \033[33m(Space/Return)\033[37m Ä~Äò ¡´" - " \033[33m(^T)\033[37m ¦s¼È¦sÀÉ \033[m"); - do { - ch = igetkey(); + move(lines, 0); + clrtoeol(); - if (ch == Ctrl('T')) { + if (msg) + outs((char *)msg); + else + outs("\033[45;1m \033[37m" + "\033[200m\033[1431m\033[506m¡¼ ½Ð«ö \033[33m(Space/Return)\033[37m Ä~Äò ¡¼\033[201m (^T) ¦¬¨ì¼È¦sÀÉ \033[m"); + + do { + if( (ch = igetch()) == Ctrl('T') ) capture_screen(); - break; - } - } while ((ch != ' ') && (ch != KEY_LEFT) && (ch != '\r') && (ch != '\n')); - move(b_lines, 0); + } while( ch == 0 ); + + move(lines, 0); clrtoeol(); - refresh(); + return ch; } #ifdef PLAY_ANGEL @@ -427,11 +429,14 @@ void pressanykey_or_callangel(){ int ch; - outmsg("\033[37;45;1m \033[33m(h)\033[37m ©I¥s¤p¤Ñ¨Ï " + move(b_lines, 0); + clrtoeol(); + + outs("\033[37;45;1m \033[33m(h)\033[37m ©I¥s¤p¤Ñ¨Ï " "¡´ ½Ð«ö \033[33m(Space/Return)\033[37m Ä~Äò ¡´" " \033[33m(^T)\033[37m ¦s¼È¦sÀÉ \033[m"); do { - ch = igetkey(); + ch = igetch(); if (ch == Ctrl('T')) { capture_screen(); @@ -443,47 +448,49 @@ pressanykey_or_callangel(){ } while ((ch != ' ') && (ch != KEY_LEFT) && (ch != '\r') && (ch != '\n')); move(b_lines, 0); clrtoeol(); - refresh(); } #endif -int -vmsg(const char *fmt,...) +char getans(const char *fmt,...) { - va_list ap; - char msg[80] = {0}; - int ch; - + char msg[256]; + char ans[5]; + va_list ap; va_start(ap, fmt); - vsnprintf(msg, sizeof(msg), fmt, ap); + vsnprintf(msg , 128, fmt, ap); va_end(ap); - move(b_lines, 0); - clrtoeol(); - - if (*msg) - prints("\033[1;36;44m ¡» %-55.54s \033[33;46m \033[200m\033[1431m\033[506m[½Ð«ö¥ô·NÁäÄ~Äò]\033[201m \033[m", msg); - else - outs("\033[46;1m \033[37m" - "\033[200m\033[1431m\033[506m¡¼ ½Ð«ö \033[33m(Space/Return)\033[37m Ä~Äò ¡¼\033[201m" - " \033[m"); - - do { - ch = igetkey(); - - if (ch == Ctrl('T')) { - capture_screen(); - break; - } - } while ((ch != ' ') && (ch != KEY_LEFT) && (ch != '\r') && (ch != '\n')); + getdata(b_lines, 0, msg, ans, sizeof(ans), LCECHO); + return ans[0]; +} +int +getkey(const char *fmt,...) +{ + char msg[256], i; + va_list ap; + va_start(ap, fmt); + i = vsnprintf(msg , 128, fmt, ap); + va_end(ap); + return vmsg_lines(b_lines, msg); +} - move(b_lines, 0); - clrtoeol(); - refresh(); - return ch; +int +vmsg(const char *fmt,...) +{ + char msg[256] = "\033[1;36;44m ¡» ", i; + va_list ap; + va_start(ap, fmt); + i = vsnprintf(msg + 14, 128, fmt, ap); + va_end(ap); + for(i = i + 14; i < 71; i++) + msg[(int)i] = ' '; + strcat(msg + 71, + "\033[33;46m \033[200m\033[1431m\033[506m[«ö¥ô·NÁäÄ~Äò]\033[201m \033[m"); + return vmsg_lines(b_lines, msg); } + void bell() { @@ -573,7 +580,7 @@ cursor_key(int row, int column) int ch; cursor_show(row, column); - ch = egetch(); + ch = igetch(); move(row, column); outs(STR_UNCUR); return ch; @@ -602,13 +609,41 @@ printdash(char *mesg) outch('\n'); } -int log_file(char *fn, char *buf, int ifcreate) +int +log_user(const char *fmt, ...) +{ + char msg[256], filename[256]; + va_list ap; + + va_start(ap, fmt); + vsnprintf(msg , 128, fmt, ap); + va_end(ap); + + sethomefile(filename, cuser.userid, "USERLOG"); + return log_file(filename, LOG_CREAT | LOG_VF, + "%s: %s %s", cuser.userid, msg, Cdate(&now)); +} + +int log_file(char *fn, int flag, const char *fmt,...) { int fd; - if( (fd = open(fn, O_APPEND | O_WRONLY | (ifcreate ? O_CREAT : 0), - (ifcreate ? 0664 : 0))) < 0 ) + char msg[256]; + const char *realmsg; + if( !(flag & LOG_VF) ){ + realmsg = fmt; + } + else{ + va_list ap; + va_start(ap, fmt); + vsnprintf(msg , 128, fmt, ap); + va_end(ap); + realmsg = msg; + } + + if( (fd = open(fn, O_APPEND | O_WRONLY | ((flag & LOG_CREAT)? O_CREAT : 0), + ((flag & LOG_CREAT) ? 0664 : 0))) < 0 ) return -1; - if( write(fd, buf, strlen(buf)) < 0 ){ + if( write(fd, realmsg, strlen(realmsg)) < 0 ){ close(fd); return -1; } diff --git a/mbbsd/talk.c b/mbbsd/talk.c index 22535b9e..96181b4f 100644 --- a/mbbsd/talk.c +++ b/mbbsd/talk.c @@ -512,7 +512,7 @@ my_write2(void) which = 0; do { - switch ((ch = igetkey())) { + switch ((ch = igetch())) { case Ctrl('T'): case KEY_UP: if (water_usies != 1) { @@ -622,9 +622,7 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) */ if (!uin && !(flag == WATERBALL_GENERAL && water_which->count > 0)) { - outmsg("\033[1;33;41mÁV¿|! ¹ï¤è¤w¸¨¶]¤F(¤£¦b¯¸¤W)! \033[37m~>_<~\033[m"); - clrtoeol(); - refresh(); + vmsg("ÁV¿|! ¹ï¤è¤w¸¨¶]¤F(¤£¦b¯¸¤W)! "); watermode = -1; return 0; } @@ -642,9 +640,6 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) /* ¤@¯ë¤ô²y */ watermode = 0; if (!(len = getdata(0, 0, prompt, msg, 56, DOECHO))) { - outmsg("\033[1;33;42mºâ¤F! ©ñ§A¤@°¨...\033[m"); - clrtoeol(); - refresh(); currutmp->chatid[0] = c0; currutmp->mode = mode0; currstat = currstat0; @@ -674,9 +669,6 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) snprintf(buf, sizeof(buf), "¥áµ¹ %s : %s [Y/n]?", destid, msg); getdata(0, 0, buf, genbuf, 3, LCECHO); if (genbuf[0] == 'n') { - outmsg("\033[1;33;42mºâ¤F! ©ñ§A¤@°¨...\033[m"); - clrtoeol(); - refresh(); currutmp->chatid[0] = c0; currutmp->mode = mode0; currstat = currstat0; @@ -690,9 +682,7 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) && flag != WATERBALL_ANSWER #endif )) { - outmsg("\033[1;33;41mÁV¿|! ¹ï¤è¤w¸¨¶]¤F(¤£¦b¯¸¤W)! \033[37m~>_<~\033[m"); - clrtoeol(); - refresh(); + vmsg("ÁV¿|! ¹ï¤è¤w¸¨¶]¤F(¤£¦b¯¸¤W)! "); currutmp->chatid[0] = c0; currutmp->mode = mode0; currstat = currstat0; @@ -785,7 +775,6 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) } clrtoeol(); - refresh(); currutmp->chatid[0] = c0; currutmp->mode = mode0; @@ -1128,7 +1117,7 @@ do_talk(int fd) add_io(fd, 0); while (1) { - ch = igetkey(); + ch = igetch(); if (ch == I_OTHERDATA) { datac = recv(fd, data, sizeof(data), 0); if (datac <= 0) @@ -1926,7 +1915,7 @@ draw_pickup(int drawall, pickup_t * pickup, int pickup_way, #endif ); - refresh(); + //refresh(); } } @@ -2240,11 +2229,12 @@ userlist(void) case 'b': /* broadcast */ if (cuser.uflag & FRIEND_FLAG || HAS_PERM(PERM_SYSOP)) { - char genbuf[60]; + char genbuf[60]="[¼s¼½]"; char ans[4]; - if (!getdata(0, 0, "¼s¼½°T®§:", genbuf, sizeof(genbuf), DOECHO)) + if (!getdata(0, 0, "¼s¼½°T®§:", genbuf+6, 54, DOECHO)) break; + if (getdata(0, 0, "½T©w¼s¼½? [Y]", ans, sizeof(ans), LCECHO) && *ans == 'n') @@ -2386,7 +2376,7 @@ userlist(void) case 'g': if (HAS_PERM(PERM_LOGINOK) && strcmp(uentp->userid, cuser.userid) != 0) { - char genbuf[128]; + char genbuf[10]; move(b_lines - 2, 0); prints("nµ¹ %s ¦h¤Ö¿ú©O? ", uentp->userid); if (getdata(b_lines - 1, 0, "[»È¦æÂà±b]: ", @@ -2396,8 +2386,8 @@ userlist(void) redrawall = redraw = 1; break; } - sprintf(genbuf, "½T©wnµ¹ %s %d Ptt ¹ô¶Ü? [N/y]", uentp->userid, ch); - if (getans(genbuf) != 'y'){ + if (getans("½T©wnµ¹ %s %d Ptt ¹ô¶Ü? [N/y]", + uentp->userid, ch) != 'y'){ redrawall = redraw = 1; break; } @@ -2407,19 +2397,16 @@ userlist(void) outs("\033[41m ²{ª÷¤£¨¬~~\033[m"); } else { deumoney(uentp->uid, ch - give_tax(ch)); - prints("\033[44m ¶â..ÁٳѤU %d ¿ú.." - "\033[m", demoney(-ch)); - snprintf(genbuf, sizeof(genbuf), - "%s\tµ¹%s\t%d\t%s\n", cuser.userid, - uentp->userid, ch, - ctime(&currutmp->lastact)); - log_file(FN_MONEY, genbuf, 1); + log_file(FN_MONEY, LOG_CREAT | LOG_VF, + "%s\tµ¹%s\t%d\t%s\n", cuser.userid, + uentp->userid, ch, ctime(&currutmp->lastact)); mail_redenvelop(cuser.userid, uentp->userid, ch - give_tax(ch), 'Y'); + vmsg(" ¶â..ÁٳѤU %d ¿ú..", demoney(-ch)); } } else { clrtoeol(); - outs("\033[41m ¥æ©ö¨ú®ø! \033[m"); + vmsg(" ¥æ©ö¨ú®ø! "); } redrawall = redraw = 1; } @@ -2476,12 +2463,9 @@ userlist(void) cuser.uflag2 -= tmp; tmp = (tmp + 1) % 3; cuser.uflag2 |= tmp; - move(4, 0); - prints("¨t²Î´£¨Ñ ¤@¯ë ¶i¶¥ ¥¼¨Ó ¤TºØ¼Ò¦¡\n" + vmsg("¨t²Î´£¨Ñ ¤@¯ë ¶i¶¥ ¥¼¨Ó ¤TºØ¼Ò¦¡\n" "¦b¤Á´««á½Ð¥¿±`¤U½u¦A«·sµn¤J, ¥H½T«Oµ²ºc¥¿½T\n" "¥Ø«e¤Á´«¨ì %s ¤ô²y¼Ò¦¡\n", wm[tmp]); - refresh(); - sleep(2); redrawall = redraw = 1; } break; @@ -2695,7 +2679,6 @@ talkreply(void) char genbuf[200]; int a, sig = currutmp->sig; - talkrequest = NA; uip = &SHM->uinfo[currutmp->destuip]; snprintf(page_requestor, sizeof(page_requestor), "%s (%s)", uip->userid, uip->username); diff --git a/mbbsd/user.c b/mbbsd/user.c index 6b141c38..cbb85d1d 100644 --- a/mbbsd/user.c +++ b/mbbsd/user.c @@ -23,7 +23,6 @@ u_loginview() { int i; unsigned int pbits = cuser.loginview; - char choice[5]; clear(); move(4, 0); @@ -32,9 +31,9 @@ u_loginview() loginview_file[i][1], ((pbits >> i) & 1 ? "£¾" : "¢æ")); clrtobot(); - while (getdata(b_lines - 1, 0, "½Ð«ö [A-N] ¤Á´«³]©w¡A«ö [Return] µ²§ô¡G", - choice, 3, LCECHO)) { - i = choice[0] - 'a'; + while ((i = getkey("½Ð«ö [A-N] ¤Á´«³]©w¡A«ö [Return] µ²§ô¡G"))!='\r') + { + i = i - 'a'; if (i >= NUMVIEWFILE || i < 0) bell(); else { @@ -219,8 +218,9 @@ violate_law(userec_t * u, int unum) static void Customize(void) { - char ans[4], done = 0, mindbuf[5]; + char done = 0, mindbuf[5]; char *wm[3] = {"¤@¯ë", "¶i¶¥", "¥¼¨Ó"}; + int key; showtitle("Ó¤H¤Æ³]©w", "Ó¤H¤Æ³]©w"); memcpy(mindbuf, &currutmp->mind, 4); @@ -241,15 +241,12 @@ static void Customize(void) if( HAS_PERM(PERM_ANGEL) ){ prints("%-30s%10s\n", "F. ±µ¨ü¤p¥D¤H¸ß°Ý", ((cuser.uflag2 & BEING_ANGEL) ? "¬O" : "§_")); - getdata(b_lines - 1, 0, "½Ð«ö [A-F] ¤Á´«³]©w¡A«ö [Return] µ²§ô¡G", - ans, 3, DOECHO); + key = getkey("½Ð«ö [A-F] ¤Á´«³]©w¡A«ö [Return] µ²§ô¡G"); }else #endif - getdata(b_lines - 1, 0, "½Ð«ö [A-E] ¤Á´«³]©w¡A«ö [Return] µ²§ô¡G", - ans, 3, DOECHO); + key = getkey("½Ð«ö [A-E] ¤Á´«³]©w¡A«ö [Return] µ²§ô¡G"); - switch( ans[0] ){ - case 'A': + switch( key ){ case 'a':{ int currentset = cuser.uflag2 & WATER_MASK; currentset = (currentset + 1) % 3; @@ -258,18 +255,14 @@ static void Customize(void) vmsg("×¥¿¤ô²y¼Ò¦¡«á½Ð¥¿±`Â÷½u¦A«·s¤W½u"); } break; - case 'B': case 'b': cuser.uflag2 ^= REJ_OUTTAMAIL; break; - - case 'C': case 'c': cuser.uflag2 ^= FAVNEW_FLAG; if (cuser.uflag2 & FAVNEW_FLAG) subscribe_newfav(); break; - case 'D': case 'd':{ getdata(b_lines - 1, 0, "²{¦bªº¤ß±¡? ", mindbuf, sizeof(mindbuf), DOECHO); @@ -281,13 +274,11 @@ static void Customize(void) memcpy(currutmp->mind, mindbuf, 4); } break; - case 'E': case 'e': cuser.uflag2 ^= FAVNOHILIGHT; break; #ifdef PLAY_ANGEL - case 'F': case 'f': if( HAS_PERM(PERM_ANGEL) ){ t_switchangel(); @@ -300,7 +291,7 @@ static void Customize(void) } passwd_update(usernum, &cuser); } - pressanykey(); + vmsg("³]©w§¹¦¨"); } void @@ -308,8 +299,8 @@ uinfo_query(userec_t * u, int real, int unum) { userec_t x; register int i = 0, fail, mail_changed; - int uid; - char ans[4], buf[STRLEN], *p; + int uid, ans; + char buf[STRLEN], *p; char genbuf[200], reason[50]; int money = 0; fileheader_t fhdr; @@ -320,23 +311,22 @@ uinfo_query(userec_t * u, int real, int unum) fail = mail_changed = 0; memcpy(&x, u, sizeof(userec_t)); - getdata(b_lines - 1, 0, real ? + ans = getans(real ? "(1)§ï¸ê®Æ(2)³]±K½X(3)³]Åv(4)¬å±b¸¹(5)§ïID" "(6)±þ/´_¬¡Ãdª«(7)¼f§P [0]µ²§ô " : - "½Ð¿ï¾Ü (1)קï¸ê®Æ (2)³]©w±K½X (C) Ó¤H¤Æ³]©w ==> [0]µ²§ô ", - ans, sizeof(ans), DOECHO); + "½Ð¿ï¾Ü (1)קï¸ê®Æ (2)³]©w±K½X (C) Ó¤H¤Æ³]©w ==> [0]µ²§ô "); - if (ans[0] > '2' && ans[0] != 'C' && ans[0] != 'c' && !real) - ans[0] = '0'; + if (ans > '2' && ans != 'C' && ans != 'c' && !real) + ans = '0'; - if (ans[0] == '1' || ans[0] == '3') { + if (ans == '1' || ans == '3') { clear(); i = 1; move(i++, 0); outs(msg_uid); outs(x.userid); } - switch (ans[0]) { + switch (ans) { case 'C': case 'c': Customize(); @@ -608,8 +598,7 @@ uinfo_query(userec_t * u, int real, int unum) pressanykey(); return; } - getdata(b_lines - 1, 0, msg_sure_ny, ans, 3, LCECHO); - if (*ans == 'y') { + if (getans(msg_sure_ny) == 'y') { if (flag) post_change_perm(temp, i, cuser.userid, x.userid); if (strcmp(u->userid, x.userid)) { @@ -841,7 +830,6 @@ u_editcalendar() getdata(b_lines - 1, 0, "¦æ¨Æ¾ä (D)§R°£ (E)½s¿è [Q]¨ú®ø¡H[Q] ", genbuf, 3, LCECHO); - sethomefile(genbuf, cuser.userid, "calendar"); if (genbuf[0] == 'e') { int aborted; @@ -852,6 +840,7 @@ u_editcalendar() vmsg("¦æ¨Æ¾ä§ó·s§¹²¦"); return 0; } else if (genbuf[0] == 'd') { + sethomefile(genbuf, cuser.userid, "calendar"); unlink(genbuf); vmsg("¦æ¨Æ¾ä§R°£§¹²¦"); } @@ -1146,13 +1135,15 @@ static char *isvalidcareer(char *career) return "³Â·Ð½Ð¥[¾Ç®Õ¨t©Ò"; if (strcmp(career, "¾Ç¥Í°ª¤¤") == 0) return "³Â·Ð¿é¤J¾Ç®Õ¦WºÙ"; +#else + if( strlen(career) < 6 ) + return "±zªº¿é¤J¤£¥¿½T"; #endif return NULL; } static char *isvalidaddr(char *addr) { -#ifndef FOREIGN_REG char *rejectstr[] = {"¦a²y", "»Èªe", "¤õ¬P", NULL}; @@ -1171,7 +1162,6 @@ static char *isvalidaddr(char *addr) strcmp(&addr[strlen(addr) - 2], "¥«") == 0 || strcmp(&addr[strlen(addr) - 2], "µó") == 0 ) return "³oÓ¦a§}¨Ã¤£¦Xªk"; -#endif return NULL; } @@ -1291,6 +1281,10 @@ u_register(void) "½Ð«ö¤U¥ô¤@Áä¸õÂ÷«á«·s¤W¯¸~ :)"); sethomefile(genbuf, cuser.userid, "justify.wait"); unlink(genbuf); + snprintf(cuser.justify, sizeof(cuser.justify), + "%s:%s:auto", phone, career); + sethomefile(genbuf, cuser.userid, "justify"); + log_file(genbuf, LOG_CREAT, cuser.justify); pressanykey(); u_exit("registed"); exit(0); @@ -1388,11 +1382,11 @@ u_register(void) getfield(11, "§t\033[1;33m¿¤¥«\033[m¤Îªù¹ì¸¹½X" "(¥x¥_½Ð¥[\033[1;33m¦æ¬F°Ï\033[m)", "¥Ø«e¦í§}", addr, 50); - if( (errcode = isvalidaddr(addr) + if( (errcode = isvalidaddr(addr)) == NULL #ifdef FOREIGN_REG - && fore[0] ==0 + || fore[0] #endif - ) == NULL ) + ) break; else vmsg(errcode); @@ -1571,6 +1565,6 @@ u_list() clrtoeol(); prints("\033[34;46m ¤wÅã¥Ü %d/%d ªº¨Ï¥ÎªÌ(¨t²Î®e¶qµL¤W) " "\033[31;47m (½Ð«ö¥ô·NÁäÄ~Äò) \033[m", usercounter, totalusers); - egetch(); + igetch(); return 0; } diff --git a/mbbsd/var.c b/mbbsd/var.c index d239fbec..b3afba22 100644 --- a/mbbsd/var.c +++ b/mbbsd/var.c @@ -84,9 +84,7 @@ char paste_title[STRLEN]; char paste_path[256]; char currtitle[TTLEN + 1] = "\0"; char vetitle[TTLEN + 1] = "\0"; -char currowner[IDLEN + 2] = "\0"; char currauthor[IDLEN + 2] = "\0"; -char currfile[FNLEN];/* current file name @ bbs.c mail.c */ char *currboard = "\0"; char currBM[IDLEN * 3 + 10]; char reset_color[4] = "\033[m"; @@ -383,7 +381,6 @@ char real_name[IDLEN + 1]; int local_article; /* mbbsd.c */ -int talkrequest = NA; char fromhost[STRLEN] = "\0"; char water_usies = 0; FILE *fp_writelog = NULL; diff --git a/mbbsd/vote.c b/mbbsd/vote.c index a6cb52c4..5325e64c 100644 --- a/mbbsd/vote.c +++ b/mbbsd/vote.c @@ -535,7 +535,7 @@ vote_view_all(char *bname) setbfile(buf, bname, STR_new_control); move(0, 0); if ((fp = fopen(buf, "r"))) { - prints("(0) "); + outs("(0) "); x = 0; fclose(fp); @@ -760,7 +760,6 @@ vote_maintain(char *bname) move((i % 15) + 2, (i / 15) * 40); prints(buf); } - refresh(); } snprintf(buf, sizeof(buf), "%c) ", num + 'A'); getdata((num % 15) + 2, (num / 15) * 40, buf, diff --git a/mbbsd/xyz.c b/mbbsd/xyz.c index e0b850b5..b20b9d74 100644 --- a/mbbsd/xyz.c +++ b/mbbsd/xyz.c @@ -180,9 +180,7 @@ note() notedata_t myitem; if (cuser.money < 5) { - outmsg("\033[1;41m «u§r! n§ë¤»È¤~¯à¯d¨¥...¨S¿úC..\033[m"); - clrtoeol(); - refresh(); + vmsg("\033[1;41m «u§r! n§ë¤»È¤~¯à¯d¨¥...¨S¿úC..\033[m"); return 0; } setutmpmode(EDNOTE); @@ -313,7 +311,7 @@ mail_sysop() move(12, 0); clrtobot(); - prints("%16s %-18sÅv³d¹º¤À\n\n", "½s¸¹", "¯¸ªø ID"); + outs(" ½s¸¹ ¯¸ªø ID Åv³d¹º¤À\n\n"); for (i = 0; i < j; i++) prints("%15d. \033[1;%dm%-16s%s\033[0m\n", diff --git a/sample/pttbbs.conf b/sample/pttbbs.conf index a6ab5597..a646aa0c 100644 --- a/sample/pttbbs.conf +++ b/sample/pttbbs.conf @@ -145,6 +145,9 @@ Y¯¸¤W¨Ã¤£·|¤@Àþ¶¡«Ü¦h¤H¶]¥h¬Ý¼öªù¬ÝªO, ·|±o¨ì¤Ï®ÄªG. */ //#define HOTBOARDCACHE 128 +/* ¦bÂà«H®Éªþ¤Wªº®É°Ï. Y¦b¥xÆW, ¤¤°ê¤j³°µ¥¦a, ¥Î¹w³]ªº§Y¥i. */ +//#define INNTIMEZONE "+0800 (CST)" + /* «e¶i¯¸µe± */ #define INSCREEN \ "«e¶i¯¸µe± (½Ð¦Ü pttbbs.conf קï±zªº«e¶i¯¸µe±)" diff --git a/staticweb/article.html b/staticweb/article.html index 1386c3d6..8c1a8260 100644 --- a/staticweb/article.html +++ b/staticweb/article.html @@ -10,7 +10,7 @@ </td></tr><tr><td> <hr> <a href="./[% IF gb %]?gb=1[% END %]">¦^¤W¶</a><br /> -<a href="telnet://ptt.cc">§å½ð½ð¹ê·~§{</a> (<a href="http://ptt.cc">PttWeb</a>) +<a href="http://ptt.cc">§å½ð½ð¹ê·~§{</a> </td></tr> </table> diff --git a/staticweb/dir.html b/staticweb/dir.html index 557438cc..071cac22 100644 --- a/staticweb/dir.html +++ b/staticweb/dir.html @@ -5,10 +5,10 @@ </td></tr> <tr><td> -<a href="http://man.ptt.cc/[% IF gb %]?gb=1[% END %]">ºô¶ª©ºëµØ°Ïº¶</a> -<a href="http://webbbs.ptt.cc/[% brdname %]/DIR.html">[% brdname %]¬ÝªOº¶</a> +<a href="http://[% IF gb %]gb[% END %]www.ptt.cc">§å½ð½ð¹ê·~§{</a> | +<a href="http://man.ptt.cc/[% IF gb %]?gb=1[% END %]">ºô¶ª©ºëµØ°Ïº¶</a> | +<a href="http://webbbs.ptt.cc/[% brdname %]/DIR.html">[% brdname %]¬ÝªOº¶</a> | <a href="http://man.ptt.cc/man.pl/[% brdname %]/[% IF gb %]?gb=1[% END %]">[% brdname %]ºëµØ°Ïº¶</a> -<a href="http://blog.ptt.cc">§å½ð½ð³¡¸¨®æ(big5 only)</a> <br /> <font size=+1>¬ÝªO¦WºÙ: <a href="/man.pl/[% brdname %]/">[% brdname %]</a></font> <hr /> @@ -36,7 +36,7 @@ [% END %] <hr /> <font size="-1">»s§@®É¶¡: [% buildtime %]</font><br> -<a href="telnet://ptt.cc">§å½ð½ð¹ê·~§{</a> (<a href="http://ptt.cc">PttWeb</a>) +<a href="http://ptt.cc">§å½ð½ð¹ê·~§{</a> </td></tr> </table> </body> diff --git a/staticweb/header.html b/staticweb/header.html index 5dc7161b..112efd70 100644 --- a/staticweb/header.html +++ b/staticweb/header.html @@ -10,6 +10,6 @@ content="text/html; charset=[% charset %]"> <meta name="generator" content="pttMan" /> <meta name="robots" content="all" /> - <link rel="stylesheet" href="http://pttx.ptt.cc:4099/ptt.man/styles.css" type="text/css" /> + <link rel="stylesheet" href="http://pttx.ptt.cc:4099/staticpage/ptt.man.styles.css" type="text/css" /> </head> <body> diff --git a/staticweb/index.html b/staticweb/index.html index e13f7d2d..c0c87174 100644 --- a/staticweb/index.html +++ b/staticweb/index.html @@ -5,7 +5,7 @@ </td></tr> <tr><td> -<a href="http://man.ptt.cc/index.pl/[% IF gb %]?gb=1[% END %]">§å½ð½ð¹ê·~§{¤§ºëµØ°Ï</a> +<a href="http://www.ptt.cc">§å½ð½ð¹ê·~§{</a> » <a href="http://man.ptt.cc/index.pl/[% IF gb %]?gb=1[% END %]">§å½ð½ð¹ê·~§{¤§ºëµØ°Ï</a> [% FOREACH x=class %] »<a href="/index.pl[% x.path %]">[% x.title %]</a> [% END %] @@ -40,7 +40,7 @@ </td></tr> <tr><td> <hr /> -<a href="telnet://ptt.cc">§å½ð½ð¹ê·~§{</a> (<a href="http://ptt.cc">PttWeb</a>) +<a href="http://ptt.cc">§å½ð½ð¹ê·~§{</a> </td></tr> </table> </body> diff --git a/staticweb/index.pl b/staticweb/index.pl index e6d647ba..5bfc631f 100755 --- a/staticweb/index.pl +++ b/staticweb/index.pl @@ -2,27 +2,28 @@ # $Id$ use lib qw/./; use LocalVars; -use CGI qw/:standard/; +use CGI qw/:cgi :html2/; use strict; use Template; -#use boardlist; use b2g; use DB_File; use Data::Serializer; +use vars qw/$serializer $tmpl %brdlist/; sub deserialize { my($what) = @_; - my $obj = Data::Serializer->new(serializer => 'Storable', - digester => 'MD5', - compress => 0, - ); - return $obj->deserialize($what); + $serializer = Data::Serializer->new(serializer => 'Storable', + digester => 'MD5', + compress => 0, + ) + if( !$serializer ); + return $serializer->deserialize($what); } sub main { - my($tmpl, %rh, $bid, %brd); + my(%rh, $bid) = (); if( param('gb') ){ $rh{gb} = 1; @@ -42,31 +43,32 @@ sub main charset(''); print header(); - tie %brd, 'DB_File', 'boardlist.db', O_RDONLY, 0666, $DB_HASH; + tie %brdlist, 'DB_File', 'boardlist.db', O_RDONLY, 0666, $DB_HASH + if( !%brdlist ); ($bid) = $ENV{PATH_INFO} =~ m|.*/(\d+)/$|; $bid ||= 0; $rh{isroot} = ($bid == 0); - if( !exists $brd{"class.$bid"} ){ + if( !exists $brdlist{"class.$bid"} ){ print "sorry, this bid $bid not found :("; return ; } - foreach( @{deserialize($brd{"class.$bid"})} ){ - next if( $brd{"$_.isboard"} && - !-e "$MANDATA/".$brd{"tobrdname.$_"}.'.db' ); + foreach( @{deserialize($brdlist{"class.$bid"})} ){ + next if( $brdlist{"$_.isboard"} && + !-e "$MANDATA/".$brdlist{"tobrdname.$_"}.'.db' ); - push @{$rh{dat}}, [$brd{"$_.isboard"} ? -1 : $_, - $brd{"$_.brdname"}, - $brd{"$_.title"}, + push @{$rh{dat}}, [$brdlist{"$_.isboard"} ? -1 : $_, + $brdlist{"$_.brdname"}, + $brdlist{"$_.title"}, ]; } my $path = ''; foreach( $ENV{PATH_INFO} =~ m|(\w+)|g ){ push @{$rh{class}}, {path => "$path/$_/", - title => $brd{"$_.title"}}; + title => $brdlist{"$_.title"}}; $path .= "/$_"; } $rh{exttitle} = ($rh{class} ? @@ -79,7 +81,9 @@ sub main EVAL_PERL => 0, COMPILE_EXT => '.tmpl', COMPILE_DIR => $MANCACHE, - }); + }) + if( !$tmpl ); + if( !$rh{gb} ){ $tmpl->process('index.html', \%rh); } @@ -89,7 +93,6 @@ sub main b2g::big5togb($output); print $output; } - untie %brd; } main(); diff --git a/staticweb/man.pl b/staticweb/man.pl index 661013fc..b77fcd03 100755 --- a/staticweb/man.pl +++ b/staticweb/man.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl # $Id$ -use CGI qw/:standard/; +use CGI qw/:cgi :html2/; use lib qw/./; use LocalVars; use DB_File; @@ -14,15 +14,16 @@ use b2g; use POSIX; use Compress::Zlib; -use vars qw/%db $brdname $fpath $isgb %b2g/; +use vars qw/%db $brdname $fpath $isgb $tmpl/; sub main { - my($tmpl, $rh, $key); + my($rh, $key) = (); if( !(($brdname, $fpath) = $ENV{PATH_INFO} =~ m|^/([\w\-]+?)(/.*)|) || - !(tie %db, 'DB_File', - "$MANDATA/$brdname.db", O_RDONLY, 0666, $DB_HASH) ){ + (!exists $db{$brdname} && + !tie %{$db{$brdname}}, 'DB_File', + "$MANDATA/$brdname.db", O_RDONLY, 0666, $DB_HASH) ){ return redirect("/man.pl/$1/") if( $ENV{PATH_INFO} =~ m|^/([\w\-]+?)$| ); print header(-status => 404); @@ -48,7 +49,9 @@ sub main EVAL_PERL => 0, COMPILE_EXT => '.tmpl', COMPILE_DIR => $MANCACHE, - }); + }) + if( !$tmpl ); + if( $rh->{gb} = $isgb ){ $rh->{encoding} = 'gb2312'; $rh->{lang} = 'zh-CN'; @@ -69,8 +72,6 @@ sub main b2g::big5togb($output); print $output; } - - untie %db; } sub dirmode @@ -80,7 +81,7 @@ sub dirmode digester => 'MD5', compress => 0, ); - foreach( @{$serial->deserialize($db{$fpath}) || []} ){ + foreach( @{$serial->deserialize($db{$brdname}{$fpath}) || []} ){ $isdir = (($_->[0] =~ m|/$|) ? 1 : 0); push @{$th{dat}}, {isdir => $isdir, fn => "man.pl/$brdname$_->[0]", @@ -89,7 +90,7 @@ sub dirmode $th{tmpl} = 'dir.html'; $th{isroot} = ($fpath eq '/') ? 1 : 0; - $th{buildtime} = POSIX::ctime($db{_buildtime} || 0); + $th{buildtime} = POSIX::ctime($db{$brdname}{_buildtime} || 0); return \%th; } @@ -99,9 +100,9 @@ sub articlemode $th{tmpl} = 'article.html'; # ¥ý®³¥X¨Ó¤~ unzip, n¤£µM·|Äê±¼ :p - $th{content} = $db{$fpath}; + $th{content} = $db{$brdname}{$fpath}; $th{content} = Compress::Zlib::memGunzip($th{content}) - if( $db{_gzip} ); + if( $db{$brdname}{_gzip} ); $th{content} =~ s/\033\[.*?m//g; @@ -128,7 +129,7 @@ sub search($) my %result = $idx->query($th{key} = $key, MATCH_FUZZY); foreach my $t (sort { $result{$b} <=> $result{$a} } keys(%result)) { $k = $idx->getkey($t); - push @{$th{search}}, {title => $db{"title-$k"}, + push @{$th{search}}, {title => $db{$brdname}{"title-$k"}, fn => $k, score => $result{$t} / 10}; } diff --git a/util/Makefile b/util/Makefile index 99461ffe..99ff62af 100644 --- a/util/Makefile +++ b/util/Makefile @@ -26,7 +26,7 @@ CPROG_WITH_UTIL= \ # ¤U±³o¨Çµ{¦¡, ·|ª½±µ³Q compile CPROG_WITHOUT_UTIL= \ - shmsweep uhash_loader showboard antispam \ + shmsweep uhash_loader showboard \ countalldice webgrep bbsrf initbbs \ userlist tunepasswd buildir merge_passwd \ merge_board xchatd bbsmail diff --git a/util/account.c b/util/account.c index bb1b1bc4..6c05b569 100644 --- a/util/account.c +++ b/util/account.c @@ -1,6 +1,7 @@ /* $Id$ */ #include "bbs.h" +//test #define ACCOUNT_MAX_LINE 16 #define ADJUST_M 6 /* adjust back 5 minutes */ @@ -90,9 +91,10 @@ void gzip(source, target, stamp) int main(int argc, char **argv) { int hour, max, item, total, i, j, mo, da, max_user = 0, max_login = 0, - max_reg = 0, mahour = 0, k; + max_reg = 0, mahour = 0, k, wday; char *act_file = ".act"; char *log_file = "usies"; + char *wday_str = "UMTWRFS"; char buf[256], buf1[256], *p; FILE *fp, *fp1; int act[27]; /* ¦¸¼Æ/²Öp®É¶¡/pointer */ @@ -328,11 +330,29 @@ int main(int argc, char **argv) if((fp = fopen("etc/feast", "r"))) { while(fgets(buf1, sizeof(buf1), fp)) { if(buf[0] != '#' && - sscanf(buf1, "%d %d ", &mo, &da) == 2) { - if(ptime->tm_mday == da && ptime->tm_mon + 1 == mo) { - i = 1; - fprintf(fp1, "%-14.14s", &buf1[6]); - } + sscanf(buf1, "%d %c%c", &mo, buf, buf+1) == 3) { + if (isdigit(buf[0])) { + if (isdigit(buf[1])) { + da = 10 * (buf[0] - '0') + (buf[1] - '0'); + if(ptime->tm_mday == da && ptime->tm_mon + 1 == mo) { + i = 1; + fprintf(fp1, "%-14.14s", &buf1[6]); + } + } + else { + if (buf[0] - '0' <= 4) { + wday = 0; + buf[1] = toupper(buf[1]); + while(wday < 7 && buf[1] != *(wday_str + wday)) + wday++; + if (ptime->tm_mon + 1 == mo && ptime->tm_wday == wday && + (ptime->tm_mday - 1)/7 + 1 == (buf[0] - '0')) { + i = 1; + fprintf(fp1, "%-14.14s", &buf1[6]); + } + } + } + } } } fclose(fp); @@ -341,7 +361,7 @@ int main(int argc, char **argv) if(i == 0) { if((fp = fopen("etc/today_boring", "r"))) { while(fgets(buf1, sizeof(buf1), fp)) - if(strlen(buf) > 3) + if(strlen(buf1) > 3) fprintf(fp1, "%s", buf1); fclose(fp); } else diff --git a/util/antispam.c b/util/antispam.c deleted file mode 100644 index e5b2ed59..00000000 --- a/util/antispam.c +++ /dev/null @@ -1,122 +0,0 @@ -/* $Id$ */ -/* §ì¼s§i«Hªºµ{¦¡ */ -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <sys/types.h> -#include "config.h" - -#define WINDOW 100 /* ¤@¦¸window¦h¤ÖÓserver */ -#define LEVEL 21 /* Y´X¦¸«´_´Nºâ¼s§i«H */ - -#define mailog BBSHOME "/etc/mailog" -#define spamlog BBSHOME "/etc/spam" - -typedef struct sendinfo -{ - char time[18]; - char from[50]; - char userid[20]; - int count; -} -sendinfo; - -int -main(int argc, char **argv) -{ - char buf[200], *from, *userid; - int num = -1, numb = -1, n, nb; - FILE *fp = fopen(mailog, "r"), *fo; - sendinfo data[WINDOW]; - sendinfo bad[WINDOW]; - - unlink(spamlog); - fo = fopen(spamlog, "a"); - memset(data, 0, sizeof(data)); - memset(bad, 0, sizeof(bad)); - - if (!fp || !fo) - return 0; - - while (fgets(buf, 200, fp)) - { - strtok(buf, "\r\n"); - from = strchr(buf, '>') + 2; - userid = strstr(buf, " =>"); - - if (!from || !userid) - continue; - - *userid = 0; - userid += 4; - - if (strstr(from, "MAILER-DAEMON") - || strstr(from, userid)) - continue; /* °h«H³qª¾¤£ºÞ */ - /* ¬O§_¤w¬Obadhost */ - - for (nb = 0; nb < WINDOW && bad[nb].from[0]; nb++) - if (!strcmp(bad[nb].from, from)) - break; - - if (nb < WINDOW && bad[nb].from[0]) - { - bad[nb].count++; - continue; - } - - /* ²¬d¹L¥h°O¿ý */ - - for (n = 0; n < WINDOW && data[n].from[0]; n++) - if (!strcmp(data[n].from, from)) - break; - - if (n < WINDOW && data[n].from[0]) - { - if (!strncmp(data[n].userid, userid, 20)) - continue; - /* Â൹¦P¤@Ó¤H´N¤£ºÞ */ - strncpy(data[n].userid, userid, 20); - if (++data[n].count >= LEVEL) - { - /* Åܦ¨bad ²¾data¨ìbad ªÅ¯Ê¥Ñ«á¤@µ§¸ê®Æ¸É¤W */ - if (nb >= WINDOW) - { - numb = (numb + 1) % WINDOW; - nb = numb; - fprintf(fo, "%s %s «ÂбH %d ¦¸\n", - bad[nb].time, bad[nb].from, bad[nb].count); -/* printf(" %s send %d times\n", - bad[nb].from, bad[nb].count); */ - } - memcpy(&bad[nb], &data[n], sizeof(sendinfo)); - memcpy(&data[n], &data[n + 1], sizeof(sendinfo) * (WINDOW - n - 1)); - if (num > n) - num--; - } - } - else - { - if (n >= WINDOW) - { - num = (num + 1) % WINDOW; - n = num; - } -/* printf("[%s] to [%s]\n", from, userid); */ - buf[17] = 0; - strncpy(data[n].time, buf, 17); - strncpy(data[n].from, from, 50); - strncpy(data[n].userid, userid, 20); - } - } - - for (nb = 0; nb < WINDOW && bad[nb].from[0]; nb++) - { - fprintf(fo, "%s %s «ÂбH %d ¦¸\n", bad[nb].time, - bad[nb].from, bad[nb].count); -/* printf(" %s send %d times\n", bad[nb].from, bad[nb].count); */ - } - fclose(fp); - fclose(fo); - return 0; -} diff --git a/util/boardlist.c b/util/boardlist.c index a37de82f..606a0192 100644 --- a/util/boardlist.c +++ b/util/boardlist.c @@ -9,8 +9,7 @@ load_uidofgid(const int gid, const int type) int n, childcount = 0; currbptr = &bcache[gid - 1]; for (n = 0; n < numboards; ++n) { - bptr = SHM->bsorted[type][n]; - if (bptr->brdname[0] == '\0') + if( !(bptr = SHM->bsorted[type][n]) || bptr->brdname[0] == '\0' ) continue; if (bptr->gid == gid) { if (currbptr == &bcache[gid - 1]) diff --git a/util/killdeadbbs.c b/util/killdeadbbs.c deleted file mode 100644 index 0c83fe29..00000000 --- a/util/killdeadbbs.c +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef FreeBSD -int main(int argc, char **argv) -{ - puts("this program is only for FreeBSD"); -} -#else -#include <err.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <signal.h> -#include <kvm.h> -#include <fcntl.h> -#include <limits.h> -#include <sys/param.h> -#include <sys/sysctl.h> -#include <sys/user.h> -#include "config.h" // for BBSUID - -int main(int argc, char **argv) -{ - kvm_t *kd; - struct kinfo_proc *kp; - char errbuf[_POSIX2_LINE_MAX]; - int nentries, i, npids; - pid_t pids[8192]; - kd = kvm_openfiles("/dev/null", "/dev/null", NULL, O_RDONLY, errbuf); - if( kd == NULL ) - errx(1, "%s", errbuf); - - if ((kp = kvm_getprocs(kd, KERN_PROC_UID, BBSUID, &nentries)) == 0 || - nentries < 0) - errx(1, "%s", kvm_geterr(kd)); - - for( npids = 0, i = nentries ; --i >= 0 ; ++kp ){ - if( strncmp(kp->ki_comm, "mbbsd", 5) == 0 ){ - if( kp->ki_runtime > (60 * 1000000) ){ // 60 secs - kill(kp->ki_pid, 1); - pids[npids++] = kp->ki_pid; - printf("%d\n", kp->ki_pid); - } - } - } - - if( npids != 0 ){ - sleep(2); - while( --npids >= 0 ) - kill(pids[npids], 9); - } - - kvm_close(kd); - return 0; -} - -#endif diff --git a/util/lunar-1,15run.pl b/util/lunar-1,15run.pl deleted file mode 100644 index d4cd2f20..00000000 --- a/util/lunar-1,15run.pl +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/perl -use lib '/home/bbs/bin/'; -use LocalVars; -# ¨C¹A¾äªì¤@, ¤Q¤´N·|¶]¤@¦¸ $ARGV[0] -# ¸ê®Æ¨Ó·½ http://tw.weathers.yahoo.com/ -open FH, "$LYNX -source http://tw.weathers.yahoo.com/ | grep '¥Á°ê'|"; -$din = <FH>; -close FH; - -($month, $day) = $din =~ /¹A¾ä (.*?)¤ë (.*?)¤é/; -system("@ARGV") if( $day eq '¤@' || $day eq '¤@¤Q¤' ); diff --git a/util/testkenben.txt b/util/testkenben.txt deleted file mode 100644 index df3893d3..00000000 --- a/util/testkenben.txt +++ /dev/null @@ -1,11 +0,0 @@ -HCGH-306 ¦Ë¤k ¡·¦³¤K¨ö¡I¡I¡I 7/24 jennywen/molly -Foolshome ¹ÎÅé ¡·CCC~~~¤dÁH¦~ 1/14 truth/citizen/nathon -KHCHS-87-306·s²ø ¡·³£¶]¨ìþ¸Ì¥h¤F 6/12 -TGHS8714 «n¤k ¡·²z©Ê¤Ñ®ð¡F·P©Ê¥ 8/07 grassflying/EPOCH -PttDoc ¼Tù ¡·Ptt Document Pr 8/07 -Delphi µ{³] ¡·Delphi¨g·Q¦± 3/09 cying -ciacia_Her ¥xÆW ¡·ciacia¥Î¤å¦r¬D³ 8/16 sherbet -CS87Love ¤¤¤s ¡··R©O! 8/08 sylna/fancydream -Wanfang ¥xÆW ¡·´Nȱo¤F·R¸UªÚ 8/07 zkkk -KS87-308 ¶¯¤¤ ¡´¶¯¤¤¤K±¾¯Z¡m¤@¤ 8/07 SBT/shouhou - |