+ /* 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 ));
+ }
+ }
+
+ /* User, Gruppe und Prozess-ID des Daemon ausgeben */
+ pwd = getpwuid( getuid( )); grp = getgrgid( getgid( ));
+ Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), (LONG)getpid( ));
+
+ /* stderr in "Error-File" umlenken */
+ 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. */
+#ifdef IRCPLUS
+ sprintf( NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE, VERSION, IRCPLUSFLAGS );
+#ifdef USE_ZLIB
+ strcat( NGIRCd_ProtoID, "Z" );
+#endif
+ if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" );
+#else
+ sprintf( NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE, VERSION );
+#endif
+ strcat( NGIRCd_ProtoID, " P" );
+#ifdef USE_ZLIB
+ strcat( NGIRCd_ProtoID, "Z" );
+#endif
+ Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID );
+
+ /* Vordefinierte Channels anlegen */
+ Channel_InitPredefined( );
+
+ /* Listen-Ports initialisieren */
+ if( Conn_InitListeners( ) < 1 )
+ {
+ Log( LOG_ALERT, "Server isn't listening on a single port!" );
+ Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE );
+ exit( 1 );
+ }
+
+ /* Hauptschleife */
+ Conn_Handler( );
+
+ /* Alles abmelden */
+ Conn_Exit( );
+ Client_Exit( );
+ Channel_Exit( );
+ Lists_Exit( );
+ Log_Exit( );
+ }
+