ulong sbbs_t::gettimeleft(bool handle_out_of_time) { char str[128]; char tmp[512]; event_t nextevent; now=time(NULL); timeleft = (ulong)::gettimeleft(&cfg, &useron, starttime); /* Timed event time reduction handler */ event_time=getnextevent(&cfg, &nextevent); if(event_time) event_code=nextevent.code; if(event_time && now+(time_t)timeleft>event_time) { /* less time, set flag */ if(event_time<now) timeleft=0; else timeleft=(ulong)(event_time-now); if(!(sys_status&SS_EVENT)) { lprintf(LOG_NOTICE,"Node %d Time reduced (to %s) due to upcoming event (%s) on %s" ,cfg.node_num,sectostr(timeleft,tmp),event_code,timestr(event_time)); sys_status|=SS_EVENT; } } if((long)timeleft<0) /* timeleft can't go negative */ timeleft=0; if(thisnode.status==NODE_NEWUSER) { timeleft=cfg.level_timepercall[cfg.new_level]; if(timeleft<10*60L) timeleft=10*60L; } if(handle_out_of_time && !gettimeleft_inside) /* The following code is not recursive */ { gettimeleft_inside=1; if(!timeleft && !SYSOP && !(sys_status&SS_LCHAT)) { logline(LOG_NOTICE,nulstr,"Ran out of time"); SAVELINE; if(sys_status&SS_EVENT) bprintf(text[ReducedTime],timestr(event_time)); bputs(text[TimesUp]); if(!(sys_status&(SS_EVENT|SS_USERON)) && useron.cdt>=100L*1024L && !(cfg.sys_misc&SM_NOCDTCVT)) { 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)); SAFEPRINTF(str,"Credit Adjustment: %ld",-(102400L)); logline("$-",str); SAFEPRINTF(str,"Minute Adjustment: %u",cfg.cdt_min_value); logline("*+",str); RESTORELINE; gettimeleft(); gettimeleft_inside=0; return timeleft; } } if(cfg.sys_misc&SM_TIME_EXP && !(sys_status&SS_EVENT) && !(useron.exempt&FLAG('E'))) { /* set to expired values */ bputs(text[AccountHasExpired]); SAFEPRINTF(str,"%s Expired",useron.alias); logentry("!%",str); if(cfg.level_misc[useron.level]&LEVEL_EXPTOVAL && cfg.level_expireto[useron.level]<10) { useron.flags1=cfg.val_flags1[cfg.level_expireto[useron.level]]; useron.flags2=cfg.val_flags2[cfg.level_expireto[useron.level]]; useron.flags3=cfg.val_flags3[cfg.level_expireto[useron.level]]; useron.flags4=cfg.val_flags4[cfg.level_expireto[useron.level]]; useron.exempt=cfg.val_exempt[cfg.level_expireto[useron.level]]; useron.rest=cfg.val_rest[cfg.level_expireto[useron.level]]; if(cfg.val_expire[cfg.level_expireto[useron.level]]) useron.expire=(time32_t)now +(cfg.val_expire[cfg.level_expireto[useron.level]]*24*60*60); else useron.expire=0; useron.level=cfg.val_level[cfg.level_expireto[useron.level]]; } else { if(cfg.level_misc[useron.level]&LEVEL_EXPTOLVL) useron.level=cfg.level_expireto[useron.level]; else useron.level=cfg.expired_level; useron.flags1&=~cfg.expired_flags1; /* expired status */ useron.flags2&=~cfg.expired_flags2; /* expired status */ useron.flags3&=~cfg.expired_flags3; /* expired status */ useron.flags4&=~cfg.expired_flags4; /* expired status */ useron.exempt&=~cfg.expired_exempt; useron.rest|=cfg.expired_rest; useron.expire=0; } putuserrec(&cfg,useron.number,U_LEVEL,2,ultoa(useron.level,str,10)); putuserrec(&cfg,useron.number,U_FLAGS1,8,ultoa(useron.flags1,str,16)); putuserrec(&cfg,useron.number,U_FLAGS2,8,ultoa(useron.flags2,str,16)); putuserrec(&cfg,useron.number,U_FLAGS3,8,ultoa(useron.flags3,str,16)); putuserrec(&cfg,useron.number,U_FLAGS4,8,ultoa(useron.flags4,str,16)); putuserrec(&cfg,useron.number,U_EXPIRE,8,ultoa((ulong)useron.expire,str,16)); putuserrec(&cfg,useron.number,U_EXEMPT,8,ultoa(useron.exempt,str,16)); putuserrec(&cfg,useron.number,U_REST,8,ultoa(useron.rest,str,16)); if(cfg.expire_mod[0]) exec_bin(cfg.expire_mod,&main_csi); RESTORELINE; gettimeleft(); gettimeleft_inside=0; return timeleft; } SYNC; hangup(); } gettimeleft_inside=0; } return timeleft; }
int dd_gfx_loadbitmap2D(unsigned short handle, void *buf, int rleflag) { HRESULT ddresult; DDSURFACEDESC ddsd; char *ptr; int pitch, i; grs_bitmap tbmp; Assert(handle != 0); if (!dd_gfx_initialized) return 0; handle--; // Convert to valid handle RedoLock: memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddresult = IDirectDrawSurface_Lock(gfxBitmap[handle].lpdds, NULL, &ddsd, DDLOCK_WAIT, NULL); if (ddresult != DD_OK) { if (ddresult == DDERR_SURFACELOST) { ddresult = IDirectDrawSurface_Restore(gfxBitmap[handle].lpdds); if (ddresult != DD_OK) { if (ddresult != DDERR_WRONGMODE) { logentry("DDGFX::Restore::Surface err: %x\n", ddresult); return 1; } else { LPDIRECTDRAWSURFACE lpdds; DDCOLORKEY ddck; IDirectDrawSurface_Release(lpdds); gfxBitmap[handle].lpdds = NULL; memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; ddsd.dwWidth = gfxBitmap[handle].w; ddsd.dwHeight = gfxBitmap[handle].h; ddresult = IDirectDraw_CreateSurface(_lpDD, &ddsd, &lpdds, NULL); if (ddresult != DD_OK) { mprintf((0, "DDGFX: Failed to restore vidmem 2d bitmap.\n")); return 1; } ddck.dwColorSpaceLowValue = TRANSPARENCY_COLOR; ddck.dwColorSpaceHighValue = TRANSPARENCY_COLOR; IDirectDrawSurface_SetColorKey(lpdds, DDCKEY_SRCBLT, &ddck); gfxBitmap[handle].lpdds = lpdds; } } goto RedoLock; } else { mprintf((0, "DDGFX:Unable to lock surface!!\n")); return 1; } } // Locked! ptr = ddsd.lpSurface; pitch = ddsd.lPitch; gr_init_bitmap(&tbmp, BM_LINEAR, 0,0,gfxBitmap[handle].w, gfxBitmap[handle].h, gfxBitmap[handle].w, buf); if (rleflag) tbmp.bm_flags = BM_FLAG_RLE; for(i = 0; i < gfxBitmap[handle].h; i++) { extern ubyte scale_rle_data[]; if (rleflag) { decode_row(&tbmp,i); memcpy(ptr+(i*pitch), scale_rle_data, gfxBitmap[handle].w); } else memcpy(ptr+(i*pitch), (ubyte*)(buf)+(i*gfxBitmap[handle].w), gfxBitmap[handle].w); } IDirectDrawSurface_Unlock(gfxBitmap[handle].lpdds, ptr); // Unlocked... return 0; }
ulong sbbs_t::logonstats() { char str[MAX_PATH+1]; int dsts,csts; uint i; time32_t update32_t=0; time_t update_t=0; time32_t now32; stats_t stats; node_t node; struct tm tm, update_tm; sys_status&=~SS_DAILY; memset(&stats,0,sizeof(stats)); sprintf(str,"%sdsts.dab",cfg.ctrl_dir); if((dsts=nopen(str,O_RDWR))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDWR); return(0L); } read(dsts,&update32_t,4); /* Last updated */ update_t=update32_t; read(dsts,&stats.logons,4); /* Total number of logons on system */ close(dsts); now=time(NULL); now32=(time32_t)now; if(update_t>now+(24L*60L*60L)) /* More than a day in the future? */ errormsg(WHERE,ERR_CHK,"Daily stats time stamp",(ulong)update_t); if(localtime_r(&update_t,&update_tm)==NULL) return(0); if(localtime_r(&now,&tm)==NULL) return(0); if((tm.tm_mday>update_tm.tm_mday && tm.tm_mon==update_tm.tm_mon) || tm.tm_mon>update_tm.tm_mon || tm.tm_year>update_tm.tm_year) { sprintf(str,"New Day - Prev: %s ",timestr(update_t)); logentry("!=",str); sys_status|=SS_DAILY; /* New Day !!! */ sprintf(str,"%slogon.lst",cfg.data_dir); /* Truncate logon list */ if((dsts=nopen(str,O_TRUNC|O_CREAT|O_WRONLY))==-1) { errormsg(WHERE,ERR_OPEN,str,O_TRUNC|O_CREAT|O_WRONLY); return(0L); } close(dsts); for(i=0;i<=cfg.sys_nodes;i++) { if(i) { /* updating a node */ getnodedat(i,&node,1); node.misc|=NODE_EVENT; putnodedat(i,&node); } sprintf(str,"%sdsts.dab",i ? cfg.node_path[i-1] : cfg.ctrl_dir); if((dsts=nopen(str,O_RDWR))==-1) /* node doesn't have stats yet */ continue; sprintf(str,"%scsts.dab",i ? cfg.node_path[i-1] : cfg.ctrl_dir); if((csts=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) { close(dsts); errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT); continue; } lseek(dsts,8L,SEEK_SET); /* Skip time and logons */ write(csts,&now32,4); read(dsts,&stats.ltoday,4); write(csts,&stats.ltoday,4); lseek(dsts,4L,SEEK_CUR); /* Skip total time on */ read(dsts,&stats.ttoday,4); write(csts,&stats.ttoday,4); read(dsts,&stats.uls,4); write(csts,&stats.uls,4); read(dsts,&stats.ulb,4); write(csts,&stats.ulb,4); read(dsts,&stats.dls,4); write(csts,&stats.dls,4); read(dsts,&stats.dlb,4); write(csts,&stats.dlb,4); read(dsts,&stats.ptoday,4); write(csts,&stats.ptoday,4); read(dsts,&stats.etoday,4); write(csts,&stats.etoday,4); read(dsts,&stats.ftoday,4); write(csts,&stats.ftoday,4); close(csts); lseek(dsts,0L,SEEK_SET); /* Go back to beginning */ write(dsts,&now32,4); /* Update time stamp */ lseek(dsts,4L,SEEK_CUR); /* Skip total logons */ stats.ltoday=0; write(dsts,&stats.ltoday,4); /* Logons today to 0 */ lseek(dsts,4L,SEEK_CUR); /* Skip total time on */ stats.ttoday=0; /* Set all other today variables to 0 */ write(dsts,&stats.ttoday,4); /* Time on today to 0 */ write(dsts,&stats.ttoday,4); /* Uploads today to 0 */ write(dsts,&stats.ttoday,4); /* U/L Bytes today */ write(dsts,&stats.ttoday,4); /* Download today */ write(dsts,&stats.ttoday,4); /* Download bytes */ write(dsts,&stats.ttoday,4); /* Posts today */ write(dsts,&stats.ttoday,4); /* Emails today */ write(dsts,&stats.ttoday,4); /* Feedback today */ write(dsts,&stats.ttoday,2); /* New users Today */ close(dsts); } } if(cfg.node_num==0) /* called from event_thread() */ return(0); if(thisnode.status==NODE_QUIET) /* Quiet users aren't counted */ return(0); if(REALSYSOP && !(cfg.sys_misc&SM_SYSSTAT)) return(0); for(i=0;i<2;i++) { sprintf(str,"%sdsts.dab",i ? cfg.ctrl_dir : cfg.node_dir); if((dsts=nopen(str,O_RDWR))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDWR); return(0L); } lseek(dsts,4L,SEEK_SET); /* Skip time stamp */ read(dsts,&stats.logons,4); read(dsts,&stats.ltoday,4); stats.logons++; stats.ltoday++; lseek(dsts,4L,SEEK_SET); /* Rewind back and overwrite */ write(dsts,&stats.logons,4); write(dsts,&stats.ltoday,4); close(dsts); } return(stats.logons); }