void bbs_make_article_array(zval * array, struct fileheader *fh, char *flags, size_t flags_len) { const struct boardheader *bh; char title[ARTICLE_TITLE_LEN]; add_assoc_string(array, "FILENAME", fh->filename, 1); if (fh->o_bid > 0 && ((bh = getboard(fh->o_bid)) != NULL)) add_assoc_string(array, "O_BOARD", (char*)(bh->filename), 1); /* for compitible */ else add_assoc_string(array, "O_BOARD", "", 1); /* for compitible */ add_assoc_long(array, "O_BID", fh->o_bid); add_assoc_long(array, "O_ID", fh->o_id); add_assoc_long(array, "ID", fh->id); add_assoc_long(array, "GROUPID", fh->groupid); add_assoc_long(array, "REID", fh->reid); add_assoc_long(array, "POSTTIME", get_posttime(fh)); add_assoc_stringl(array, "INNFLAG", fh->innflag, sizeof(fh->innflag), 1); add_assoc_string(array, "OWNER", fh->owner, 1); strcpy(title, fh->title); //process_control_chars(title,NULL); add_assoc_string(array, "TITLE", title, 1); /* add_assoc_long(array, "LEVEL", fh->level);*/ add_assoc_stringl(array, "FLAGS", flags, flags_len, 1); add_assoc_long(array, "ATTACHPOS", fh->attachment); add_assoc_long(array, "EFFSIZE", fh->eff_size); add_assoc_long(array, "IS_TEX", fh->accessed[1] & FILE_TEX); #ifdef HAVE_REPLY_COUNT add_assoc_long(array, "REPLYCOUNT", fh->replycount); add_assoc_string(array, "LAST_OWNER", fh->last_owner, 1); add_assoc_long(array, "LAST_POSTTIME", fh->last_posttime); #endif /* HAVE_REPLY_COUNT */ }
int fh_view(int num) { struct fileheader fh; int posttime, i, j; char timetext[STRLEN]; if (num <= 0) num = 1; lseek(fd, (num - 1) * sizeof(struct fileheader), SEEK_SET); if (read(fd, &fh, sizeof(struct fileheader)) > 0) { printf("filename: %s\n", fh.filename); printf("id: %d groupid: %d reid: %d\n", fh.id, fh.groupid, fh.reid); printf("o_bid: %d o_id: %d o_groupid: %d o_reid: %d\n", fh.o_bid, fh.o_id, fh.o_groupid, fh.o_reid); printf("innflag: %c%c owner: %s eff_size: %d\n", fh.innflag[0], fh.innflag[1], fh.owner, fh.eff_size); posttime = get_posttime(&fh); ctime_r((time_t *)&posttime, timetext); timetext[strlen(timetext)-1] = 0; printf("posttime: %d(%s) attachment: %d\n", posttime, timetext, fh.attachment); printf("title: %s\n", fh.title); printf("accessed: "); for (i=0; i<4; i++) { for (j=7; j>=0; j--) printf("%c", (fh.accessed[i] & (1 << j)) ? '1' : '0'); printf(" "); } printf("\n"); } return 1; }
/* * 生成热点话题的函数 */ int gen_board_hot (const char *filename) { FILE *fp; int i, head; time_t now; time (&now); for (i = 0; i < HASHSIZE; i++) bucket[i] = NULL; if ((fp = fopen (filename, "r")) == NULL) return 0; /*将DAY天内的帖子信息加入hash表中*/ head = fseek (fp, -sizeof (struct fileheader), SEEK_END); while (!head) { fread (fh, sizeof (struct fileheader), 1, fp); /*判断发帖时间是否符合要求*/ if ((now - get_posttime (fh)) / (60*60*24) > DAY) break; search (fh); //将帖子的信息加入hash表中 head = fseek (fp, -2*sizeof (struct fileheader), SEEK_CUR); } fclose (fp); i = sort(); //找出hash表中的热点话题 return i; }
/*主函数*/ int main(int argc,char **argv) { FILE *fp; struct stat st; struct fileheader *dir1,*dir2,*dir; struct boardheader bh; struct BoardStatus *bs; char path1[512],path2[512],path[512],buf[512],*p1,*p2,*p; int ret; unsigned int size1,size2,pos1,pos2,pos,*offset1,*offset2; //初始化及错误检测 if (argc!=4) { printf("[%s] 错误的参数结构...\nUSAGE: %s <srcboard1> <srcboard2> <dstdir>\n",argv[0],argv[0]); return 0x11; } if (chdir(BBSHOME)) { printf("[%s] 切换到 BBS 主目录 %s 错误...\n",argv[0],BBSHOME); return 0x12; } /*初始化源版面数据*/ if ((ret=initdir(argv[0],path1,argv[1],&offset1,&size1,&dir1,&p1))!=0) return ret; if ((ret=initdir(argv[0],path2,argv[2],&offset2,&size2,&dir2,&p2))!=0) return ret; /*检测顺序并进行可能必要的顺序化*/ if (!checkseq(dir1,size1)&&!seqdir(dir1,size1)) { printf("[%s] 版面 %s .DIR 结构错误, 修复失败...\n",argv[0],argv[1]); return 0x51; } if (!checkseq(dir2,size2)&&!seqdir(dir2,size2)) { printf("[%s] 版面 %s .DIR 结构错误, 修复失败...\n",argv[0],argv[2]); return 0x51; } /*创建目标目录,用pid进行标识区分*/ sprintf(path,"boards/%s",argv[3]); sprintf(buf,"boards/%s_%d",argv[3], (int)getpid()); if (!stat(path,&st)&&S_ISDIR(st.st_mode)) rename(path,buf); else unlink(path); if (mkdir(path,(S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH))) { printf("[%s] 创建版面目录 %s 错误...\n",argv[0],path); return 0x31; } build_board_structure(argv[3]); p=path+strlen(path);*p++='/'; sprintf(p,".DIR"); /*准备目标.DIR文件的写操作*/ if (!(fp=fopen(path,"wb"))) { printf("[%s] 创建 %s 错误...\n",argv[0],path); return 0x32; } /*申请目标.DIR结构需要的内存空间*/ if (!(dir=(struct fileheader*)malloc((size1+size2)*sizeof(struct fileheader)))) { printf("[%s] 申请内存空间失败...\n",argv[0]); return 0x33; } //主处理 pos1=0;pos2=0;pos=0; while (true) { /*比较时间戳*/ if (pos1<size1&&pos2<size2) { //ret=strcmp(&dir1[pos1].filename[2],&dir2[pos2].filename[2]); ret = get_posttime(&dir1[pos1]) - get_posttime(&dir2[pos2]); } else if (pos1<size1)/*源版面2已经处理完成*/ ret=-1; else if (pos2<size2)/*源版面1已经处理完成*/ ret=1; else/*done*/ break; /*处理当前fileheader*/ if (!(ret>0)) {/*源版面1*/ process(argv[0],dir,dir1,offset1,pos,pos1,path,p,path1,p1); pos1++;pos++; } else {/*源版面2*/ process(argv[0],dir,dir2,offset2,pos,pos2,path,p,path2,p2); pos2++;pos++; } } /*写回目的.DIR*/ if (fwrite(dir,sizeof(struct fileheader),(size1+size2),fp)!=(size1+size2)) { printf("[%s] 写入文件错误...\n",argv[0]); return 0x41; } /*设定未读标记*/ resolve_boards(); ret=getboardnum(argv[3],&bh); if (ret) { bh.idseq=size1+size2; set_board(ret,&bh,NULL); bs=getbstatus(ret); bs->total=size1+size2; bs->lastpost=size1+size2; bs->updatemark=true; bs->updatetitle=true; bs->updateorigin=true; bs->nowid=size1+size2; bs->toptitle=0; } /*清理*/ fclose(fp); munmap(dir1,size1*sizeof(struct fileheader)); if (size1) free(offset1); munmap(dir2,size2*sizeof(struct fileheader)); if (size2) free(offset2); free(dir); return 0; }
static inline int process_article(const struct fileheader *f,int n,const struct boardheader *b){ static const struct flock lck_set={.l_type=F_RDLCK,.l_whence=SEEK_SET,.l_start=0,.l_len=0,.l_pid=0}; static const struct flock lck_clr={.l_type=F_UNLCK,.l_whence=SEEK_SET,.l_start=0,.l_len=0,.l_pid=0}; static struct stat st; static struct tm *p; static char name[BOUND]; static int fd,i,j,k,l; static time_t timestamp; static const char *S,*M,*N; static void *vp; do{ if((timestamp=get_posttime(f))<from||timestamp>to) break; if(ISSET(PARAM_P)&&strcmp(f->owner,post)) break; setbfile(name,b->filename,f->filename); if(stat(name,&st)==-1||!S_ISREG(st.st_mode)||st.st_size<size) break; if((fd=open(name,O_RDONLY #ifdef O_NOATIME |O_NOATIME #endif /* O_NOATIME */ ,0644))==-1) break; if(fcntl(fd,F_SETLKW,&lck_set)==-1){ close(fd); break; } vp=mmap(NULL,st.st_size,PROT_READ,MAP_PRIVATE,fd,0); fcntl(fd,F_SETLKW,&lck_clr); close(fd); if((S=(const char*)vp)==MAP_FAILED) break; for(p=NULL,j=0,i=0;S[i]&&i<st.st_size;i++){ #define EQUAL(cp,cs) (((cp)==(cs))||(ISSET(PARAM_I)&&((cp)==toupper(cs)))) while(j>0&&!EQUAL(P[j],S[i])) j=L[j-1]; if(EQUAL(P[j],S[i])) j++; if(!P[j]){ M=&S[l=((i-j)+1)]; if(!ISSET(PARAM_N)){ for(k=0,N=M;!(N<S);N--) if((*N)&0x80) k++; if(!(k&0x01)) continue; } if(!p&&!(p=localtime(×tamp))) continue; count++; fprintf(out,"%6d %-20.20s %4d %4s %04d%02d%02d%02d%02d%02d %-17.17s %6d %-13.13s %s\n", n,b->filename,current,mode,(p->tm_year+1900),(p->tm_mon+1),(p->tm_mday), (p->tm_hour),(p->tm_min),(p->tm_sec),f->filename,l,f->owner,f->title); if(ISSET(PARAM_S)) break; j=L[j-1]; } #undef EQUAL } munmap(vp,st.st_size); number++; } while(0); return 0; } static inline int process_board(const struct boardheader *b,int n,void *v){ static char name[BOUND]; do{ if(ISSET(PARAM_A)) break; if(ISSET(PARAM_U)){ if(!check_read_perm(user,b)) return -1; break; } if(ISSET(PARAM_B)) break; if(!public_board(b)) return -2; } while(0); current=n; if(!ISSET(PARAM_Q)) fprintf(stdout,"正在处理版面 %-29.29s ... ",b->filename); if(!ISSET(PARAM_E)){ mode="版面"; setbdir(DIR_MODE_NORMAL,name,b->filename); APPLY_RECORD(name,process_article,sizeof(struct fileheader),b,0,true); } if(ISSET(PARAM_D)){ mode="回收"; setbdir(DIR_MODE_DELETED,name,b->filename); APPLY_RECORD(name,process_article,sizeof(struct fileheader),b,0,true); } if(ISSET(PARAM_J)){ mode="自删"; setbdir(DIR_MODE_JUNK,name,b->filename); APPLY_RECORD(name,process_article,sizeof(struct fileheader),b,0,true); } if(!ISSET(PARAM_Q)) fprintf(stdout,"%s\n","处理完成!"); return 0; } int main(int argc,char **argv){ #define EXIT(msg) do{fprintf(stderr,"%s\n",(msg));if(out)fclose(out);exit(__LINE__);}while(0) const struct boardheader *board; char name[BOUND],path[BOUND]; const char *desc; int ret; double cost; if(!getcwd(path,BOUND)) EXIT("获取当前工作目录时发生错误"); if(chdir(BBSHOME)==-1) EXIT("切换工作目录时发生错误..."); if((mark=time(NULL))==(time_t)(-1)) EXIT("获取时间时发生错误..."); resolve_ucache(); resolve_boards(); to=mark; opterr=0; while((ret=getopt(argc,argv,"r:f:t:ab:u:p:djesnio:qh"))!=-1){ switch(ret){ #define CHECK_CONFLICT(param) do{if(ISSET(param))EXIT("给定的选项间存在冲突...");}while(0) #define CHECK_DEPENDENCE(param) do{if(!ISSET(param))EXIT("给定的选项间缺少依赖...");}while(0) #define CHECK_DUP(param) do{if(ISSET(param))EXIT("给定的选项中存在重复...");}while(0) #define SET(param) do{CHECK_DUP(param);flag|=(param);}while(0) case 'r': CHECK_CONFLICT(PARAM_F|PARAM_T); SET(PARAM_R); do{ struct tm t,*p; int n; if(!isdigit(optarg[0])) EXIT("选项 -r 的参数无法解析..."); n=atoi(optarg); if(!(p=localtime(&mark))) EXIT("解析时间时发生错误..."); memcpy(&t,p,sizeof(struct tm)); t.tm_hour=0; t.tm_min=0; t.tm_sec=0; if((from=mktime(&t))==(time_t)(-1)) EXIT("设定时间时发生错误..."); } while(0); break; #define PARSE2(p) ((((p)[0]*10)+((p)[1]*1))-('0'*11)) #define PARSE4(p) ((PARSE2(p)*100)+(PARSE2(&(p)[2])*1)) case 'f': CHECK_CONFLICT(PARAM_R); SET(PARAM_F); do{ struct tm t; int i; for(i=0;optarg[i];i++) if(!isdigit(optarg[i])) break; if(i!=14) EXIT("选项 -f 的参数无法解析..."); memset(&t,0,sizeof(struct tm)); t.tm_year=(PARSE4(optarg)-1900); t.tm_mon=(PARSE2(&optarg[4])-1); t.tm_mday=PARSE2(&optarg[6]); t.tm_hour=PARSE2(&optarg[8]); t.tm_min=PARSE2(&optarg[10]); t.tm_sec=PARSE2(&optarg[12]); if((from=mktime(&t))==(time_t)(-1)) EXIT("设定时间时发生错误..."); } while(0); break; case 't': CHECK_CONFLICT(PARAM_R); SET(PARAM_T); do{ struct tm t; int i; for(i=0;optarg[i];i++) if(!isdigit(optarg[i])) break; if(i!=14) EXIT("选项 -t 的参数无法解析..."); memset(&t,0,sizeof(struct tm)); t.tm_year=(PARSE4(optarg)-1900); t.tm_mon=(PARSE2(&optarg[4])-1); t.tm_mday=PARSE2(&optarg[6]); t.tm_hour=PARSE2(&optarg[8]); t.tm_min=PARSE2(&optarg[10]); t.tm_sec=PARSE2(&optarg[12]); if((from=mktime(&t))==(time_t)(-1)) EXIT("设定时间时发生错误..."); } while(0); break; #undef PARSE2 #undef PARSE4 case 'a': CHECK_CONFLICT(PARAM_B|PARAM_U); SET(PARAM_A); break; case 'b': CHECK_CONFLICT(PARAM_A|PARAM_U); SET(PARAM_B); if(!(current=getbid(optarg,&board))) EXIT("选项 -b 所指定的版面无法获取..."); break; case 'u': CHECK_CONFLICT(PARAM_A|PARAM_B); SET(PARAM_U); do{ struct userec *u; if(!getuser(optarg,&u)) EXIT("选项 -u 所指定的用户无法获取..."); user=u; } while(0); break; case 'p': SET(PARAM_P); snprintf(post,OWNER_LEN,"%s",optarg); break; case 'd': SET(PARAM_D); break; case 'j': SET(PARAM_J); break; case 'e': CHECK_DEPENDENCE(PARAM_D|PARAM_J); SET(PARAM_E); break; case 's': SET(PARAM_S); break; case 'n': SET(PARAM_N); break; case 'i': SET(PARAM_I); break; case 'o': SET(PARAM_O); if(optarg[0]!='/') snprintf(name,BOUND,"%s/%s",path,optarg); else snprintf(name,BOUND,"%s",optarg); break; case 'q': SET(PARAM_Q); break; case 'h': usage(); return 0; default: usage(); EXIT("不可识别的选项..."); break; #undef CHECK_CONFLICT #undef CHECK_DEPENDENCE #undef CHECK_DUP #undef SET } } if(from>to){ usage(); EXIT("当前时间设定不合法..."); } if(!ISSET(PARAM_Q)&&setvbuf(stdout,NULL,_IONBF,BUFSIZ)) EXIT("调整文件缓冲时发生错误..."); if((argc-optind)!=1){ usage(); EXIT("不可识别的参数..."); } set_pattern(argv[optind]); set_link(argv[optind]); if(!size) EXIT("模式串不能为空串..."); if(!ISSET(PARAM_O)) snprintf(name,BOUND,"%s/res_%lu.us",path,mark); if(!(out=fopen(name,"w"))) EXIT("打开文件时发生错误..."); fprintf(out,"%6s %-20.20s %4s %4s %-14.14s %-17.17s %6s %-13.13s %s\n", "文章号","版面名称"," BID","位置","发表时间","文件名","偏移量","作者","标题"); if(!(P[0]&0x80)) flag|=PARAM_N; if(ISSET(PARAM_B)) process_board(board,current,NULL); else APPLY_BIDS(process_board,NULL); fclose(out); cost=difftime(time(NULL),mark); if(cost>86400){ cost/=86400; desc="天"; } else if(cost>3600){ cost/=3600; desc="小时"; } else if(cost>60){ cost/=60; desc="分钟"; } else desc="秒"; fprintf(stdout,"\n操作已完成! 共处理 %d 篇文章, 获得 %d 处匹配, 耗时 %.2lf %s!\n", number,count,cost,desc); return 0; #undef EXIT }
int gen_super_filter_index2(char *index, struct fileheader* fileinfo, char * boardname, int isbm) { struct fileheader *ptr1; struct flock ldata, ldata2; int fd, fd2, size = sizeof(fileheader), total, i, count = 0; char direct[PATHLEN]; char newdirect[PATHLEN]; char *ptr; struct stat buf; int load_content=0, found=0, load_stat=0; int gid = fileinfo->groupid; //TODO: 这么大的index! load_content = (strstr(index, "content")!=NULL||strstr(index, "文章内容")!=NULL); load_stat = (strstr(index, "asize")!=NULL||strstr(index, "总长度")!=NULL); setbdir(DIR_MODE_NORMAL, direct, boardname); setbdir(DIR_MODE_SUPERFITER, newdirect, boardname); if ((fd = open(newdirect, O_WRONLY | O_CREAT, 0664)) == -1) { bbslog("user", "%s", "recopen err"); return -9999; } ldata.l_type = F_WRLCK; ldata.l_whence = 0; ldata.l_len = 0; ldata.l_start = 0; if (fcntl(fd, F_SETLKW, &ldata) == -1) { bbslog("user", "%s", "reclock err"); close(fd); return -9999; } if ((fd2 = open(direct, O_RDONLY, 0664)) == -1) { bbslog("user", "%s", "recopen err"); ldata.l_type = F_UNLCK; fcntl(fd, F_SETLKW, &ldata); close(fd); return -9999; } fstat(fd2, &buf); ldata2.l_type = F_RDLCK; ldata2.l_whence = 0; ldata2.l_len = 0; ldata2.l_start = 0; fcntl(fd2, F_SETLKW, &ldata2); total = buf.st_size / size; if ((i = safe_mmapfile_handle(fd2, PROT_READ, MAP_SHARED, (void **) &ptr, &buf.st_size)) != 1) { if (i == 2) end_mmapfile((void *) ptr, buf.st_size, -1); ldata2.l_type = F_UNLCK; fcntl(fd2, F_SETLKW, &ldata2); close(fd2); ldata.l_type = F_UNLCK; fcntl(fd, F_SETLKW, &ldata); close(fd); return -9999; } ptr1 = (struct fileheader *) ptr; libs = (char*)malloc(LIBLEN); for (i = 0; i < total; i++) { struct stat st; char* p; char ffn[80]; int j=0; off_t fsize; libptr = libs; ferr = 0; set_vard(fvars+fget_var("cid"), fileinfo->id); set_vard(fvars+fget_var("creid"), fileinfo->reid); set_vard(fvars+fget_var("cgroupid"), fileinfo->groupid); set_vars(fvars+fget_var("cauthor"), fileinfo->owner); set_vars(fvars+fget_var("cfname"), fileinfo->filename); set_vard(fvars+fget_var("cftime"), get_posttime(fileinfo)); set_vard(fvars+fget_var("ceffsize"), fileinfo->eff_size); set_vard(fvars+fget_var("no"), i+1); set_vard(fvars+fget_var("文章号"), i+1); set_vard(fvars+fget_var("id"), ptr1->id); set_vard(fvars+fget_var("reid"), ptr1->reid); set_vard(fvars+fget_var("groupid"), ptr1->groupid); set_vard(fvars+fget_var("thread"), ptr1->groupid==gid); set_vard(fvars+fget_var("本主题"), ptr1->groupid==gid); set_vard(fvars+fget_var("origin"), ptr1->id==ptr1->groupid); set_vard(fvars+fget_var("原作"), ptr1->id==ptr1->groupid); set_vard(fvars+fget_var("m"), ptr1->accessed[0]&FILE_MARKED); set_vard(fvars+fget_var("保留"), ptr1->accessed[0]&FILE_MARKED); set_vard(fvars+fget_var("g"), ptr1->accessed[0]&FILE_DIGEST); set_vard(fvars+fget_var("文摘"), ptr1->accessed[0]&FILE_DIGEST); set_vard(fvars+fget_var("b"), (ptr1->accessed[0]&FILE_MARKED)&&(ptr1->accessed[0]&FILE_DIGEST)); if (isbm) { set_vard(fvars+fget_var("noreply"), ptr1->accessed[1]&FILE_READ); set_vard(fvars+fget_var("不可回复"), ptr1->accessed[1]&FILE_READ); set_vard(fvars+fget_var("sign"), ptr1->accessed[0]&FILE_SIGN); set_vard(fvars+fget_var("标记"), ptr1->accessed[0]&FILE_SIGN); #ifdef PERCENT_SIGN_SUPPORT set_vard(fvars+fget_var("percent"), ptr1->accessed[0]&FILE_PERCENT); set_vard(fvars+fget_var("百分号"), ptr1->accessed[0]&FILE_PERCENT); #endif #ifdef FILTER set_vard(fvars+fget_var("censor"), ptr1->accessed[1]&FILE_CENSOR); set_vard(fvars+fget_var("审核"), ptr1->accessed[1]&FILE_CENSOR); #endif set_vard(fvars+fget_var("del"), ptr1->accessed[1]&FILE_DEL); set_vard(fvars+fget_var("删除"), ptr1->accessed[1]&FILE_DEL); set_vard(fvars+fget_var("import"), ptr1->accessed[0]&FILE_IMPORTED); set_vard(fvars+fget_var("精华"), ptr1->accessed[0]&FILE_IMPORTED); } set_vard(fvars+fget_var("attach"), ptr1->attachment); set_vard(fvars+fget_var("附件"), ptr1->attachment); set_vars(fvars+fget_var("title"), ptr1->title); set_vars(fvars+fget_var("标题"), ptr1->title); set_vars(fvars+fget_var("author"), ptr1->owner); set_vars(fvars+fget_var("作者"), ptr1->owner); set_vars(fvars+fget_var("fname"), ptr1->filename); set_vars(fvars+fget_var("文件名"), ptr1->filename); set_vard(fvars+fget_var("my"), !strcmp(ptr1->owner,getCurrentUser()->userid)); set_vard(fvars+fget_var("我的"), !strcmp(ptr1->owner,getCurrentUser()->userid)); #ifdef HAVE_BRC_CONTROL set_vard(fvars+fget_var("unread"), brc_unread(ptr1->id, getSession())); set_vard(fvars+fget_var("未读"), brc_unread(ptr1->id, getSession())); #endif setbfile(ffn, boardname, ptr1->filename); set_vard(fvars+fget_var("ftime"), get_posttime(ptr1)); set_vard(fvars+fget_var("时间"), get_posttime(ptr1)); set_vard(fvars+fget_var("effsize"), ptr1->eff_size); set_vard(fvars+fget_var("有效长度"), ptr1->eff_size); if(load_stat) { if(stat(ffn, &st)!=-1) { set_vard(fvars+fget_var("asize"), st.st_size); set_vard(fvars+fget_var("总长度"), st.st_size); } else { set_vard(fvars+fget_var("asize"), 0); set_vard(fvars+fget_var("总长度"), 0); } } if(load_content) { set_vars(fvars+fget_var("content"), ptr1->filename); set_vars(fvars+fget_var("文章内容"), ptr1->filename); j = safe_mmapfile(ffn, O_RDONLY, PROT_READ, MAP_SHARED, (void **) &p, &fsize, NULL); if(j) { set_vars(fvars+fget_var("content"), p); set_vars(fvars+fget_var("文章内容"), p); } } ferr=0; feval(fvars+fget_var("res"), index, 0, strlen(index)-1); if(ferr) break; if(fvars[fget_var("res")].s) { write(fd, ptr1, size); count++; found++; } if(load_content) { if(j) end_mmapfile((void*)p, fsize, -1); } ptr1++; } free(libs); end_mmapfile((void *) ptr, buf.st_size, -1); ldata2.l_type = F_UNLCK; fcntl(fd2, F_SETLKW, &ldata2); close(fd2); ftruncate(fd, count * size); ldata.l_type = F_UNLCK; fcntl(fd, F_SETLKW, &ldata); /* 退出互斥区域*/ close(fd); if(ferr) { return -ferr; } else { return count; } }
int refresh_board(char* bname) { int fd, fd2, origincount, acount, i, j, replycount; char dirpath[256], originpath[256]; char *head, *ahead; struct fileheader *ptr, *aptr, *topic, *lastpost; struct stat buf, abuf; if (setboardorigin(bname, -1)) board_regenspecial(bname, DIR_MODE_ORIGIN, NULL); setbdir(DIR_MODE_NORMAL, dirpath, bname); setbdir(DIR_MODE_ORIGIN, originpath, bname); fd = open(originpath, O_RDWR, 0644); if (fd == -1) { printf("cannot open %s.\n", originpath); return 0; } fd2 = open(dirpath, O_RDWR, 0644); if (fd2 == -1) { close(fd); printf("cannot open %s.\n", dirpath); return 0; } BBS_TRY { if (!safe_mmapfile_handle(fd, PROT_READ | PROT_WRITE, MAP_SHARED, &head, &buf.st_size)) { printf("cannot mmap %s.\n", originpath); close(fd); return 0; } if (!safe_mmapfile_handle(fd2, PROT_READ | PROT_WRITE, MAP_SHARED, &ahead, &abuf.st_size)) { printf("cannot mmap %s.\n", dirpath); close(fd); close(fd2); return 0; } origincount = buf.st_size / sizeof(struct fileheader); acount = abuf.st_size / sizeof(struct fileheader); ptr = (struct fileheader *)head; for (i=0; i<origincount; i++) { replycount = 0; topic = NULL; lastpost = NULL; aptr = (struct fileheader *)ahead; for (j=0; j<acount; j++) { if (aptr->groupid == ptr->id) { replycount++; if (aptr->groupid == aptr->id) topic = aptr; lastpost = aptr; } aptr++; } ptr->replycount = replycount; if (topic) topic->replycount = replycount; if (lastpost) { strcpy(ptr->last_owner, lastpost->owner); ptr->last_posttime = get_posttime(lastpost); if (topic) { strcpy(topic->last_owner, ptr->owner); topic->last_posttime = ptr->last_posttime; } } ptr++; } } BBS_CATCH { } BBS_END; end_mmapfile((void *)head, buf.st_size, -1); end_mmapfile((void *)ahead, abuf.st_size, -1); close(fd); close(fd2); printf("board %s is done.\n", bname); return 0; }
int fh_list(int num, int count) { struct fileheader fh; int i, posttime; char timetext[STRLEN]; if (num <= 0) num = 1; lseek(fd, (num - 1) * sizeof(struct fileheader), SEEK_SET); for (i=0; i<count; i++) { if (read(fd, &fh, sizeof(struct fileheader)) > 0) { if (fhbool.filename[0]) if (strcmp(fh.filename, fhopt.filename) != 0) continue; if (fhbool.id) if (fh.id != fhopt.id) continue; if (fhbool.groupid) if (fh.groupid != fhopt.groupid) continue; if (fhbool.reid) if (fh.reid != fhopt.reid) continue; if (fhbool.o_bid) if (fh.o_bid != fhopt.o_bid) continue; if (fhbool.o_id) if (fh.o_id != fhopt.o_id) continue; if (fhbool.o_groupid) if (fh.o_groupid != fhopt.o_groupid) continue; if (fhbool.o_reid) if (fh.o_reid != fhopt.o_reid) continue; if (fhbool.innflag[0]) if ((fh.innflag[0] != fhopt.innflag[0]) || (fh.innflag[1] != fhopt.innflag[1])) continue; if (fhbool.owner[0]) if (strcmp(fh.owner, fhopt.owner) != 0) continue; if (fhbool.eff_size) if (fh.eff_size != fhopt.eff_size) continue; if (fhbool.attachment) if (fh.attachment != fhopt.attachment) continue; if (fhbool.title[0]) if (strcmp(fh.title, fhopt.title) != 0) continue; if (fhbool.accessed[0]) if (fh.accessed[0] != fhopt.accessed[0]) continue; if (fhbool.accessed[1]) if (fh.accessed[1] != fhopt.accessed[1]) continue; if (fhbool.accessed[2]) if (fh.accessed[2] != fhopt.accessed[2]) continue; if (fhbool.accessed[3]) if (fh.accessed[3] != fhopt.accessed[3]) continue; if (binary) { fwrite(&fh, sizeof(struct fileheader), 1, stdout); } else { if (simple) printf("%d\n", num + i); else { posttime = get_posttime(&fh); ctime_r((time_t *)&posttime, timetext); timetext[strlen(timetext)-1] = 0; printf("%7d %-14s %-25.25s %s\n", num + i, fh.owner, timetext, fh.title); } } } } return 1; }
int gen_commend_xml(const char *bname, const char *fn, int max) { int dirfd; FILE *fp; FILE *fp1; struct fileheader dirfh; char dirpath[STRLEN]; char dirfile[STRLEN]; char xml_buf[1024]; //changed from 256 to 1024, for <brief> - atppp char buf[256]; char url_buf[1024]; //changed from 256 to 1024, for <brief> - atppp struct stat st; int numrecords; int i, brieflen, len; char *c; struct boardheader *bh; setbfile(dirpath, bname, DIGEST_DIR); if (stat(dirpath, &st) < 0) return -1; numrecords = st.st_size / sizeof(struct fileheader) ; if (numrecords <= 0) return -1; if ((fp = fopen(fn, "w")) == NULL) return -1; fprintf(fp, "<?xml version=\"1.0\" encoding=\"GBK\"?>\n"); fprintf(fp, "<hotsubjects>\n"); dirfd = open(dirpath, O_RDONLY); if (dirfd >= 0) { if (numrecords > max) lseek(dirfd, sizeof(struct fileheader)*(numrecords - max), SEEK_SET); numrecords -= max; while (read(dirfd, &dirfh, sizeof(dirfh)) >= sizeof(dirfh)) { setbfile(dirfile, bname, dirfh.filename); if ((fp1=fopen(dirfile, "r"))==NULL) continue; numrecords ++; fprintf(fp, "<hotsubject>\n"); fprintf(fp, "<title>%s</title>\n", encode_url(url_buf,encode_xml(xml_buf, dirfh.title, sizeof(xml_buf)),sizeof(url_buf))); fprintf(fp, "<author>%s</author>\n", encode_url(url_buf,dirfh.owner,sizeof(url_buf))); fprintf(fp, "<time>%ld</time>\n", get_posttime(&dirfh)); fprintf(fp, "<board>%s</board>\n", encode_url(url_buf,bname,sizeof(url_buf))); fprintf(fp, "<id>%d</id>\n", dirfh.id); fprintf(fp, "<groupid>%d</groupid>\n", dirfh.groupid); bh = (struct boardheader *) getboard(dirfh.o_bid); fprintf(fp, "<o_board>%s</o_board>\n", encode_url(url_buf,(bh ? bh->filename : ""),sizeof(url_buf))); fprintf(fp, "<o_id>%d</o_id>\n",dirfh.o_id); if (fgets(buf, 255, fp1)) { if (! strncmp(buf, "发信人: ", 8)) { if ((c=strchr(buf+8, ' ')) != NULL) *c = 0; fprintf(fp, "<owner>%s</owner>\n", buf+8); } } fprintf(fp, "<o_groupid>%d</o_groupid>\n<brief>", dirfh.o_groupid); for (i=0;i<3;i++) fgets(buf, 255, fp1); brieflen = 240; for (i=0;i<4;) { if (fgets(buf, 240, fp1)) { if (buf[0] == '\n' || buf[0] == '\r' || buf[0]=='\0') continue; buf[240]=0; /* etnlegend, 2006.09.17, 过滤控制字符... */ process_control_chars(buf,"\n"); len = strlen(buf); if (!(len<brieflen-1)) { strnzhcpy(buf,buf,brieflen); len=brieflen; } fprintf(fp, "%s", encode_url(url_buf,encode_xml(xml_buf, buf, sizeof(xml_buf)),sizeof(url_buf))); i++; brieflen -= len; if (brieflen<2) break; } else break; } fprintf(fp, " </brief>\n</hotsubject>\n"); fclose(fp1); } close(dirfd); } fprintf(fp, "</hotsubjects>\n"); fclose(fp); return 0; }