/* $Id: shmctl.c 1484 2004-01-15 17:37:12Z in2 $ */ #include "bbs.h" struct { char userid[IDLEN + 1]; time_t lastlogin, expire; } explist[MAX_FRIEND]; time_t now; void usage(void) { fprintf(stderr, "通知隱板板主是否有板友過期/已經過期\n" "usage: chkhbf [-a] [board name [board name]]\n"); } int mailalertuid(int tuid) { userinfo_t *uentp=NULL; if(tuid>0 && (uentp = (userinfo_t *)search_ulist(tuid)) ) uentp->mailalert=1; return 0; } char *CTIMEx(char *buf, time_t t) { strcpy(buf, ctime(&t)); buf[strlen(buf) - 1] = 0; return buf; } void informBM(char *userid, boardheader_t *bptr, int nEXP) { int uid, i; char filename[256], buf[64]; fileheader_t mymail; FILE *fp; if( !(uid = getuser(userid)) ) return; sprintf(filename, BBSHOME "/home/%c/%s", userid[0], userid); stampfile(filename, &mymail); if( (fp = fopen(filename, "w")) == NULL ) return; printf("brdname: %s, BM: %s\n", bptr->brdname, userid); fprintf(fp, "作者: 系統通知.\n" "標題: 警告: 貴板板友即將過期/已經過期\n" "時間: %s\n" " %s 的板主您好: \n" " 下列貴板板友即將過期或已經過期:\n" "------------------------------------------------------------\n", CTIMEx(buf, now), bptr->brdname); for( i = 0 ; i < nEXP ; ++i ) if( explist[i].expire == -1 ) fprintf(fp, "%-15s 已經過期\n", explist[i].userid); else fprintf(fp, "%-15s 即將在 %s 過期\n", explist[i].userid, CTIMEx(buf, explist[i].expire)); fprintf(fp, "------------------------------------------------------------\n" "說明:\n" " 為了節省系統資源, 系統將自動清除掉超過四個月未上站\n" "的使用者. 此時若有某位您不認識的使用者恰好註冊了該帳號,\n" "將會視為貴板板友而放行進入.\n" " 建議您暫時將這些使用者自貴板的板友名單中移除.\n" "\n" " 這封信件是由程式自動發出, 請不要直接回覆這封信. 若\n" "您有相關問題請麻煩至看板 SYSOP, 或是直接與看板總管聯繫. :)\n" "\n" BBSNAME "站長群敬上" ); fclose(fp); strcpy(mymail.title, "警告: 貴板板友即將過期/已經過期"); strcpy(mymail.owner, "系統通知."); sprintf(filename, BBSHOME "/home/%c/%s/.DIR", userid[0], userid); mailalertuid(uid); append_record(filename, &mymail, sizeof(mymail)); } void chkhbf(boardheader_t *bptr) { char fn[256], chkuser[256]; int i, nEXP = 0; FILE *fp; sprintf(fn, "boards/%c/%s/visable", bptr->brdname[0], bptr->brdname); if( (fp = fopen(fn, "rt")) == NULL ) return; while( fgets(chkuser, sizeof(chkuser), fp) != NULL ){ for( i = 0 ; chkuser[i] != 0 && i < sizeof(chkuser) ; ++i ) if( !isalnum(chkuser[i]) ){ chkuser[i] = 0; break; } if( !getuser(chkuser) || strcmp(chkuser, "guest") == 0 ){ strcpy(explist[nEXP].userid, chkuser); explist[nEXP].expire = -1; ++nEXP; } else if( (xuser.lastlogin < now - 86400 * 90) && !(xuser.userlevel & PERM_XEMPT) ){ strcpy(explist[nEXP].userid, chkuser); explist[nEXP].lastlogin = xuser.lastlogin; explist[nEXP].expire = xuser.lastlogin + 86400 * 120; ++nEXP; } } fclose(fp); if( nEXP ){ char BM[IDLEN * 3 + 3], *p; strlcpy(BM, bptr->BM, sizeof(BM)); for( p = BM ; *p != 0 ; ++p ) if( !isalpha(*p) && !isdigit(*p) ) *p = ' '; for( i = 0, p = strtok(BM, " ") ; p != NULL ; ++i, p = strtok(NULL, " ") ) informBM(p, bptr, nEXP); } } int main(int argc, char **argv) { int ch, allboards = 0, i; boardheader_t *bptr; while( (ch = getopt(argc, argv, "ah")) != -1 ) switch( ch ){ case 'a': allboards = 1; break; case 'h': usage(); return 0; } chdir(BBSHOME); attach_SHM(); argc -= optind; argv += optind; now = time(NULL); if( allboards ){ for( i = 0 ; i < MAX_BOARD ; ++i ){ bptr = &bcache[i]; if( bptr->brdname[0] && !(bptr->brdattr & (BRD_TOP | BRD_GROUPBOARD)) && bptr->brdattr & BRD_HIDE ) chkhbf(bptr); } } else if( argc > 0 ){ int bid; for( i = 0 ; i < argc ; ++i ) if( (bid = getbnum(argv[i])) != 0 ) // XXX: bid start 1 chkhbf(getbcache(bid)); else fprintf(stderr, "%s not found\n", argv[i]); } else usage(); return 0; }