#define Use_MsgBase #define Use_LinkedList #define Use_Handlers //#define INCLUDE_REGIS #include #include #include #include #include #include #include #include "proboard.hpp" //#include "timebomb.h" #include long Message::lastIndex = 0; static int port = PORT_VALUE; bool do_modem(modem_response *); // unsigned _stack = 12000; extern unsigned _stklen = 13000; #if __OVERLAY__ unsigned _ovrbuffer = 0x800; #endif char *months_short[] = { "???","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; char *days_short[] = { "Mon","Tue","Wed","Thu","Fri","Sat","Sun" }; char *days_full[] = { "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday" }; char *date_formats[] = { "MM/DD/YY", "YY/MM/DD", "DD/MM/YY", NULL }; char *date_formats_long[] = { "MM/DD/YYYY", "YYYY/MM/DD", "DD/MM/YYYY", NULL }; bool chatflag = FALSE; bool noyell_flag = FALSE; bool password_ok = FALSE; bool desqview = FALSE; bool stopped = FALSE; bool use_ems = TRUE; bool use_xms = FALSE; bool quiet = FALSE; bool echo_entered = FALSE; bool net_entered = FALSE; bool registered = TRUE; word max_node_count = 255; bool menuchanged = TRUE; bool updatemenu = TRUE; bool reliable = TRUE; bool ignore_carrier = FALSE; bool fatal = FALSE; bool no_hangup = FALSE; bool rip_detected = FALSE; bool sysop_next = FALSE; int num_yells = 0; long totalcalls = 0; int num_users = 0; int time_limit = 0; int time_removed = 0; int node_number = 1; int num_limits = 0; int returnvalue = 0; int display_mode = 1; int event_due = 10080; byte org_videomode = 0; word org_numlines = 0; word min_level = 0; int rip_screenlines= 0; int pastFirstUse = 31; bool newFilesChecked = FALSE; int download_limit = 0; int download_delay = 0; word free_download = 0; word upload_needed = 0; String S_PRESS_ENTER_TO_CONTINUE; byte current_color; fossilio io; BinLog lastcaller; char user_firstname[36] = ""; char mypath[64] = ""; char syspath[64] = ""; char curmenu[9] = ""; char page_reason[81] = ""; User user; Config far cfg; usertimer timer; limits limit[50]; KeyData regis; event nextevent; MarkedMsgList markedmsglist; command_stack comstack; LinkedList sysopkey_handlers; LinkedList hangup_handlers; Date login_date; Time login_time; int user_recnr = -1; FileName FN_BINLOG_PB; FileName FN_TIMELOG_PRO; FileName FN_ONLINE_PRO; FileName FN_MSGAREAS_PRO; FileName FN_PVTFILES_PB; MsgBaseList msgbase; MsgBase *squishMsgBase; MsgBase *hudsonMsgBase; MsgBase *jamMsgBase; char *EMPTY_STRING=""; extern "C" void cleanup(); extern void (*_new_handler)(); void nomemory(); static void _near init(); void readconfig(); #ifdef SOFTWARE_EXPIRE //--------------------- // Expire on 06/01/2000 //--------------------- int BetaTooOld( void ); #endif void main(int argc,char *argv[]) { File f; long baud=0; int i; FileName fn; bool standalone = FALSE; /*#ifdef SOFTWARE_EXPIRE if ( BetaTooOld() ) { printf( "\nThis software expired on %02d/%02d/%04d. Contact TeleGrafix Communications at:\n\n", EXPIRE_MONTH, EXPIRE_DAY, EXPIRE_YEAR ); printf( " http://www.telegrafix.com/products/proboard\n\n" ); printf( "to obtain the latest version.\7\n" ); printf( "\n" ); sleep( 5 ); exit( 1 ); } #endif */ org_videomode = getvideomode(); org_numlines = tsw_vsize; for(i=1;i=3 && mode<=255) setvideomode(mode); } break; case 'X': use_ems = FALSE; break; case 'I': ignore_carrier = TRUE; break; case 'S': standalone = TRUE; break; case 'A': reliable = TRUE; break; case 'L': min_level = unsigned(atol(&argv[i][2])); break; case 'T': event_due = atoi(&argv[i][2]); break; default : printf("\nUnknown option '-%c'\n",toupper(argv[i][1])); sleep(5); } if(_osmajor<3 || (_osmajor==3 && _osminor<30)) { puts("\nDOS v3.30 or higher needed!"); exit(1); } #if __OVERLAY__ if(use_ems) _OvrInitEms(0, 0, 0); if(use_xms) _OvrInitExt(0 ,0 ); #endif syspath[0]='\0'; if(getenv("PROBOARD")) { strcpy(syspath,getenv("PROBOARD")); append_backspace(syspath); } if(!syspath[0]) { fn(argv[0]); fn.stripName(); strcpy(syspath,fn); append_backspace(syspath); } strupr(syspath); getcwd(mypath,59); append_backspace(mypath); check_exe(argv[0]); readconfig(); if(!ReadLanguage(cfg.defaultLanguage)) { fatalerror("Error reading default language files"); } readconfig(); FN_BINLOG_PB (syspath, "BINLOG.PB"); FN_TIMELOG_PRO (syspath, "TIMELOG.PRO" ); FN_ONLINE_PRO (syspath, "ONLINE.PRO" ); FN_MSGAREAS_PRO(syspath, "MESSAGES.PB" ); FN_PVTFILES_PB (syspath, "PVTFILES.PB "); _new_handler=nomemory; if(cfg.egamode) set43(); if(tsw_videocard==EGA) tsw_vsize=*((byte _far *)0x484)+1; tsw_hsize = *((byte far *)0x44A); init(); run_sdkfile("/I INIT"); run_sdkfile("/I INIT_1"); run_sdkfile("/I INIT_2"); run_sdkfile("/I INIT_3"); run_sdkfile("/I INIT_4"); run_sdkfile("/I INIT_5"); run_sdkfile("/I INIT_6"); run_sdkfile("/I INIT_7"); run_sdkfile("/I INIT_8"); run_sdkfile("/I INIT_9"); msgbase.add( squishMsgBase = new SquishMsgBase ); msgbase.add( hudsonMsgBase = new HudsonMsgBase ); msgbase.add( jamMsgBase = new JamMsgBase ); if(standalone) { modem_response response; CLEAR_OBJECT(response); response.baud = baud; response.port = port; if(do_modem(&response)) { baud = response.baud; port = response.port; } else { fatalerror("Modem initialization failed"); } if(!baud) port = -1; } else { if(port<0 && baud) port = 0; } SCREEN.clear(); SCREEN.attrib(15); SCREEN.change(1,1,tsw_hsize,tsw_vsize-1); update_user_window(); if(baud || cfg.loglocal) LOG("-----------------------------------------------------"); if(port<0) io.init(0,0); else io.init(port,baud); if(baud) LOG("Incoming call at %ld bps",baud); else LOG("Local login"); atexit(cleanup); timer.start(20); update_display(); if(nextevent.minutesleft()<=5 || (event_due<=5 && event_due>=0)) { if(showansascrip("EVENTDUE") == ANS_NOFILE) io << '\n' << S_EVENT_HAS_TO_RUN << "\n\xFF"; LOG("Event has to run"); sleep(2); exit_proboard(); } show_intro(); if(login()) exit_proboard(); LOG(1,"Calling from %s - Level %u",user.city,user.level); { user_online uo; uo.write(); } for(i=0;i=0) { LOG("Event has to run"); io << '\n' << S_EVENT_HAS_TO_RUN << "\n\xFF"; sleep(2); exit_proboard(); } if(event_due>=0 && timer.left()>event_due-5) { LOG("Time limit adjusted from %d to %d minutes" , timer.left() , event_due-5); time_removed = timer.left() - event_due + 5; timer.changeleft(event_due-5); io << "\n\n" << S_UPCOMING_EVENT << "\n\n"; io << S_PRESS_ENTER_TO_CONTINUE << '\n'; } showansascrip("WELCOME"); for(i=1;i<10;i++) { run_sdkfile(form("/I WELCOME%d",i)); showansascrip(form("WELCOME%d",i)); } run_sdkfile(form("/I SEC%u",user.level)); showansascrip(form("SEC%u",user.level)); switch(cfg.mailcheck) { case 2: { /* if(rip_mode) { rip_query("$COFF$"); rip_query("$PHASER$"); show_rip("_CHKMAIL"); } else */ { io << "\n" << S_CHECK_MAIL_PROMPT; } //if(rip_mode) io.show_remote = FALSE; bool resp = io.ask(); //if(rip_mode) io.show_remote = TRUE; rip_query("$CON$"); if(!resp) break; /*if(rip_mode) rip_reset(); else */io << '\n'; } case 1: mailcheck(); break; } rip_query("$CON$"); io << '\n'; showansascrip("NEWS"); if(user.birthDate[0]==login_date[0] && user.birthDate[1]==login_date[1]) { run_sdkfile("/I BIRTHDAY"); showansascrip("BIRTHDAY"); } menu_processor(); } #ifdef SOFTWARE_EXPIRE int BetaTooOld( void ) { struct dosdate_t d; _dos_getdate( & d ); if ( d.year >= EXPIRE_YEAR and d.month >= EXPIRE_MONTH and d.day > EXPIRE_DAY ) { //--------------------- // Software has expired //--------------------- return( TRUE ); } else { //--------------------------------------- // Re-establish the proper starting port // number for ProBoard's COM port support //--------------------------------------- port = -1; return( FALSE ); } } #endif // SOFTWARE_EXPIRE void readconfig() { File f; FileName fn(syspath,"CONFIG.PRO"); if(!f.open(fn)) { file_error(fn , f.error()); } else { if(f.len()!=sizeof(cfg) || f.read(&cfg,sizeof(cfg))!=sizeof(cfg)) fatalerror(form("File <%s> is invalid." , (char *)fn)); } f.close(); if(memcmp(cfg.dateStampSignature,"ecwqnoiwef",10)) { memcpy(cfg.dateStampSignature,"ecwqnoiwef",10); cfg.dateStamp.today(); cfg.dateStampCrc = crc32(cfg.dateStampSignature,13); f.open(fn,fmode_create); f.write(&cfg,sizeof(cfg)); f.close(); } if(cfg.dateStampCrc != crc32(cfg.dateStampSignature,13)) { pastFirstUse = 61; } else { pastFirstUse = Date(TODAY) - cfg.dateStamp; } if(!cfg.defaultLanguage[0]) strcpy(cfg.defaultLanguage,"ENGLISH"); if(pb_curlang.menuPath[0]) strcpy(cfg.mnupath , pb_curlang.menuPath); if(pb_curlang.txtPath[0]) strcpy(cfg.txtpath , pb_curlang.txtPath); append_backspace(cfg.txtpath); append_backspace(cfg.RIPpath); append_backspace(cfg.iconspath); append_backspace(cfg.mnupath); append_backspace(cfg.msgpath); append_backspace(cfg.uploadpath); append_backspace(cfg.pexpath); append_backspace(cfg.pvtuploadpath); append_backspace(cfg.nodelistdir); if(cfg.pwdchar == '\0') cfg.pwdchar = '#'; if(cfg.numnodes>1) cfg.multiline = TRUE; if(cfg.IObuffersize < 1 || cfg.IObuffersize > 9999) cfg.IObuffersize = 1; User::setDir(cfg.msgpath); } static void near init() { //---------------------------- // JDR: REGISTRATION REFERENCE //---------------------------- if ( registered || max_node_count != 2 ) { //------------------------------------- // Someone tampered with the .EXE file, // trying to hardcode these values //------------------------------------- //exit_proboard(); } //CHECK_REG(); /*#ifdef KEY_NEEDED if ( ! registered ) { LOG( "This version does not work in unregistered mode" ); exit_proboard(); } #endif */ //------------------------------------- // Check the node count of this license //------------------------------------- /*if ( registered ) { if ( max_node_count != 0 ) { //----------------------------------------------------------- // We have a distinct node count. Are we within our license? //----------------------------------------------------------- if ( node_number > max_node_count ) { //----------------- // License exceeded //----------------- fatalerror( form( "Node license exceeded. Tried to load node %d (%d allowed)", (int) node_number, (int) max_node_count ) ); exit_proboard(); } } } else { //-------------------------------------------------- // Unregistered version -- only allow two nodes max! //-------------------------------------------------- if ( node_number > MAX_UNREG_NODES ) { fatalerror( form( "Unregistered versions cannot start more than %d nodes", MAX_UNREG_NODES ) ); exit_proboard(); } }*/ if ( tsw_OS == OS_DESQVIEW ) { desqview = TRUE; } timelog tl; tl.read(); totalcalls = tl.totalcalls; File f; if ( f.open( FN_BINLOG_PB ) ) { if ( f.len() >= sizeof( BinLog ) ) { f.seek( f.len() - sizeof( BinLog ) ); f.read( & lastcaller, sizeof( lastcaller ) ); } f.close(); } event e; memset( & nextevent, 0, sizeof( nextevent ) ); if ( f.open( FileName( syspath, "EVENTS.PRO" ) ) ) { for(;;) { if ( f.read( & e, sizeof( e ) ) != sizeof( e ) ) { break; } if ( e.minutesleft() <= nextevent.minutesleft() ) { nextevent = e; } } } num_users = int( User::numUsers() ); // user.gentops(); }