+ /* Globale Variablen initialisieren */
+ NGIRCd_Start = time( NULL );
+ (VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
+ NGIRCd_Restart = FALSE;
+ NGIRCd_Quit = FALSE;
+
+ /* Module initialisieren */
+ Log_Init( );
+ Resolve_Init( );
+ Conf_Init( );
+ Lists_Init( );
+ Channel_Init( );
+ Client_Init( );
+ Conn_Init( );
+
+ /* Wenn als root ausgefuehrt und eine andere UID
+ * konfiguriert ist, jetzt zu dieser wechseln */
+ if( getuid( ) == 0 )
+ {
+ if( Conf_GID != 0 )
+ {
+ /* Neue Group-ID setzen */
+ if( setgid( Conf_GID ) != 0 ) Log( LOG_ERR, "Can't change Group-ID to %u: %s", Conf_GID, strerror( errno ));
+ }
+ if( Conf_UID != 0 )
+ {
+ /* Neue User-ID setzen */
+ if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change User-ID to %u: %s", Conf_UID, strerror( errno ));
+ }
+ }
+ Log( LOG_INFO, "Running as user %ld, group %ld, with PID %ld.", (INT32)getuid( ), (INT32)getgid( ), (INT32)getpid( ));
+
+ Log_InitErrorfile( );
+
+ /* Signal-Handler initialisieren */
+ Initialize_Signal_Handler( );
+
+ /* Protokoll- und Server-Identifikation erzeugen. Die vom ngIRCd
+ * beim PASS-Befehl verwendete Syntax sowie die erweiterten Flags
+ * sind in doc/Protocol.txt beschrieben. */
+ sprintf( NGIRCd_ProtoID, "%s%s %s|%s:", PROTOVER, PROTOSUFFIX, PACKAGE, VERSION );
+ if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" );
+ strcat( NGIRCd_ProtoID, " P" );
+ Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID );
+
+ /* Vordefinierte Channels anlegen */
+ Channel_InitPredefined( );
+
+ /* Listen-Ports initialisieren */
+ Initialize_Listen_Ports( );
+
+ /* Hauptschleife */
+ Conn_Handler( );
+
+ /* Alles abmelden */
+ Conn_Exit( );
+ Client_Exit( );
+ Channel_Exit( );
+ Lists_Exit( );
+ Log_Exit( );
+ }
+