void TSessionLog::Add(TLogLineType Type, UnicodeString ALine) { DebugAssert(FConfiguration); if (GetLogging()) { try { if (FParent != nullptr) { DoAdd(Type, ALine, nb::bind(&TSessionLog::DoAddToParent, this)); } else { TGuard Guard(FCriticalSection); DoAdd(Type, ALine, nb::bind(&TSessionLog::DoAddToSelf, this)); } } catch (Exception &E) { // We failed logging, turn it off and notify user. FConfiguration->SetLogging(false); try { throw ExtException(&E, LoadStr(LOG_GEN_ERROR)); } catch (Exception &E2) { AddException(&E2); FUI->HandleExtendedException(&E2); } } } }
//--------------------------------------------------------------------------- void TSessionLog::OpenLogFile() { try { assert(FFile == nullptr); assert(FConfiguration != nullptr); FCurrentLogFileName = FConfiguration->GetLogFileName(); FFile = OpenFile(FCurrentLogFileName, FSessionData, FConfiguration->GetLogFileAppend(), FCurrentFileName); } catch (Exception & E) { // We failed logging to file, turn it off and notify user. FCurrentLogFileName = L""; FCurrentFileName = L""; FConfiguration->SetLogFileName(UnicodeString()); try { throw ExtException(&E, LoadStr(LOG_GEN_ERROR)); } catch (Exception & E) { AddException(&E); FUI->HandleExtendedException(&E); } } StateChange(); }
void TSessionLog::OpenLogFile() { DebugAssert(FConfiguration != nullptr); if (!FConfiguration) return; try { DebugAssert(FLogger == nullptr); FCurrentLogFileName = FConfiguration->GetLogFileName(); FILE *file = LocalOpenLogFile(FCurrentLogFileName, FStarted, FSessionData, FConfiguration->GetLogFileAppend(), FCurrentFileName); FLogger = new tinylog::TinyLog(file); TSearchRec SearchRec; if (FileSearchRec(FCurrentFileName, SearchRec)) { FCurrentFileSize = SearchRec.Size; } else { FCurrentFileSize = 0; } } catch (Exception &E) { // We failed logging to file, turn it off and notify user. FCurrentLogFileName.Clear(); FCurrentFileName.Clear(); FConfiguration->SetLogFileName(UnicodeString()); try { throw ExtException(&E, LoadStr(LOG_GEN_ERROR)); } catch (Exception &E2) { AddException(&E2); // not to deadlock with TSessionLog::ReflectSettings invoked by FConfiguration->LogFileName setter above TUnguard Unguard(FCriticalSection); FUI->HandleExtendedException(&E2); } } // in case we are appending and the existing log file is already too large if (FLogger != nullptr) { CheckSize(0); } }
//--------------------------------------------------------------------------- void TSessionLog::Add(TLogLineType Type, const UnicodeString & Line) { assert(FConfiguration); if (GetLogging()) { try { if (FParent != nullptr) { DoAdd(Type, Line, MAKE_CALLBACK(TSessionLog::DoAddToParent, this)); } else { TGuard Guard(FCriticalSection); BeginUpdate(); auto cleanup = finally([&]() { DeleteUnnecessary(); EndUpdate(); }); { DoAdd(Type, Line, MAKE_CALLBACK(TSessionLog::DoAddToSelf, this)); } } } catch (Exception &E) { // We failed logging, turn it off and notify user. FConfiguration->SetLogging(false); try { throw ExtException(&E, LoadStr(LOG_GEN_ERROR)); } catch (Exception &E) { AddException(&E); FUI->HandleExtendedException(&E); } } } }
CPPCDebug::CPPCDebug(const char *name) : CCPUDebug("PPC", name, 4, 4, true, 32, 7), m_irqState(0) { // PC & Link registers AddPCRegister ("pc", srGroup); AddAddrRegister("lr", srGroup, PPCSPECIAL_LR, GetSpecialReg, SetSpecialReg); // SPR registers AddInt32Register ("ctr", srGroup, SPR_LR, GetSPR, SetSPR); AddStatus32Register("xer", srGroup, SPR_XER, "SOC", GetSPR, SetSPR); AddInt32Register ("srr0", srGroup, SPR_SRR0, GetSPR, SetSPR); AddInt32Register ("srr1", srGroup, SPR_SRR1, GetSPR, SetSPR); // etc... // Condition registers for (unsigned id = 0; id < 8; id++) { sprintf(m_crNames[id], "cr%u", id); AddStatus8Register(m_crNames[id], crGroup, id, "O=><", GetCR, SetCR); } //AddStatus16Register("fpscr", "Condition Registers", PPCSPECIAL_FPSCR, "FEVOUZX789ABCRI 0123", GetSpecial, SetSpecial); // GPR registers for (unsigned id = 0; id < 32; id++) { sprintf(m_gprNames[id], "r%u", id); AddInt32Register(m_gprNames[id], grGroup, id, GetGPR, SetGPR); } // FPR registers for (unsigned id = 0; id < 32; id++) { sprintf(m_fprNames[id], "f%u", id); AddFPointRegister(m_fprNames[id], frGroup, id, GetFPR, SetFPR); } // Exceptions AddException("IRQ", EXCEPTION_IRQ, "External Interrupt"); AddException("DEC", EXCEPTION_DECREMENTER, "Decrement Overflow"); AddException("TRAP", EXCEPTION_TRAP, "Program Exception/Trap"); AddException("SYSCALL", EXCEPTION_SYSTEM_CALL, "System Call"); AddException("SMI", EXCEPTION_SMI, "SMI"); AddException("DSI", EXCEPTION_DSI, "DSI"); AddException("ISI", EXCEPTION_ISI, "ISI"); }
UINT16 loadConfiguration(const char * filePath,bool isInternalTest) { FILE *configureFile = fopen(filePath,"r"); if (!configureFile) { return 1; } char dataBuff[102400] = {0}; char *dataPtr = dataBuff; fread(dataBuff,102400,sizeof(char),configureFile); if (!feof(configureFile))//Buff is insufficient { fclose(configureFile); return 1; } char *pdef; //Current First Line; pdef = strstr(dataPtr,"\n"); *pdef = '\0'; pdef ++; if(dataBuff) { if(dataBuff[0] == 'R' && dataPtr[1] == 'T') { RTBCMTMode = 1; int rtAddress = 33; sscanf(dataPtr + 2,"%x",&rtAddress); if(rtAddress >= 0 && rtAddress < 32) { rt = new SimRT(rtAddress); } else { //RT address is not valid fclose(configureFile); return 1; } llogDebug("Init","RT Mode, and address: 0x%x",rtAddress); } else if(dataPtr[0] == 'B' && dataPtr[1] == 'C') { RTBCMTMode = 0; bc = new SimBC; llogDebug("Init","BC Mode"); } else if(dataPtr[0] == 'B' && dataPtr[1] == 'M') { RTBCMTMode = 2; mt = new SimMT; llogDebug("Init","MT Mode"); } else { //Error fclose(configureFile); return 1; } dataPtr = pdef; pdef = strstr(dataPtr,"\n"); if(pdef) { *pdef = '\0'; pdef ++; } } if (isInternalTest) { while (dataPtr && *dataPtr != '\0') { char mode = '\0'; int address = 0; int data = 0; sscanf(dataPtr,"%c%x%x",&mode,&address,&data); if((mode == 'M') ||(mode == 'R')) { if (mode == 'M') { llogDebug("Init","Mem 0x%x : 0x%2x",address,data); address |= 0XF000; } else { llogDebug("Init","Reg 0x%x : 0x%2x",address,data); } if((RTBCMTMode == 0 && bc)||//BC (RTBCMTMode == 1 && rt)||//RT RTBCMTMode == 2 && mt)//MT { Write(0,address,&data); } } else if (mode == 'E') { AddException(address,data); } dataPtr = pdef; if(!dataPtr) { break; } pdef = strstr(dataPtr,"\n"); if(pdef) { *pdef = '\0'; pdef ++; } } } fclose(configureFile); return 0; }
void UpdateChanModes(struct Luser *lptr, char *who, struct Channel *cptr, char *modes) { int add; char *tmp, *p; register char ch; struct Luser *userptr; #if defined(NICKSERVICES) && defined(CHANNELSERVICES) int cs_deoped = 0; /* was chanserv deoped? */ #endif char **modeargs; /* arguements to +l/k/o/v modes */ char tempargs[MAXLINE]; int argcnt; /* number of arguements */ int argidx; /* current index in modeargs[] */ #ifndef SAVE_TS char sendstr[MAXLINE]; #endif if (!cptr) return; assert(lptr || who); if (lptr) { SendUmode(OPERUMODE_M, "*** %s: Mode [%s] by %s!%s@%s", cptr->name, modes, lptr->nick, lptr->username, lptr->hostname); putlog(LOG3, "%s: mode change \"%s\" by %s!%s@%s", cptr->name, modes, lptr->nick, lptr->username, lptr->hostname); } else { SendUmode(OPERUMODE_M, "*** %s: Mode [%s] by %s", cptr->name, modes, who); putlog(LOG3, "%s: mode change \"%s\" by %s", cptr->name, modes, who); } if ((tmp = strchr(modes, ' '))) strcpy(tempargs, *(tmp + 1) ? tmp + 1 : ""); else tempargs[0] = '\0'; argcnt = SplitBuf(tempargs, &modeargs); /* * This routine parses the given channel modes and keeps * the corresponding lists correctly updated - also make * sure OperServ and ChanServ remain opped */ add = 0; argidx = (-1); for (tmp = modes; *tmp; ++tmp) { ch = *tmp; if (IsSpace(ch)) break; switch (ch) { case ' ': case '\n': case '\r': break; case '-': { add = 0; break; } case '+': { add = 1; break; } /* * Op/DeOp */ case 'o': { ++argidx; if (argidx >= argcnt) { /* * there are more 'o' flags than there are nicknames, * just break */ break; } if (!(userptr = FindClient(modeargs[argidx]))) break; SetChannelMode(cptr, add, MODE_O, userptr, 0); if (add) { #ifdef STATSERVICES if (lptr) ++lptr->numops; #endif } /* if (add) */ else { if (userptr == Me.osptr) { if (!FloodCheck(cptr, lptr, Me.osptr, 0)) { #ifdef SAVE_TS os_part(cptr); os_join(cptr); #else toserv(":%s MODE %s +o %s\n", n_OperServ, cptr->name, n_OperServ); #endif } if (!lptr) { putlog(LOG1, "%s: %s attempted to deop %s", cptr->name, who, n_OperServ); } else { putlog(LOG1, "%s: %s!%s@%s attempted to deop %s", cptr->name, lptr->nick, lptr->username, lptr->hostname, n_OperServ); } } #if defined(NICKSERVICES) && defined(CHANNELSERVICES) else if (userptr == Me.csptr) { cs_deoped = 1; } #endif /* defined(NICKSERVICES) && defined(CHANNELSERVICES) */ #ifdef STATSERVICES if (lptr) ++lptr->numdops; #endif } /* else if (!add) */ #if defined(NICKSERVICES) && defined(CHANNELSERVICES) cs_CheckModes(lptr, FindChan(cptr->name), !add, MODE_O, userptr); #endif break; } /* case 'o' */ /* * Voice/DeVoice */ case 'v': { ++argidx; if (argidx >= argcnt) break; if (!(userptr = FindClient(modeargs[argidx]))) break; SetChannelMode(cptr, add, MODE_V, userptr, 0); if (add) { #ifdef STATSERVICES if (lptr) ++lptr->numvoices; #endif } else { #ifdef STATSERVICES if (lptr) ++lptr->numdvoices; #endif } /* else if (!add) */ #if defined(NICKSERVICES) && defined(CHANNELSERVICES) cs_CheckModes(lptr, FindChan(cptr->name), !add, MODE_V, userptr); #endif break; } /* case 'v' */ #ifdef HYBRID7 /* HalfOp/DeHalfOp -Janos */ case 'h': { ++argidx; if (argidx >= argcnt) break; if (!(userptr = FindClient(modeargs[argidx]))) break; SetChannelMode(cptr, add, MODE_H, userptr, 0); if (add) { #ifdef STATSERVICES if (lptr) ++lptr->numhops; #endif } else { #ifdef STATSERVICES if (lptr) ++lptr->numdhops; #endif } /* else if (!add) */ #if defined(NICKSERVICES) && defined(CHANNELSERVICES) cs_CheckModes(lptr, FindChan(cptr->name), !add, MODE_H, userptr); #endif break; } /* case 'h'*/ #endif /* HYBRID7 */ /* * Channel limit */ case 'l': { if (add) { ++argidx; if (argidx >= argcnt) break; cptr->limit = atoi(modeargs[argidx]); } else cptr->limit = 0; #if defined(NICKSERVICES) && defined(CHANNELSERVICES) cs_CheckModes(lptr, FindChan(cptr->name), !add, MODE_L, 0); #endif break; } /* case 'l' */ /* * Channel key */ case 'k': { ++argidx; if (argidx >= argcnt) break; #ifndef BLOCK_ALLOCATION if (cptr->key) MyFree(cptr->key); #endif if (add) { #ifdef BLOCK_ALLOCATION strncpy(cptr->key, modeargs[argidx], KEYLEN); cptr->key[KEYLEN] = '\0'; #else cptr->key = MyStrdup(modeargs[argidx]); #endif /* BLOCK_ALLOCATION */ } else { #ifdef BLOCK_ALLOCATION cptr->key[0] = '\0'; #else cptr->key = 0; #endif /* BLOCK_ALLOCATION */ } #if defined(NICKSERVICES) && defined(CHANNELSERVICES) cs_CheckModes(lptr, FindChan(cptr->name), !add, MODE_K, 0); #endif break; } /* case 'k' */ /* * Channel forwarding target */ case 'f': { ++argidx; if (argidx >= argcnt) break; #ifndef BLOCK_ALLOCATION if (cptr->forward) MyFree(cptr->forward); #endif if (add) { #ifdef BLOCK_ALLOCATION strncpy(cptr->forward, modeargs[argidx], CHANNELLEN); cptr->forward[CHANNELLEN] = '\0'; #else cptr->forward = MyStrdup(modeargs[argidx]); #endif /* BLOCK_ALLOCATION */ } else { #ifdef BLOCK_ALLOCATION cptr->forward[0] = '\0'; #else cptr->forward = 0; #endif /* BLOCK_ALLOCATION */ } #if defined(NICKSERVICES) && defined(CHANNELSERVICES) cs_CheckModes(lptr, FindChan(cptr->name), !add, MODE_F, 0); #endif break; } /* case 'f' */ /* * Channel ban */ case 'b': { ++argidx; if (argidx >= argcnt) break; /* if it's a forwarding ban like nick!ident@host!#channel * just drop the forward channel * found by CheeToS -- jilles */ p = strchr(modeargs[argidx], '!'); if (p != NULL) { p = strchr(p + 1, '!'); if (p != NULL) *p = '\0'; } if (add) AddBan(who, cptr, modeargs[argidx]); else DeleteBan(cptr, modeargs[argidx]); if (p != NULL) *p = '!'; break; } /* case 'b' */ #ifdef GECOSBANS /* * Channel deny */ case 'd': { ++argidx; if (argidx >= argcnt) break; if (add) AddGecosBan(who, cptr, modeargs[argidx]); else DeleteGecosBan(cptr, modeargs[argidx]); break; } /* case 'd' */ #endif /* GECOSBANS */ /* * Channel exception */ case 'e': { ++argidx; if (argidx >= argcnt) break; if (add) AddException(who, cptr, modeargs[argidx]); else DeleteException(cptr, modeargs[argidx]); break; } /* case 'e' */ #ifdef HYBRID7 /* Channel invite exception -Janos */ case 'I': { ++argidx; if (argidx >= argcnt) break; if (add) AddInviteException(who, cptr, modeargs[argidx]); else DeleteInviteException(cptr, modeargs[argidx]); break; } /* case 'I' */ #endif /* HYBRID7 */ default: { int modeflag = 0; if (ch == 's') modeflag = MODE_S; else if (ch == 'p') modeflag = MODE_P; else if (ch == 'n') modeflag = MODE_N; else if (ch == 't') modeflag = MODE_T; else if (ch == 'm') modeflag = MODE_M; else if (ch == 'i') modeflag = MODE_I; else if (ch == 'r') modeflag = MODE_R; else if (ch == 'z') modeflag = MODE_Z; else if (ch == 'P') modeflag = MODE_CAPP; #if 0 /* doesn't exist in 1.0.34 */ else if (ch == 'F') modeflag = MODE_CAPF; #endif else if (ch == 'Q') modeflag = MODE_CAPQ; #ifdef HYBRID7 else if (ch == 'a') modeflag = MODE_A; #endif else if (ch == 'c') modeflag = MODE_C; else if (ch == 'g') modeflag = MODE_G; else if (ch == 'L') modeflag = MODE_CAPL; else if (ch == 'R') modeflag = MODE_CAPR; if (modeflag) { if (add) cptr->modes |= modeflag; else cptr->modes &= ~modeflag; } #if defined(NICKSERVICES) && defined(CHANNELSERVICES) if (modeflag) cs_CheckModes(lptr, FindChan(cptr->name), !add, modeflag, 0); #endif break; } /* default: */ } /* switch (*tmp) */ } /* for (tmp = modes; *tmp; ++tmp) */ MyFree(modeargs); #if defined(NICKSERVICES) && defined(CHANNELSERVICES) if ((cs_deoped) && (!FloodCheck(cptr, lptr, Me.csptr, 0))) { /* reop ChanServ */ #ifdef SAVE_TS cs_part(cptr); cs_join(FindChan(cptr->name)); #else toserv(":%s MODE %s +o %s\n", n_ChanServ, cptr->name, n_ChanServ); #endif if (!lptr) putlog(LOG1, "%s: %s attempted to deop %s", cptr->name, who, n_ChanServ); else putlog(LOG1, "%s: %s!%s@%s attempted to deop %s", cptr->name, lptr->nick, lptr->username, lptr->hostname, n_ChanServ); } #endif /* defined(NICKSERVICES) && defined(CHANNELSERVICES) */ } /* UpdateChanModes() */