【 以下文字转载自 BBSSystem 讨论区 】
【 原文由 AM 所发表 】
/* 检查版主出勤情况 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "/home/bbs/src/bbssrc/include/bbs.h"
#include "/home/bbs/src/bbssrc/include/config.h"
#include "/home/bbs/src/bbssrc/include/permissions.h"
#define HOME "/home/bbs/"
#define MAX_ABSENCE (86400*14) //now set to 2 weeks;
struct boardheader b[MAXBOARD];
char bmname[MAXBOARD][5][IDLEN+2];
time_t lv[MAXBOARD][5];
int bmnums[MAXBOARD];
int brdnum;
struct tm parsed;
static char des[12][4]= {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
};
int main()
{
FILE *fp;
time_t now;
char *token, *ptr, buf[180], temp[180], id[IDLEN+2],
brd[STRLEN];
int i, j, found, locx, locy;
now=time(0);
printf("版主出勤情况统计(小百合版)\n\n\n");
printf("统计开始时间:%s", ctime(&now));
memset(&lv , 0, sizeof(time_t)*MAXBOARD*5);
fp=fopen(HOME".BOARDS", "r");
if (fp==NULL){
printf("Cannot open .BOARDS!\n");
return -1;
}
i=0;
while (1){
if ( fread(&b[i],sizeof(b[i]),1, fp) <= 0 )
break;
j=0;
if (strlen(b[i].filename)==0)
continue;
//printf("Loading board %s: \n", b[i].filename );
token = strtok( b[i].BM, " " );
while ( token != NULL )
{
if (((unsigned)*token <= 'z')&&(strcmp(token, "SYSOP")))
{
strcpy(bmname[i][j], token);
j++;
}
token = strtok( NULL, " " );
}
bmnums[i]=j;
i++;
}
fclose(fp);
brdnum=i;
fp=fopen(HOME"use_board", "r");
if (fp==NULL){
printf("Cannot open usage log!\n");
return -1;
}
while (!feof(fp)) {
fgets(buf, 179, fp);
//printf("processing %s\n", buf);
/* An example of the buffer:
Nov 2 18:53:32 1999 USE Psychology Stay: 3 (tim)
1 2 5
0 4 0 5 9
*/
if (strlen(buf)<60) continue;
strcpy(temp, &buf[25]);
ptr=strchr(temp, ' ');
*ptr='\0';
strcpy(brd, temp);
strcpy(temp, &buf[59]);
ptr=strchr(temp, ')');
*ptr='\0';
strcpy(id, temp);
i=0; found=0;
while ( i<brdnum)
{
if (strcmp(brd, b[i].filename))
{ i++; continue;}
j=0;
while ( j< bmnums[i])
{
if (!strcmp(bmname[i][j], id))
{
found=1;
break;
}
j++;
}
if (found) break;
i++;
}
if (found){
memcpy(&parsed, localtime(&now),sizeof(parsed));
locx=i; locy=j;
i=0;
while (i<12)
{
if (strncmp(buf, des[i], 3))
i++;
else {
parsed.tm_mon=i;
break;
}
}
i=0;
token = strtok( &buf[4], " :\t" );
while ( token != NULL )
{
j=atoi(token);
//printf("(%d)%s,%d\n", i, token, j);
switch (i){
case 0:
parsed.tm_mday=j;
break;
case 1:
parsed.tm_hour=j;
break;
case 2:
parsed.tm_min=j;
break;
case 3:
parsed.tm_sec=j;
break;
case 4:
parsed.tm_year=j-1900;
break;
}
i++;
token = strtok( NULL, " :\t" );
if (!strcmp(token, "USE"))
break;
}
lv[locx][locy] = mktime(&parsed);
/*
printf("(%s)%s, %d/%d/%d %d:%d:%d %s",
b[locx].filename, bmname[locx][locy],
parsed.tm_year,
parsed.tm_mon, parsed.tm_mday,
parsed.tm_hour,parsed.tm_min,parsed.tm_sec, ctime(&lv[locx][locy])
);
*/
}
}
fclose(fp);
for (i=0; i< brdnum; i++)
{
if (strlen(b[i].filename)==0)
continue;
for (j=0; j<bmnums[i]; j++)
if (lv[i][j]==0)
printf("%20s版版主%12s上次进版时间记录找不到。\n",
b[i].filename, bmname[i][j]);
else if ((now-lv[i][j])>MAX_ABSENCE) //2 weeks;
{
printf("%20s版版主%12s上次进版时间是%s",
b[i].filename, bmname[i][j],
ctime(&lv[i][j]));
}
}
now=time(0);
printf("统计结束时间:%s", ctime(&now));
return 0;
}
--