From 9a12adf6d29cdefc98afe2566a9e5479489f111b Mon Sep 17 00:00:00 2001 From: kcwu Date: Wed, 12 Dec 2007 01:42:23 +0000 Subject: * extract common functions as library. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3673 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/Makefile | 4 +- mbbsd/announce.c | 3 +- mbbsd/args.c | 18 ++- mbbsd/bbs.c | 38 +---- mbbsd/cal.c | 38 +---- mbbsd/calendar.c | 39 +---- mbbsd/chicken.c | 10 +- mbbsd/dice.c | 13 -- mbbsd/friend.c | 2 +- mbbsd/io.c | 136 ----------------- mbbsd/kaede.c | 105 ------------- mbbsd/mbbsd.c | 6 +- mbbsd/pmore.c | 2 +- mbbsd/record.c | 15 -- mbbsd/stuff.c | 448 +------------------------------------------------------ mbbsd/topsong.c | 9 -- mbbsd/user.c | 2 +- 17 files changed, 37 insertions(+), 851 deletions(-) (limited to 'mbbsd') diff --git a/mbbsd/Makefile b/mbbsd/Makefile index 327749b3..84468ffc 100644 --- a/mbbsd/Makefile +++ b/mbbsd/Makefile @@ -16,7 +16,7 @@ OBJS= admin.o announce.o args.o assess.o bbs.o board.o cache.o cal.o card.o\ more.o name.o osdep.o othello.o read.o record.o register.o\ screen.o stuff.o talk.o term.o topsong.o user.o brc.o vice.o vote.o\ xyz.o voteboard.o syspost.o var.o passwd.o calendar.o go.o file.o \ - pmore.o chess.o reversi.o + pmore.o chess.o reversi.o .if defined(DIET) OBJS+= random.o time.o alloc.o @@ -34,6 +34,8 @@ LDFLAGS+=-Wl,--sort-common CFLAGS+= -DMERGEBBS OBJS+= merge.o .endif +LIBS+= $(SRCROOT)/src/libbbsutil/libbbsutil.a \ + $(SRCROOT)/src/libbbs/libbbs.a .SUFFIXES: .c .o .c.o: $(SRCROOT)/include/var.h diff --git a/mbbsd/announce.c b/mbbsd/announce.c index bf6c8add..28ea9784 100644 --- a/mbbsd/announce.c +++ b/mbbsd/announce.c @@ -1179,8 +1179,7 @@ a_menu(const char *maintitle, const char *path, int lastlevel, char *trans_buffe strlcpy(trans_buffer, fname, PATHLEN); Fexit = 1; if (currstat == OSONG) { - log_file(FN_USSONG, LOG_CREAT | LOG_VF, - "%s\n", fhdr->title); + log_filef(FN_USSONG, LOG_CREAT, "%s\n", fhdr->title); } free(me.header); return FULLUPDATE; diff --git a/mbbsd/args.c b/mbbsd/args.c index 8d6ee98d..8a7658a7 100644 --- a/mbbsd/args.c +++ b/mbbsd/args.c @@ -10,9 +10,10 @@ initsetproctitle(int argc, char **argv, char **envp) #else -char **Argv = NULL; /* pointer to argument vector */ -char *LastArgv = NULL;/* end of argv */ -extern char **environ; +static char **Argv = NULL; /* pointer to argument vector */ +static int arg_size; /* end of argv */ + +extern char **environ; void initsetproctitle(int argc, char **argv, char **envp) @@ -20,6 +21,7 @@ initsetproctitle(int argc, char **argv, char **envp) register int i; int len=0,nenv=0; + /* * Move the environment so setproctitle can use the space at the top of * memory. @@ -40,9 +42,9 @@ initsetproctitle(int argc, char **argv, char **envp) /* Save start and extent of argv for setproctitle. */ Argv = argv; if (i > 0) - LastArgv = envp[i - 1] + strlen(envp[i - 1]); + argv_size = envp[i - 1] + strlen(envp[i - 1]) - Argv[0]; else - LastArgv = argv[argc - 1] + strlen(argv[argc - 1]); + argv_size = argv[argc - 1] + strlen(argv[argc - 1]) - Argv[0]; } static void @@ -51,9 +53,9 @@ do_setproctitle(const char *cmdline) int len; len = strlen(cmdline) + 1; // +1 for '\0' - if(len > LastArgv - Argv[0] - 2) // 2 ?? - len = LastArgv - Argv[0] - 2; - memset(Argv[0], 0, LastArgv-Argv[0]); + if(len > argv_size - 2) // 2 ?? + len = argv_size - 2; + memset(Argv[0], 0, argv_size); strlcpy(Argv[0], cmdline, len); Argv[1] = NULL; } diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c index 55ddb14f..593efa07 100644 --- a/mbbsd/bbs.c +++ b/mbbsd/bbs.c @@ -85,7 +85,7 @@ static int currlistmode = LISTMODE_DATE; void anticrosspost(void) { - log_file("etc/illegal_money", LOG_CREAT | LOG_VF, + log_filef("etc/illegal_money", LOG_CREAT, ANSI_COLOR(1;33;46) "%s " ANSI_COLOR(37;45) "cross post 文章 " ANSI_COLOR(37) " %s" ANSI_RESET "\n", @@ -592,7 +592,7 @@ cancelpost(const fileheader_t *fh, int by_BM, char *newpath) fclose(fout); } fclose(fin); - log_file(fn1, LOG_CREAT | LOG_VF, "\n※ Deleted by: %s (%s) %d/%d", + log_filef(fn1, LOG_CREAT, "\n※ Deleted by: %s (%s) %d/%d", cuser.userid, fromhost, ptime->tm_mon + 1, ptime->tm_mday); Rename(fn1, newpath); setbdir(genbuf, brd); @@ -707,28 +707,6 @@ do_reply_title(int row, const char *title) // don't getdata() on non-local variable save_title directly, to avoid reentrant crash. strlcpy(save_title, tmp_title, sizeof(save_title)); } -/* -static void -do_unanonymous_post(const char *fpath) -{ - fileheader_t mhdr; - char title[128]; - char genbuf[200]; - - setbpath(genbuf, "UnAnonymous"); - if (dashd(genbuf)) { - stampfile(genbuf, &mhdr); - unlink(genbuf); - // XXX: Link should use BBSHOME/blah - Link(fpath, genbuf); - strlcpy(mhdr.owner, cuser.userid, sizeof(mhdr.owner)); - strlcpy(mhdr.title, save_title, sizeof(mhdr.title)); - mhdr.filemode = 0; - setbdir(title, "UnAnonymous"); - append_record(title, &mhdr, sizeof(mhdr)); - } -} -*/ void do_crosspost(const char *brd, fileheader_t *postfile, const char *fpath, @@ -3579,16 +3557,6 @@ change_counting(void) #endif -/** - * 改變目前所在板文章的預設儲存方式 - */ -static int -change_localsave(void) -{ - vmsg("此功\能已整合進大寫 I 看板設定,請按 I 設定。"); - return FULLUPDATE; -} - #ifdef USE_COOLDOWN int check_cooldown(boardheader_t *bp) @@ -3694,7 +3662,7 @@ const onekey_t read_comms[] = { { 0, NULL }, // Ctrl('U') { 0, do_post_vote }, // Ctrl('V') { 0, whereami }, // Ctrl('W') - { 0, change_localsave }, // Ctrl('X') + { 0, NULL }, // Ctrl('X') { 0, NULL }, // Ctrl('Y') { 1, push_bottom }, // Ctrl('Z') 26 { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, diff --git a/mbbsd/cal.c b/mbbsd/cal.c index d44b5b58..39f55514 100644 --- a/mbbsd/cal.c +++ b/mbbsd/cal.c @@ -58,24 +58,6 @@ unlockutmpmode(void) /* 使用錢的函數 */ #define VICE_NEW "vice.new" -const char* -money_level(int money) -{ - int i = 0; - - static const char *money_msg[] = - { - "債台高築", "赤貧", "清寒", "普通", "小康", - "小富", "中富", "大富翁", "富可敵國", "比爾蓋\天", NULL - }; - while (money_msg[i] && money > 10) - i++, money /= 10; - - if(!money_msg[i]) - i--; - return money_msg[i]; -} - /* Heat:發票 */ int vice(int money, const char *item) @@ -87,7 +69,7 @@ vice(int money, const char *item) if(money>=100) { setuserfile(buf, VICE_NEW); - log_file(buf, LOG_CREAT | LOG_VF, "%8.8d\n", viceserial); + log_filef(buf, LOG_CREAT, "%8.8d\n", viceserial); } snprintf(buf, sizeof(buf), "%s 花了$%d 編號[%08d]", item, money, viceserial); @@ -221,7 +203,7 @@ osong(void) fclose(fp1); fclose(fp); - log_file("etc/osong.log", LOG_CREAT | LOG_VF, "id: %-12s ◇ %s 點給 %s : \"%s\", 轉寄至 %s\n", cuser.userid, sender, receiver, say, address, ctime4(&now)); + log_filef("etc/osong.log", LOG_CREAT, "id: %-12s ◇ %s 點給 %s : \"%s\", 轉寄至 %s\n", cuser.userid, sender, receiver, say, address); if (append_record(OSONGPATH "/.DIR", &mail, sizeof(mail)) != -1) { cuser.lastsong = now; @@ -371,20 +353,6 @@ mail_redenvelop(const char *from, const char *to, int money, char mode) append_record(genbuf, &fhdr, sizeof(fhdr)); } -/* 計算贈與稅 */ -int -give_tax(int money) -{ - int i, tax = 0; - int tax_bound[] = {1000000, 100000, 10000, 1000, 0}; - double tax_rate[] = {0.4, 0.3, 0.2, 0.1, 0.08}; - for (i = 0; i <= 4; i++) - if (money > tax_bound[i]) { - tax += (money - tax_bound[i]) * tax_rate[i]; - money -= (money - tax_bound[i]); - } - return (tax <= 0) ? 1 : tax; -} int do_give_money(char *id, int uid, int money) { @@ -400,7 +368,7 @@ int do_give_money(char *id, int uid, int money) return -1; /* 繳完稅就沒錢給了 */ deumoney(uid, money - tax); demoney(-money); - log_file(FN_MONEY, LOG_CREAT | LOG_VF, "%-12s 給 %-12s %d\t(稅後 %d)\t%s", + log_filef(FN_MONEY, LOG_CREAT, "%-12s 給 %-12s %d\t(稅後 %d)\t%s", cuser.userid, id, money, money - tax, ctime4(&now)); #ifdef PLAY_ANGEL getuser(id, &xuser); diff --git a/mbbsd/calendar.c b/mbbsd/calendar.c index 865e52be..053474fe 100644 --- a/mbbsd/calendar.c +++ b/mbbsd/calendar.c @@ -1,8 +1,6 @@ /* $Id$ */ #include "bbs.h" -#if !defined(PTTBBS_UTIL) - typedef struct event_t { int year, month, day, days; int color; @@ -19,15 +17,6 @@ MonthDay(int m, int leap) return leap && m == 2 ? 29 : day[m - 1]; } -static int -IsLeap(int y) -{ - if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) - return 1; - else - return 0; -} - static int Days(int y, int m, int d) { @@ -37,7 +26,7 @@ Days(int y, int m, int d) + ((y - 1) / 4) - ((y - 1) / 100) + ((y - 1) / 400) + d - 1; for (i = 1; i < m; i++) - w += MonthDay(i, IsLeap(y)); + w += MonthDay(i, is_leap_year(y)); return w; } @@ -61,7 +50,7 @@ int ParseDate(const char *date, int *year, int *month, int *day) *month = atoi(m); *day = atoi(d); if (*year < 1 || *month < 1 || *month > 12 || - *day < 1 || *day > MonthDay(*month, IsLeap(*year))) + *day < 1 || *day > MonthDay(*month, is_leap_year(*year))) return 1; return 0; } @@ -242,7 +231,7 @@ GenerateCalendar(char **buf, int y, int m, int today, event_t * e) /* initial event */ for (; e && e->days < first_day; e = e->next); - d = MonthDay(m, IsLeap(y)); + d = MonthDay(m, is_leap_year(y)); for (i = 1; i <= d; i++, w = (w + 1) % 7) { attr1[0] = 0; attr2 = ""; @@ -336,25 +325,3 @@ calendar(void) pressanykey(); return 0; } - -#endif - -int getHoroscope(int m, int d) -{ - if (m > 12 || m < 1) - return 1; - - // Return: 1 .. 12 - // 摩羯 水瓶 雙魚 牡羊 金牛 雙子 巨蟹 獅子 處女 天秤 天蠍 射手 - const int firstday[12] = { - /* Jan. */ 20, 19, 21, 20, 21, 21, 23, 23, 23, 23, 22, 22 - }; - if (d >= firstday[m - 1]) { - if (m == 12) - return 1; - else - return m + 1; - } - else - return m; -} diff --git a/mbbsd/chicken.c b/mbbsd/chicken.c index 6fcffba3..7dd9118f 100644 --- a/mbbsd/chicken.c +++ b/mbbsd/chicken.c @@ -136,7 +136,7 @@ new_chicken(void) sizeof(tmp_name), DOECHO); strlcpy(mychicken->name, tmp_name, sizeof(mychicken->name)); - log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + log_filef(CHICKENLOG, LOG_CREAT, ANSI_COLOR(31) "%s " ANSI_RESET "養了一隻叫" ANSI_COLOR(33) " %s " ANSI_RESET "的 " ANSI_COLOR(32) "%s" ANSI_RESET " 於 %s\n", cuser.userid, mychicken->name, chicken_type[(int)mychicken->type], ctime4(&now)); @@ -430,7 +430,7 @@ ch_kill(void) vice(100, "棄養寵物費"); more(CHICKEN_PIC "/deadth", YEA); - log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + log_filef(CHICKENLOG, LOG_CREAT, ANSI_COLOR(31) "%s " ANSI_RESET "把 " ANSI_COLOR(33) "%s" ANSI_RESET ANSI_COLOR(32) " %s " ANSI_RESET "宰了 於 %s\n", cuser.userid, mychicken->name, chicken_type[(int)mychicken->type], ctime4(&now)); @@ -487,7 +487,7 @@ ch_sell(int age) ans = getans("這隻%d歲%s可以賣 %d 元, 是否要賣?(y/N)", age, chicken_type[(int)mychicken->type], money); if (ans == 'y') { - log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + log_filef(CHICKENLOG, LOG_CREAT, ANSI_COLOR(31) "%s" ANSI_RESET " 把 " ANSI_COLOR(33) "%s" ANSI_RESET " " ANSI_COLOR(32) "%s" ANSI_RESET " 用 " ANSI_COLOR(36) "%d" ANSI_RESET " 賣了 於 %s\n", cuser.userid, mychicken->name, @@ -644,7 +644,7 @@ deadtype(const chicken_t * thechicken) return 0; if (thechicken == mychicken) { - log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + log_filef(CHICKENLOG, LOG_CREAT, ANSI_COLOR(31) "%s" ANSI_RESET " 所疼愛的" ANSI_COLOR(33) " %s" ANSI_COLOR(32) " %s " ANSI_RESET "掛了 於 %s\n", cuser.userid, thechicken->name, chicken_type[(int)thechicken->type], ctime4(&now)); @@ -701,7 +701,7 @@ ch_changename(void) if (strlen(newname) >= 3 && strcmp(newname, mychicken->name)) { strlcpy(mychicken->name, newname, sizeof(mychicken->name)); - log_file(CHICKENLOG, LOG_CREAT | LOG_VF, + log_filef(CHICKENLOG, LOG_CREAT, ANSI_COLOR(31) "%s" ANSI_RESET " 把疼愛的" ANSI_COLOR(33) " %s" ANSI_COLOR(32) " %s " ANSI_RESET "改名為" ANSI_COLOR(33) " %s" ANSI_RESET " 於 %s\n", cuser.userid, mychicken->name, diff --git a/mbbsd/dice.c b/mbbsd/dice.c index e809044a..e353bec4 100644 --- a/mbbsd/dice.c +++ b/mbbsd/dice.c @@ -80,19 +80,6 @@ IsNum(const char *a, int n) return 1; } -#if 0 -static int -IsSNum(char *a) -{ - int i; - - for (i = 0; a[i]; i++) - if (a[i] > '9' || a[i] < '0') - return 0; - return 1; -} -#endif - static void show_data(void) { diff --git a/mbbsd/friend.c b/mbbsd/friend.c index e3c31fb9..a3e77f0d 100644 --- a/mbbsd/friend.c +++ b/mbbsd/friend.c @@ -319,7 +319,7 @@ inline void friend_load_real(int tosort, int maxf, fclose(fp); if( tosort ) - qsort(tarray, nFriends, sizeof(int), qsort_intcompar); + qsort(tarray, nFriends, sizeof(int), cmp_int); if( destn ) *destn = nFriends; tarray[nFriends] = 0; diff --git a/mbbsd/io.c b/mbbsd/io.c index 9b5f1308..39b62836 100644 --- a/mbbsd/io.c +++ b/mbbsd/io.c @@ -637,142 +637,6 @@ wait_input(float f, int flDoRefresh) return 1; } -/** - * 根據 mode 來 strip 字串 str,並把結果存到 buf - * @param buf - * @param str - * @param mode enum {STRIP_ALL = 0, ONLY_COLOR, NO_RELOAD}; - * STRIP_ALL: 全部吃掉 - * ONLY_COLOR: 吃掉所有跟顏色無關的 (ESC[*m) - * NO_RELOAD: 不 strip (?) - */ -static const char EscapeFlag[] = { - /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, - /* 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 30 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, /* 0~9 ;= */ - /* 40 */ 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, /* ABCDHIJK */ - /* 50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 60 */ 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 2, 0, 0, /* fhlm */ - /* 70 */ 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* su */ - /* 80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* A0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* B0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* C0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* D0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* E0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* F0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; -#define isEscapeParam(X) (EscapeFlag[(int)(X)] & 1) -#define isEscapeCommand(X) (EscapeFlag[(int)(X)] & 2) - -int -strip_ansi(char *buf, const char *str, int mode) -{ - register int count = 0; - - for(; *str; ++str) - if( *str != ESC_CHR ){ - if( buf ) - *buf++ = *str; - ++count; - }else{ - const char* p = str + 1; - if( *p != '[' ){ - ++str; - if(*str=='\0') break; - continue; - } - while(isEscapeParam(*++p)); - if( (mode == NO_RELOAD && isEscapeCommand(*p)) || - (mode == ONLY_COLOR && *p == 'm' )){ - register int len = p - str + 1; - if( buf ){ - strncpy(buf, str, len); - buf += len; - } - count += len; - } - str = p; - if(*str=='\0') break; - } - if( buf ) - *buf = 0; - return count; -} - -int -strlen_noansi(const char *s) -{ - // XXX this is almost identical to - // strip_ansi(NULL, s, STRIP_ALL) - register int count = 0, mode = 0; - - if (!s || !*s) - return 0; - - for (; *s; ++s) - { - // 0 - no ansi, 1 - [, 2 - param+cmd - switch (mode) - { - case 0: - if (*s == ESC_CHR) - mode = 1; - else - count ++; - break; - - case 1: - if (*s == '[') - mode = 2; - else - mode = 0; // unknown command - break; - - case 2: - if (isEscapeParam(*s)) - continue; - else if (isEscapeCommand(*s)) - mode = 0; - else - mode = 0; - break; - } - } - return count; -} - -void -strip_nonebig5(unsigned char *str, int maxlen) -{ - int i; - int len=0; - for(i=0;i 0) - waitpid(pid, NULL, 0); - else - return -1; - } - return 0; -} - -int -Copy(const char *src, const char *dst) -{ - int fi, fo, bytes; - char buf[8192]; - fi=open(src, O_RDONLY); - if(fi<0) return -1; - fo=open(dst, O_WRONLY | O_TRUNC | O_CREAT, 0600); - if(fo<0) {close(fi); return -1;} - while((bytes=read(fi, buf, sizeof(buf)))>0) - write(fo, buf, bytes); - close(fo); - close(fi); - return 0; -} - -int -CopyN(const char *src, const char *dst, int n) -{ - int fi, fo, bytes; - char buf[8192]; - - fi=open(src, O_RDONLY); - if(fi<0) return -1; - - fo=open(dst, O_WRONLY | O_TRUNC | O_CREAT, 0600); - if(fo<0) {close(fi); return -1;} - - while(n > 0 && (bytes=read(fi, buf, sizeof(buf)))>0) - { - n -= bytes; - if (n < 0) - bytes += n; - write(fo, buf, bytes); - } - close(fo); - close(fi); - return 0; -} - -/* append data from tail of src (starting point=off) to dst */ -int -AppendTail(const char *src, const char *dst, int off) -{ - int fi, fo, bytes; - char buf[8192]; - - fi=open(src, O_RDONLY); - if(fi<0) return -1; - - fo=open(dst, O_WRONLY | O_APPEND | O_CREAT, 0600); - if(fo<0) {close(fi); return -1;} - - if(off > 0) - lseek(fi, (off_t)off, SEEK_SET); - - while((bytes=read(fi, buf, sizeof(buf)))>0) - { - write(fo, buf, bytes); - } - close(fo); - close(fi); - return 0; -} - -int -Link(const char *src, const char *dst) -{ - if (strcmp(src, BBSHOME "/home") == 0) - return 1; - if (symlink(src, dst) == 0) - return 0; - - return Copy(src, dst); -} - -char * -my_ctime(const time4_t * t, char *ans, int len) -{ - struct tm *tp; - - tp = localtime4((time4_t*)t); - snprintf(ans, len, - "%02d/%02d/%02d %02d:%02d:%02d", (tp->tm_year % 100), - tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec); - return ans; -} diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c index 87b98b0f..41a8ab4a 100644 --- a/mbbsd/mbbsd.c +++ b/mbbsd/mbbsd.c @@ -123,12 +123,12 @@ log_usies(const char *mode, const char *mesg) { now = time(NULL); if (!mesg) - log_file(FN_USIES, LOG_CREAT | LOG_VF, + log_filef(FN_USIES, LOG_CREAT, "%s %s %-12s Stay:%d (%s)\n", Cdate(&now), mode, cuser.userid , (int)(now - login_start_time) / 60, cuser.nickname); else - log_file(FN_USIES, LOG_CREAT | LOG_VF, + log_filef(FN_USIES, LOG_CREAT, "%s %s %-12s %s\n", Cdate(&now), mode, cuser.userid, mesg); @@ -277,7 +277,7 @@ abort_bbs_debug(int sig) /* log */ /* assume vsnprintf() in log_file() is signal-safe, is it? */ - log_file("log/crash.log", LOG_VF|LOG_CREAT, + log_filef("log/crash.log", LOG_CREAT, "%ld %d %d %.12s\n", time4(NULL), getpid(), sig, cuser.userid); /* try logout... not a good idea, maybe crash again. now disabled */ diff --git a/mbbsd/pmore.c b/mbbsd/pmore.c index 589fa893..abca918f 100644 --- a/mbbsd/pmore.c +++ b/mbbsd/pmore.c @@ -2295,7 +2295,7 @@ pmore(char *fpath, int promptend) #ifdef PMORE_LOG_SYSOP_EDIT time4_t t = time4(NULL); - log_file("log/security", LOG_VF|LOG_CREAT, + log_filef("log/security", LOG_CREAT, "%d %24.24s %d %s admin edit file=%s\n", t, ctime4(&t), getpid(), cuser.userid, fpath); #endif // PMORE_LOG_SYSOP_EDIT diff --git a/mbbsd/record.c b/mbbsd/record.c index d896398f..37d15870 100644 --- a/mbbsd/record.c +++ b/mbbsd/record.c @@ -5,21 +5,6 @@ #undef HAVE_MMAP #define BUFSIZE 512 -static void -PttLock(int fd, int start, int size, int mode) -{ - static struct flock lock_it; - int ret; - - lock_it.l_whence = SEEK_CUR;/* from current point */ - lock_it.l_start = start; /* -"- */ - lock_it.l_len = size; /* length of data */ - lock_it.l_type = mode; /* set exclusive/write lock */ - lock_it.l_pid = 0; /* pid not actually interesting */ - while ((ret = fcntl(fd, F_SETLKW, &lock_it)) < 0 && errno == EINTR) - sleep(1); -} - #define safewrite write int diff --git a/mbbsd/stuff.c b/mbbsd/stuff.c index 371583f4..abe65680 100644 --- a/mbbsd/stuff.c +++ b/mbbsd/stuff.c @@ -1,6 +1,5 @@ /* $Id$ */ #include "bbs.h" -#include "fnv_hash.h" /* ----------------------------------------------------- */ /* set file path for boards/user home */ @@ -9,7 +8,6 @@ static const char * const str_home_file = "home/%c/%s/%s"; static const char * const str_board_file = "boards/%c/%s/%s"; static const char * const str_board_n_file = "boards/%c/%s/%s.%d"; -static char cdate_buffer[32]; static const char * const str_dotdir = FN_DIR; @@ -127,81 +125,6 @@ subject(char *title) return title; } -/* ----------------------------------------------------- */ -/* 字串轉換檢查函數 */ -/* ----------------------------------------------------- */ -/** - * 將字串 s 轉為小寫存回 t - * @param t allocated char array - * @param s - */ -void -str_lower(char *t, const char *s) -{ - register unsigned char ch; - - do { - ch = *s++; - *t++ = char_lower(ch); - } while (ch); -} - -/** - * 移除字串 buf 後端多餘的空白。 - * @param buf - */ -void -trim(char *buf) -{ /* remove trailing space */ - char *p = buf; - - while (*p) - p++; - while (--p >= buf) { - if (*p == ' ') - *p = '\0'; - else - break; - } -} - -/** - * 移除 src 的 '\n' 並改成 '\0' - * @param src - */ -void chomp(char *src) -{ - while(*src){ - if (*src == '\n') - *src = 0; - else - src++; - } -} - -/* ----------------------------------------------------- */ -/* 字串檢查函數:英文、數字、檔名、E-mail address */ -/* ----------------------------------------------------- */ - -int -invalid_pname(const char *str) -{ - const char *p1, *p2, *p3; - - p1 = str; - while (*p1) { - if (!(p2 = strchr(p1, '/'))) - p2 = str + strlen(str); - if (p1 + 1 > p2 || p1 + strspn(p1, ".") == p2) /* 不允許用 / 開頭, 或是 // 之間只有 . */ - return 1; - for (p3 = p1; p3 < p2; p3++) - if (not_alnum(*p3) && !strchr("@[]-._", *p3)) /* 只允許 alnum 或這些符號 */ - return 1; - p1 = p2 + (*p2 ? 1 : 0); - } - return 0; -} - int is_validuserid(const char *id) { int len, i; @@ -212,10 +135,10 @@ int is_validuserid(const char *id) if (len < 2 || len>IDLEN) return 0; - if (not_alpha(id[0])) + if (!isalpha(id[0])) return 0; for (i = 1; i < len; i++) - if (not_alnum(id[i])) + if (!isalnum(id[i])) return 0; return 1; } @@ -279,197 +202,12 @@ userid_is_BM(const char *userid, const char *list) return 0; } -/* ----------------------------------------------------- */ -/* 檔案檢查函數:檔案、目錄、屬於 */ -/* ----------------------------------------------------- */ - -/** - * 傳回 fname 的檔案大小 - * @param fname - */ -off_t -dashs(const char *fname) -{ - struct stat st; - - if (!stat(fname, &st)) - return st.st_size; - else - return -1; -} - -/** - * 傳回 fname 的 mtime - * @param fname - */ -time4_t -dasht(const char *fname) -{ - struct stat st; - - if (!stat(fname, &st)) - return st.st_mtime; - else - return -1; -} - -/** - * 傳回 fname 是否為 symbolic link - * @param fname - */ -int -dashl(const char *fname) -{ - struct stat st; - - return (lstat(fname, &st) == 0 && S_ISLNK(st.st_mode)); -} - -/** - * 傳回 fname 是否為一般的檔案 - * @param fname - */ -int -dashf(const char *fname) -{ - struct stat st; - - return (stat(fname, &st) == 0 && S_ISREG(st.st_mode)); -} - -/** - * 傳回 fname 是否為目錄 - * @param fname - */ -int -dashd(const char *fname) -{ - struct stat st; - - return (stat(fname, &st) == 0 && S_ISDIR(st.st_mode)); -} - -#define BUFFER_SIZE 8192 -static int copy_file_to_file(const char *src, const char *dst) -{ - char buf[BUFFER_SIZE]; - int fdr, fdw, len; - - if ((fdr = open(src, O_RDONLY)) < 0) - return -1; - - if ((fdw = open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0) { - close(fdr); - return -1; - } - - while (1) { - len = read(fdr, buf, sizeof(buf)); - if (len <= 0) - break; - write(fdw, buf, len); - if (len < BUFFER_SIZE) - break; - } - - close(fdr); - close(fdw); - return 0; -} -#undef BUFFER_SIZE - -static int copy_file_to_dir(const char *src, const char *dst) -{ - char buf[PATHLEN]; - char *slash; - if ((slash = rindex(src, '/')) == NULL) - snprintf(buf, PATHLEN, "%s/%s", dst, src); - else - snprintf(buf, PATHLEN, "%s/%s", dst, slash); - return copy_file_to_file(src, buf); -} - -static int copy_dir_to_dir(const char *src, const char *dst) -{ - DIR *dir; - struct dirent *entry; - struct stat st; - char buf[PATHLEN], buf2[PATHLEN]; - - if (stat(dst, &st) < 0) - if (mkdir(dst, 0700) < 0) - return -1; - - if ((dir = opendir(src)) == NULL) - return -1; - - while ((entry = readdir(dir)) != NULL) { - if (strcmp(entry->d_name, ".") == 0 || - strcmp(entry->d_name, "..") == 0) - continue; - snprintf(buf, PATHLEN, "%s/%s", src, entry->d_name); - snprintf(buf2, PATHLEN, "%s/%s", dst, entry->d_name); - if (stat(buf, &st) < 0) - continue; - if (S_ISDIR(st.st_mode)) - mkdir(buf2, 0700); - copy_file(buf, buf2); - } - - closedir(dir); - return 0; -} - -/** - * copy src to dst (recursively) - * @param src and dst are file or dir - * @return -1 if failed - */ -int copy_file(const char *src, const char *dst) -{ - struct stat st; - - if (stat(dst, &st) == 0 && S_ISDIR(st.st_mode)) { - if (stat(src, &st) < 0) - return -1; - - if (S_ISDIR(st.st_mode)) - return copy_dir_to_dir(src, dst); - else if (S_ISREG(st.st_mode)) - return copy_file_to_dir(src, dst); - return -1; - } - else if (stat(src, &st) == 0 && S_ISDIR(st.st_mode)) - return copy_dir_to_dir(src, dst); - return copy_file_to_file(src, dst); -} - int belong(const char *filelist, const char *key) { return file_exist_record(filelist, key); } -unsigned int -ipstr2int(const char *ip) -{ - unsigned int i, val = 0; - char buf[32]; - char *nil, *p; - - strlcpy(buf, ip, sizeof(buf)); - p = buf; - for (i = 0; i < 4; i++) { - nil = strchr(p, '.'); - if (nil != NULL) - *nil = 0; - val *= 256; - val += atoi(p); - if (nil != NULL) - p = nil + 1; - } - return val; -} #ifndef _BBS_UTIL_C_ /* getdata_buf */ time4_t @@ -502,35 +240,6 @@ gettime(int line, time4_t dt, const char*head) } #endif -char * -Cdate(const time4_t *clock) -{ - time_t temp = (time_t)*clock; - struct tm *mytm = localtime(&temp); - - strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d/%Y %T %a", mytm); - return cdate_buffer; -} - -char * -Cdatelite(const time4_t *clock) -{ - time_t temp = (time_t)*clock; - struct tm *mytm = localtime(&temp); - - strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d/%Y %T", mytm); - return cdate_buffer; -} - -char * -Cdatedate(const time4_t * clock) -{ - time_t temp = (time_t)*clock; - struct tm *mytm = localtime(&temp); - - strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d/%Y", mytm); - return cdate_buffer; -} #ifndef _BBS_UTIL_C_ /* 這一區都是有關於畫面處理的, 故 _BBS_UTIL_C_ 不須要 */ @@ -858,36 +567,7 @@ log_user(const char *fmt, ...) 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(const char *fn, int flag, const char *fmt,...) -{ - int fd; - 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, realmsg, strlen(realmsg)) < 0 ){ - close(fd); - return -1; - } - close(fd); - return 0; + return log_filef(filename, LOG_CREAT, "%s: %s %s", cuser.userid, msg, Cdate(&now)); } void @@ -954,11 +634,6 @@ void FREE(void *ptr) } #endif -unsigned -StringHash(const char *s) -{ - return fnv1a_32_strcase(s, FNV1_32_INIT); -} unsigned DBCS_StringHash(const char *s) @@ -1007,120 +682,3 @@ uintbsearch(const unsigned int key, const unsigned int *base0, const int nmemb) return (NULL); } -int qsort_intcompar(const void *a, const void *b) -{ - return *(int *)a - *(int *)b; -} - -#ifdef TIMET64 -char * -ctime4(const time4_t *clock) -{ - time_t temp = (time_t)*clock; - - return ctime(&temp); -} - -struct tm *localtime4(const time4_t *t) -{ - if( t == NULL ) - return localtime(NULL); - else { - time_t temp = (time_t)*t; - return localtime(&temp); - } -} - -time4_t time4(time4_t *ptr) -{ - if( ptr == NULL ) - return time(NULL); - else - return *ptr = (time4_t)time(NULL); -} -#endif - -#ifdef OUTTACACHE -int tobind(const char * host, int port) -{ - int sockfd, val = 1; - struct sockaddr_in servaddr; - - if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { - perror("socket()"); - exit(1); - } - setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, - (char *)&val, sizeof(val)); - bzero(&servaddr, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - if (host == NULL || host[0] == 0) - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - else if (inet_aton(host, &servaddr.sin_addr) == 0) { - perror("inet_aton()"); - exit(1); - } - servaddr.sin_port = htons(port); - if( bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) { - perror("bind()"); - exit(1); - } - if( listen(sockfd, 5) < 0 ) { - perror("listen()"); - exit(1); - } - - return sockfd; -} - -int toconnect(const char *host, int port) -{ - int sock; - struct sockaddr_in serv_name; - if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ - perror("socket"); - return -1; - } - - serv_name.sin_family = AF_INET; - serv_name.sin_addr.s_addr = inet_addr(host); - serv_name.sin_port = htons(port); - if( connect(sock, (struct sockaddr*)&serv_name, sizeof(serv_name)) < 0 ){ - close(sock); - return -1; - } - return sock; -} - -/** - * same as read(2), but read until exactly size len - */ -int toread(int fd, void *buf, int len) -{ - int l; - for( l = 0 ; len > 0 ; ) - if( (l = read(fd, buf, len)) <= 0 ) - return -1; - else{ - buf += l; - len -= l; - } - return l; -} - -/** - * same as write(2), but write until exactly size len - */ -int towrite(int fd, const void *buf, int len) -{ - int l; - for( l = 0 ; len > 0 ; ) - if( (l = write(fd, buf, len)) <= 0 ) - return -1; - else{ - buf += l; - len -= l; - } - return l; -} -#endif diff --git a/mbbsd/topsong.c b/mbbsd/topsong.c index a60a26c4..906dadbf 100644 --- a/mbbsd/topsong.c +++ b/mbbsd/topsong.c @@ -25,15 +25,6 @@ topsong(void) return 0; } -static int -strip_blank(char *cbuf, char *buf) -{ - for (; *buf; buf++) - if (*buf != ' ') - *cbuf++ = *buf; - *cbuf = 0; - return 0; -} void sortsong(void) diff --git a/mbbsd/user.c b/mbbsd/user.c index 889bc9b0..f2475e95 100644 --- a/mbbsd/user.c +++ b/mbbsd/user.c @@ -100,7 +100,7 @@ int u_cancelbadpost(void) cuser.badpost--; cuser.timeremovebadpost = now; passwd_update(usernum, &cuser); - log_file("log/cancelbadpost.log", LOG_VF|LOG_CREAT, + log_filef("log/cancelbadpost.log", LOG_CREAT, "%s %s 刪除一篇劣文\n", Cdate(&now), cuser.userid); } vmsg("恭喜您已經成功\刪除一篇劣文."); -- cgit v1.2.3