static int _iter_paste_tag(void *item, void *optarg) { char buf[PATHLEN]; char title[TTLEN + 1] = "◇ "; fileheader_t *fhdr = (fileheader_t*) item; _iter_paste_tag_param *param = (_iter_paste_tag_param*) optarg; param->item ++; // XXX many process crashed here as fhdr.filename[0] == 0 // let's workaround it? or trace? if (!fhdr->filename[0]) { grayout(0, b_lines-2, GRAYOUT_DARK); move(b_lines-1, 0); clrtobot(); prints("處理 #%d 項發生錯誤。 請把你剛剛進行的完整步驟貼到 " BN_BUGREPORT " 板。\n", param->item); vmsg("忽略錯誤並繼續進行。"); return 0; } if (!FindTaggedItem(fhdr)) return 0; if (TagBoard == 0) sethomefile(buf, cuser.userid, fhdr->filename); else { setbfile(buf, param->bh->brdname, fhdr->filename); } if (!dashf(buf)) return 0; strlcpy(title + 3, fhdr->title, sizeof(title) - 3); a_copyitem(buf, title, 0, 0); if (param->mode) { param->mode--; a_pasteitem(param->pm, 0); } else a_appenditem(param->pm, 0); param->copied++; RemoveTagItem(fhdr); return IsEmptyTagList(); }
int delete_range(const char *fpath, int id1, int id2) { fileheader_t fhdr; nol_t my; char fullpath[STRLEN], *t; int fdr, fdw, fd; int count, dcount=0; nolfilename(&my, fpath); if ((fd = OpenCreate(my.lockfn, O_RDWR | O_APPEND)) == -1) return -1; flock(fd, LOCK_EX); if ((fdr = open(fpath, O_RDONLY)) == -1) { flock(fd, LOCK_UN); close(fd); return -1; } if ( ((fdw = OpenCreate(my.newfn, O_WRONLY | O_EXCL)) == -1) && ((fdw = force_open(my.newfn)) == -1)) { close(fdr); flock(fd, LOCK_UN); close(fd); return -1; } count = 1; strlcpy(fullpath, fpath, sizeof(fullpath)); t = strrchr(fullpath, '/'); assert(t); t++; while (read(fdr, &fhdr, sizeof(fileheader_t)) == sizeof(fileheader_t)) { strcpy(t, fhdr.filename); /* rocker.011018: add new tag delete */ if ( (fhdr.filemode & FILE_MARKED) || /* 標記 */ ((fhdr.filemode & FILE_DIGEST) && (currstat != RMAIL) )|| /* 文摘 , FILE_DIGEST is used as REPLIED in mail menu.*/ (id1 && (count < id1 || count > id2)) || /* range */ (!id1 && !FindTaggedItem(&fhdr))) { /* TagList */ if ((safewrite(fdw, &fhdr, sizeof(fileheader_t)) == -1)) { close(fdr); close(fdw); unlink(my.newfn); flock(fd, LOCK_UN); close(fd); return -1; } } else { unlink(fullpath); dcount++; RemoveTagItem(&fhdr); } ++count; } close(fdr); close(fdw); if (Rename(fpath, my.oldfn) == -1 || Rename(my.newfn, fpath) == -1) { flock(fd, LOCK_UN); close(fd); return -1; } flock(fd, LOCK_UN); close(fd); return dcount; }
TagItem *ToggleTagItem(const fileheader_t *fh) { TagItem *tag = RemoveTagItem(fh); if (tag) return tag; return AddTagItem(fh); }