예제 #1
0
int delete_all_mail(int dfd, char *touser, char *filename, int size, RECORD_FUNC_ARG fptr, void *farg)
{
    int i;
    char *buf, *buf1;
    off_t filesize;
    char *fname;
    char buf2[80];
    char from[256];
    char to[256];
    struct stat st;
    int subspace = 0;
    struct userec *to_userec;

    printf("Deleting mails of %s... \n", touser);
    BBS_TRY {
        if (safe_mmapfile(filename, O_RDONLY, PROT_READ, MAP_SHARED, &buf, &filesize, NULL) == 0)
            BBS_RETURN(0);
        for (i = 0, buf1 = buf; i < filesize / size; i++, buf1 += size) {
            if ((*fptr)(buf1, farg)) {
                fname = ((struct fileheader *)buf1)->filename;
                sprintf(buf2, "SMTH.DM%s", fname);
                setmailfile(from, touser, fname);
                setmailfile(to, touser, buf2);
                rename(from, to);
                printf("found one %s...\n",fname);
                if (lstat(to, &st) == 0 && S_ISREG(st.st_mode) && st.st_nlink == 1) {
                    subspace += st.st_size;
                }
                continue;
            }
            write(dfd, buf1, size);
        }
        end_mmapfile((void *) buf, filesize, -1);
        if (getuser(touser, &to_userec) != 0) {
            if (to_userec->usedspace > subspace)
                to_userec->usedspace -= subspace;
            else
                to_userec->usedspace = 0;
        }
        BBS_RETURN(0);
    }
    BBS_CATCH {
    }
    BBS_END;
    end_mmapfile((void *) buf, filesize, -1);

    return 0;
}
예제 #2
0
int calcboard(struct boardheader *bh, void *arg)
{
    char fn[80];
    int fd, total, i;
    struct stat buf;
    struct flock ldata;
    struct fileheader *ptr1;
    char *ptr;
    int size = sizeof(struct fileheader);

    setbdir(0, fn, bh->filename);
    printf("\r%s:\n", bh->filename);
    if ((fd = open(fn, O_RDWR, 0664)) == -1) {
        bbslog("user", "%s", "recopen err");
        return 0;               /* 创建文件发生错误 */
    }
    fstat(fd, &buf);
    ldata.l_type = F_RDLCK;
    ldata.l_whence = 0;
    ldata.l_len = 0;
    ldata.l_start = 0;
    fcntl(fd, F_SETLKW, &ldata);
    total = buf.st_size / size;

    if ((i = safe_mmapfile_handle(fd, PROT_READ | PROT_WRITE, MAP_SHARED, (void **) &ptr, &buf.st_size)) != 1) {
        if (i == 2)
            end_mmapfile((void *) ptr, buf.st_size, -1);
        ldata.l_type = F_UNLCK;
        fcntl(fd, F_SETLKW, &ldata);
        close(fd);
        return 0;
    }
    ptr1 = (struct fileheader *) ptr;
    for (i = 0; i < total; i++) {
        struct stat st;
        char *p, *op;
        char ffn[80];
        int j;
        off_t fsize;

        printf("\r%d", i);
        setbfile(ffn, bh->filename, ptr1->filename);
        {
            int k, abssize = 0, entercount = 0, ignoreline = 0;
            char *attach;
            long attach_len;

            j = safe_mmapfile(ffn, O_RDONLY, PROT_READ, MAP_SHARED, (void **) &p, &fsize, NULL);
            op = p;
            if (j) {
                k = fsize;
                while (k) {
			/*
                    if (NULL != (checkattach(p, k, &attach_len, &attach))) {
                        k -= (attach - p) + attach_len;
                        p = attach + attach_len;
                        continue;
                    }  */
                    if (k >= 3 && *p == '\n' && *(p + 1) == '-' && *(p + 2) == '-' && *(p + 3) == '\n')
                        break;
                    if (*p == '\n') {
                        entercount++;
                        ignoreline = 0;
                    }
                    if (k >= 5 && *p == '\n' && *(p + 1) == '\xa1' && *(p + 2) == '\xbe' && *(p + 3) == ' ' && *(p + 4) == '\xd4' && *(p + 5) == '\xda')
                        ignoreline = 1;
                    if (k >= 2 && *p == '\n' && *(p + 1) == ':' && *(p + 2) == ' ')
                        ignoreline = 2;
                    if (k >= 2 && *p == KEY_ESC && *(p + 1) == '[' && *(p + 2) == 'm')
                        ignoreline = 3;

                    k--;
                    p++;
                    if (entercount >= 4 && !ignoreline)
                        abssize++;
                }
                ptr1->eff_size = abssize;
                end_mmapfile((void *) op, fsize, -1);
            }
        }
        //ptr1->posttime = get_posttime(ptr1);
        set_posttime(ptr1);
        ptr1++;
    }
    end_mmapfile((void *) ptr, buf.st_size, -1);
    ldata.l_type = F_UNLCK;
    fcntl(fd, F_SETLKW, &ldata);
    close(fd);
    return 0;
}
예제 #3
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;
    }
}