[文件] 上一篇的附件account.c的內容

看板SetupBBS作者時間22年前 (2004/04/19 10:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
/*-------------------------------------------------------*/ /* util/account.c ( NTHU CS MapleBBS Ver 2.36 ) */ /*-------------------------------------------------------*/ /* target : 上站人次統計、系統資料備份 */ /* create : 95/03/29 */ /* update : 95/12/15 */ /*-------------------------------------------------------*/ #include "bbs.h" #include <time.h> #include <sys/ipc.h> #include <sys/shm.h> #include "record.c" #define MAX_LINE 16 #define ADJUST_M 6 /* adjust back 5 minutes */ /* Ptt about share memory */ struct UCACHE *uidshm; struct FILMCACHE *ptt; struct FROMCACHE *fcache; static void attach_err(shmkey, name) int shmkey; char *name; { fprintf(stderr, "[%s error] key = %x\n", name, shmkey); exit(1); } static void * attach_shm(shmkey, shmsize) int shmkey, shmsize; { void *shmptr; int shmid; shmid = shmget(shmkey, shmsize, 0); if (shmid < 0) { shmid = shmget(shmkey, shmsize, IPC_CREAT | 0600); if (shmid < 0) attach_err(shmkey, "shmget"); shmptr = (void *) shmat(shmid, NULL, 0); if (shmptr == (void *) -1) attach_err(shmkey, "shmat"); } return shmptr; } void resolve_ucache() { if (uidshm == NULL) { uidshm = attach_shm(UIDSHM_KEY, sizeof(*uidshm)); } } void reset_garbage() { if (ptt == NULL) { ptt = attach_shm(FILMSHM_KEY, sizeof(*ptt)); if (ptt->touchtime == 0) ptt->touchtime = 1; } ptt->uptime =0; } void resolve_fcache() { if (fcache == NULL) { fcache = attach_shm(FROMSHM_KEY, sizeof(*fcache)); if (fcache->touchtime == 0) fcache->touchtime = 1; } fcache->uptime =0; } void keeplog(fpath, board, title) char *fpath; char *board; char *title; { fileheader fhdr; char genbuf[256]; char *flog; if(!board) board = "Record"; sprintf(genbuf, "boards/%s", board); stampfile(genbuf, &fhdr); f_mv(fpath, genbuf); strcpy(fhdr.title, title); strcpy(fhdr.owner, "[歷史的今天]"); sprintf(genbuf, "boards/%s/.DIR", board); rec_add(genbuf, &fhdr, sizeof(fhdr)); } void outs(fp, buf, mode) FILE *fp; char buf[], mode; { static char state = '0'; strcpy(fhdr.owner, "[歷史的今天]"); sprintf(genbuf, "boards/%s/.DIR", board); if (state != mode) fprintf(fp, "^[[3%cm", state = mode); if (buf[0]) { fprintf(fp, buf); buf[0] = 0; } } void gzip(source, target, stamp) char *source, *target, *stamp; { char buf[128]; sprintf(buf, "/bin/gzip -9n adm/%s%s", target, stamp); f_mv(source, &buf[14]); system(buf); } main() { int hour, max, item, total, i, j,mo,da,max_user=0,max_login=0,max_reg=0,mahour,k; char *act_file = ".act"; char *log_file = "usies"; char buf[256],buf1[256], *p; FILE *fp,*fp1; int act[27]; /* 次數/累計時間/pointer */ time_t now; struct tm *ptime; chdir(BBSHOME); now = time(NULL) - ADJUST_M * 60; /* back to ancent */ ptime = localtime(&now); memset(act, 0, sizeof(act)); printf("次數/累計時間\n"); if ((ptime->tm_hour != 0) && (fp = fopen(act_file, "r"))) { fread(act, sizeof(act), 1, fp); fclose(fp); } if ((fp = fopen(log_file, "r")) == NULL) time_t now; struct tm *ptime; chdir(BBSHOME); now = time(NULL) - ADJUST_M * 60; /* back to ancent */ ptime = localtime(&now); memset(act, 0, sizeof(act)); printf("次數/累計時間\n"); if ((ptime->tm_hour != 0) && (fp = fopen(act_file, "r"))) { fread(act, sizeof(act), 1, fp); fclose(fp); } if ((fp = fopen(log_file, "r")) == NULL) { printf("cann't open usies\n"); if (fp = fopen(act_file, "w")) { memset(act, 0, sizeof(act)); fwrite(act, sizeof(act), 1, fp); fclose(fp); } return 1; } if (act[26]) fseek(fp, (off_t)(act[26]), 0); while (fgets(buf, 256, fp)) { hour = atoi(buf + 9); if (hour < 0 || hour > 23) { continue; } if (!strncmp(buf + 22, "ENTER", 5)) { act[hour]++; continue; } if (p = (char *) strstr(buf + 40, "Stay:")) { if (hour = atoi(p + 5)) { act[24] += hour; act[25]++; } continue; } } act[26] = ftell(fp); fclose(fp); for (i = max = total = 0; i < 24; i++) { total += act[i]; if (act[i] > max) { max_user = max = act[i]; mahour = i; } } item = max / MAX_LINE + 1; if (!ptime->tm_hour) keeplog("etc/today", "Record", "[塵埃紀錄] 上站人次統計"); if ((fp = fopen("etc/today", "w")) == NULL) { printf("cann't open etc/today\n"); return 1; } fprintf(fp, "\t\t\t^[[1m^[[33;46m 每小時上站人次統計 [%02d/%02d/%02d] ^[[40m\n \n", ptime->tm_year % 100, ptime->tm_mon + 1, ptime->tm_mday); {or (i = MAX_LINE + 1; i > 0; i--) strcpy(buf, " "); for (j = 0; j < 24; j++) { max = item * i; hour = act[j]; if (hour && (max > hour) && (max - item <= hour)) { outs(fp, buf, '7'); fprintf(fp, "%-3d", hour); } else if (max <= hour) { outs(fp, buf, '6'); fprintf(fp, "█ "); } else strcat(buf, " "); } else strcat(buf, " "); } fprintf(fp, "\n"); } fprintf(fp, " ^[[33m" "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n\n " "\t^[[33m總共上站人次:^[[37m%-9d^[[33m平均使用人數:^[[37m%-5d^[[33m平均使用伅﹛,total, total/24,act[24]/act[25]+1); fclose(fp); if (fp = fopen(act_file, "w")) { fwrite(act, sizeof(act), 1, fp); fclose(fp); } /* -------------------------------------------------------------- */ sprintf(buf, "-%02d%02d%02d", ptime->tm_year % 100, ptime->tm_mon + 1, ptime->tm_mday); now += ADJUST_M * 60; /* back to future */ /* Ptt 歷史事件處理 */ if(fp = fopen("etc/history.data","r")) { /*最多同時上線*/ if(fscanf(fp,"%d %d %d %d",&max_login,&max,&max_reg,&k)) { int a; resolve_fcache(); printf("此時段最多同時上線:%d 過去:%d",a=fcache->max_user,k); // fclose(fp); if(a > k) { time_t now = time(0); ptime=localtime(&fcache->max_time); // ptime=localtime(&now); if(fp1=fopen("etc/history", "a")) { time_t now = time(0); ptime=localtime(&fcache->max_time); // ptime=localtime(&now); if(fp1=fopen("etc/history", "a")) { fprintf(fp1, "◎ 【%02d/%02d/%02d %02d:%02d】" "^[[32m同時在站內人數^[[m首次達到 ^[[1;36m%d^[[m 人次\n", ptime->tm_mon+1, ptime->tm_mday, ptime->tm_year % 100, ptime->tm_hour,ptime->tm_min,a); fclose(fp1); } fclose(fp); // 如果 a < k,那會關檔兩次, 所以移到這邊 hialan if(fp=fopen("etc/history.data","w")) { fprintf(fp,"%d %d %d %d",max_login,max,max_reg,a); } } } fclose(fp); } ptime = localtime(&now); if(ptime->tm_hour) { printf("多個節日處理\n"); /* Ptt 多個節日處理 */ if(fp1 = fopen("etc/today_is","r")); { char tod[20][100]; for(i=0;fgets(tod[i],20,fp1) && i<100;i++); fclose(fp1); fp1 = fopen("etc/today_is","w"); for(j=1;j<=i;j++) { fputs(tod[j%i],fp1); } fclose(fp1); } /* Ptt reset Ptt's share memory */ reset_garbage(); } if (ptime->tm_wday == 0) { keeplog("log/week", "Record", "[塵埃紀錄] 本週熱門話題"); keeplog("log/trade.log", "Record","[金融中心] 商品販賣狀況"); keeplog("log/race.log", "LocalGame","[遊樂場] 本週賽馬紀錄"); keeplog("log/pip.log", "LocalGame","[遊樂場] 本週電子雞飼養紀錄"); keeplog("log/bingo.log", "LocalGame","[遊樂場] 本週賓果紀錄"); keeplog("log/stock.log", "LocalGame","[遊樂場] 本週股市紀錄"); keeplog("log/gp.log", "LocalGame","[遊樂場] 本週金撲克紀錄"); keeplog("log/dice.log", "LocalGame","[遊樂場] 本週西八拉紀錄"); keeplog("log/marie.log", "LocalGame","[遊樂場] 本週小瑪麗紀錄"); keeplog("log/nine.log", "LocalGame","[遊樂場] 本週九九紀錄"); keeplog("log/ab.log", "LocalGame","[遊樂場] 本週猜數字紀錄"); keeplog("log/bj.log", "LocalGame","[遊樂場] 本週黑傑克紀錄"); keeplog("log/chessmj.log", "LocalGame","[遊樂場] 本週象棋麻將紀錄"); keeplog("log/seven.log", "LocalGame","[遊樂場] 本週賭城七張紀錄"); gzip("bbslog", "bntplink", buf); gzip("innd/bbslog", "innbbsd", buf); gzip("log/bbsmail.log", "mailog", buf); } if (ptime->tm_mday == 1) { keeplog("log/month", "Record", "[塵埃紀錄] 本月熱門話題"); keeplog("log/topboard", "Record", "[塵埃紀錄] 本月看板排行"); keeplog("log/toppersonal", "Record", "[塵埃紀錄] 本月個人板排行"); } if (ptime->tm_yday == 1) keeplog("log/year", "Record", "[塵埃紀錄] 年度熱門話題"); } else if (ptime->tm_hour == 3 && ptime->tm_wday == 6) { char *fn1 = "tmp"; char *fn2 = "suicide"; f_mv(fn1, fn2); mkdir(fn1, 0755); sprintf(buf, "/bin/gtar cfz adm/%s-%02d%02d%02d.tgz %s", fn2, ptime->tm_year % 100, ptime->tm_mon + 1, ptime->tm_mday, fn2); system(buf); sprintf(buf, "/bin/rm -fr %s", fn2); system(buf); } } -- ╭──── bbs.csie.mcu.edu.tw ───────────╮ ╔══╗ 上 <●>The First IPv6 Ready BBS ~~~*歡迎光臨*~~~ 神話 From: 61-216-177-21.dynamic.hinet.net ╚══╝ 去 |﹨ ╰──────────────────────────╯
文章代碼(AID): #10WpBn00 (SetupBBS)