/************************************************************************/ /* */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* *************** *************** */ /* ***************** ***************** */ /* *************** *************** */ /* ***** ***** TheNetNode */ /* ***** ***** Portable */ /* ***** ***** Network */ /* ***** ***** Software */ /* */ /* File src/main.c (maintained by: ???) */ /* */ /* This file is part of "TheNetNode" - Software Package */ /* */ /* Copyright (C) 1998 - 2008 NORD> #ifdef __GO32__ #define ptrdiff_t int #endif extern int console_login_status; static void initvar(void); static void main_loop(void); static void mainf(void); #ifdef SETPATH static void SetPath(void); #endif /* SETPATH */ static void initvar(void) { int port, i; PORTINFO *p; BEACON *b; memset(mh, 0, sizeof(STAT)*MAXSTAT); memset(portstat, 0, sizeof(PORTSTAT)*L2PNUM); for (port = 0, p = &portpar[0], b = &beacon[0]; port < L2PNUM; port++, p++, b++) { sprintf(p->name, "Port%u", port); /* Portnamen eintragen */ p->mtu = 256; p->l1mode = p->l2mode = 0; p->l1_tx_timer = 0; p->txdelay = 25; p->persistance = 128; p->slottime = 10; #ifdef PORT_MANUELL p->paclen = 128; p->IRTT = 200; p->T2 = 10; p->T3 = 18000; #else p->IRTT = 500; p->T2 = 150; #endif /* PORT_MANUELL */ #ifdef IPOLL_FRAME p->ipoll_paclen = 128; p->ipoll_retry = 3; #endif /* IPOLL_FRAME */ #ifdef PORT_L2_CONNECT_TIME p->l2_connect_time = 120; #endif #ifdef PORT_L2_CONNECT_RETRY p->l2_connect_retry = 3; #endif #ifdef AUTOROUTING p->poAuto = L_NOROUTE; #endif /* AUTOROUTING */ #ifdef THENETMOD p->broadcast = broint_ui; /* Timer fuer Broadcast-Nodes Bake. */ #endif /* THENETMOD */ p->maxframe = 2; #ifdef EAX25 p->maxframe_eax = 16; /* Standard: Maxframe 16 */ p->eax_behaviour = 1; /* Mode nach MHEARD */ #endif p->retry = 15; #ifdef SETTAILTIME #ifdef MC68302 p->tailtime = TAILTIME*10; #else p->tailtime = TAILTIME; #endif #endif #ifdef EXPERTPARAMETER p->l2autoparam = ~0L; #endif p->nmblks = p->nmbstn = 0; #ifdef DAMASLAVE p->damaok = 0; p->sendok = 0; #endif #ifdef USERMAXCON p->maxcon = 0; #endif #ifdef PACSAT pacsat_enabled[port] = FALSE; #endif cpyid(b->beades, "QST \140"); b->beadil[0] = b->text[0] = NUL; b->interval = b->beatim = b->telemetrie = 0; } for (i = 0; i < MAXSUSPEND; i++) *sustab[i].call = NUL; #ifdef GRAPH graphclear(); #endif } void memerr(void) { hputs("*** ERROR: Not enough Memory!\n"); exit(10); } int main(int argc, char *argv[]) { #if defined(__GO32__) static char *line; char drive[MAXDRIVE]; char path[MAXDIR]; char name[MAXFILE]; char ext[MAXEXT]; #endif #ifdef __WIN32__ SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ); #endif /* Hardwarespezifische Sachen (Uhr nachstellen, UTC ins Enviroment, */ /* Kommandozeile auswerten steht jetzt in init_hardware(). */ if (init_hardware(argc, argv)) /* Hardwarespezifische Sachen */ exit(1); time(&start_time); /* Startzeit merken */ clear_time = start_time; /**********************************************************************/ /* Speicher besorgen */ /**********************************************************************/ VMSG("--- Allocating mem for LinkTable ...\n"); lnktbl = (LNKBLK *) malloc (sizeof(LNKBLK) * (LINKNMBR )); VMSG("--- Allocating mem for CircuitTable ...\n"); cirtab = (CIRBLK *) malloc (sizeof(CIRBLK) * (NUMCIR )); VMSG("--- Allocating mem for PatchcordTable ...\n"); ptctab = (PTCENT *) malloc (sizeof(PTCENT) * (NUMPAT )); VMSG("--- Allocating mem for HostTable ...\n"); hstubl = (HOSTUS *) malloc (sizeof(HOSTUS) * (MAXHST )); #ifdef L1TCPIP VMSG("--- Allocating mem for TcpipTable ...\n"); tcptbl = (TCPIP *) malloc (sizeof(TCPIP) * (MAXTCPIP )); #endif /* L1TCPIP */ if (lnktbl == NULL || cirtab == NULL || ptctab == NULL || #ifdef L1TCPIP tcptbl == NULL || #endif /* L1TCPIP */ hstubl == NULL ) memerr(); VMSG("--- Initializing variables ...\n"); initvar(); /* Variablen Initialisieren */ /**********************************************************************/ /* Configuration laden */ /**********************************************************************/ *confpath = NUL; #if defined(__GO32__) fnsplit(argv[0],drive,path,name,ext); /* Pfad zu TNN.EXE ermitteln, */ strcpy(confpath,drive); /* dort auch die .cfg Dateien! */ strcat(confpath,path); strcpy(exename, argv[0]); /* Name der EXE merken */ normfname(exename); /* normieren */ #endif /* wird aus dem aktuellen Verzeichniss gestartet, dann ist das der */ /* ConfPath (Dose gibt "" zurueck !) */ #ifndef MC68302 /* DL1HAZ 01.02.95 */ if (*confpath == NUL) /* sonst wie Atari */ getcwd(confpath,MAXPATH); /* Aktuelles Verzeichnis, Suchpfad */ addslash(confpath); #endif if (load_configuration() == FALSE) /* Configuration laden */ hprintf("*** WARNING: Error reading %s.PAS ***\n",cfgfile); if (load_stat() == FALSE) /* Statistik laden */ hprintf("*** WARNING: Error reading %s.STA ***\n",cfgfile); #ifdef GRAPH if (load_graph() == FALSE) /* Graphen laden */ hprintf("*** WARNING: Error reading GRAPH.STA ***\n"); graph.enabled = FALSE; /* wird erst nach einer Minute */ /* auf TRUE gesetzt */ #endif #ifdef SETPATH SetPath(); #endif /* WIN32 */ #ifdef MC68302 strcpy(confpath, textpath); strcpy(msgpath, textpath); #else xchdir(textpath); /* Aktuelles Laufwerk und Pfad */ #if defined(__GO32__) line = malloc(MAXPATH); /* Pfad zu den Konfigurations- */ strcpy(line,"CONFPATH="); /* dateien */ strcat(line,confpath); if (putenv(line) == -1) printf("*** WARNING: Enviroment full ***\n"); line = malloc(MAXPATH); /* Temporaerpfad umleiten */ strcpy(line,"TMP="); strcat(line,textpath); if (putenv(line) == -1) printf("*** WARNING: Enviroment full ***\n"); #ifdef __GO32__ line = malloc(MAXPATH); /* Temporaerpfad umleiten */ strcpy(line,"TMPDIR="); strcat(line,textpath); if (putenv(line) == -1) printf("*** WARNING: Enviroment full ***\n"); #endif #endif if (getenv("MSGPATH") == NULL) { #if defined(__GO32__) line = malloc(MAXPATH); strcpy(line,"MSGPATH="); /* MSGPATH auf TEXTPATH setzten */ strcat(line,textpath); if (putenv(line) == -1) printf("*** WARNING: Enviroment full ***\n"); #endif #if defined(__WIN32__) strcpy(msgpath, textpath); /* MSGPATH auf TEXTPATH setzten */ strcat(msgpath, "msg"); addslash(msgpath); #endif /* WIN32 */ } else { strcpy(msgpath, getenv("MSGPATH")); addslash(msgpath); } #endif #ifndef MC68302 init_rs232(); /* Schnittstellen */ init_host(); /* Host-Schnittstelle */ init_timer(); /* Timer initialisieren */ #else init_host(); /* Host-Schnittstelle */ init_timer(); /* Timer initialisieren */ mem_init(); #endif /**********************************************************************/ /* Software initialisieren */ /**********************************************************************/ VMSG("--- Initializing Level 1 ...\n"); l1init(); /* Level 1 initialisieren */ VMSG("--- Initializing Level 2 ...\n"); l2init(); /* L2 */ VMSG("--- Initializing Level 3 ...\n"); l3init(); /* L3 */ VMSG("--- Initializing Level 4 ...\n"); initl4(); /* L4 */ VMSG("--- Initializing Level 7 ...\n"); initl7(); /* L7 */ #ifdef PACSAT VMSG("--- Initializing PACSAT ...\n"); pacsat_init(); /* PACSAT-Broadcast */ #endif #ifdef IPROUTE VMSG("--- Initializing IP-router ...\n"); ipinit(); /* IP-Router initialisieren */ #endif #ifdef L1TCPIP VMSG("--- Initializing L1TCPIP ...\n"); InitTCP(); /* TCPIP Initialisieren. */ #endif /* L1TCPIP */ VMSG("--- Initializing MHeard ...\n"); init_mh(); /* MHEARD Liste laden */ #ifdef SPEECH speech_init(); /* Sprache initialisieren */ #endif VMSG("*** Entering main loop ...\n"); mainf(); /* ab in die Hauptschleife */ return(0); /* hierhin kommen wir niemals! */ } #ifdef ST char *wowarich; #endif /************************************************************************/ /* die Hauptschleife ---*/ /*----------------------------------------------------------------------*/ static void main_loop(void) { prof_start(PROF_SUM); PROFILE(PROF_L2,"l2",l2); PROFILE(PROF_L3RX,"l3rx",l3rx); PROFILE(PROF_L7RX,"l7rx",l7rx); PROFILE(PROF_TIM,"timsrv",timsrv); #ifdef PACSAT PROFILE(PROF_PAC,"pacsrv",pacsrv); #endif #ifdef IPROUTE PROFILE(PROF_IP,"ipserv",ipserv); #endif #ifdef TCP_STACK PROFILE(PROF_STACK,"StackSRV",StackSRV); #endif /* TCP_STACK */ #ifdef L1TCPIP PROFILE(PROF_TCPIP,"TcpipSRV",TcpipSRV); #endif /* L1TCPIP */ PROFILE(PROF_L4,"l4rest",l4rest); PROFILE(PROF_L3,"l3rest",l3rest); PROFILE(PROF_L7TX,"l7tx",l7tx); PROFILE(PROF_L4TX,"l4tx",l4tx); PROFILE(PROF_L3TX,"l3tx",l3tx); PROFILE(PROF_L1,"l1rxtx",l1rxtx); prof_stop(PROF_SUM); #ifndef MC68K PROFILE(PROF_UPD,"timer",update_timer); #endif } /************************************************************************/ /* das Programm persoenlich... ---*/ /*----------------------------------------------------------------------*/ static void mainf(void) { #ifdef ST ULONG t; #endif hputs(signon); hputid(myid); hprintf(")\r" "Copyright by NORD> tic10) /* zusaetzliche 5s Ruhe fuer den Tokenring */ { l1rxtx(); hostsv(); hostim(); l7rx(); l7tx(); dealml((LEHEAD*)&rxfl); } #endif #ifdef AXIPR_UDP /* Sperre zuruecksetzen. */ LookAX25IP = FALSE; #endif /* AXIPR_UDP */ VMSG("*** All done. Here we go ...\n\n"); hputs("password: "); /* Die Start-TNB wurde geladen, jetzt koennen wir anfangen */ LOOP main_loop(); } /************************************************************************/ /* Programm Ende, aufraeumen */ /************************************************************************/ void quit_program(int exit_code) { #ifdef SPEECH printf(speech_message(280)); #else printf("Programm wird beendet!\n"); #endif if ( console_login_status || exit_code == -1 #ifdef ST || exit_code == 2 #endif ) { exit_mh(); /* MH-Liste sichern */ save_stat(); #ifdef GRAPH save_graph(); #endif #ifndef MC68302 /*hier nur noch auf Anforderung */ #ifndef DEBUG if (nmbfre >= 600) /* nur wenn genug Buffer da ! */ save_parms(); /* Braucht 500 Buffer! */ #endif personalmanager(SAVE,NULL,NULL); /* Pers. Daten fuer Convers */ #ifdef USERPROFIL SaveProfil(); #endif /* USERPROFIL */ exit_timer(); /* Timer in Ursprungszustand */ l1exit(); /* L1 zuruecksetzen! */ exit_hardware(); /* Andere Hardware in Ursprungs.*/ exit_host(); /* Console schliessen */ #else personalmanager(SAVE,NULL,NULL); /* Pers. Daten fuer Convers */ exit_hardware(); /* Andere Hardware in Ursprungs.*/ #endif #ifdef ALIASCMD /* Aliasliste loeschen */ clean_aliaslist(); #endif /* Netzwerk deregistieren */ unregister_network(); /* Speicher freigeben */ free (lnktbl); free (cirtab); free (ptctab); free (hstubl); #ifdef L1TCPIP free (tcptbl); #endif /* L1TCPIP */ /* und tschuess.... */ exit(exit_code); } } #ifdef SETPATH /* System Pfade setzen. */ static void SetPath(void) { #ifdef __LINUX__ mode_t mode = 0775; #endif /* LINUX */ #ifdef __GO32__ mode_t mode = S_IWUSR; #endif /* GO32 */ strcpy(textpath, confpath); /* TEXTPATH setzen */ strcpy(textcmdpath, confpath); /* TEXTCMDPATH setzen */ strcat(textcmdpath, "textcmd"); addslash(textcmdpath); #if defined(__LINUX__) || defined(__GO32__) mkdir(textcmdpath, mode); /* Verzeichnis textcmd erstellen */ #else mkdir(textcmdpath); /* Verzeichnis textcmd erstellen */ #endif /* LINUX / GO32 */ strcpy(userexepath, textpath); /* USEREXEPATH setzen */ strcat(userexepath, "userexe"); addslash(userexepath); #if defined(__LINUX__) || defined(__GO32__) mkdir(userexepath, mode); /* Verzeichnis USEREXE erstllen */ #else mkdir(userexepath); /* Verzeichnis USEREXE erstllen */ #endif /* LINUX / GO32 */ strcpy(sysopexepath, textpath);/* SYSOEXEPATH setzen */ strcat(sysopexepath, "sysexe"); addslash(sysopexepath); #if defined(__LINUX__) || defined(__GO32__) mkdir(sysopexepath, mode); /* Verzeichnis SYSEXE erstllen */ #else mkdir(sysopexepath); /* Verzeichnis SYSEXE erstllen */ #endif /* LINUX / GO32 */ strcpy(msgpath, textpath); /* MSGPATH setzen */ strcat(msgpath, "msg"); addslash(msgpath); #if defined(__LINUX__) || defined(__GO32__) mkdir(msgpath, mode); /* Verzeichnis MSG erstllen */ #else mkdir(msgpath); /* Verzeichnis MSG erstllen */ #endif /* LINUX / GO32 */ #ifdef PACSAT strcpy(pacsatpath, textpath); /* PACSATPATH setzen */ strcat(pacsatpath, "pacsat"); addslash(pacsatpath); #if defined(__LINUX__) || defined(__GO32__) mkdir(pacsatpath, mode); /* Verzeichnis PACSAT erstllen */ #else mkdir(pacsatpath); /* Verzeichnis PACSAT erstllen */ #endif /* LINUX / GO32 */ #endif /* PACSAT */ #ifdef SPEECH strcpy(speechpath, textpath); /* SPEECHPATH setzen */ strcat(speechpath, "speech"); addslash(speechpath); #if defined(__LINUX__) || defined(__GO32__) mkdir(speechpath, mode); /* Verzeichnis SPEECH erstllen */ #else mkdir(speechpath); /* Verzeichnis SPEECH erstllen */ #endif /* LINUX / GO32 */ #endif /* SPEECH */ } #endif /* SETPATH */ /* End of src/main.c */