--- sbbs/src/sbbs3/ctrl/mainformunit.cpp 2018/04/24 16:41:24 1.1 +++ sbbs/src/sbbs3/ctrl/mainformunit.cpp 2018/04/24 16:44:12 1.1.1.2 @@ -1,12 +1,12 @@ /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */ -/* $Id: mainformunit.cpp,v 1.1 2018/04/24 16:41:24 root Exp $ */ +/* $Id: mainformunit.cpp,v 1.1.1.2 2018/04/24 16:44:12 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -71,6 +71,7 @@ #include "PropertiesDlgUnit.h" #include "ConfigWizardUnit.h" #include "PreviewFormUnit.h" +#include "LoginAttemptsFormUnit.h" #include "sbbs_ini.h" // sbbs_read_ini() #include "userdat.h" // lastuser() @@ -84,6 +85,7 @@ TMainForm *MainForm; #define LOG_TIME_FMT " m/d hh:mm:ssa/p" +#define STATUSBAR_LAST_PANEL 5 /* Service functions are NT-only, must call dynamically :-( */ typedef WINADVAPI SC_HANDLE (WINAPI *OpenSCManager_t)(LPCTSTR,LPCTSTR,DWORD); @@ -124,12 +126,50 @@ DWORD mail_svc_config_size; QUERY_SERVICE_CONFIG* services_svc_config; DWORD services_svc_config_size; +const char* LogLevelDesc[] = { "Emergency" + ,"Alert" + ,"Critical" + ,"Error" + ,"Warning" + ,"Notice" + ,"Normal" + ,"Debug" + }; +const TColor LogLevelColor[] = { + clRed + ,clRed + ,clRed + ,clRed + ,clFuchsia + ,clBlue + ,clBlack /* not used */ + ,clGreen + }; + +link_list_t bbs_log_list; +link_list_t event_log_list; +link_list_t mail_log_list; +link_list_t ftp_log_list; +link_list_t web_log_list; +link_list_t services_log_list; +link_list_t login_attempt_list; + DWORD MaxLogLen=20000; int threads=1; time_t initialized=0; static str_list_t recycle_semfiles; static str_list_t shutdown_semfiles; bool terminating=false; +ulong errors; +AnsiString ErrorSoundFile; + +static void errormsg(void* p, int level, const char* msg) +{ + errors++; + + if(MainForm->SoundToggle->Checked) + PlaySound(ErrorSoundFile.c_str(), NULL, SND_ASYNC|SND_FILENAME); +} static void thread_up(void* p, BOOL up, BOOL setuid) { @@ -143,10 +183,6 @@ static void thread_up(void* p, BOOL up, threads++; else if(threads>0) threads--; - sprintf(str,"Threads: %d",threads); - AnsiString Str=AnsiString(str); - if(MainForm->StatusBar->Panels->Items[0]->Text!=Str) - MainForm->StatusBar->Panels->Items[0]->Text=Str; ReleaseMutex(mutex); } @@ -164,10 +200,6 @@ void socket_open(void* p, BOOL open) sockets++; else if(sockets>0) sockets--; - sprintf(str,"Sockets: %d",sockets); - AnsiString Str=AnsiString(str); - if(MainForm->StatusBar->Panels->Items[1]->Text!=Str) - MainForm->StatusBar->Panels->Items[1]->Text=Str; ReleaseMutex(mutex); } @@ -183,15 +215,6 @@ static void client_add(void* p, BOOL add total_clients++; } else if(clients>0) clients--; - sprintf(str,"Clients: %d",clients); - AnsiString Str=AnsiString(str); - if(MainForm->StatusBar->Panels->Items[2]->Text!=Str) - MainForm->StatusBar->Panels->Items[2]->Text=Str; - - sprintf(str,"Served: %d",total_clients); - Str=AnsiString(str); - if(MainForm->StatusBar->Panels->Items[3]->Text!=Str) - MainForm->StatusBar->Panels->Items[3]->Text=Str; } static void client_on(void* p, BOOL on, int sock, client_t* client, BOOL update) @@ -233,11 +256,12 @@ static void client_on(void* p, BOOL on, return; } if(client!=NULL && client->size==sizeof(client_t)) { + t=time(NULL); if(i>=0) { Item=ClientForm->ListView->Items->Item[i]; } else { Item=ClientForm->ListView->Items->Add(); - Item->Data=(void*)client->time; + Item->Data=(void*)t; Item->Caption=sock; } Item->SubItems->Clear(); @@ -246,7 +270,7 @@ static void client_on(void* p, BOOL on, Item->SubItems->Add(client->addr); Item->SubItems->Add(client->host); Item->SubItems->Add(client->port); - t=time(NULL)-(time_t)Item->Data; + t-=(time_t)Item->Data; sprintf(str,"%d:%02d",t/60,t%60); Item->SubItems->Add(str); } @@ -254,25 +278,33 @@ static void client_on(void* p, BOOL on, ReleaseMutex(ClientForm->ListMutex); } -static int bbs_lputs(void* p, int level, char *str) +static int lputs(void* p, int level, const char *str) { - static HANDLE mutex; + log_msg_t msg; - if(!mutex) - mutex=CreateMutex(NULL,false,NULL); - WaitForSingleObject(mutex,INFINITE); + msg.level = level; + GetLocalTime(&msg.time); + SAFECOPY(msg.buf, str); + listPushNodeData((link_list_t*)p, &msg, sizeof(msg)); + return strlen(msg.buf); +} - while(MaxLogLen && TelnetForm->Log->Text.Length()>=MaxLogLen) +static void bbs_log_msg(log_msg_t* msg) +{ + while(MaxLogLen && TelnetForm->Log->Lines->Count >= MaxLogLen) TelnetForm->Log->Lines->Delete(0); - AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" "; - Line+=AnsiString(str).Trim(); + AnsiString Line=SystemTimeToDateTime(msg->time).FormatString(LOG_TIME_FMT)+" "; + + Line+=AnsiString(msg->buf).Trim(); + TelnetForm->Log->SelLength=0; + TelnetForm->Log->SelAttributes->Assign( + MainForm->LogAttributes(msg->level, TelnetForm->Log->Color, TelnetForm->Log->Font)); TelnetForm->Log->Lines->Add(Line); - ReleaseMutex(mutex); - return(Line.Length()); + SendMessage(TelnetForm->Log->Handle, WM_VSCROLL, SB_BOTTOM, NULL); } -static void bbs_status(void* p, char *str) +static void bbs_status(void* p, const char *str) { static HANDLE mutex; @@ -309,7 +341,9 @@ static void bbs_terminated(void* p, int Screen->Cursor=crDefault; MainForm->TelnetStart->Enabled=true; MainForm->TelnetStop->Enabled=false; - MainForm->TelnetRecycle->Enabled=false; + MainForm->TelnetRecycle->Enabled=false; + MainForm->TelnetPause->Enabled=false; + MainForm->TelnetPause->Checked=false; Application->ProcessMessages(); } static void bbs_started(void* p) @@ -317,7 +351,9 @@ static void bbs_started(void* p) Screen->Cursor=crDefault; MainForm->TelnetStart->Enabled=false; MainForm->TelnetStop->Enabled=true; - MainForm->TelnetRecycle->Enabled=true; + MainForm->TelnetRecycle->Enabled=true; + MainForm->TelnetPause->Enabled=true; + MainForm->TelnetPause->Checked=false; Application->ProcessMessages(); } static void bbs_start(void) @@ -341,43 +377,35 @@ static void bbs_start(void) Application->ProcessMessages(); } -static int event_lputs(int level, char *str) +static void event_log_msg(log_msg_t* msg) { - static HANDLE mutex; - - if(!mutex) - mutex=CreateMutex(NULL,false,NULL); - WaitForSingleObject(mutex,INFINITE); - - while(MaxLogLen && EventsForm->Log->Text.Length()>=MaxLogLen) + while(MaxLogLen && EventsForm->Log->Lines->Count >= MaxLogLen) EventsForm->Log->Lines->Delete(0); - AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" "; - Line+=AnsiString(str).Trim(); + AnsiString Line=SystemTimeToDateTime(msg->time).FormatString(LOG_TIME_FMT)+" "; + Line+=AnsiString(msg->buf).Trim(); + EventsForm->Log->SelLength=0; + EventsForm->Log->SelAttributes->Assign( + MainForm->LogAttributes(msg->level, EventsForm->Log->Color, EventsForm->Log->Font)); EventsForm->Log->Lines->Add(Line); - ReleaseMutex(mutex); - return(Line.Length()); + SendMessage(EventsForm->Log->Handle, WM_VSCROLL, SB_BOTTOM, NULL); } -static int service_lputs(void* p, int level, char *str) +static void services_log_msg(log_msg_t* msg) { - static HANDLE mutex; - - if(!mutex) - mutex=CreateMutex(NULL,false,NULL); - WaitForSingleObject(mutex,INFINITE); - - while(MaxLogLen && ServicesForm->Log->Text.Length()>=MaxLogLen) + while(MaxLogLen && ServicesForm->Log->Lines->Count >= MaxLogLen) ServicesForm->Log->Lines->Delete(0); - AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" "; - Line+=AnsiString(str).Trim(); + AnsiString Line=SystemTimeToDateTime(msg->time).FormatString(LOG_TIME_FMT)+" "; + Line+=AnsiString(msg->buf).Trim(); + ServicesForm->Log->SelLength=0; + ServicesForm->Log->SelAttributes->Assign( + MainForm->LogAttributes(msg->level, ServicesForm->Log->Color, ServicesForm->Log->Font)); ServicesForm->Log->Lines->Add(Line); - ReleaseMutex(mutex); - return(Line.Length()); + SendMessage(ServicesForm->Log->Handle, WM_VSCROLL, SB_BOTTOM, NULL); } -static void services_status(void* p, char *str) +static void services_status(void* p, const char *str) { static HANDLE mutex; @@ -396,6 +424,8 @@ static void services_terminated(void* p, MainForm->ServicesStart->Enabled=true; MainForm->ServicesStop->Enabled=false; MainForm->ServicesRecycle->Enabled=false; + MainForm->ServicesPause->Enabled=false; + MainForm->ServicesPause->Checked=false; Application->ProcessMessages(); } static void services_started(void* p) @@ -404,6 +434,8 @@ static void services_started(void* p) MainForm->ServicesStart->Enabled=false; MainForm->ServicesStop->Enabled=true; MainForm->ServicesRecycle->Enabled=true; + MainForm->ServicesPause->Enabled=true; + MainForm->ServicesPause->Checked=false; Application->ProcessMessages(); } @@ -411,35 +443,33 @@ static void services_clients(void* p, in { } -static int mail_lputs(void* p, int level, char *str) +static void mail_log_msg(log_msg_t* msg) { - static HANDLE mutex; static FILE* LogStream; - if(!mutex) - mutex=CreateMutex(NULL,false,NULL); - WaitForSingleObject(mutex,INFINITE); - - if(str==NULL) { + if(msg==NULL) { if(LogStream!=NULL) fclose(LogStream); LogStream=NULL; - ReleaseMutex(mutex); - return(0); + return; } - while(MaxLogLen && MailForm->Log->Text.Length()>=MaxLogLen) + while(MaxLogLen && MailForm->Log->Lines->Count >= MaxLogLen) MailForm->Log->Lines->Delete(0); - AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" "; - Line+=AnsiString(str).Trim(); + AnsiString Line=SystemTimeToDateTime(msg->time).FormatString(LOG_TIME_FMT)+" "; + Line+=AnsiString(msg->buf).Trim(); + MailForm->Log->SelLength=0; + MailForm->Log->SelAttributes->Assign( + MainForm->LogAttributes(msg->level, MailForm->Log->Color, MailForm->Log->Font)); MailForm->Log->Lines->Add(Line); + SendMessage(MailForm->Log->Handle, WM_VSCROLL, SB_BOTTOM, NULL); if(MainForm->MailLogFile && MainForm->MailStop->Enabled) { AnsiString LogFileName - =AnsiString(MainForm->cfg.data_dir) + =AnsiString(MainForm->cfg.logs_dir) +"LOGS\\MS" - +Now().FormatString("mmddyy") + +SystemTimeToDateTime(msg->time).FormatString("mmddyy") +".LOG"; if(!FileExists(LogFileName)) { @@ -452,18 +482,15 @@ static int mail_lputs(void* p, int level LogStream=_fsopen(LogFileName.c_str(),"a",SH_DENYNONE); if(LogStream!=NULL) { - Line=Now().FormatString("hh:mm:ss")+" "; - Line+=AnsiString(str).Trim(); + Line=SystemTimeToDateTime(msg->time).FormatString("hh:mm:ss")+" "; + Line+=AnsiString(msg->buf).Trim(); Line+="\n"; fwrite(AnsiString(Line).c_str(),1,Line.Length(),LogStream); } } - - ReleaseMutex(mutex); - return(Line.Length()); } -static void mail_status(void* p, char *str) +static void mail_status(void* p, const char *str) { static HANDLE mutex; @@ -496,6 +523,8 @@ static void mail_terminated(void* p, int MainForm->MailStart->Enabled=true; MainForm->MailStop->Enabled=false; MainForm->MailRecycle->Enabled=false; + MainForm->MailPause->Enabled=false; + MainForm->MailPause->Checked=false; Application->ProcessMessages(); } static void mail_started(void* p) @@ -504,6 +533,8 @@ static void mail_started(void* p) MainForm->MailStart->Enabled=false; MainForm->MailStop->Enabled=true; MainForm->MailRecycle->Enabled=true; + MainForm->MailPause->Enabled=true; + MainForm->MailPause->Checked=false; Application->ProcessMessages(); } static void mail_start(void) @@ -527,35 +558,33 @@ static void mail_start(void) Application->ProcessMessages(); } -static int ftp_lputs(void* p, int level, char *str) +static void ftp_log_msg(log_msg_t* msg) { - static HANDLE mutex; static FILE* LogStream; - if(!mutex) - mutex=CreateMutex(NULL,false,NULL); - WaitForSingleObject(mutex,INFINITE); - - if(str==NULL) { + if(msg==NULL) { if(LogStream!=NULL) fclose(LogStream); LogStream=NULL; - ReleaseMutex(mutex); - return(0); + return; } - while(MaxLogLen && FtpForm->Log->Text.Length()>=MaxLogLen) + while(MaxLogLen && FtpForm->Log->Lines->Count >= MaxLogLen) FtpForm->Log->Lines->Delete(0); - AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" "; - Line+=AnsiString(str).Trim(); + AnsiString Line=SystemTimeToDateTime(msg->time).FormatString(LOG_TIME_FMT)+" "; + Line+=AnsiString(msg->buf).Trim(); + FtpForm->Log->SelLength=0; + FtpForm->Log->SelAttributes->Assign( + MainForm->LogAttributes(msg->level, FtpForm->Log->Color, FtpForm->Log->Font)); FtpForm->Log->Lines->Add(Line); + SendMessage(FtpForm->Log->Handle, WM_VSCROLL, SB_BOTTOM, NULL); if(MainForm->FtpLogFile && MainForm->FtpStop->Enabled) { AnsiString LogFileName - =AnsiString(MainForm->cfg.data_dir) + =AnsiString(MainForm->cfg.logs_dir) +"LOGS\\FS" - +Now().FormatString("mmddyy") + +SystemTimeToDateTime(msg->time).FormatString("mmddyy") +".LOG"; if(!FileExists(LogFileName)) { @@ -569,18 +598,15 @@ static int ftp_lputs(void* p, int level, LogStream=_fsopen(LogFileName.c_str(),"a",SH_DENYNONE); if(LogStream!=NULL) { - Line=Now().FormatString("hh:mm:ss")+" "; - Line+=AnsiString(str).Trim(); + Line=SystemTimeToDateTime(msg->time).FormatString("hh:mm:ss")+" "; + Line+=AnsiString(msg->buf).Trim(); Line+="\n"; fwrite(AnsiString(Line).c_str(),1,Line.Length(),LogStream); } } - - ReleaseMutex(mutex); - return(Line.Length()); } -static void ftp_status(void* p, char *str) +static void ftp_status(void* p, const char *str) { static HANDLE mutex; @@ -613,6 +639,8 @@ static void ftp_terminated(void* p, int MainForm->FtpStart->Enabled=true; MainForm->FtpStop->Enabled=false; MainForm->FtpRecycle->Enabled=false; + MainForm->FtpPause->Enabled=false; + MainForm->FtpPause->Checked=false; Application->ProcessMessages(); } static void ftp_started(void* p) @@ -621,6 +649,8 @@ static void ftp_started(void* p) MainForm->FtpStart->Enabled=false; MainForm->FtpStop->Enabled=true; MainForm->FtpRecycle->Enabled=true; + MainForm->FtpPause->Enabled=true; + MainForm->FtpPause->Checked=false; Application->ProcessMessages(); } static void ftp_start(void) @@ -644,60 +674,30 @@ static void ftp_start(void) Application->ProcessMessages(); } //--------------------------------------------------------------------------- -static int web_lputs(void* p, int level, char *str) +static void web_log_msg(log_msg_t* msg) { - static HANDLE mutex; static FILE* LogStream; - if(!mutex) - mutex=CreateMutex(NULL,false,NULL); - WaitForSingleObject(mutex,INFINITE); - - if(str==NULL) { + if(msg==NULL) { if(LogStream!=NULL) fclose(LogStream); LogStream=NULL; - ReleaseMutex(mutex); - return(0); + return; } - while(MaxLogLen && WebForm->Log->Text.Length()>=MaxLogLen) + while(MaxLogLen && WebForm->Log->Lines->Count >= MaxLogLen) WebForm->Log->Lines->Delete(0); - AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" "; - Line+=AnsiString(str).Trim(); + AnsiString Line=SystemTimeToDateTime(msg->time).FormatString(LOG_TIME_FMT)+" "; + Line+=AnsiString(msg->buf).Trim(); + WebForm->Log->SelLength=0; + WebForm->Log->SelAttributes->Assign( + MainForm->LogAttributes(msg->level, WebForm->Log->Color, WebForm->Log->Font)); WebForm->Log->Lines->Add(Line); -#if 0 - if(MainForm->WebLogFile && MainForm->WebStop->Enabled) { - AnsiString LogFileName - =AnsiString(MainForm->cfg.data_dir) - +"LOGS\\FS" - +Now().FormatString("mmddyy") - +".LOG"; - - if(!FileExists(LogFileName)) { - FileClose(FileCreate(LogFileName)); - if(LogStream!=NULL) { - fclose(LogStream); - LogStream=NULL; - } - } - if(LogStream==NULL) - LogStream=_fsopen(LogFileName.c_str(),"a",SH_DENYNONE); - - if(LogStream!=NULL) { - Line=Now().FormatString("hh:mm:ss")+" "; - Line+=AnsiString(str).Trim(); - Line+="\n"; - fwrite(AnsiString(Line).c_str(),1,Line.Length(),LogStream); - } - } -#endif - ReleaseMutex(mutex); - return(Line.Length()); + SendMessage(WebForm->Log->Handle, WM_VSCROLL, SB_BOTTOM, NULL); } -static void web_status(void* p, char *str) +static void web_status(void* p, const char *str) { static HANDLE mutex; @@ -718,7 +718,7 @@ static void web_clients(void* p, int cli mutex=CreateMutex(NULL,false,NULL); WaitForSingleObject(mutex,INFINITE); - WebForm->ProgressBar->Max=MainForm->ftp_startup.max_clients; + WebForm->ProgressBar->Max=MainForm->web_startup.max_clients; WebForm->ProgressBar->Position=clients; ReleaseMutex(mutex); @@ -730,6 +730,8 @@ static void web_terminated(void* p, int MainForm->WebStart->Enabled=true; MainForm->WebStop->Enabled=false; MainForm->WebRecycle->Enabled=false; + MainForm->WebPause->Enabled=false; // caused exception + MainForm->WebPause->Checked=false; Application->ProcessMessages(); } static void web_started(void* p) @@ -738,6 +740,8 @@ static void web_started(void* p) MainForm->WebStart->Enabled=false; MainForm->WebStop->Enabled=true; MainForm->WebRecycle->Enabled=true; + MainForm->WebPause->Enabled=true; + MainForm->WebPause->Checked=false; Application->ProcessMessages(); } static void web_start(void) @@ -773,21 +777,21 @@ static void recycle(void* cbdata) services_startup_t* services=NULL; SAFEPRINTF(str,"Reading %s",MainForm->ini_file); - if(cbdata==(void*)&MainForm->bbs_startup) { + if(cbdata==(void*)&bbs_log_list) { bbs=&MainForm->bbs_startup; - bbs_lputs(cbdata,LOG_INFO,str); - } else if(cbdata==(void*)&MainForm->ftp_startup) { + lputs(cbdata,LOG_INFO,str); + } else if(cbdata==(void*)&ftp_log_list) { ftp=&MainForm->ftp_startup; - ftp_lputs(cbdata,LOG_INFO,str); - } else if(cbdata==(void*)&MainForm->web_startup) { + lputs(cbdata,LOG_INFO,str); + } else if(cbdata==(void*)&web_log_list) { web=&MainForm->web_startup; - web_lputs(cbdata,LOG_INFO,str); - } else if(cbdata==(void*)&MainForm->mail_startup) { + lputs(cbdata,LOG_INFO,str); + } else if(cbdata==(void*)&mail_log_list) { mail=&MainForm->mail_startup; - mail_lputs(cbdata,LOG_INFO,str); - } else if(cbdata==(void*)&MainForm->services_startup) { + lputs(cbdata,LOG_INFO,str); + } else if(cbdata==(void*)&services_log_list) { services=&MainForm->services_startup; - service_lputs(cbdata,LOG_INFO,str); + lputs(cbdata,LOG_INFO,str); } fp=fopen(MainForm->ini_file,"r"); @@ -807,6 +811,7 @@ __fastcall TMainForm::TMainForm(TCompone : TForm(Owner) { /* Defaults */ + memset(&global,0,sizeof(global)); SAFECOPY(global.ctrl_dir,"c:\\sbbs\\ctrl\\"); global.js.max_bytes=JAVASCRIPT_MAX_BYTES; global.js.cx_stack=JAVASCRIPT_CONTEXT_STACK; @@ -823,6 +828,8 @@ __fastcall TMainForm::TMainForm(TCompone UseFileAssociations=true; Initialized=false; + loginAttemptListInit(&login_attempt_list); + char* p; if((p=getenv("SBBSCTRL"))!=NULL) SAFECOPY(global.ctrl_dir,p); @@ -832,7 +839,8 @@ __fastcall TMainForm::TMainForm(TCompone memset(&bbs_startup,0,sizeof(bbs_startup)); bbs_startup.size=sizeof(bbs_startup); - bbs_startup.cbdata=&bbs_startup; + bbs_startup.cbdata=&bbs_log_list; + bbs_startup.event_cbdata=&event_log_list; bbs_startup.first_node=1; bbs_startup.last_node=4; bbs_startup.options=BBS_OPT_XTRN_MINIMIZED|BBS_OPT_SYSOP_AVAILABLE; @@ -840,7 +848,9 @@ __fastcall TMainForm::TMainForm(TCompone bbs_startup.telnet_interface=INADDR_ANY; bbs_startup.rlogin_port=513; bbs_startup.rlogin_interface=INADDR_ANY; - bbs_startup.lputs=bbs_lputs; + bbs_startup.lputs=lputs; + bbs_startup.event_lputs=lputs; + bbs_startup.errormsg=errormsg; bbs_startup.status=bbs_status; bbs_startup.clients=bbs_clients; bbs_startup.started=bbs_started; @@ -849,16 +859,17 @@ __fastcall TMainForm::TMainForm(TCompone bbs_startup.thread_up=thread_up; bbs_startup.client_on=client_on; bbs_startup.socket_open=socket_open; - bbs_startup.event_lputs=event_lputs; + bbs_startup.login_attempt_list=&login_attempt_list; memset(&mail_startup,0,sizeof(mail_startup)); mail_startup.size=sizeof(mail_startup); - mail_startup.cbdata=&mail_startup; + mail_startup.cbdata=&mail_log_list; mail_startup.smtp_port=IPPORT_SMTP; mail_startup.relay_port=IPPORT_SMTP; mail_startup.pop3_port=110; mail_startup.interface_addr=INADDR_ANY; - mail_startup.lputs=mail_lputs; + mail_startup.lputs=lputs; + mail_startup.errormsg=errormsg; mail_startup.status=mail_status; mail_startup.clients=mail_clients; mail_startup.started=mail_started; @@ -873,13 +884,15 @@ __fastcall TMainForm::TMainForm(TCompone mail_startup.lines_per_yield=10; mail_startup.max_clients=10; mail_startup.max_msg_size=10*1024*1024; + mail_startup.login_attempt_list=&login_attempt_list; memset(&ftp_startup,0,sizeof(ftp_startup)); ftp_startup.size=sizeof(ftp_startup); - ftp_startup.cbdata=&ftp_startup; + ftp_startup.cbdata=&ftp_log_list; ftp_startup.port=IPPORT_FTP; ftp_startup.interface_addr=INADDR_ANY; - ftp_startup.lputs=ftp_lputs; + ftp_startup.lputs=lputs; + ftp_startup.errormsg=errormsg; ftp_startup.status=ftp_status; ftp_startup.clients=ftp_clients; ftp_startup.started=ftp_started; @@ -894,11 +907,13 @@ __fastcall TMainForm::TMainForm(TCompone strcpy(ftp_startup.index_file_name,"00index"); strcpy(ftp_startup.html_index_file,"00index.html"); strcpy(ftp_startup.html_index_script,"ftp-html.js"); + ftp_startup.login_attempt_list=&login_attempt_list; memset(&web_startup,0,sizeof(web_startup)); web_startup.size=sizeof(web_startup); - web_startup.cbdata=&web_startup; - web_startup.lputs=web_lputs; + web_startup.cbdata=&web_log_list; + web_startup.lputs=lputs; + web_startup.errormsg=errormsg; web_startup.status=web_status; web_startup.clients=web_clients; web_startup.started=web_started; @@ -907,12 +922,14 @@ __fastcall TMainForm::TMainForm(TCompone web_startup.thread_up=thread_up; web_startup.client_on=client_on; web_startup.socket_open=socket_open; + web_startup.login_attempt_list=&login_attempt_list; memset(&services_startup,0,sizeof(services_startup)); services_startup.size=sizeof(services_startup); - services_startup.cbdata=&services_startup; + services_startup.cbdata=&services_log_list; services_startup.interface_addr=INADDR_ANY; - services_startup.lputs=service_lputs; + services_startup.lputs=lputs; + services_startup.errormsg=errormsg; services_startup.status=services_status; services_startup.clients=services_clients; services_startup.started=services_started; @@ -921,6 +938,7 @@ __fastcall TMainForm::TMainForm(TCompone services_startup.thread_up=thread_up; services_startup.client_on=client_on; services_startup.socket_open=socket_open; + services_startup.login_attempt_list=&login_attempt_list; bbs_log=INVALID_HANDLE_VALUE; event_log=INVALID_HANDLE_VALUE; @@ -969,6 +987,30 @@ __fastcall TMainForm::TMainForm(TCompone mail_svc = openService(hSCManager, NTSVC_NAME_MAIL, GENERIC_READ|GENERIC_EXECUTE); services_svc = openService(hSCManager, NTSVC_NAME_SERVICES, GENERIC_READ|GENERIC_EXECUTE); } + + { + int i; + + for(i=LOG_EMERG;i<=LOG_DEBUG;i++) { + LogFont[i] = new TFont; + LogFont[i]->Color=LogLevelColor[i]; + if(i<=LOG_ERR) + LogFont[i]->Style = TFontStyles()<< fsBold; + } + } + + listInit(&bbs_log_list, LINK_LIST_MUTEX); + listInit(&event_log_list, LINK_LIST_MUTEX); + listInit(&ftp_log_list, LINK_LIST_MUTEX); + listInit(&web_log_list, LINK_LIST_MUTEX); + listInit(&mail_log_list, LINK_LIST_MUTEX); + listInit(&services_log_list, LINK_LIST_MUTEX); + + TelnetPause->DisableIfNoHandler=false; + MailPause->DisableIfNoHandler=false; + WebPause->DisableIfNoHandler=false; + FtpPause->DisableIfNoHandler=false; + ServicesPause->DisableIfNoHandler=false; } //--------------------------------------------------------------------------- void __fastcall TMainForm::FileExitMenuItemClick(TObject *Sender) @@ -1080,7 +1122,7 @@ void __fastcall TMainForm::FormClose(TOb if(Initialized) /* Don't overwrite registry settings with defaults */ SaveRegistrySettings(Sender); - StatusBar->Panels->Items[4]->Text="Terminating servers..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Terminating servers..."; time_t start=time(NULL); while( (TelnetStop->Enabled && !bbsServiceEnabled()) || (MailStop->Enabled && !mailServiceEnabled()) @@ -1092,25 +1134,14 @@ void __fastcall TMainForm::FormClose(TOb Application->ProcessMessages(); YIELD(); } - StatusBar->Panels->Items[4]->Text="Closing..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Closing..."; Application->ProcessMessages(); LogTimer->Enabled=false; + ServiceStatusTimer->Enabled=false; NodeForm->Timer->Enabled=false; ClientForm->Timer->Enabled=false; -#if 0 - /* Extra time for callbacks to be called by child threads */ - start=time(NULL); - while(time(NULL)ProcessMessages(); - YIELD(); - } -#endif -#if 0 - if(hSCManager!=NULL) - closeServiceHandle(hSCManager); -#endif } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose) @@ -1119,8 +1150,8 @@ void __fastcall TMainForm::FormCloseQuer if(TelnetStop->Enabled && !bbsServiceEnabled()) { if(!terminating && TelnetForm->ProgressBar->Position - && Application->MessageBox("Shut down the Telnet Server?" - ,"Telnet Server In Use", MB_OKCANCEL)!=IDOK) + && Application->MessageBox("Shut down the Terminal Server?" + ,"Terminal Server In Use", MB_OKCANCEL)!=IDOK) return; TelnetStopExecute(Sender); } @@ -1764,6 +1795,13 @@ void __fastcall TMainForm::StartupTimerT ClientForm->ListView->Color=ReadColor(Registry,"ClientList"); ReadFont("ClientList",ClientForm->ListView->Font); + { + int i; + + for(i=LOG_EMERG; i<=LOG_DEBUG; i++) + ReadFont("Log" + AnsiString(LogLevelDesc[i]), LogFont[i]); + } + if(Registry->ValueExists("TelnetFormTop")) TelnetForm->Top=Registry->ReadInteger("TelnetFormTop"); if(Registry->ValueExists("TelnetFormLeft")) @@ -1876,6 +1914,8 @@ void __fastcall TMainForm::StartupTimerT NodeForm->Timer->Interval=Registry->ReadInteger("NodeDisplayInterval")*1000; if(Registry->ValueExists("ClientDisplayInterval")) ClientForm->Timer->Interval=Registry->ReadInteger("ClientDisplayInterval")*1000; + if(Registry->ValueExists("ErrorSoundFile")) + ErrorSoundFile=Registry->ReadString("ErrorSoundFile"); if(Registry->ValueExists("MailLogFile")) MailLogFile=Registry->ReadInteger("MailLogFile"); @@ -1906,7 +1946,7 @@ void __fastcall TMainForm::StartupTimerT ,&MailAutoStart ,&mail_startup ,&ServicesAutoStart ,&services_startup ); - StatusBar->Panels->Items[4]->Text="Read " + AnsiString(ini_file); + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Read " + AnsiString(ini_file); fclose(fp); } else { /* Legacy (v3.10-3.11) */ @@ -2134,66 +2174,6 @@ void __fastcall TMainForm::StartupTimerT if(SaveIniSettings(Sender)) Registry->WriteBool("Imported",true); /* Use the .ini file for these settings from now on */ - -#if 0 - /******************************************************/ - /* Copy global values into each server startup struct */ - /******************************************************/ - - /* used to be handled in bbs_start() */ - SAFECOPY(bbs_startup.ctrl_dir,global.ctrl_dir); - SAFECOPY(bbs_startup.temp_dir,global.temp_dir); - SAFECOPY(bbs_startup.host_name,global.host_name); - bbs_startup.sem_chk_freq=global.sem_chk_freq; - - /* JavaScript operational parameters */ - bbs_startup.js_max_bytes=global.js.max_bytes; - bbs_startup.js_cx_stack=global.js.cx_stack; - bbs_startup.js_branch_limit=global.js.branch_limit; - bbs_startup.js_gc_interval=global.js.gc_interval; - bbs_startup.js_yield_interval=global.js.yield_interval; - - /* used to be handled in mail_start() */ - SAFECOPY(mail_startup.ctrl_dir - ,global.ctrl_dir); - SAFECOPY(mail_startup.host_name - ,global.host_name); - mail_startup.sem_chk_freq=global.sem_chk_freq; - - /* used to be handled in ftp_start() */ - SAFECOPY(ftp_startup.ctrl_dir - ,global.ctrl_dir); - SAFECOPY(ftp_startup.temp_dir - ,global.temp_dir); - SAFECOPY(ftp_startup.host_name - ,global.host_name); - ftp_startup.sem_chk_freq=global.sem_chk_freq; - - /* JavaScript operational parameters */ - ftp_startup.js_max_bytes=global.js.max_bytes; - ftp_startup.js_cx_stack=global.js.cx_stack; - - /* used to be handled in web_start() */ - SAFECOPY(web_startup.ctrl_dir,global.ctrl_dir); - SAFECOPY(web_startup.host_name,global.host_name); - web_startup.sem_chk_freq=global.sem_chk_freq; - - /* JavaScript operational parameters */ - web_startup.js_max_bytes=global.js.max_bytes; - web_startup.js_cx_stack=global.js.cx_stack; - - /* used to be handled in ServicesStartExecute() */ - SAFECOPY(services_startup.ctrl_dir,global.ctrl_dir); - SAFECOPY(services_startup.host_name,global.host_name); - services_startup.sem_chk_freq=global.sem_chk_freq; - - /* JavaScript operational parameters */ - services_startup.js_max_bytes=global.js.max_bytes; - services_startup.js_cx_stack=global.js.cx_stack; - services_startup.js_branch_limit=global.js.branch_limit; - services_startup.js_gc_interval=global.js.gc_interval; - services_startup.js_yield_interval=global.js.yield_interval; -#endif } Registry->CloseKey(); @@ -2218,28 +2198,23 @@ void __fastcall TMainForm::StartupTimerT cfg.node_num=bbs_startup.first_node; char error[256]; SAFECOPY(error,UNKNOWN_LOAD_ERROR); + + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Loading configuration..."; if(!load_cfg(&cfg, NULL, TRUE, error)) { Application->MessageBox(error,"ERROR Loading Configuration" ,MB_OK|MB_ICONEXCLAMATION); Application->Terminate(); return; } + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Configuration loaded"; recycle_semfiles=semfile_list_init(cfg.ctrl_dir,"recycle","ctrl"); + semfile_list_add(&recycle_semfiles,ini_file); semfile_list_check(&initialized,recycle_semfiles); shutdown_semfiles=semfile_list_init(cfg.ctrl_dir,"shutdown","ctrl"); semfile_list_check(&initialized,shutdown_semfiles); - if(!(cfg.sys_misc&SM_LOCAL_TZ)) { - if(putenv("TZ=UTC0")) { - Application->MessageBox("Error setting timezone" - ,"ERROR",MB_OK|MB_ICONEXCLAMATION); - Application->Terminate(); - } - tzset(); - } - if(cfg.new_install) { Application->BringToFront(); for(int i=0;i<10;i++) { @@ -2325,8 +2300,11 @@ void __fastcall TMainForm::StartupTimerT LowerLeftPageControl->ActivePageIndex=i; LowerLeftPageControl->ActivePageIndex=0; - LogTimerTick(Sender); /* Open Log Mailslots */ - ServiceStatusTimerTick(Sender); /* Query service config lengths */ + /* Open Log Mailslots */ + LogTimerTick(Sender); + + /* Query service config lengths */ + ServiceStatusTimerTick(Sender); if(SysAutoStart) TelnetStartExecute(Sender); @@ -2342,7 +2320,7 @@ void __fastcall TMainForm::StartupTimerT NodeForm->Timer->Enabled=true; ClientForm->Timer->Enabled=true; - SemFileTimer->Interval=global.sem_chk_freq; + SemFileTimer->Interval=global.sem_chk_freq*1000; SemFileTimer->Enabled=true; StatsTimer->Interval=cfg.node_stat_check*1000; @@ -2351,15 +2329,27 @@ void __fastcall TMainForm::StartupTimerT UpTimer->Enabled=true; /* Start updating the status bar */ LogTimer->Enabled=true; + ServiceStatusTimer->Enabled=true; + TelnetForm->LogLevelUpDown->Position=bbs_startup.log_level; + TelnetForm->LogLevelText->Caption=LogLevelDesc[bbs_startup.log_level]; + FtpForm->LogLevelUpDown->Position=ftp_startup.log_level; + FtpForm->LogLevelText->Caption=LogLevelDesc[ftp_startup.log_level]; + MailForm->LogLevelUpDown->Position=mail_startup.log_level; + MailForm->LogLevelText->Caption=LogLevelDesc[mail_startup.log_level]; + WebForm->LogLevelUpDown->Position=web_startup.log_level; + WebForm->LogLevelText->Caption=LogLevelDesc[web_startup.log_level]; + ServicesForm->LogLevelUpDown->Position=services_startup.log_level; + ServicesForm->LogLevelText->Caption=LogLevelDesc[services_startup.log_level]; + if(!Application->Active) /* Starting up minimized? */ FormMinimize(Sender); /* Put icon in systray */ } //--------------------------------------------------------------------------- void __fastcall TMainForm::SaveRegistrySettings(TObject* Sender) { - StatusBar->Panels->Items[4]->Text="Saving Registry Settings..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Saving Registry Settings..."; // Write Registry keys TRegistry* Registry=new TRegistry; @@ -2490,6 +2480,13 @@ void __fastcall TMainForm::SaveRegistryS WriteColor(Registry,"ClientList",ClientForm->ListView->Color); WriteFont("ClientList",ClientForm->ListView->Font); + { + int i; + + for(i=LOG_EMERG;i<=LOG_DEBUG;i++) + WriteFont("Log" + AnsiString(LogLevelDesc[i]), LogFont[i]); + } + Registry->WriteBool("ToolBarVisible",Toolbar->Visible); Registry->WriteBool("StatusBarVisible",StatusBar->Visible); @@ -2502,6 +2499,7 @@ void __fastcall TMainForm::SaveRegistryS Registry->WriteBool("UseFileAssociations",UseFileAssociations); Registry->WriteInteger("NodeDisplayInterval",NodeForm->Timer->Interval/1000); Registry->WriteInteger("ClientDisplayInterval",ClientForm->Timer->Interval/1000); + Registry->WriteString("ErrorSoundFile",ErrorSoundFile); Registry->WriteInteger( "SpyTerminalWidth" ,SpyTerminalWidth); @@ -2537,7 +2535,7 @@ bool __fastcall TMainForm::SaveIniSettin return(false); } - StatusBar->Panels->Items[4]->Text="Saving Settings to " + AnsiString(ini_file) + " ..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Saving Settings to " + AnsiString(ini_file) + " ..."; bool success = sbbs_write_ini(fp ,&cfg @@ -2556,6 +2554,7 @@ bool __fastcall TMainForm::SaveIniSettin Application->MessageBox(err,"ERROR",MB_OK|MB_ICONEXCLAMATION); } + semfile_list_check(&initialized,recycle_semfiles); return(success); } @@ -2603,7 +2602,7 @@ void __fastcall TMainForm::ImportSetting if(!OpenDialog->Execute()) return; - StatusBar->Panels->Items[4]->Text="Importing Settings..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Importing Settings..."; TMemIniFile* IniFile=new TMemIniFile(OpenDialog->FileName); @@ -2694,7 +2693,7 @@ void __fastcall TMainForm::ExportSetting TMemIniFile* IniFile=new TMemIniFile(SaveDialog->FileName); - StatusBar->Panels->Items[4]->Text="Exporting Settings..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Exporting Settings..."; const char* section = "Properties"; @@ -2732,18 +2731,27 @@ void __fastcall TMainForm::ExportSetting ExportFormSettings(IniFile,section = "TelnetForm",TelnetForm); ExportFont(IniFile,section,"LogFont",TelnetForm->Log->Font); + IniFile->WriteString(section,"LogColor",ColorToString(TelnetForm->Log->Color)); ExportFormSettings(IniFile,section = "EventsForm",EventsForm); ExportFont(IniFile,section,"LogFont",EventsForm->Log->Font); + IniFile->WriteString(section,"LogColor",ColorToString(EventsForm->Log->Color)); ExportFormSettings(IniFile,section = "ServicesForm",ServicesForm); ExportFont(IniFile,section,"LogFont",ServicesForm->Log->Font); + IniFile->WriteString(section,"LogColor",ColorToString(ServicesForm->Log->Color)); ExportFormSettings(IniFile,section = "FtpForm",FtpForm); ExportFont(IniFile,section,"LogFont",FtpForm->Log->Font); + IniFile->WriteString(section,"LogColor",ColorToString(FtpForm->Log->Color)); ExportFormSettings(IniFile,section = "MailForm",MailForm); ExportFont(IniFile,section,"LogFont",MailForm->Log->Font); + IniFile->WriteString(section,"LogColor",ColorToString(MailForm->Log->Color)); + + ExportFormSettings(IniFile,section = "WebForm",WebForm); + ExportFont(IniFile,section,"LogFont",WebForm->Log->Font); + IniFile->WriteString(section,"LogColor",ColorToString(WebForm->Log->Color)); section = "SpyTerminal"; IniFile->WriteInteger(section, "Width" @@ -2936,8 +2944,34 @@ void __fastcall TMainForm::UpTimerTick(T ,(up/60)%60 ); AnsiString Str=AnsiString(str); + if(MainForm->StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text!=Str) + MainForm->StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text=Str; + + sprintf(str,"Threads: %u",threads); + Str=AnsiString(str); + if(MainForm->StatusBar->Panels->Items[0]->Text!=Str) + MainForm->StatusBar->Panels->Items[0]->Text=Str; + + sprintf(str,"Sockets: %u",sockets); + Str=AnsiString(str); + if(MainForm->StatusBar->Panels->Items[1]->Text!=Str) + MainForm->StatusBar->Panels->Items[1]->Text=Str; + + sprintf(str,"Clients: %u",clients); + Str=AnsiString(str); + if(MainForm->StatusBar->Panels->Items[2]->Text!=Str) + MainForm->StatusBar->Panels->Items[2]->Text=Str; + + sprintf(str,"Served: %u",total_clients); + Str=AnsiString(str); + if(MainForm->StatusBar->Panels->Items[3]->Text!=Str) + MainForm->StatusBar->Panels->Items[3]->Text=Str; + + sprintf(str,"Errors: %u",errors); + Str=AnsiString(str); if(MainForm->StatusBar->Panels->Items[4]->Text!=Str) MainForm->StatusBar->Panels->Items[4]->Text=Str; + #if 0 THeapStatus hp=GetHeapStatus(); sprintf(str,"Mem Used: %lu bytes",hp.TotalAllocated); @@ -2963,15 +2997,6 @@ void __fastcall TMainForm::UpTimerTick(T } //--------------------------------------------------------------------------- -void __fastcall TMainForm::BBSViewErrorLogMenuItemClick(TObject *Sender) -{ - char filename[MAX_PATH+1]; - - sprintf(filename,"%sERROR.LOG" - ,MainForm->cfg.logs_dir); - ViewFile(filename,"Error Log"); -} -//--------------------------------------------------------------------------- void __fastcall TMainForm::ChatToggleExecute(TObject *Sender) { @@ -3052,15 +3077,21 @@ void __fastcall TMainForm::ViewLogClick( return; /* Close Mail/FTP logs */ - mail_lputs(NULL,0,NULL); - ftp_lputs(NULL,0,NULL); + mail_log_msg(NULL); + ftp_log_msg(NULL); - sprintf(filename,"%sLOGS\\%s%02d%02d%02d.LOG" - ,MainForm->cfg.logs_dir - ,((TMenuItem*)Sender)->Hint.c_str() - ,tm->tm_mon+1 - ,tm->tm_mday - ,tm->tm_year%100 + if(strchr(((TMenuItem*)Sender)->Hint.c_str(),'.')==NULL) + sprintf(filename,"%sLOGS\\%s%02d%02d%02d.LOG" + ,MainForm->cfg.logs_dir + ,((TMenuItem*)Sender)->Hint.c_str() + ,tm->tm_mon+1 + ,tm->tm_mday + ,tm->tm_year%100 + ); + else + sprintf(filename,"%s\\%s" + ,MainForm->cfg.logs_dir + ,((TMenuItem*)Sender)->Hint.c_str() ); ViewFile(filename,((TMenuItem*)Sender)->Caption); } @@ -3129,6 +3160,8 @@ void __fastcall TMainForm::PropertiesExe PropertiesDlg->JS_BranchLimitEdit->Text=IntToStr(global.js.branch_limit); PropertiesDlg->JS_GcIntervalEdit->Text=IntToStr(global.js.gc_interval); PropertiesDlg->JS_YieldIntervalEdit->Text=IntToStr(global.js.yield_interval); + PropertiesDlg->JS_LoadPathEdit->Text=global.js.load_path; + PropertiesDlg->ErrorSoundEdit->Text=ErrorSoundFile; if(MaxLogLen==0) PropertiesDlg->MaxLogLenEdit->Text=""; @@ -3168,7 +3201,7 @@ void __fastcall TMainForm::PropertiesExe SAFECOPY(services_startup.host_name,global.host_name); SAFECOPY(services_startup.ctrl_dir,global.ctrl_dir); SAFECOPY(services_startup.temp_dir,global.temp_dir); - services_startup.sem_chk_freq=global.sem_chk_freq; + services_startup.sem_chk_freq=global.sem_chk_freq ; Password=PropertiesDlg->PasswordEdit->Text; NodeForm->Timer->Interval=PropertiesDlg->NodeIntUpDown->Position*1000; @@ -3176,6 +3209,7 @@ void __fastcall TMainForm::PropertiesExe MinimizeToSysTray=PropertiesDlg->TrayIconCheckBox->Checked; UndockableForms=PropertiesDlg->UndockableCheckBox->Checked; UseFileAssociations=PropertiesDlg->FileAssociationsCheckBox->Checked; + ErrorSoundFile=PropertiesDlg->ErrorSoundEdit->Text; /* JavaScript operating parameters */ js_startup_t js=global.js; // save for later comparison @@ -3191,6 +3225,7 @@ void __fastcall TMainForm::PropertiesExe =PropertiesDlg->JS_GcIntervalEdit->Text.ToIntDef(JAVASCRIPT_GC_INTERVAL); global.js.yield_interval =PropertiesDlg->JS_YieldIntervalEdit->Text.ToIntDef(JAVASCRIPT_YIELD_INTERVAL); + SAFECOPY(global.js.load_path, PropertiesDlg->JS_LoadPathEdit->Text.c_str()); /* Copy global settings, if appropriate (not unique) */ if(memcmp(&bbs_startup.js,&js,sizeof(js))==0) bbs_startup.js=global.js; @@ -3271,12 +3306,35 @@ void __fastcall TMainForm::reload_config { char error[256]; SAFECOPY(error,UNKNOWN_LOAD_ERROR); + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Reloading configuration..."; if(!load_cfg(&cfg, NULL, TRUE, error)) { Application->MessageBox(error,"ERROR Re-loading Configuration" ,MB_OK|MB_ICONEXCLAMATION); Application->Terminate(); } + FILE* fp=fopen(MainForm->ini_file,"r"); + sbbs_read_ini(fp + ,&MainForm->global + ,NULL ,&MainForm->bbs_startup + ,NULL ,NULL + ,NULL ,NULL + ,NULL ,NULL + ,NULL ,NULL + ); + if(fp!=NULL) + fclose(fp); + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Configuration reloaded"; semfile_list_check(&initialized,recycle_semfiles); + + if(bbs_startup.options&BBS_OPT_SYSOP_AVAILABLE) + ChatToggle->Checked=true; + else + ChatToggle->Checked=false; + + if(bbs_startup.options&BBS_OPT_MUTE) + SoundToggle->Checked=false; + else + SoundToggle->Checked=true; } //--------------------------------------------------------------------------- @@ -3477,7 +3535,7 @@ void __fastcall TMainForm::BBSEditFileCl delete dlg; } //--------------------------------------------------------------------------- -bool GetServerLogLine(HANDLE& log, const char* name, char* line, size_t len) +bool GetServerLogLine(HANDLE& log, const char* name, log_msg_t* msg) { char fname[256]; @@ -3504,43 +3562,77 @@ bool GetServerLogLine(HANDLE& log, const DWORD rd=0; if(!ReadFile( log, // handle of file to read - line, // pointer to buffer that receives data - len-1, // number of bytes to read + msg, // pointer to buffer that receives data + sizeof(*msg), // number of bytes to read &rd, // pointer to number of bytes read NULL // pointer to structure for data ) || !rd) return(false); - line[rd]=0; /* 0-terminate */ - return(true); } //--------------------------------------------------------------------------- void __fastcall TMainForm::LogTimerTick(TObject *Sender) { - char line[1024]; + log_msg_t msg; + log_msg_t* pmsg; - while(GetServerLogLine(bbs_log,NTSVC_NAME_BBS,line,sizeof(line))) - bbs_lputs(NULL,LOG_INFO,line); - - while(GetServerLogLine(event_log,NTSVC_NAME_EVENT,line,sizeof(line))) - event_lputs(LOG_INFO,line); - - while(GetServerLogLine(ftp_log,NTSVC_NAME_FTP,line,sizeof(line))) - ftp_lputs(NULL,LOG_INFO,line); - - while(GetServerLogLine(web_log,NTSVC_NAME_WEB,line,sizeof(line))) - web_lputs(NULL,LOG_INFO,line); - - while(GetServerLogLine(mail_log,NTSVC_NAME_MAIL,line,sizeof(line))) - mail_lputs(NULL,LOG_INFO,line); + if(!TelnetPause->Checked) { + while(GetServerLogLine(bbs_log,NTSVC_NAME_BBS,&msg)) + bbs_log_msg(&msg); + + while(GetServerLogLine(event_log,NTSVC_NAME_EVENT,&msg)) + event_log_msg(&msg); + + while((pmsg=(log_msg_t*)listShiftNode(&bbs_log_list)) != NULL) { + bbs_log_msg(pmsg); + free(pmsg); + } - while(GetServerLogLine(services_log,NTSVC_NAME_SERVICES,line,sizeof(line))) - service_lputs(NULL,LOG_INFO,line); + while((pmsg=(log_msg_t*)listShiftNode(&event_log_list)) != NULL) { + event_log_msg(pmsg); + free(pmsg); + } + } + if(!FtpPause->Checked) { + while(GetServerLogLine(ftp_log,NTSVC_NAME_FTP,&msg)) + ftp_log_msg(&msg); + + while((pmsg=(log_msg_t*)listShiftNode(&ftp_log_list)) != NULL) { + ftp_log_msg(pmsg); + free(pmsg); + } + } + if(!MailPause->Checked) { + while(GetServerLogLine(mail_log,NTSVC_NAME_MAIL,&msg)) + mail_log_msg(&msg); + + while((pmsg=(log_msg_t*)listShiftNode(&mail_log_list)) != NULL) { + mail_log_msg(pmsg); + free(pmsg); + } + } + if(!WebPause->Checked) { + while(GetServerLogLine(web_log,NTSVC_NAME_WEB,&msg)) + web_log_msg(&msg); + + while((pmsg=(log_msg_t*)listShiftNode(&web_log_list)) != NULL) { + web_log_msg(pmsg); + free(pmsg); + } + } + if(!ServicesPause->Checked) { + while(GetServerLogLine(services_log,NTSVC_NAME_SERVICES,&msg)) + services_log_msg(&msg); + + while((pmsg=(log_msg_t*)listShiftNode(&services_log_list)) != NULL) { + services_log_msg(pmsg); + free(pmsg); + } + } } - //--------------------------------------------------------------------------- void CheckServiceStatus( SC_HANDLE svc @@ -3705,14 +3797,52 @@ void __fastcall TMainForm::SemFileTimerT char* p; if((p=semfile_list_check(&initialized,shutdown_semfiles))!=NULL) { - StatusBar->Panels->Items[4]->Text=AnsiString(p) + " signaled"; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text=AnsiString(p) + " signaled"; terminating=true; Close(); } else if((p=semfile_list_check(&initialized,recycle_semfiles))!=NULL) { - StatusBar->Panels->Items[4]->Text=AnsiString(p) + " signaled"; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text=AnsiString(p) + " signaled"; reload_config(); } } //--------------------------------------------------------------------------- +TFont* __fastcall TMainForm::LogAttributes(int log_level, TColor Color, TFont* Font) +{ + if(log_level==LOG_INFO || LogFont[log_level]->Color==Color + || log_level > LOG_DEBUG) + return Font; + + return LogFont[log_level]; +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::ClearErrorsExecute(TObject *Sender) +{ + errors=0; + + node_t node; + for(int i=0;igetnodedat(i+1,&node,&file)) + break; + node.errors=0; + if(NodeForm->putnodedat(i+1,&node,file)) + break; + } +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::ViewErrorLogExecute(TObject *Sender) +{ + char filename[MAX_PATH+1]; + + sprintf(filename,"%sERROR.LOG" + ,MainForm->cfg.logs_dir); + ViewFile(filename,"Error Log"); +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::ViewLoginAttemptsMenuItemClick(TObject *Sender) +{ + LoginAttemptsForm->Show(); +} +//---------------------------------------------------------------------------