Exemple #1
0
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 */
}
Exemple #2
0
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;
}
Exemple #3
0
/*
 * 生成热点话题的函数
 */
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;
}
Exemple #4
0
/*主函数*/
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;
}
Exemple #5
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(&timestamp)))
                    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
}
Exemple #6
0
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;
    }
}
Exemple #7
0
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;
}
Exemple #8
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;
}
Exemple #9
0
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;
}