diff --git a/src/sbbs3/file.cpp b/src/sbbs3/file.cpp index babd798bd7dcdb733a2309e1982d33d06b59dcac..4c905c8c098cfc69d41c7788842319845f5edc85 100644 --- a/src/sbbs3/file.cpp +++ b/src/sbbs3/file.cpp @@ -44,7 +44,7 @@ void sbbs_t::showfileinfo(file_t* f, bool show_extdesc) bprintf(P_TRUNCATE, text[FiCredits] ,(cfg.dir[f->dir]->misc&DIR_FREE || !f->cost) ? "FREE" : ultoac((ulong)f->cost,tmp)); - if(getfilesize(&cfg, f) > 0 && f->size == f->file_idx.idx.size) { + if(getfilesize(&cfg, f) > 0 && f->size == smb_getfilesize(&f->idx)) { #if 0 // I don't think anyone cares about the CRC-16 checksum value of a file if(f->file_idx.hash.flags & SMB_HASH_CRC16) { SAFEPRINTF(tmp, "%04x", f->file_idx.hash.data.crc16); diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c index a5204c5c7bb2fd4433e09719078580a4ff6aa2ec..2721d9d61e3c040fef0c33e8eabb48baea0a4b09 100644 --- a/src/sbbs3/filedat.c +++ b/src/sbbs3/filedat.c @@ -310,7 +310,12 @@ static int file_compare_size_a(const void* v1, const void* v2) file_t* f1 = (file_t*)v1; file_t* f2 = (file_t*)v2; - return f1->idx.size - f2->idx.size; + int64_t diff = smb_getfilesize(&f1->idx) - smb_getfilesize(&f2->idx); + if(diff < 0) + return -1; + if(diff > 0) + return 1; + return 0; } static int file_compare_size_d(const void* v1, const void* v2) @@ -318,7 +323,12 @@ static int file_compare_size_d(const void* v1, const void* v2) file_t* f1 = (file_t*)v1; file_t* f2 = (file_t*)v2; - return f2->idx.size - f1->idx.size; + int64_t diff = smb_getfilesize(&f2->idx) - smb_getfilesize(&f1->idx); + if(diff < 0) + return -1; + if(diff > 0) + return 1; + return 0; } void sortfiles(file_t* filelist, size_t count, enum file_sort order) diff --git a/src/sbbs3/js_filebase.c b/src/sbbs3/js_filebase.c index 08eacba5b227da2f06b2aec08d49455744900995..e6d09508458f947b5cac1de0a17904eebc8ec245 100644 --- a/src/sbbs3/js_filebase.c +++ b/src/sbbs3/js_filebase.c @@ -254,7 +254,7 @@ set_file_properties(JSContext *cx, JSObject* obj, file_t* f, enum file_detail de if(is_valid_dirnum(scfg, f->dir) && (scfg->dir[f->dir]->misc & DIR_FCHK) && detail >= file_detail_normal) val = DOUBLE_TO_JSVAL((double)getfilesize(scfg, f)); else - val = UINT_TO_JSVAL(f->idx.size); + val = DOUBLE_TO_JSVAL((double)smb_getfilesize(&f->idx)); if(!JS_DefineProperty(cx, obj, "size", val, NULL, NULL, flags)) return false; @@ -328,11 +328,7 @@ parse_file_index_properties(JSContext *cx, JSObject* obj, fileidxrec_t* idx) SAFECOPY(idx->name, cp); } if(JS_GetProperty(cx, obj, prop_name = "size", &val) && !JSVAL_NULL_OR_VOID(val)) { - if(!JS_ValueToECMAUint32(cx, val, &idx->idx.size)) { - free(cp); - JS_ReportError(cx, "Error converting adding '%s' property to Uint32", prop_name); - return FALSE; - } + smb_setfilesize(&idx->idx, (uint64_t)JSVAL_TO_DOUBLE(val)); } if(JS_GetProperty(cx, obj, prop_name = "crc16", &val) && !JSVAL_NULL_OR_VOID(val)) { idx->hash.data.crc16 = JSVAL_TO_INT(val); @@ -675,7 +671,7 @@ js_hash_file(JSContext *cx, uintN argc, jsval *arglist) if(size == -1) JS_ReportError(cx, "File does not exist: %s", path); else { - file.idx.size = (uint32_t)size; + smb_setfilesize(&file.idx, size); if((p->smb_result = smb_hashfile(path, size, &file.file_idx.hash.data)) > 0) { file.file_idx.hash.flags = p->smb_result; file.hdr.when_written.time = (uint32_t)fdate(path); diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c index 797bd078443ef466225ec14544de0f019fab9517..a7f7e0612858e26fcd2110e8ce9647e08db9d2e1 100644 --- a/src/sbbs3/smbutil.c +++ b/src/sbbs3/smbutil.c @@ -581,7 +581,7 @@ void dumpindex(ulong start, ulong count) printf("%10"PRIu32" ", idx.number); switch(smb_msg_type(idx.attr)) { case SMB_MSG_TYPE_FILE: - printf("F %10lu ", (ulong)idx.size); + printf("F %10"PRIu64" ", smb_getfilesize(&idx)); break; case SMB_MSG_TYPE_BALLOT: printf("V %04hX %-10"PRIu32, idx.votes,idx.remsg); diff --git a/src/smblib/smbdefs.h b/src/smblib/smbdefs.h index cd676ec2c40b933216db74e87f767b2c6426eace..9adb5ed8bc8454281e9888db570235fcef9cb7db 100644 --- a/src/smblib/smbdefs.h +++ b/src/smblib/smbdefs.h @@ -393,7 +393,7 @@ typedef struct { /* Index record */ }; struct { /* when msg.type == FILE */ uint32_t size; - uint16_t unused; /* possibly store additional 16-bits of file size here */ + uint16_t size_ext; /* store additional 16-bits of file size here */ }; }; smb_msg_attr_t attr; /* attributes (read, permanent, etc.) */ diff --git a/src/smblib/smbfile.c b/src/smblib/smbfile.c index b9ac5c3bddd8bcb838336fd31fd964253ff58920..f23ce9ec437c687ab98da9a68346998e41553d1f 100644 --- a/src/smblib/smbfile.c +++ b/src/smblib/smbfile.c @@ -221,6 +221,7 @@ int smb_findfile(smb_t* smb, const char* filename, smbfile_t* file) smbfile_t file_ = {0}; if(f == NULL) f = &file_; + uint64_t fsize; char fname[SMB_FILEIDX_NAMELEN + 1] = ""; if(filename != NULL) smb_fileidxname(filename, fname, sizeof(fname)); @@ -249,8 +250,9 @@ int smb_findfile(smb_t* smb, const char* filename, smbfile_t* file) if(file == NULL) continue; - if((f->file_idx.hash.flags & SMB_HASH_MASK) != 0 || f->file_idx.idx.size > 0) { - if(f->file_idx.idx.size > 0 && f->file_idx.idx.size != fidx.idx.size) + fsize = smb_getfilesize(&f->idx); + if((f->file_idx.hash.flags & SMB_HASH_MASK) != 0 || fsize > 0) { + if(fsize > 0 && fsize != smb_getfilesize(&fidx.idx)) continue; if((f->file_idx.hash.flags & SMB_HASH_CRC16) && f->file_idx.hash.data.crc16 != fidx.hash.data.crc16) continue; @@ -460,3 +462,19 @@ int smb_removefile(smb_t* smb, smbfile_t* file) smb_unlocksmbhdr(smb); return result; } + +uint64_t smb_getfilesize(idxrec_t* idx) +{ + return ((uint64_t)idx->size) | (((uint64_t)idx->size_ext) << 32); +} + +int smb_setfilesize(idxrec_t* idx, uint64_t size) +{ + if(size > 0xffffffffffffULL) + return SMB_ERR_FILE_LEN; + + idx->size = (uint32_t)size; + idx->size_ext = (uint16_t)(size >> 32); + + return SMB_SUCCESS; +} diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index 7eaa5c9bed88d252765bde37616ddcac297b58b7..ef2771d49305fd9e5fa87710000cbd394fd63aff 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -1730,7 +1730,7 @@ int smb_init_idx(smb_t* smb, smbmsg_t* msg) if(msg->name != NULL) smb_fileidxname(msg->name, msg->file_idx.name, sizeof(msg->file_idx.name)); if(msg->size > 0) - msg->idx.size = (uint32_t)msg->size; + smb_setfilesize(&msg->idx, msg->size); } else { msg->idx.subj = smb_subject_crc(msg->subj); if(smb->status.attr & SMB_EMAIL) { diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h index eb2f37760a16c2b32bf562882d7c33a190ac1528..95493f7487018d5976f9f82b43695ccf4821129e 100644 --- a/src/smblib/smblib.h +++ b/src/smblib/smblib.h @@ -295,6 +295,8 @@ SMBEXPORT int smb_loadfile(smb_t*, const char* filename, smbfile_t*, enum file_ SMBEXPORT void smb_freefilemem(smbfile_t*); SMBEXPORT int smb_removefile(smb_t*, smbfile_t*); SMBEXPORT char* smb_fileidxname(const char* filename, char* buf, size_t); +SMBEXPORT uint64_t smb_getfilesize(idxrec_t*); +SMBEXPORT int smb_setfilesize(idxrec_t*, uint64_t); #ifdef __cplusplus }