diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp index f189baee21400275a4450027f4b567d47f447567..458bcdb35e532e8b534e4e9ab022e5f5c6d73779 100644 --- a/src/sbbs3/atcodes.cpp +++ b/src/sbbs3/atcodes.cpp @@ -1175,12 +1175,12 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen, long* pmode, bool } if(!strcmp(sp,"UPBYTES")) { - safe_snprintf(str,maxlen,"%lu",useron.ulb); + safe_snprintf(str,maxlen,"%" PRIu64,useron.ulb); return(str); } if(!strcmp(sp,"UPK")) { - safe_snprintf(str,maxlen,"%lu",useron.ulb/1024L); + safe_snprintf(str,maxlen,"%" PRIu64,useron.ulb/1024L); return(str); } @@ -1190,12 +1190,12 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen, long* pmode, bool } if(!strcmp(sp,"DLBYTES")) { - safe_snprintf(str,maxlen,"%lu",useron.dlb); + safe_snprintf(str,maxlen,"%" PRIu64,useron.dlb); return(str); } if(!strcmp(sp,"DOWNK")) { - safe_snprintf(str,maxlen,"%lu",useron.dlb/1024L); + safe_snprintf(str,maxlen,"%" PRIu64,useron.dlb/1024L); return(str); } @@ -1247,37 +1247,37 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen, long* pmode, bool /* MAXDL */ if(!strcmp(sp,"MAXDK") || !strcmp(sp,"DLKLIMIT") || !strcmp(sp,"KBLIMIT")) { - safe_snprintf(str,maxlen,"%lu",cfg.level_freecdtperday[useron.level]/1024L); + safe_snprintf(str,maxlen,"%" PRIu64,cfg.level_freecdtperday[useron.level]/1024L); return(str); } if(!strcmp(sp,"DAYBYTES")) { /* amt of free cdts used today */ - safe_snprintf(str,maxlen,"%lu",cfg.level_freecdtperday[useron.level]-useron.freecdt); + safe_snprintf(str,maxlen,"%" PRIu64,cfg.level_freecdtperday[useron.level]-useron.freecdt); return(str); } if(!strcmp(sp,"BYTELIMIT")) { - safe_snprintf(str,maxlen,"%ld", (long)cfg.level_freecdtperday[useron.level]); + safe_snprintf(str,maxlen,"%" PRIu64, cfg.level_freecdtperday[useron.level]); return(str); } if(!strcmp(sp,"KBLEFT")) { - safe_snprintf(str,maxlen,"%lu",(useron.cdt+useron.freecdt)/1024L); + safe_snprintf(str,maxlen,"%" PRIu64,(useron.cdt+useron.freecdt)/1024ULL); return(str); } if(!strcmp(sp,"BYTESLEFT")) { - safe_snprintf(str,maxlen,"%lu",useron.cdt+useron.freecdt); + safe_snprintf(str,maxlen,"%" PRIu64,useron.cdt+useron.freecdt); return(str); } if(strcmp(sp, "CREDITS") == 0) { - safe_snprintf(str, maxlen, "%lu", useron.cdt); + safe_snprintf(str, maxlen, "%" PRIu64, useron.cdt); return str; } if(strcmp(sp, "FREECDT") == 0) { - safe_snprintf(str, maxlen, "%lu", useron.freecdt); + safe_snprintf(str, maxlen, "%" PRIu64, useron.freecdt); return str; } @@ -1716,11 +1716,11 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen, long* pmode, bool else if(!strcmp(sp,"ULS")) safe_snprintf(str,maxlen,"%lu", (ulong)stats.uls); else if(!strcmp(sp,"ULB")) - safe_snprintf(str,maxlen,"%lu", (ulong)stats.ulb); + safe_snprintf(str,maxlen,"%" PRIu64, stats.ulb); else if(!strcmp(sp,"DLS")) safe_snprintf(str,maxlen,"%lu", (ulong)stats.dls); else if(!strcmp(sp,"DLB")) - safe_snprintf(str,maxlen,"%lu", (ulong)stats.dlb); + safe_snprintf(str,maxlen,"%" PRIu64, stats.dlb); else if(!strcmp(sp,"PTODAY")) safe_snprintf(str,maxlen,"%lu", (ulong)stats.ptoday); else if(!strcmp(sp,"ETODAY")) diff --git a/src/sbbs3/bat_xfer.cpp b/src/sbbs3/bat_xfer.cpp index f34a3ef2083e431f1471048f8787342b76ff98d0..9ad5fba71bc0179152b98d2cc9a884a66129cff7 100644 --- a/src/sbbs3/bat_xfer.cpp +++ b/src/sbbs3/bat_xfer.cpp @@ -124,10 +124,10 @@ void sbbs_t::batchmenu() getfiletime(&cfg, &f); bprintf(text[DownloadQueueLstFmt],i+1 ,filename - ,i64toac(f.cost, tmp) - ,i64toac(f.size, str) + ,byte_estimate_to_str(f.cost, tmp, sizeof(tmp), 1, 1) + ,byte_estimate_to_str(f.size, str, sizeof(str), 1, 1) ,cur_cps - ? sectostr((uint)(f.size/(ulong)cur_cps),tmp2) + ? sectostr((uint)(f.size/(uint64_t)cur_cps), tmp2) : "??:??:??" ,datestr(f.time) ); @@ -136,9 +136,9 @@ void sbbs_t::batchmenu() smb_freefilemem(&f); } bprintf(text[DownloadQueueTotals] - ,ultoac((ulong)totalcdt,tmp),ultoac((ulong)totalsize,str),cur_cps - ? sectostr((ulong)totalsize/(ulong)cur_cps,tmp2) - : "??:??:??"); + ,byte_estimate_to_str(totalcdt, tmp, sizeof(tmp), 1, 1) + ,byte_estimate_to_str(totalsize, str, sizeof(tmp), 1, 1) + ,cur_cps ? sectostr((uint)(totalsize/(uint64_t)cur_cps), tmp2) : "??:??:??"); } else bputs(text[DownloadQueueIsEmpty]); iniFreeStringList(filenames); @@ -253,7 +253,7 @@ BOOL sbbs_t::start_batch_download() return result; } - int64_t totalcdt = 0; + uint64_t totalcdt = 0; for(size_t i=0; filenames[i] != NULL; ++i) { file_t f = {{}}; if(batch_file_load(&cfg, ini, filenames[i], &f)) { @@ -261,9 +261,9 @@ BOOL sbbs_t::start_batch_download() smb_freefilemem(&f); } } - if(totalcdt > (int64_t)(useron.cdt+useron.freecdt)) { + if(totalcdt > useron.cdt+useron.freecdt) { bprintf(text[YouOnlyHaveNCredits] - ,ultoac(useron.cdt+useron.freecdt,tmp)); + ,u64toac(useron.cdt+useron.freecdt,tmp)); iniFreeStringList(ini); iniFreeStringList(filenames); return(FALSE); @@ -690,7 +690,7 @@ bool sbbs_t::addtobatdl(file_t* f) totalcost += f->cost; if(totalcost > useron.cdt+useron.freecdt) { bprintf(text[CantAddToQueue],f->name); - bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt+useron.freecdt,tmp)); + bprintf(text[YouOnlyHaveNCredits],u64toac(useron.cdt+useron.freecdt,tmp)); } else { totalsize += f->size; if(!(cfg.dir[f->dir]->misc&DIR_TFREE) && cur_cps) @@ -701,9 +701,10 @@ bool sbbs_t::addtobatdl(file_t* f) } else { if(batch_file_add(&cfg, useron.number, XFER_BATCH_DOWNLOAD, f)) { bprintf(text[FileAddedToBatDlQueue] - ,f->name, strListCount(filenames) + 1, cfg.max_batdn, i64toac(totalcost,tmp) - ,i64toac(totalsize,tmp2) - ,sectostr((ulong)(totalsize/MAX((ulong)cur_cps, 1)),str)); + ,f->name, strListCount(filenames) + 1, cfg.max_batdn + ,byte_estimate_to_str(totalcost, tmp, sizeof(tmp), 1, 1) + ,byte_estimate_to_str(totalsize, tmp2, sizeof(tmp2), 1, 1) + ,sectostr((uint)(totalsize/MAX((uint64_t)cur_cps, 1)),str)); result = true; } } diff --git a/src/sbbs3/chat.cpp b/src/sbbs3/chat.cpp index 2ffe4ca8a6a3a9bd77ef0e8d35d34f5b4e2fd4aa..f8290fcd82593d63eb043b05ec4dddb4469322c9 100644 --- a/src/sbbs3/chat.cpp +++ b/src/sbbs3/chat.cpp @@ -1666,7 +1666,7 @@ void sbbs_t::guruchat(char* line, char* gurubuf, int gurunum, char* last_answer) break; case 'D': if(sys_status&SS_USERON) { - SAFECAT(theanswer,ultoac(useron.dlb,tmp)); + SAFECAT(theanswer,u64toac(useron.dlb,tmp)); } else { SAFECAT(theanswer,"0"); } @@ -1730,7 +1730,7 @@ void sbbs_t::guruchat(char* line, char* gurubuf, int gurunum, char* last_answer) break; case 'U': if(sys_status&SS_USERON) { - SAFECAT(theanswer,ultoac(useron.ulb,tmp)); + SAFECAT(theanswer,u64toac(useron.ulb,tmp)); } else { SAFECAT(theanswer,"0"); } @@ -1751,7 +1751,7 @@ void sbbs_t::guruchat(char* line, char* gurubuf, int gurunum, char* last_answer) break; case '$': /* Credits */ if(sys_status&SS_USERON) { - SAFECAT(theanswer,ultoac(useron.cdt,tmp)); + SAFECAT(theanswer,u64toac(useron.cdt,tmp)); } else { SAFECAT(theanswer,"0"); } diff --git a/src/sbbs3/chk_ar.cpp b/src/sbbs3/chk_ar.cpp index 2318b03b6cce4dc8140f7359766599b6f543b6eb..6d3433417ba142638a6f4b74c425099ffd27b37a 100644 --- a/src/sbbs3/chk_ar.cpp +++ b/src/sbbs3/chk_ar.cpp @@ -25,7 +25,7 @@ bool sbbs_t::ar_exp(const uchar **ptrptr, user_t* user, client_t* client) { bool result,_not,_or,equal; uint i,n,artype,age; - ulong l; + uint64_t l; struct tm tm; const char* p; @@ -294,7 +294,7 @@ bool sbbs_t::ar_exp(const uchar **ptrptr, user_t* user, client_t* client) } break; case AR_CREDIT: - l=(ulong)i*1024UL; + l = i * 1024UL; if((equal && user->cdt+user->freecdt!=l) || (!equal && user->cdt+user->freecdt<l)) result=_not; @@ -303,7 +303,7 @@ bool sbbs_t::ar_exp(const uchar **ptrptr, user_t* user, client_t* client) (*ptrptr)++; if(!result) { noaccess_str=text[NoAccessCredit]; - noaccess_val=l; + noaccess_val=(long)l; } break; case AR_NODE: diff --git a/src/sbbs3/data.cpp b/src/sbbs3/data.cpp index 18a8218540989d8a9cdd1d85283de4845704676c..428d74bf23e32e84f08a1c53721926af4cbcc79d 100644 --- a/src/sbbs3/data.cpp +++ b/src/sbbs3/data.cpp @@ -225,8 +225,8 @@ ulong sbbs_t::gettimeleft(bool handle_out_of_time) SAFEPRINTF(tmp,text[Convert100ktoNminQ],cfg.cdt_min_value); if(yesno(tmp)) { logline(" ","Credit to Minute Conversion"); - useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,cfg.cdt_min_value); - useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,-(102400L)); + useron.min=(uint32_t)adjustuserrec(&cfg,useron.number,U_MIN,cfg.cdt_min_value); + useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,-(102400LL)); SAFEPRINTF(str,"Credit Adjustment: %ld",-(102400L)); logline("$-",str); SAFEPRINTF(str,"Minute Adjustment: %u",cfg.cdt_min_value); diff --git a/src/sbbs3/download.cpp b/src/sbbs3/download.cpp index 1db61078e584bc7482a80afe732a8167031fc18a..669d7ce6295031362db07b6e77db452cb080dd2e 100644 --- a/src/sbbs3/download.cpp +++ b/src/sbbs3/download.cpp @@ -68,7 +68,7 @@ void sbbs_t::notdownloaded(off_t size, time_t start, time_t end) && end-start>=(double)(size/cur_cps)*(double)cfg.leech_pct/100.0) { lprintf(LOG_ERR, "Node %d Possible use of leech protocol (leech=%u downloads=%u)" ,cfg.node_num, useron.leech+1,useron.dls); - useron.leech=(uchar)adjustuserrec(&cfg,useron.number,U_LEECH,2,1); + useron.leech=(uchar)adjustuserrec(&cfg,useron.number,U_LEECH,1); } } @@ -393,8 +393,8 @@ bool sbbs_t::sendfile(char* fname, char prot, const char* desc, bool autohang) off_t length = flength(fname); logon_dlb += length; /* Update stats */ logon_dls++; - useron.dls = (ushort)adjustuserrec(&cfg, useron.number, U_DLS, 5, 1); - useron.dlb = adjustuserrec(&cfg,useron.number, U_DLB, 10, (long)length); + useron.dls = (ushort)adjustuserrec(&cfg, useron.number, U_DLS, 1); + useron.dlb = (uint32_t)adjustuserrec(&cfg,useron.number, U_DLB, length); char bytes[32]; ultoac((ulong)length, bytes); bprintf(text[FileNBytesSent], getfname(fname), bytes); diff --git a/src/sbbs3/exec.cpp b/src/sbbs3/exec.cpp index 9e6f9b8f8b4b967d87c69b61ffa89354f8b2f179..6d5167c79aa543b25773456c506d61d20005cd40 100644 --- a/src/sbbs3/exec.cpp +++ b/src/sbbs3/exec.cpp @@ -1433,12 +1433,12 @@ int sbbs_t::exec(csi_t *csi) if(l<0) subtract_cdt(&cfg,&useron,-l); else - useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,l); + useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,l); csi->ip+=2; return(0); case CS_ADJUST_USER_MINUTES: i=*(short *)csi->ip; - useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,i); + useron.min=(uint32_t)adjustuserrec(&cfg,useron.number,U_MIN,i); csi->ip+=2; return(0); case CS_GETNUM: diff --git a/src/sbbs3/file.cpp b/src/sbbs3/file.cpp index 9a2059a6cc7cd5c5da180ea7b1ef62b4cc113363..6483776e4bc64b321fddcd909b661be7a57551fa 100644 --- a/src/sbbs3/file.cpp +++ b/src/sbbs3/file.cpp @@ -39,11 +39,11 @@ void sbbs_t::showfileinfo(file_t* f, bool show_extdesc) bprintf(P_TRUNCATE, text[FiFilename],f->name); if(getfilesize(&cfg, f) >= 0) - bprintf(P_TRUNCATE, text[FiFileSize], i64toac(f->size,tmp) + bprintf(P_TRUNCATE, text[FiFileSize], u64toac(f->size,tmp) , byte_estimate_to_str(f->size, tmp2, sizeof(tmp2), /* units: */1024, /* precision: */1)); bprintf(P_TRUNCATE, text[FiCredits] - ,(cfg.dir[f->dir]->misc&DIR_FREE || !f->cost) ? "FREE" : i64toac(f->cost,tmp)); + ,(cfg.dir[f->dir]->misc&DIR_FREE || !f->cost) ? "FREE" : u64toac(f->cost,tmp)); if(getfilesize(&cfg, f) > 0 && (uint64_t)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) { @@ -178,7 +178,7 @@ bool sbbs_t::removefcdt(file_t* f) && f->hdr.times_downloaded) /* all downloads */ cdt+=((ulong)((long)f->hdr.times_downloaded *f->cost*(cfg.dir[f->dir]->dn_pct/100.0))/cur_cps)/60; - adjustuserrec(&cfg,u,U_MIN,10,-cdt); + adjustuserrec(&cfg,u,U_MIN,-cdt); sprintf(str,"%lu minute",cdt); sprintf(tmp,text[FileRemovedUserMsg] ,f->name,cdt ? str : text[No]); @@ -199,14 +199,14 @@ bool sbbs_t::removefcdt(file_t* f) return false; cdt = atol(str); } - adjustuserrec(&cfg,u,U_CDT,10,-cdt); + adjustuserrec(&cfg,u,U_CDT,-cdt); sprintf(tmp,text[FileRemovedUserMsg] ,f->name,cdt ? ultoac(cdt,str) : text[No]); putsmsg(&cfg,u,tmp); } - adjustuserrec(&cfg,u,U_ULB,10,(long)-f->size); - adjustuserrec(&cfg,u,U_ULS,5,-1); + adjustuserrec(&cfg,u,U_ULB,-f->size); + adjustuserrec(&cfg,u,U_ULS,-1); return(true); } diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c index 2721d9d61e3c040fef0c33e8eabb48baea0a4b09..ae598427c248d8cc2926563f537c7a9a40a98d44 100644 --- a/src/sbbs3/filedat.c +++ b/src/sbbs3/filedat.c @@ -1286,7 +1286,7 @@ char* cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* fpath break; case '$': /* Credits */ if(user!=NULL) - strncat(cmd,ultoa(user->cdt+user->freecdt,str,10), avail); + strncat(cmd,_ui64toa(user->cdt+user->freecdt,str,10), avail); break; case '%': /* %% for percent sign */ strncat(cmd,"%", avail); diff --git a/src/sbbs3/filelist.c b/src/sbbs3/filelist.c index b2eadb50122226f1ca78726821f0b7a1ac17e7f1..c0fa9a0e0a81632feb6352621fcc0f53e1776ecb 100644 --- a/src/sbbs3/filelist.c +++ b/src/sbbs3/filelist.c @@ -57,7 +57,7 @@ int lprintf(int level, const char *fmat, ...) return(chcount); } -char* byteStr(unsigned long value) +char* byteStr(uint64_t value) { static char tmp[128]; @@ -109,8 +109,9 @@ int main(int argc, char **argv) int i,j,dirnum,libnum,desc_off,lines,nots=0; char* omode="w"; char* pattern=NULL; - ulong m,misc=0,total_cdt=0,total_files=0,dir_files; + ulong m,misc=0,total_files=0,dir_files; uint64_t cdt; + uint64_t total_cdt=0; long max_age=0; FILE* out=NULL; @@ -450,7 +451,7 @@ int main(int argc, char **argv) } if(misc&TOT && !(misc&AUTO)) - fprintf(out,"TOTALS\n------\n%lu credits/bytes in %lu files.\n" + fprintf(out,"TOTALS\n------\n%" PRIu64 " credits/bytes in %lu files.\n" ,total_cdt,total_files); printf("\nDone.\n"); return(0); diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index 6fc323c791e9ac170334be2493736c93f1d4a11e..17bfca6d28b3a96e891629e976b44ca602af5e20 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -775,12 +775,12 @@ static void send_thread(void* arg) l=0; if(scfg.dir[f.dir]->misc&DIR_CDTMIN && cps) { /* Give min instead of cdt */ mod=((ulong)(l*(scfg.dir[f.dir]->dn_pct/100.0))/cps)/60; - adjustuserrec(&scfg,uploader.number,U_MIN,10,mod); + adjustuserrec(&scfg,uploader.number,U_MIN,mod); sprintf(tmp,"%lu minute",mod); } else { mod=(ulong)(l*(scfg.dir[f.dir]->dn_pct/100.0)); - adjustuserrec(&scfg,uploader.number,U_CDT,10,mod); - ultoac(mod,tmp); + adjustuserrec(&scfg,uploader.number,U_CDT,mod); + u32toac(mod,tmp,','); } if(!(scfg.dir[f.dir]->misc&DIR_QUIET)) { const char* prefix = xfer.filepos ? "partially FTP-" : "FTP-"; @@ -1071,11 +1071,11 @@ static void receive_thread(void* arg) user_uploaded(&scfg, xfer.user, (!xfer.append && xfer.filepos==0) ? 1:0, total); if(scfg.dir[f.dir]->up_pct && scfg.dir[f.dir]->misc&DIR_CDTUL) { /* credit for upload */ if(scfg.dir[f.dir]->misc&DIR_CDTMIN && cps) /* Give min instead of cdt */ - xfer.user->min=adjustuserrec(&scfg,xfer.user->number,U_MIN,10 + xfer.user->min=(uint32_t)adjustuserrec(&scfg,xfer.user->number,U_MIN ,((ulong)(total*(scfg.dir[f.dir]->up_pct/100.0))/cps)/60); else - xfer.user->cdt=adjustuserrec(&scfg,xfer.user->number,U_CDT,10 - ,(ulong)(cdt*(scfg.dir[f.dir]->up_pct/100.0))); + xfer.user->cdt=adjustuserrec(&scfg,xfer.user->number,U_CDT + ,cdt*(uint64_t)(scfg.dir[f.dir]->up_pct/100.0)); } if(!(scfg.dir[f.dir]->misc&DIR_NOSTAT)) inc_sys_upload_stats(&scfg, 1, (ulong)total); diff --git a/src/sbbs3/getmsg.cpp b/src/sbbs3/getmsg.cpp index 0923a4269d0c1b3503ad64a3a1c459346ffed616..6197e69e2a9b1f495f8e31e45a416a79de4c571b 100644 --- a/src/sbbs3/getmsg.cpp +++ b/src/sbbs3/getmsg.cpp @@ -409,17 +409,17 @@ void sbbs_t::download_msg_attachments(smb_t* smb, smbmsg_t* msg, bool del) if(!fexistcase(fpath) && msg->idx.from) SAFEPRINTF3(fpath,"%sfile/%04u.out/%s" /* path is path/fname */ ,cfg.data_dir, msg->idx.from,tp); - long length=(long)flength(fpath); + off_t length=flength(fpath); if(length<1) bprintf(text[FileDoesNotExist], tp); else if(!(useron.exempt&FLAG('T')) && cur_cps && !SYSOP - && length/(long)cur_cps>(time_t)timeleft) + && length/cur_cps>(time_t)timeleft) bputs(text[NotEnoughTimeToDl]); else { char tmp[512]; int i; SAFEPRINTF2(str, text[DownloadAttachedFileQ] - ,getfname(fpath),ultoac(length,tmp)); + ,getfname(fpath),u64toac(length,tmp)); if(length>0L && text[DownloadAttachedFileQ][0] && yesno(str)) { { /* Remote User */ xfer_prot_menu(XFER_DOWNLOAD); @@ -444,11 +444,11 @@ void sbbs_t::download_msg_attachments(smb_t* smb, smbmsg_t* msg, bool del) logon_dlb+=length; /* Update stats */ logon_dls++; useron.dls=(ushort)adjustuserrec(&cfg,useron.number - ,U_DLS,5,1); + ,U_DLS,1); useron.dlb=adjustuserrec(&cfg,useron.number - ,U_DLB,10,length); + ,U_DLB,length); bprintf(text[FileNBytesSent] - ,getfname(fpath),ultoac(length,tmp)); + ,getfname(fpath),u64toac(length,tmp)); SAFEPRINTF(str ,"downloaded attached file: %s" ,getfname(fpath)); diff --git a/src/sbbs3/js_user.c b/src/sbbs3/js_user.c index 4ad482bd1075f33d68444518b64a7f933423f7f9..6e91e515f3e320feaddb55aec351a9a48c47ac0f 100644 --- a/src/sbbs3/js_user.c +++ b/src/sbbs3/js_user.c @@ -262,20 +262,25 @@ static JSBool js_user_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) val=p->user->ptoday; break; case USER_PROP_ULB: - val=p->user->ulb; + *vp = DOUBLE_TO_JSVAL((jsdouble)p->user->ulb); + JS_RESUMEREQUEST(cx, rc); + return JS_TRUE; /* intentional early return */ break; case USER_PROP_ULS: val=p->user->uls; break; case USER_PROP_DLB: - val=p->user->dlb; + *vp = DOUBLE_TO_JSVAL((jsdouble)p->user->dlb); + JS_RESUMEREQUEST(cx, rc); + return JS_TRUE; /* intentional early return */ break; case USER_PROP_DLS: val=p->user->dls; break; case USER_PROP_CDT: - val=p->user->cdt; - break; + *vp = DOUBLE_TO_JSVAL((jsdouble)p->user->cdt); + JS_RESUMEREQUEST(cx, rc); + return JS_TRUE; /* intentional early return */ case USER_PROP_MIN: val=p->user->min; break; @@ -327,8 +332,9 @@ static JSBool js_user_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) break; case USER_PROP_FREECDT: - val=p->user->freecdt; - break; + *vp = DOUBLE_TO_JSVAL((jsdouble)p->user->freecdt); + JS_RESUMEREQUEST(cx, rc); + return JS_TRUE; /* intentional early return */ case USER_PROP_XEDIT: if(p->user->xedit>0 && p->user->xedit<=scfg->total_xedits) s=scfg->xedit[p->user->xedit-1]->code; @@ -722,11 +728,11 @@ static JSBool js_user_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, rc=JS_SUSPENDREQUEST(cx); break; case USER_PROP_CDT: - p->user->cdt=strtoul(str,NULL,0); + p->user->cdt=strtoull(str,NULL,0); putuserrec(scfg,p->user->number,U_CDT,0,str); break; case USER_PROP_FREECDT: - p->user->freecdt=strtoul(str,NULL,0); + p->user->freecdt=strtoull(str,NULL,0); putuserrec(scfg,p->user->number,U_FREECDT,0,str); break; case USER_PROP_MIN: diff --git a/src/sbbs3/listfile.cpp b/src/sbbs3/listfile.cpp index 8b99f3b268e1fd005f16b5b6cc4d4d3d37c7b93f..552e887de5847a9951a959d453c4ef2c7799a4c0 100644 --- a/src/sbbs3/listfile.cpp +++ b/src/sbbs3/listfile.cpp @@ -940,7 +940,7 @@ int sbbs_t::listfileinfo(uint dirnum, const char *filespec, long mode) && f->cost>(useron.cdt+useron.freecdt)) { SYNC; bprintf(text[YouOnlyHaveNCredits] - ,ultoac(useron.cdt+useron.freecdt,tmp)); + ,u64toac(useron.cdt+useron.freecdt,tmp)); mnemonics(text[QuitOrNext]); if(getkeys("\rQ",0)=='Q') { found=-1; diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp index 626630f029a7afa42fe44ec6d381ffceee46bf65..e8ef49151c3ed20f54526c807da0bb5bf6fb9338 100644 --- a/src/sbbs3/logon.cpp +++ b/src/sbbs3/logon.cpp @@ -241,9 +241,9 @@ bool sbbs_t::logon() getfilesize(&cfg, &f); bprintf(text[FileAddedToBatDlQueue] ,f.name, i + 1, cfg.max_batdn - ,ultoac((ulong)f.cost,tmp) - ,ultoac((ulong)f.size,tmp2) - ,sectostr((ulong)f.size / (ulong)cur_cps,str)); + ,byte_estimate_to_str(f.cost, tmp, sizeof(tmp), 1, 1) + ,byte_estimate_to_str(f.size, tmp2, sizeof(tmp2), 1, 1) + ,sectostr((uint)(f.size / (uint64_t)cur_cps),str)); smb_freefilemem(&f); } else batch_file_remove(&cfg, useron.number, XFER_BATCH_DOWNLOAD, filename); diff --git a/src/sbbs3/netmail.cpp b/src/sbbs3/netmail.cpp index 375fcf6081a4271360696f388dc84d71e0e3685a..5dcf191d3db2e472e96e3287c55fb79371aede52 100644 --- a/src/sbbs3/netmail.cpp +++ b/src/sbbs3/netmail.cpp @@ -338,9 +338,9 @@ bool sbbs_t::netmail(const char *into, const char *title, long mode, smb_t* resm return false; } - useron.emails = (ushort)adjustuserrec(&cfg, useron.number, U_EMAILS, 0, 1); + useron.emails = (ushort)adjustuserrec(&cfg, useron.number, U_EMAILS, 1); logon_emails++; - useron.etoday = (ushort)adjustuserrec(&cfg, useron.number, U_ETODAY, 0, 1); + useron.etoday = (ushort)adjustuserrec(&cfg, useron.number, U_ETODAY, 1); if(!(useron.exempt&FLAG('S'))) subtract_cdt(&cfg,&useron,cfg.netmail_cost); diff --git a/src/sbbs3/pack_qwk.cpp b/src/sbbs3/pack_qwk.cpp index 0da138a1fdc7a2959bc6f9ccb0cb86b47aa1a0e6..8bf391660dab8779ffc1e3b8f2b85e84e649355e 100644 --- a/src/sbbs3/pack_qwk.cpp +++ b/src/sbbs3/pack_qwk.cpp @@ -657,7 +657,7 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) if(!is_download_free(&cfg, f.dir, &useron, &client)) { if(totalcdt + f.cost > (uint64_t)(useron.cdt+useron.freecdt)) { bprintf(text[YouOnlyHaveNCredits] - ,ultoac(useron.cdt+useron.freecdt,tmp)); + ,u64toac(useron.cdt+useron.freecdt,tmp)); batch_file_remove(&cfg, useron.number, XFER_BATCH_DOWNLOAD, filename); continue; } diff --git a/src/sbbs3/qwk.cpp b/src/sbbs3/qwk.cpp index 6a50324adc97ce428ba8cb09c48c465eceeaea92..f45336d27736d9bca6e240038cd086069ed21205 100644 --- a/src/sbbs3/qwk.cpp +++ b/src/sbbs3/qwk.cpp @@ -584,7 +584,7 @@ void sbbs_t::qwk_sec() off_t l=flength(str); bprintf(text[FiFilename], getfname(str)); - bprintf(text[FiFileSize], ultoac((ulong)l,tmp) + bprintf(text[FiFileSize], u64toac(l,tmp) , byte_estimate_to_str(l, tmp2, sizeof(tmp2), /* units: */1024, /* precision: */1)); if(l>0L && cur_cps) diff --git a/src/sbbs3/readmsgs.cpp b/src/sbbs3/readmsgs.cpp index 13c94fa2989d9ba734e41cef04358fe585df625f..f52165688e4a94f376f98b2dc72214db98e12598 100644 --- a/src/sbbs3/readmsgs.cpp +++ b/src/sbbs3/readmsgs.cpp @@ -903,7 +903,7 @@ int sbbs_t::scanposts(uint subnum, long mode, const char *find) if(!stricmp(cfg.sub[subnum]->misc&SUB_NAME ? useron.name : useron.alias, msg.from)) useron.posts=(ushort)adjustuserrec(&cfg,useron.number - ,U_POSTS,5,-1); + ,U_POSTS,-1); } } smb_unlocksmbhdr(&smb); diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index dabf50743ab04a08bff0ce846f58d1dc4f644a89..ef00b376105744de4c578d04c30f40b74337b68e 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -722,6 +722,8 @@ public: bool chkpass(char *pass, user_t* user, bool unique); char * cmdstr(const char *instr, const char *fpath, const char *fspec, char *outstr, long mode = EX_UNSPECIFIED); char cmdstr_output[512]; + char* ultoac(uint32_t, char*, char sep=','); + char* u64toac(uint64_t, char*, char sep=','); void subinfo(uint subnum); void dirinfo(uint dirnum); diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h index 591f455bece3b0f0650548c0208a2376b37e7ea7..36c9f236164497e5576f5d0a6cdaad24af11bd0e 100644 --- a/src/sbbs3/sbbsdefs.h +++ b/src/sbbs3/sbbsdefs.h @@ -510,13 +510,14 @@ typedef enum { /* Values for xtrn_t.event */ #define LEN_FDESC 58 /* File description (summary) */ #define LEN_EXTDESC 5000 /* Extended file description */ #define LEN_TITLE 70 /* Message title */ -#define LEN_MAIN_CMD 28 /* Unused Storage in user.dat */ +#define LEN_CDT 20 /* Maximum credit length: 18446744073709551616 */ +#define LEN_MAIN_CMD 8 /* Unused Storage in user.dat */ #define LEN_COLS 3 #define LEN_ROWS 3 #define LEN_PASS 40 #define MIN_PASS_LEN 4 #define RAND_PASS_LEN 8 -#define LEN_SCAN_CMD 35 +#define LEN_SCAN_CMD 15 #define LEN_IPADDR 45 #define LEN_CID 45 /* Caller ID (phone number) */ #define LEN_ARSTR 40 /* Max length of Access Requirement string */ @@ -565,8 +566,8 @@ typedef enum { /* Values for xtrn_t.event */ #define U_ULS U_ULB+10 #define U_DLB U_ULS+5 #define U_DLS U_DLB+10 -#define U_CDT U_DLS+5 -#define U_MIN U_CDT+10 +#define U_OLDCDT U_DLS+5 +#define U_MIN U_OLDCDT+10 #define U_LEVEL U_MIN+10+2 /* Offset to Security Level */ #define U_FLAGS1 U_LEVEL+2 /* Offset to Flags */ @@ -583,12 +584,14 @@ typedef enum { /* Values for xtrn_t.event */ #define U_CURXTRN U_CURSUB+16 /* Current xtrn (internal code) */ #define U_ROWS U_CURXTRN+8+2 #define U_COLS U_ROWS+LEN_ROWS -#define U_MAIN_CMD U_COLS+LEN_COLS /* unused */ +#define U_CDT U_COLS+LEN_COLS /* unused */ +#define U_MAIN_CMD U_CDT+LEN_CDT #define U_PASS U_MAIN_CMD+LEN_MAIN_CMD -#define U_SCAN_CMD U_PASS+LEN_PASS+2 /* unused */ -#define U_IPADDR U_SCAN_CMD+LEN_SCAN_CMD /* unused */ -#define U_FREECDT U_IPADDR+LEN_IPADDR+2 -#define U_FLAGS3 U_FREECDT+10 /* Flag set #3 */ +#define U_FREECDT U_PASS+LEN_PASS+2 +#define U_SCAN_CMD U_FREECDT+LEN_CDT /* unused */ +#define U_IPADDR U_SCAN_CMD+LEN_SCAN_CMD +#define U_OLDFREECDT U_IPADDR+LEN_IPADDR+2 /* unused */ +#define U_FLAGS3 U_OLDFREECDT+10 /* Flag set #3 */ #define U_FLAGS4 U_FLAGS3+8 /* Flag set #4 */ #define U_XEDIT U_FLAGS4+8 /* External editor (code */ #define U_SHELL U_XEDIT+8 /* Command shell (code */ @@ -1007,7 +1010,7 @@ typedef struct { /* Users information */ int rows, /* Rows on terminal (0 = auto-detect) */ cols; /* Columns on terminal (0 = auto-detect) */ - ulong misc, /* Misc. bits - ANSI, Deleted etc. */ + uint32_t misc, /* Misc. bits - ANSI, Deleted etc. */ qwk, /* QWK settings */ chat, /* Chat defaults */ flags1, /* Flag set #1 */ @@ -1016,11 +1019,11 @@ typedef struct { /* Users information */ flags4, /* Flag set #4 */ exempt, /* Exemption Flags */ rest, /* Restriction Flags */ - ulb, /* Total bytes uploaded */ - dlb, /* Total bytes downloaded */ - cdt, /* Credits */ - min, /* Minutes */ - freecdt; /* Free credits (renewed daily) */ + min; /* Minutes */ + uint64_t cdt; /* Credits */ + uint64_t freecdt; /* Free credits (renewed daily) */ + uint64_t ulb; /* Total bytes uploaded */ + uint64_t dlb; /* Total bytes downloaded */ time32_t firston, /* Date/Time first called */ laston, /* Last logoff date/time */ expire, /* Expiration date */ diff --git a/src/sbbs3/scfg/scfgsys.c b/src/sbbs3/scfg/scfgsys.c index 6d35ada31daeab1d9fbdfde156a8610fc51437e9..88a150143231dc51481bcf0e475818358d0f7ad8 100644 --- a/src/sbbs3/scfg/scfgsys.c +++ b/src/sbbs3/scfg/scfgsys.c @@ -891,9 +891,9 @@ void sys_cfg(void) sprintf(opt[i++],"%-27.27s%s","Expiration Days" ,ultoa(cfg.new_expire,str,10)); - ultoac(cfg.new_cdt,str); + u32toac(cfg.new_cdt,str,','); sprintf(opt[i++],"%-27.27s%s","Credits",str); - ultoac(cfg.new_min,str); + u32toac(cfg.new_min,str,','); sprintf(opt[i++],"%-27.27s%s","Minutes",str); sprintf(opt[i++],"%-27.27s%s","Editor" ,cfg.new_xedit); @@ -1367,7 +1367,7 @@ void sys_cfg(void) ,cfg.new_sif); sprintf(opt[i++],"%-27.27s%s","Output SIF Questionnaire" ,cfg.new_sof); - ultoac(cfg.cdt_per_dollar,str); + u32toac(cfg.cdt_per_dollar,str,','); sprintf(opt[i++],"%-27.27s%s","Credits Per Dollar",str); sprintf(opt[i++],"%-27.27s%u","Minutes Per 100k Credits" ,cfg.cdt_min_value); @@ -1951,9 +1951,9 @@ void sys_cfg(void) byte_count_to_str(cfg.level_freecdtperday[i], tmp, sizeof(tmp)); if(uifc.input(WIN_MID|WIN_SAV,0,0 ,"Free Credits Awarded Per Day" - ,tmp,10 + ,tmp,19 ,K_EDIT|K_UPPER) > 0) - cfg.level_freecdtperday[i] = (int32_t)parse_byte_count(tmp, 1); + cfg.level_freecdtperday[i] = parse_byte_count(tmp, 1); break; case 7: j=0; diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h index f86c20517bc2e3072aee33268ff7a1c87109cd39..9e6e619df28cc628d0736c759653359a9e7c00e2 100644 --- a/src/sbbs3/scfgdefs.h +++ b/src/sbbs3/scfgdefs.h @@ -528,7 +528,7 @@ typedef struct level_linespermsg[100], level_postsperday[100], level_emailperday[100]; - int32_t level_freecdtperday[100]; + uint64_t level_freecdtperday[100]; int32_t level_misc[100]; char expired_level; /* Expired user's ML */ uint32_t expired_flags1; /* Flags from set #1 to remove when expired */ diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c index 7b98e1e3f07086ae75e5a453c90c75061ed285e0..9204302269b2bc17187aa031308b5a33b5c46e27 100644 --- a/src/sbbs3/scfglib1.c +++ b/src/sbbs3/scfglib1.c @@ -299,18 +299,21 @@ BOOL read_main_cfg(scfg_t* cfg, char* error, size_t maxerrlen) /***************************/ for(i=0;i<100 && !feof(instream);i++) { + uint32_t freecdt32; get_int(cfg->level_timeperday[i],instream); get_int(cfg->level_timepercall[i],instream); get_int(cfg->level_callsperday[i],instream); - get_int(cfg->level_freecdtperday[i],instream); + get_int(freecdt32,instream); get_int(cfg->level_linespermsg[i],instream); get_int(cfg->level_postsperday[i],instream); get_int(cfg->level_emailperday[i],instream); get_int(cfg->level_misc[i],instream); get_int(cfg->level_expireto[i],instream); + get_int(cfg->level_freecdtperday[i],instream); + if(freecdt32) + cfg->level_freecdtperday[i] = freecdt32; get_int(c,instream); - for(j=0;j<5;j++) - get_int(n,instream); + get_int(n,instream); } if(i!=100) { safe_snprintf(error, maxerrlen,"Insufficient User Level Information: " diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c index 29d00d7ce9b0cf486c20bfa30d0551c70d849c54..e1b3b19db2ce6a387434063ca3558295d9b942b9 100644 --- a/src/sbbs3/scfgsave.c +++ b/src/sbbs3/scfgsave.c @@ -280,18 +280,20 @@ BOOL write_main_cfg(scfg_t* cfg, int backup_level) c=0; for(i=0;i<100 && !feof(stream);i++) { + uint32_t l = 0; put_int(cfg->level_timeperday[i],stream); put_int(cfg->level_timepercall[i],stream); put_int(cfg->level_callsperday[i],stream); - put_int(cfg->level_freecdtperday[i],stream); + put_int(l,stream); // Used to be freecdtperday (32-bit) put_int(cfg->level_linespermsg[i],stream); put_int(cfg->level_postsperday[i],stream); put_int(cfg->level_emailperday[i],stream); put_int(cfg->level_misc[i],stream); put_int(cfg->level_expireto[i],stream); + put_int(cfg->level_freecdtperday[i],stream); put_int(c,stream); - for(j=0;j<5;j++) - put_int(n,stream); } + put_int(n,stream); + } /* Command Shells */ diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp index 0939273a9b88b1d318bcec5b15400c08d190ef06..7c605ff345e6a2d74828fbd37a536920f999b6b2 100644 --- a/src/sbbs3/str.cpp +++ b/src/sbbs3/str.cpp @@ -922,12 +922,12 @@ void sbbs_t::user_info() ,getmail(&cfg,useron.number,/* Sent: */FALSE, /* SPAM: */FALSE),useron.etoday); CRLF; bprintf(text[UserUploads] - ,ultoac(useron.ulb,tmp),useron.uls); + ,byte_estimate_to_str(useron.ulb, tmp, sizeof(tmp), 1, 1),useron.uls); bprintf(text[UserDownloads] - ,ultoac(useron.dlb,tmp),useron.dls,nulstr); - bprintf(text[UserCredits],ultoac(useron.cdt,tmp) - ,ultoac(useron.freecdt,tmp2) - ,ultoac(cfg.level_freecdtperday[useron.level],str)); + ,byte_estimate_to_str(useron.dlb, tmp, sizeof(tmp), 1, 1),useron.dls,nulstr); + bprintf(text[UserCredits],byte_estimate_to_str(useron.cdt, tmp, sizeof(tmp), 1, 1) + ,byte_estimate_to_str(useron.freecdt,tmp2, sizeof(tmp2), 1, 1) + ,byte_estimate_to_str(cfg.level_freecdtperday[useron.level], str, sizeof(str), 1, 1)); bprintf(text[UserMinutes],ultoac(useron.min,tmp)); } @@ -1166,8 +1166,8 @@ void sbbs_t::time_bank(void) s=getnum(s); if(s>0) { logline(" ","Minute Bank Deposit"); - useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,s); - useron.ttoday=(ushort)adjustuserrec(&cfg,useron.number,U_TTODAY,10,s); + useron.min=(uint32_t)adjustuserrec(&cfg,useron.number,U_MIN,s); + useron.ttoday=(ushort)adjustuserrec(&cfg,useron.number,U_TTODAY,s); sprintf(str,"Minute Adjustment: %u",s*cfg.cdt_min_value); logline("*+",str); } @@ -1176,27 +1176,27 @@ void sbbs_t::time_bank(void) if(!(cfg.sys_misc&SM_NOCDTCVT)) { bprintf(text[ConversionRate],cfg.cdt_min_value); bprintf(text[UserCredits] - ,ultoac(useron.cdt,tmp) - ,ultoac(useron.freecdt,tmp2) - ,ultoac(cfg.level_freecdtperday[useron.level],str)); + ,u64toac(useron.cdt,tmp) + ,u64toac(useron.freecdt,tmp2) + ,u64toac(cfg.level_freecdtperday[useron.level],str)); bprintf(text[UserMinutes],ultoac(useron.min,tmp)); if(useron.cdt/102400L<1L) { - bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt,tmp)); + bprintf(text[YouOnlyHaveNCredits],u64toac(useron.cdt,tmp)); return; } if(cfg.max_minutes && useron.min>=cfg.max_minutes) { bputs(text[YouHaveTooManyMinutes]); return; } - s=useron.cdt/102400L; + s=(uint32_t)(useron.cdt/102400L); if(cfg.max_minutes) while(s>0 && (s*cfg.cdt_min_value)+useron.min>cfg.max_minutes) s--; bprintf(text[CreditsToMin],s); s=getnum(s); if(s>0) { logline(" ","Credit to Minute Conversion"); - useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,-(s*102400L)); - useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,s*(int)cfg.cdt_min_value); + useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,-(s*102400L)); + useron.min=(uint32_t)adjustuserrec(&cfg,useron.number,U_MIN,s*(int)cfg.cdt_min_value); sprintf(str,"Credit Adjustment: %ld",-(s*102400L)); logline("$-",str); sprintf(str,"Minute Adjustment: %u",s*cfg.cdt_min_value); @@ -1284,3 +1284,13 @@ char* sbbs_t::server_host_name(void) { return startup->host_name[0] ? startup->host_name : cfg.sys_inetaddr; } + +char* sbbs_t::ultoac(uint32_t val, char* str, char sep) +{ + return ::u32toac(val, str, sep); +} + +char* sbbs_t::u64toac(uint64_t val, char* str, char sep) +{ + return ::u64toac(val, str, sep); +} diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c index 64b85ef4f7b0ba1925f66cc78e64e80de83eef57..9991892fbd22fe2b413d993b62f8f600feb526e3 100644 --- a/src/sbbs3/str_util.c +++ b/src/sbbs3/str_util.c @@ -476,9 +476,9 @@ str_list_t trashcan_list(scfg_t* cfg, const char* name) /****************************************************************************/ /* Returns in 'string' a character representation of the number in l with */ -/* commas. */ +/* thousands separators (e.g. commas). */ /****************************************************************************/ -char* ultoac(ulong l, char *string) +char* u32toac(uint32_t l, char *string, char sep) { char str[256]; int i,j,k; @@ -490,24 +490,24 @@ char* ultoac(ulong l, char *string) for(k=1;i>-1;k++) { string[j--]=str[i--]; if(j>0 && !(k%3)) - string[j--]=','; + string[j--]=sep; } return(string); } -char* i64toac(int64_t l, char *string) +char* u64toac(uint64_t l, char *string, char sep) { char str[256]; int i,j,k; - _i64toa(l,str,10); + _ui64toa(l,str,10); i=strlen(str)-1; j=i/3+1+i; string[j--]=0; for(k=1;i>-1;k++) { string[j--]=str[i--]; if(j>0 && !(k%3)) - string[j--]=','; + string[j--]=sep; } return string; } diff --git a/src/sbbs3/str_util.h b/src/sbbs3/str_util.h index 269b13e911b56c3a40ecccc47acd47b5b6829104..5b9e4b44a4325213c2e707ebf23f910c2d83ae58 100644 --- a/src/sbbs3/str_util.h +++ b/src/sbbs3/str_util.h @@ -63,8 +63,8 @@ DLLEXPORT char * net_addr(net_t* net); DLLEXPORT BOOL valid_ctrl_a_attr(char a); DLLEXPORT BOOL valid_ctrl_a_code(char a); DLLEXPORT size_t strip_invalid_attr(char *str); -DLLEXPORT char * ultoac(ulong l,char *str); -DLLEXPORT char * i64toac(int64_t, char *str); +DLLEXPORT char * u32toac(uint32_t, char*, char sep); +DLLEXPORT char * u64toac(uint64_t, char*, char sep); DLLEXPORT char * rot13(char* str); DLLEXPORT uint32_t str_to_bits(uint32_t currval, const char *str); DLLEXPORT BOOL str_has_ctrl(const char*); diff --git a/src/sbbs3/text_defaults.c b/src/sbbs3/text_defaults.c index b2d2500a67ebbd3758118032d59919e95ddfabce..a1863252a196223331c4b6d31127d11c2b72c34f 100644 --- a/src/sbbs3/text_defaults.c +++ b/src/sbbs3/text_defaults.c @@ -719,15 +719,14 @@ const char * const text_defaults[TOTAL_TEXT]={ "\x67\x20\x20\x20\x3a\x20\x01\x68\x25\x2d\x35\x75\x20\x20\x20\x20\x20\x01\x6e\x01\x63\x54\x6f\x64\x61\x79\x20\x3a\x20\x01\x68\x25" "\x75\x0d\x0a" // 431 UserEmails ,"\x01\x6e\x01\x63\x4e\x65\x74\x4d\x61\x69\x6c\x20\x20\x20\x3a\x20\x01\x68\x25\x73\x0d\x0a" // 432 UserNetMail - ,"\x01\x6e\x01\x63\x55\x70\x6c\x6f\x61\x64\x73\x20\x20\x20\x3a\x20\x01\x68\x25\x31\x33\x2e\x31\x33\x73\x20\x01\x6e\x01\x63\x62\x79" - "\x74\x65\x73\x20\x69\x6e\x20\x01\x68\x25\x75\x20\x01\x6e\x01\x63\x66\x69\x6c\x65\x73\x0d\x0a" // 433 UserUploads - ,"\x01\x6e\x01\x63\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x73\x20\x3a\x20\x01\x68\x25\x31\x33\x2e\x31\x33\x73\x20\x01\x6e\x01\x63\x62\x79" - "\x74\x65\x73\x20\x69\x6e\x20\x01\x68\x25\x75\x20\x01\x6e\x01\x63\x66\x69\x6c\x65\x73\x20\x25\x73\x0d\x0a" // 434 UserDownloads + ,"\x01\x6e\x01\x63\x55\x70\x6c\x6f\x61\x64\x73\x20\x20\x20\x3a\x20\x01\x68\x25\x39\x2e\x39\x73\x20\x01\x6e\x01\x63\x62\x79\x74\x65" + "\x73\x20\x69\x6e\x20\x01\x68\x25\x75\x20\x01\x6e\x01\x63\x66\x69\x6c\x65\x73\x0d\x0a" // 433 UserUploads + ,"\x01\x6e\x01\x63\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x73\x20\x3a\x20\x01\x68\x25\x39\x2e\x39\x73\x20\x01\x6e\x01\x63\x62\x79\x74\x65" + "\x73\x20\x69\x6e\x20\x01\x68\x25\x75\x20\x01\x6e\x01\x63\x66\x69\x6c\x65\x73\x20\x25\x73\x0d\x0a" // 434 UserDownloads ,"\x2d\x20\x4c\x65\x65\x63\x68\x3a\x20\x01\x72\x01\x68\x01\x69\x25\x75\x01\x6e" // 435 UserLeech - ,"\x01\x6e\x01\x63\x43\x72\x65\x64\x69\x74\x73\x20\x20\x20\x3a\x20\x01\x68\x25\x31\x33\x2e\x31\x33\x73\x20\x01\x6e\x01\x63\x66\x72" - "\x65\x65\x3a\x20\x01\x68\x25\x73\x20\x01\x6e\x01\x63\x28\x01\x68\x25\x73\x20\x01\x6e\x01\x63\x70\x65\x72\x20\x64\x61\x79\x29\x0d" - "\x0a" // 436 UserCredits - ,"\x01\x6e\x01\x63\x4d\x69\x6e\x75\x74\x65\x73\x20\x20\x20\x3a\x20\x01\x68\x25\x31\x33\x2e\x31\x33\x73\x0d\x0a" // 437 UserMinutes + ,"\x01\x6e\x01\x63\x43\x72\x65\x64\x69\x74\x73\x20\x20\x20\x3a\x20\x01\x68\x25\x39\x2e\x39\x73\x20\x01\x6e\x01\x63\x66\x72\x65\x65" + "\x3a\x20\x01\x68\x25\x73\x20\x01\x6e\x01\x63\x28\x01\x68\x25\x73\x20\x01\x6e\x01\x63\x70\x65\x72\x20\x64\x61\x79\x29\x0d\x0a" // 436 UserCredits + ,"\x01\x6e\x01\x63\x4d\x69\x6e\x75\x74\x65\x73\x20\x20\x20\x3a\x20\x01\x68\x25\x39\x2e\x39\x73\x0d\x0a" // 437 UserMinutes ,"\x0d\x0a\x01\x6e\x01\x63\x53\x65\x63\x20\x4c\x65\x76\x65\x6c\x20\x3a\x20\x01\x68\x25\x64\x0d\x0a" // 438 UeditSecLevel ,"\x01\x6e\x01\x63\x46\x6c\x61\x67\x73\x20\x23\x31\x20\x20\x3a\x20\x01\x68\x25\x2d\x32\x36\x73\x20\x20\x20\x01\x6e\x01\x63\x46\x6c" "\x61\x67\x73\x20\x23\x33\x20\x20\x3a\x20\x01\x68\x25\x73\x0d\x0a\x01\x6e\x01\x63\x46\x6c\x61\x67\x73\x20\x23\x32\x20\x20\x3a\x20" diff --git a/src/sbbs3/uedit/uedit.c b/src/sbbs3/uedit/uedit.c index 3a362e7bc2af01cba3d153c7c85b620c303f1008..837108ebde59ef22e0c7727b014df24f93cc718e 100644 --- a/src/sbbs3/uedit/uedit.c +++ b/src/sbbs3/uedit/uedit.c @@ -1002,9 +1002,9 @@ int edit_stats(scfg_t *cfg, user_t *user) sprintf(opt[i++],"Time On Last Call %hu",user->tlast); sprintf(opt[i++],"Extra Time Today %hu",user->textra); sprintf(opt[i++],"Total Downloads %hu",user->dls); - sprintf(opt[i++],"Downloaded Bytes %lu",user->dlb); + sprintf(opt[i++],"Downloaded Bytes %" PRIu64,user->dlb); sprintf(opt[i++],"Total Uploads %hu",user->uls); - sprintf(opt[i++],"Uploaded Bytes %lu",user->ulb); + sprintf(opt[i++],"Uploaded Bytes %" PRIu64,user->ulb); sprintf(opt[i++],"Leech Downloads %u",user->leech); sprintf(opt[i++],"Password Modified %s",user->pwmod?timestr(cfg, user->pwmod, str):"Never"); opt[i][0]=0; @@ -1183,11 +1183,11 @@ int edit_stats(scfg_t *cfg, user_t *user) case 15: /* Downloaded Bytes */ GETUSERDAT(cfg,user); - sprintf(str,"%lu",user->dlb); - uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Downloaded Bytes",str,10,K_EDIT|K_NUMBER); + sprintf(str,"%" PRIu64,user->dlb); + uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Downloaded Bytes",str,20,K_EDIT|K_NUMBER); if(uifc.changes) { - user->dlb=strtoul(str,NULL,10); - putuserrec(cfg,user->number,U_DLB,10,ultoa(user->dlb,str,10)); + user->dlb=strtoull(str,NULL,10); + putuserrec(cfg,user->number,U_DLB,10,userbytestr(user->dlb,str)); } break; case 16: @@ -1203,11 +1203,11 @@ int edit_stats(scfg_t *cfg, user_t *user) case 17: /* Uploaded Bytes */ GETUSERDAT(cfg,user); - sprintf(str,"%lu",user->ulb); - uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Uploaded Bytes",str,10,K_EDIT|K_NUMBER); + sprintf(str,"%" PRIu64,user->ulb); + uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Uploaded Bytes",str,20,K_EDIT|K_NUMBER); if(uifc.changes) { user->ulb=strtoul(str,NULL,10); - putuserrec(cfg,user->number,U_ULB,10,ultoa(user->ulb,str,10)); + putuserrec(cfg,user->number,U_ULB,10,userbytestr(user->ulb,str)); } break; case 18: @@ -1278,8 +1278,8 @@ int edit_security(scfg_t *cfg, user_t *user) sprintf(opt[i++],"Flag Set 4 %s",ltoaf(user->flags4,str)); sprintf(opt[i++],"Exemptions %s",ltoaf(user->exempt,str)); sprintf(opt[i++],"Restrictions %s",ltoaf(user->rest,str)); - sprintf(opt[i++],"Credits %lu",user->cdt); - sprintf(opt[i++],"Free Credits %lu",user->freecdt); + sprintf(opt[i++],"Credits %" PRIu64,user->cdt); + sprintf(opt[i++],"Free Credits %" PRIu64,user->freecdt); sprintf(opt[i++],"Minutes %lu",user->min); opt[i][0]=0; switch(uifc.list(WIN_MID|WIN_ACT,0,0,0,&j,0,"Security Settings",opt)) { @@ -1369,21 +1369,21 @@ int edit_security(scfg_t *cfg, user_t *user) case 8: /* Credits */ GETUSERDAT(cfg,user); - sprintf(str,"%lu",user->cdt); - uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Credits",str,10,K_EDIT|K_NUMBER); + sprintf(str,"%" PRIu64,user->cdt); + uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Credits",str,LEN_CDT,K_EDIT|K_NUMBER); if(uifc.changes) { - user->cdt=strtoul(str,NULL,10); - putuserrec(cfg,user->number,U_CDT,10,ultoa(user->cdt,str,10)); + user->cdt=strtoull(str,NULL,10); + putuserrec(cfg,user->number,U_CDT,0,_ui64toa(user->cdt,str,10)); } break; case 9: /* Free Credits */ GETUSERDAT(cfg,user); - sprintf(str,"%lu",user->freecdt); - uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Free Credits",str,10,K_EDIT|K_NUMBER); + sprintf(str,"%" PRIu64,user->freecdt); + uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Free Credits",str,LEN_CDT,K_EDIT|K_NUMBER); if(uifc.changes) { - user->freecdt=strtoul(str,NULL,10); - putuserrec(cfg,user->number,U_FREECDT,10,ultoa(user->freecdt,str,10)); + user->freecdt=strtoull(str,NULL,10); + putuserrec(cfg,user->number,U_FREECDT,0,_ui64toa(user->freecdt,str,10)); } break; case 10: diff --git a/src/sbbs3/upload.cpp b/src/sbbs3/upload.cpp index 92217d759deb28a9c7ddd88a3b83564531fe24a3..f55d00ba363342356a319bfb5805d059526da9ae 100644 --- a/src/sbbs3/upload.cpp +++ b/src/sbbs3/upload.cpp @@ -172,7 +172,7 @@ bool sbbs_t::uploadfile(file_t* f) f->hdr.attr |= MSG_ANONYMOUS; smb_hfield_bin(f, SMB_COST, length); smb_hfield_str(f, SENDER, useron.alias); - bprintf(text[FileNBytesReceived],f->name, i64toac(length,tmp)); + bprintf(text[FileNBytesReceived],f->name, u64toac(length,tmp)); if(!addfile(&cfg, f->dir, f, ext, /* metadata: */NULL, &client)) return false; @@ -188,11 +188,11 @@ bool sbbs_t::uploadfile(file_t* f) user_uploaded(&cfg, &useron, 1, length); if(cfg.dir[f->dir]->up_pct && cfg.dir[f->dir]->misc&DIR_CDTUL) { /* credit for upload */ if(cfg.dir[f->dir]->misc&DIR_CDTMIN && cur_cps) /* Give min instead of cdt */ - useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10 + useron.min=(uint32_t)adjustuserrec(&cfg,useron.number,U_MIN ,((ulong)(length*(cfg.dir[f->dir]->up_pct/100.0))/cur_cps)/60); else - useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10 - ,(ulong)(f->cost * (cfg.dir[f->dir]->up_pct/100.0))); + useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT + ,(int64_t)(f->cost * (cfg.dir[f->dir]->up_pct/100.0))); } user_event(EVENT_UPLOAD); diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index 12110077c0a0dbacc61f4ebb3aff37d9f25c86e3..0cf64c521d623c5c1731ac7fe3a798a9ac506b91 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -321,11 +321,14 @@ int parseuserdat(scfg_t* cfg, char *userdat, user_t *user) getrec(userdat,U_FBACKS,5,str); user->fbacks=atoi(str); getrec(userdat,U_ETODAY,5,str); user->etoday=atoi(str); getrec(userdat,U_PTODAY,5,str); user->ptoday=atoi(str); - getrec(userdat,U_ULB,10,str); user->ulb=strtoul(str, NULL, 10); + getrec(userdat,U_ULB,10,str); user->ulb=parse_byte_count(str, 1); getrec(userdat,U_ULS,5,str); user->uls=atoi(str); - getrec(userdat,U_DLB,10,str); user->dlb=strtoul(str, NULL, 10); + getrec(userdat,U_DLB,10,str); user->dlb=parse_byte_count(str, 1); getrec(userdat,U_DLS,5,str); user->dls=atoi(str); - getrec(userdat,U_CDT,10,str); user->cdt=strtoul(str, NULL, 10); + getrec(userdat,U_CDT,LEN_CDT,str); + if(str[0] < '0' || str[0] > '9') + getrec(userdat,U_OLDCDT,10,str); + user->cdt=strtoull(str, NULL, 10); getrec(userdat,U_MIN,10,str); user->min=strtoul(str, NULL, 10); getrec(userdat,U_LEVEL,2,str); user->level=atoi(str); getrec(userdat,U_FLAGS1,8,str); user->flags1=ahtoul(str); @@ -359,8 +362,10 @@ int parseuserdat(scfg_t* cfg, char *userdat, user_t *user) getrec(userdat,U_CURDIR,sizeof(user->curdir)-1,user->curdir); getrec(userdat,U_CURXTRN,8,user->curxtrn); - getrec(userdat,U_FREECDT,10,str); - user->freecdt=strtoul(str, NULL, 10); + getrec(userdat,U_FREECDT,LEN_CDT,str); + if(str[0] < '0' || str[0] > '9') + getrec(userdat,U_OLDFREECDT,10,str); + user->freecdt=strtoull(str, NULL, 10); getrec(userdat,U_XEDIT,8,str); for(i=0;i<cfg->total_xedits;i++) @@ -499,6 +504,14 @@ int is_user_online(scfg_t* cfg, uint usernumber) return 0; } +char* userbytestr(uint64_t bytes, char* str) +{ + _ui64toa(bytes, str, 10); + if(strlen(str) > 10) + byte_estimate_to_str(bytes, str, 10 + 1, 1, 4); // +1 for NUL terminator + return str; +} + /****************************************************************************/ /* Writes into user.number's slot in user.dat data in structure 'user' */ /* Called from functions newuser, useredit and main */ @@ -560,11 +573,11 @@ int putuserdat(scfg_t* cfg, user_t* user) putrec(userdat,U_PTODAY,5,ultoa(user->ptoday,str,10)); putrec(userdat,U_PTODAY+5,2,crlf); - putrec(userdat,U_ULB,10,ultoa(user->ulb,str,10)); + putrec(userdat,U_ULB,10,userbytestr(user->ulb, str)); putrec(userdat,U_ULS,5,ultoa(user->uls,str,10)); - putrec(userdat,U_DLB,10,ultoa(user->dlb,str,10)); + putrec(userdat,U_DLB,10,userbytestr(user->dlb, str)); putrec(userdat,U_DLS,5,ultoa(user->dls,str,10)); - putrec(userdat,U_CDT,10,ultoa(user->cdt,str,10)); + putrec(userdat,U_CDT,LEN_CDT,_ui64toa(user->cdt,str,10)); putrec(userdat,U_MIN,10,ultoa(user->min,str,10)); putrec(userdat,U_MIN+10,2,crlf); @@ -592,7 +605,7 @@ int putuserdat(scfg_t* cfg, user_t* user) putrec(userdat,U_IPADDR+LEN_IPADDR,2,crlf); - putrec(userdat,U_FREECDT,10,ultoa(user->freecdt,str,10)); + putrec(userdat,U_FREECDT,LEN_CDT,_ui64toa(user->freecdt,str,10)); putrec(userdat,U_FLAGS3,8,ultoa(user->flags3,str,16)); putrec(userdat,U_FLAGS4,8,ultoa(user->flags4,str,16)); @@ -1609,7 +1622,7 @@ static BOOL ar_exp(scfg_t* cfg, uchar **ptrptr, user_t* user, client_t* client) { BOOL result,not,or,equal; uint i,n,artype=AR_LEVEL,age; - ulong l; + uint64_t l; time_t now; struct tm tm; const char* p; @@ -1830,7 +1843,7 @@ static BOOL ar_exp(scfg_t* cfg, uchar **ptrptr, user_t* user, client_t* client) result=!not; break; case AR_CREDIT: - l=(ulong)i*1024UL; + l = i * 1024UL; if(user==NULL || (equal && user->cdt+user->freecdt!=l) || (!equal && user->cdt+user->freecdt<l)) @@ -2319,12 +2332,12 @@ int putuserrec(scfg_t* cfg, int usernumber, int start, int length, const char *s /* Updates user 'usernumber's record (numeric string) by adding 'adj' to it */ /* returns the new value. */ /****************************************************************************/ -ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj) +uint64_t adjustuserrec(scfg_t* cfg, int usernumber, int start, int64_t adj) { char str[256],path[256]; char tmp[32]; int i,c,file; - ulong val; + uint64_t val; if(!VALID_CFG(cfg) || usernumber<1) return(0); @@ -2340,12 +2353,10 @@ ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj (void)lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); - if(length < 1) { /* auto-length */ - length=user_rec_len(start); - if(length < 1) { - close(file); - return 0; - } + int length=user_rec_len(start); + if(length < 1) { + close(file); + return 0; } i=0; @@ -2369,14 +2380,26 @@ ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj for(c=0;c<length;c++) if(str[c]==ETX || str[c]==CR) break; str[c]=0; - if(length > 5) { + if(start == U_ULB || start == U_DLB || length > 10) { + if(start == U_ULB || start == U_DLB) + val = parse_byte_count(str, 1); + else + val = strtoull(str, NULL, 10); + if(adj<0L && val<(uint64_t)-adj) /* don't go negative */ + val=0; + else if(adj > 0 && val + adj < val) + val = UINT64_MAX; + else + val += (uint64_t)adj; + } + else if(length > 5) { val = strtoul(str, NULL, 10); - if(adj<0L && val<(ulong)-adj) /* don't go negative */ + if(adj<0L && val<(uint32_t)-adj) /* don't go negative */ val=0; else if(adj > 0 && val + adj < val) - val = ULONG_MAX; + val = UINT32_MAX; else - val += (ulong)adj; + val += (uint32_t)adj; } else { ushort sval = (ushort)strtoul(str, NULL, 10); if(adj < 0L && sval < (ushort)-adj) /* don't go negative */ @@ -2388,7 +2411,11 @@ ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj val = sval; } (void)lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); - putrec(str,0,length,ultoa(val,tmp,10)); + if(start == U_ULB || start == U_DLB) + userbytestr(val, tmp); + else + _ui64toa(val,tmp,10); + putrec(str,0,length,tmp); if(write(file,str,length)!=length) { unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length); close(file); @@ -2404,27 +2431,30 @@ ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj /* Subtract credits from the current user online, accounting for the new */ /* "free credits" field. */ /****************************************************************************/ -void subtract_cdt(scfg_t* cfg, user_t* user, long amt) +void subtract_cdt(scfg_t* cfg, user_t* user, uint64_t amt) { char tmp[64]; - long mod; + int64_t mod; if(!amt || user==NULL) return; if(user->freecdt) { - if((ulong)amt>user->freecdt) { /* subtract both credits and */ + if(amt > user->freecdt) { /* subtract both credits and */ mod=amt-user->freecdt; /* free credits */ - putuserrec(cfg, user->number,U_FREECDT,10,"0"); + putuserrec(cfg, user->number,U_FREECDT,0,"0"); user->freecdt=0; - user->cdt=adjustuserrec(cfg, user->number,U_CDT,10,-mod); + user->cdt=adjustuserrec(cfg, user->number,U_CDT,-mod); } else { /* subtract just free credits */ user->freecdt-=amt; - putuserrec(cfg, user->number,U_FREECDT,10 - ,ultoa(user->freecdt,tmp,10)); + putuserrec(cfg, user->number,U_FREECDT,0 + ,_ui64toa(user->freecdt,tmp,10)); } } - else /* no free credits */ - user->cdt=adjustuserrec(cfg, user->number,U_CDT,10,-amt); + else { /* no free credits */ + if(amt > INT64_MAX) + amt = INT64_MAX; + user->cdt=adjustuserrec(cfg, user->number,U_CDT,-(int64_t)amt); + } } BOOL user_posted_msg(scfg_t* cfg, user_t* user, int count) @@ -2432,8 +2462,8 @@ BOOL user_posted_msg(scfg_t* cfg, user_t* user, int count) if(user==NULL) return(FALSE); - user->posts =(ushort)adjustuserrec(cfg, user->number, U_POSTS, 5, count); - user->ptoday=(ushort)adjustuserrec(cfg, user->number, U_PTODAY, 5, count); + user->posts =(ushort)adjustuserrec(cfg, user->number, U_POSTS, count); + user->ptoday=(ushort)adjustuserrec(cfg, user->number, U_PTODAY, count); return(TRUE); } @@ -2444,10 +2474,10 @@ BOOL user_sent_email(scfg_t* cfg, user_t* user, int count, BOOL feedback) return(FALSE); if(feedback) - user->fbacks=(ushort)adjustuserrec(cfg, user->number, U_FBACKS, 5, count); + user->fbacks=(ushort)adjustuserrec(cfg, user->number, U_FBACKS, count); else - user->emails=(ushort)adjustuserrec(cfg, user->number, U_EMAILS, 5, count); - user->etoday=(ushort)adjustuserrec(cfg, user->number, U_ETODAY, 5, count); + user->emails=(ushort)adjustuserrec(cfg, user->number, U_EMAILS, count); + user->etoday=(ushort)adjustuserrec(cfg, user->number, U_ETODAY, count); return(TRUE); } @@ -2457,8 +2487,8 @@ BOOL user_downloaded(scfg_t* cfg, user_t* user, int files, off_t bytes) if(user==NULL) return(FALSE); - user->dls=(ushort)adjustuserrec(cfg, user->number, U_DLS, 5, files); - user->dlb=adjustuserrec(cfg, user->number, U_DLB, 10, (long)bytes); + user->dls=(ushort)adjustuserrec(cfg, user->number, U_DLS, files); + user->dlb=adjustuserrec(cfg, user->number, U_DLB, bytes); return(TRUE); } @@ -2511,16 +2541,16 @@ BOOL user_downloaded_file(scfg_t* cfg, user_t* user, client_t* client, && uploader.number != user->number && getuserdat(cfg, &uploader) == 0 && (uint32_t)uploader.firston < f.hdr.when_imported.time) { - ulong l = (ulong)f.cost; + uint64_t l = f.cost; if(!(cfg->dir[dirnum]->misc&DIR_CDTDL)) /* Don't give credits on d/l */ l=0; - ulong mod=(ulong)(l*(cfg->dir[dirnum]->dn_pct/100.0)); - adjustuserrec(cfg, uploader.number, U_CDT, 10, mod); + uint64_t mod=(uint64_t)(l*(cfg->dir[dirnum]->dn_pct/100.0)); + adjustuserrec(cfg, uploader.number, U_CDT, mod); if(cfg->text != NULL && !(cfg->dir[dirnum]->misc&DIR_QUIET)) { char str[256]; char tmp[128]; char prefix[128]=""; - ultoac(mod,tmp); + u64toac(mod,tmp,','); const char* alias = user->alias[0] ? user->alias : cfg->text[UNKNOWN_USER]; char username[64]; if(client != NULL && uploader.level >= SYSOP_LEVEL) { @@ -2530,7 +2560,7 @@ BOOL user_downloaded_file(scfg_t* cfg, user_t* user, client_t* client, SAFEPRINTF2(username,"%s [%s]", alias, client->addr); } else SAFECOPY(username, alias); - if(strcmp(cfg->dir[dirnum]->code, "TEMP") == 0 || bytes < (ulong)f.size) + if(strcmp(cfg->dir[dirnum]->code, "TEMP") == 0 || bytes < f.size) SAFECOPY(prefix, cfg->text[Partially]); if(client != NULL) { SAFECAT(prefix, client->protocol); @@ -2555,10 +2585,10 @@ BOOL user_downloaded_file(scfg_t* cfg, user_t* user, client_t* client, /****************************/ user_downloaded(cfg, user, /* files: */1, bytes); if(!is_download_free(cfg, dirnum, user, client)) - subtract_cdt(cfg, user, (long)f.cost); + subtract_cdt(cfg, user, f.cost); if(!(cfg->dir[dirnum]->misc&DIR_NOSTAT)) - inc_sys_download_stats(cfg, /* files: */1, (ulong)bytes); + inc_sys_download_stats(cfg, /* files: */1, (ulong)bytes); // TODO: remove ulong typecast smb_freefilemem(&f); return TRUE; @@ -2570,13 +2600,13 @@ BOOL user_uploaded(scfg_t* cfg, user_t* user, int files, off_t bytes) if(user==NULL) return(FALSE); - user->uls=(ushort)adjustuserrec(cfg, user->number, U_ULS, 5, files); - user->ulb=adjustuserrec(cfg, user->number, U_ULB, 10, (long)bytes); + user->uls=(ushort)adjustuserrec(cfg, user->number, U_ULS, files); + user->ulb=adjustuserrec(cfg, user->number, U_ULB, bytes); return(TRUE); } -BOOL user_adjust_credits(scfg_t* cfg, user_t* user, long amount) +BOOL user_adjust_credits(scfg_t* cfg, user_t* user, int64_t amount) { if(user==NULL) return(FALSE); @@ -2584,7 +2614,7 @@ BOOL user_adjust_credits(scfg_t* cfg, user_t* user, long amount) if(amount<0) /* subtract */ subtract_cdt(cfg, user, -amount); else /* add */ - user->cdt=adjustuserrec(cfg, user->number, U_CDT, 10, amount); + user->cdt=adjustuserrec(cfg, user->number, U_CDT, amount); return(TRUE); } @@ -2594,7 +2624,7 @@ BOOL user_adjust_minutes(scfg_t* cfg, user_t* user, long amount) if(user==NULL) return(FALSE); - user->min=adjustuserrec(cfg, user->number, U_MIN, 10, amount); + user->min=(uint32_t)adjustuserrec(cfg, user->number, U_MIN, amount); return(TRUE); } @@ -2618,8 +2648,8 @@ BOOL logoutuserdat(scfg_t* cfg, user_t* user, time_t now, time_t logontime) putuserrec(cfg,user->number,U_LASTON,8,ultoa((ulong)now,str,16)); putuserrec(cfg,user->number,U_TLAST,5,ultoa(user->tlast,str,10)); - adjustuserrec(cfg,user->number,U_TIMEON,5,user->tlast); - adjustuserrec(cfg,user->number,U_TTODAY,5,user->tlast); + adjustuserrec(cfg,user->number,U_TIMEON,user->tlast); + adjustuserrec(cfg,user->number,U_TTODAY,user->tlast); /* Convert time_t to struct tm */ if(localtime_r(&now,&tm_now)==NULL) @@ -2655,8 +2685,8 @@ void resetdailyuserdat(scfg_t* cfg, user_t* user, BOOL write) if(write) putuserrec(cfg,user->number,U_PTODAY,5,"0"); /* free credits per day */ user->freecdt=cfg->level_freecdtperday[user->level]; - if(write) putuserrec(cfg,user->number,U_FREECDT,10 - ,ultoa(user->freecdt,str,10)); + if(write) putuserrec(cfg,user->number,U_FREECDT,0 + ,_ui64toa(user->freecdt,str,10)); /* time used today */ user->ttoday=0; if(write) putuserrec(cfg,user->number,U_TTODAY,5,"0"); @@ -2933,11 +2963,14 @@ int user_rec_len(int offset) /* 32-bit integers (10 decimal digits) */ case U_ULB: case U_DLB: - case U_CDT: case U_MIN: - case U_FREECDT: return(10); + /* 64-bit integers (20 decimal digits) */ + case U_CDT: + case U_FREECDT: + return 20; + /* 3 char strings */ case U_TMPEXT: return(3); diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h index b8e4509e817251cd2f3dffd86b45773739fc8a63..0ca7ac0239a3ca01894072218d54253ee1566c1d 100644 --- a/src/sbbs3/userdat.h +++ b/src/sbbs3/userdat.h @@ -81,12 +81,13 @@ DLLEXPORT uint userdatdupe(scfg_t*, uint usernumber, uint offset, uint datlen, c DLLEXPORT BOOL chk_ar(scfg_t*, uchar* str, user_t*, client_t*); /* checks access requirements */ +DLLEXPORT char* userbytestr(uint64_t bytes, char* str); DLLEXPORT int getuserrec(scfg_t*, int usernumber, int start, int length, char *str); DLLEXPORT int putuserrec(scfg_t*, int usernumber, int start, int length, const char *str); -DLLEXPORT ulong adjustuserrec(scfg_t*, int usernumber, int start, int length, long adj); +DLLEXPORT uint64_t adjustuserrec(scfg_t*, int usernumber, int start, int64_t adj); DLLEXPORT BOOL logoutuserdat(scfg_t*, user_t*, time_t now, time_t logontime); DLLEXPORT void resetdailyuserdat(scfg_t*, user_t*, BOOL write); -DLLEXPORT void subtract_cdt(scfg_t*, user_t*, long amt); +DLLEXPORT void subtract_cdt(scfg_t*, user_t*, uint64_t amt); DLLEXPORT int user_rec_len(int offset); DLLEXPORT BOOL can_user_access_all_libs(scfg_t*, user_t*, client_t*); DLLEXPORT BOOL can_user_access_all_dirs(scfg_t*, uint libnum, user_t*, client_t*); @@ -133,7 +134,7 @@ DLLEXPORT BOOL user_downloaded(scfg_t*, user_t*, int files, off_t bytes); DLLEXPORT BOOL user_downloaded_file(scfg_t*, user_t*, client_t*, uint dirnum, const char* filename, off_t bytes); DLLEXPORT BOOL user_uploaded(scfg_t*, user_t*, int files, off_t bytes); -DLLEXPORT BOOL user_adjust_credits(scfg_t*, user_t*, long amount); +DLLEXPORT BOOL user_adjust_credits(scfg_t*, user_t*, int64_t amount); DLLEXPORT BOOL user_adjust_minutes(scfg_t*, user_t*, long amount); DLLEXPORT time_t gettimeleft(scfg_t*, user_t*, time_t starttime); diff --git a/src/sbbs3/useredit.cpp b/src/sbbs3/useredit.cpp index c3521a081a5f38a417b9950568dfa38572924b32..e83c649181fad6b01a280b18b70b7f10a69cd0b9 100644 --- a/src/sbbs3/useredit.cpp +++ b/src/sbbs3/useredit.cpp @@ -45,6 +45,7 @@ void sbbs_t::useredit(int usernumber) float f; long l; long kmode = K_LINE|K_EDIT|K_AUTODEL|K_TRIM; + int64_t adj; user_t user; struct tm tm; @@ -125,14 +126,15 @@ void sbbs_t::useredit(int usernumber) bprintf(text[UserEmails] ,user.emails,user.fbacks,getmail(&cfg,user.number,/* Sent: */FALSE, /* SPAM: */FALSE),user.etoday); - bprintf(text[UserUploads],ultoac(user.ulb,tmp),user.uls); + bprintf(text[UserUploads], byte_estimate_to_str(user.ulb, tmp, sizeof(tmp), 1, 1), user.uls); if(user.leech) SAFEPRINTF(str,text[UserLeech],user.leech); else str[0]=0; - bprintf(text[UserDownloads],ultoac(user.dlb,tmp),user.dls,str); - bprintf(text[UserCredits],ultoac(user.cdt,tmp) - ,ultoac(user.freecdt,tmp2),ultoac(cfg.level_freecdtperday[user.level],str)); + bprintf(text[UserDownloads],byte_estimate_to_str(user.dlb, tmp, sizeof(tmp), 1, 1) ,user.dls,str); + bprintf(text[UserCredits],byte_estimate_to_str(user.cdt, tmp, sizeof(tmp), 1, 1) + ,byte_estimate_to_str(user.freecdt, tmp2, sizeof(tmp2), 1, 1) + ,byte_estimate_to_str(cfg.level_freecdtperday[user.level], str, sizeof(str), 1, 1)); bprintf(text[UserMinutes],ultoac(user.min,tmp)); bprintf(text[UeditSecLevel],user.level); bprintf(text[UeditFlags],ltoaf(user.flags1,tmp),ltoaf(user.flags3,tmp2) @@ -433,9 +435,11 @@ void sbbs_t::useredit(int usernumber) break; case 'U': bputs(text[UeditUlBytes]); - ultoa(user.ulb,str,10); - if(getstr(str,10,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) - putuserrec(&cfg,user.number,U_ULB,10,str); + _ui64toa(user.ulb,str,10); + if(getstr(str,19,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) { + user.ulb = parse_byte_count(str, 1); + putuserrec(&cfg,user.number,U_ULB,10,userbytestr(user.ulb, str)); + } if(sys_status&SS_ABORT) break; bputs(text[UeditUploads]); @@ -445,9 +449,11 @@ void sbbs_t::useredit(int usernumber) if(sys_status&SS_ABORT) break; bputs(text[UeditDlBytes]); - ultoa(user.dlb,str,10); - if(getstr(str,10,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) - putuserrec(&cfg,user.number,U_DLB,10,str); + _ui64toa(user.dlb,str,10); + if(getstr(str,19,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) { + user.dlb = parse_byte_count(str, 1); + putuserrec(&cfg,user.number,U_DLB,10,userbytestr(user.dlb, str)); + } if(sys_status&SS_ABORT) break; bputs(text[UeditDownloads]); @@ -540,15 +546,13 @@ void sbbs_t::useredit(int usernumber) break; case '+': bputs(text[ModifyCredits]); - getstr(str,10,K_UPPER|K_LINE); - l=atol(str); - if(strstr(str,"M")) - l*=0x100000L; - else if(strstr(str,"K")) - l*=1024; - else if(strstr(str,"$")) - l*=cfg.cdt_per_dollar; - adjustuserrec(&cfg, user.number, U_CDT, 10, l); + if(getstr(str,10,K_UPPER|K_LINE)) { + if(strstr(str,"$")) + adj = strtoll(str, NULL, 10) * cfg.cdt_per_dollar; + else + adj = parse_byte_count(str, 1); + adjustuserrec(&cfg, user.number, U_CDT, adj); + } break; case '*': bputs(text[ModifyMinutes]); @@ -572,9 +576,11 @@ void sbbs_t::useredit(int usernumber) break; case '$': bputs(text[UeditCredits]); - ultoa(user.cdt,str,10); - if(getstr(str,10,K_NUMBER|K_LINE)) - putuserrec(&cfg,user.number,U_CDT,10,str); + _ui64toa(user.cdt,str,10); + if(getstr(str,19,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) { + user.cdt = parse_byte_count(str, 1); + putuserrec(&cfg,user.number,U_CDT,0,userbytestr(user.cdt, str)); + } break; case '/': bputs(text[SearchStringPrompt]); diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp index 2dcca277da480d27c3a5d55a44b984979b32fd35..3e457ee53b8229dc4123e6a00b6969158fe72792 100644 --- a/src/sbbs3/xtrn.cpp +++ b/src/sbbs3/xtrn.cpp @@ -2082,7 +2082,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch strncat(cmd,str, avail); break; case '$': /* Credits */ - strncat(cmd,ultoa(useron.cdt+useron.freecdt,str,10), avail); + strncat(cmd,_ui64toa(useron.cdt+useron.freecdt,str,10), avail); break; case '%': /* %% for percent sign */ strncat(cmd,"%", avail); diff --git a/src/sbbs3/xtrn_sec.cpp b/src/sbbs3/xtrn_sec.cpp index 518ccc8ab0de43dfe8cf1d5a8be195d822a3b655..7f1313ec9f00e07d0a9373d1e116de867e443ebe 100644 --- a/src/sbbs3/xtrn_sec.cpp +++ b/src/sbbs3/xtrn_sec.cpp @@ -567,7 +567,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl unixtodstr(&cfg,(time32_t)logontime,tmp); exitinfo.LoginDate = tmp; exitinfo.TimeLimit = cfg.level_timepercall[useron.level]; - exitinfo.Credit = useron.cdt; + exitinfo.Credit = (uint32_t)MIN(useron.cdt, UINT32_MAX); exitinfo.UserRecNum = useron.number; exitinfo.WantChat = (sys_status & SS_SYSPAGE); exitinfo.ScreenClear = (useron.misc & CLRSCRN); @@ -771,8 +771,8 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl user.fixed.RegExpDate = unixtojulian(useron.expire); user.fixed.ExpSecurityLevel = cfg.expired_level; user.fixed.LastConference = cursubnum; - user.fixed.ulTotDnldBytes = useron.dlb; - user.fixed.ulTotUpldBytes = useron.ulb; + user.fixed.ulTotDnldBytes = (uint32_t)MIN(useron.dlb, UINT32_MAX); + user.fixed.ulTotUpldBytes = (uint32_t)MIN(useron.ulb, UINT32_MAX); user.fixed.DeleteFlag = INT_TO_BOOL(useron.misc & DELETED); user.fixed.RecNum = useron.number; user.fixed.MsgsLeft = useron.posts + useron.emails + useron.fbacks; @@ -1066,7 +1066,7 @@ void sbbs_t::moduserdat(uint xtrnnum) truncsp(str); mod=atol(str)*1024L; if(mod) { - useron.dlb=adjustuserrec(&cfg,useron.number,U_DLB,10,mod); + useron.dlb=adjustuserrec(&cfg,useron.number,U_DLB,mod); subtract_cdt(&cfg,&useron,mod); } } @@ -1125,7 +1125,7 @@ void sbbs_t::moduserdat(uint xtrnnum) } logline(tmp,str); if(mod>0L) /* always add to real cdt */ - useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,mod); + useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,mod); else subtract_cdt(&cfg,&useron,-mod); /* subtract from free cdt first */ } @@ -1176,7 +1176,7 @@ void sbbs_t::moduserdat(uint xtrnnum) if(mod) { SAFEPRINTF(str,"Minute Adjustment: %s",ultoac(mod,tmp)); logline("*+",str); - useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,mod); + useron.min=(uint32_t)adjustuserrec(&cfg,useron.number,U_MIN,mod); } } if(fgets(str,81,stream)) { /* flags #3 */