diff options
-rw-r--r-- | include/proto.h | 1 | ||||
-rw-r--r-- | mbbsd/read.c | 16 | ||||
-rw-r--r-- | mbbsd/record.c | 18 |
3 files changed, 31 insertions, 4 deletions
diff --git a/include/proto.h b/include/proto.h index 84db664c..073e9520 100644 --- a/include/proto.h +++ b/include/proto.h @@ -366,6 +366,7 @@ void UnTagger (int locus); int substitute_record(char *fpath, void *rptr, int size, int id); int lock_substitute_record(char *fpath, void *rptr, int size, int id, int); int get_record(char *fpath, void *rptr, int size, int id); +int get_record_keep(char *fpath, void *rptr, int size, int id, int *fd); void prints(char *fmt, ...) GCC_CHECK_FORMAT(1,2); int append_record(char *fpath, fileheader_t *record, int size); int stampfile(char *fpath, fileheader_t *fh); diff --git a/mbbsd/read.c b/mbbsd/read.c index 009b6912..1542ace5 100644 --- a/mbbsd/read.c +++ b/mbbsd/read.c @@ -289,6 +289,7 @@ thread(keeploc_t * locmem, int stype) register int now, pos, match, near = 0; fileheader_t fh; int circulate_flag = 1; /* circulate at end or begin */ + int fd = -1; match = hit_thread = 0; now = pos = locmem->crs_ln; @@ -357,10 +358,15 @@ thread(keeploc_t * locmem, int stype) do { if (!circulate_flag || stype & RS_RELATED) { if (stype & RS_FORWARD) { - if (++now > last_line) + if (++now > last_line){ + if( fd != -1 ) + close(fd); return DONOTHING; + } } else { - if (--now <= 0 || now < pos - 300) { + if (--now <= 0 || now < pos - 200) { + if( fd ) + close(fd); if ((stype & RS_FIRST) && (near)) { hit_thread = 1; return cursor_pos(locmem, near, 10); @@ -376,7 +382,7 @@ thread(keeploc_t * locmem, int stype) now = last_line; } - get_record(currdirect, &fh, sizeof(fileheader_t), now); + get_record_keep(currdirect, &fh, sizeof(fileheader_t), now, &fd); if (fh.owner[0] == '-') continue; @@ -384,6 +390,8 @@ thread(keeploc_t * locmem, int stype) if (stype & RS_THREAD) { if (strncasecmp(fh.title, str_reply, 3)) { hit_thread = 1; + if( fd ) + close(fd); return cursor_pos(locmem, now, 10); } continue; @@ -411,6 +419,8 @@ thread(keeploc_t * locmem, int stype) } } while (now != pos); + if( fd != -1 ) + close(fd); return match; } diff --git a/mbbsd/record.c b/mbbsd/record.c index 55f78787..491af517 100644 --- a/mbbsd/record.c +++ b/mbbsd/record.c @@ -56,11 +56,27 @@ get_sum_records(char *fpath, int size) } int +get_record_keep(char *fpath, void *rptr, int size, int id, int *fd) +{ + /* 和 get_record() 一樣. 不過藉由 *fd, 可使同一個檔案不要一直重複開關 */ + if (id >= 1 && + (*fd > 0 || + ((*fd = open(fpath, O_RDONLY, 0)) > 0))){ + if (lseek(*fd, (off_t) (size * (id - 1)), SEEK_SET) != -1) { + if (read(*fd, rptr, size) == size) { + return 0; + } + } + } + return -1; +} + +int get_record(char *fpath, void *rptr, int size, int id) { int fd = -1; - if (id < 1 || (fd = open(fpath, O_RDONLY, 0)) != -1) { + if (id >= 1 && (fd = open(fpath, O_RDONLY, 0)) != -1) { if (lseek(fd, (off_t) (size * (id - 1)), SEEK_SET) != -1) { if (read(fd, rptr, size) == size) { close(fd); |