Config->forcedebug = do_debug;
Config->writelog = !do_nolog;
Config->ClearStack();
- Config->Read(true, NULL);
- // Get XLine to do it's thing.
- this->XLines->CheckELines();
- this->XLines->ApplyLines();
-
- /*
- * Initialise SID/UID.
- * For an explanation as to exactly how this works, and why it works this way, see GetUID().
- * -- w00t
- */
- /* Generate SID */
- size_t sid = 0;
- if (Config->sid)
- {
- sid = Config->sid;
- }
- else
- {
- for (const char* x = Config->ServerName; *x; ++x)
- sid = 5 * sid + *x;
- for (const char* y = Config->ServerDesc; *y; ++y)
- sid = 5 * sid + *y;
- sid = sid % 999;
-
- Config->sid = sid;
- }
-
- this->InitialiseUID();
+ this->Modes = new ModeParser(this);
- /* set up fake client */
+ /* set up fake client (uid is incorrect at this point,
+ * until after config is read. we set up the user again
+ * at that point
+ */
this->FakeClient = new User(this);
this->FakeClient->SetFd(FD_MAGIC_NUMBER);
SE->RecoverFromFork();
- this->Modes = new ModeParser(this);
- this->AddServerName(Config->ServerName);
- CheckDie();
- int bounditems = BindPorts(true, found_ports, pl);
+ this->Res = new DNS(this);
- for(int t = 0; t < 255; t++)
- Config->global_implementation[t] = 0;
+ /* Read config, pass 0. At the end if this pass,
+ * the Config->IncludeFiles is populated, we call
+ * Config->StartDownloads to initialize the downlaods of all
+ * these files.
+ */
+ Config->Read(true, NULL, 0);
+ Config->StartDownloads();
+
+ /* Now the downloads are started, we monitor them for completion.
+ * On completion, we call Read again with pass = 1.
+ * NOTE: We really should add a timeout here
+ */
- memset(&Config->implement_lists,0,sizeof(Config->implement_lists));
+ while (Config->Downloading())
+ {
+ SE->DispatchEvents();
+ this->BufferedSocketCull();
+ }
printf("\n");
- this->Res = new DNS(this);
+ if (Config->FileErrors)
+ {
+ /* One or more file download/access errors, do not
+ * proceed to second pass
+ */
+ for (std::map<std::string, std::istream*>::iterator x = Config->IncludedFiles.begin(); x != Config->IncludedFiles.end(); ++x)
+ {
+ if (!x->second)
+ printf("ERROR: Failed to access the file: %s.\n", x->first.c_str());
+ }
+ printf("Initialisation of configuration failed.\n");
+ Exit(EXIT_STATUS_CONFIG);
+ }
+
+ /* We have all the files we can get, initiate pass 1 */
+ Config->Read(true, NULL, 1);
+
+ this->AddServerName(Config->ServerName);
+
+ /* set up fake client again this time with the correct uid */
+ delete FakeClient;
+ this->FakeClient = new User(this);
+ this->FakeClient->SetFd(FD_MAGIC_NUMBER);
+
+ /*
+ * Initialise SID/UID.
+ * For an explanation as to exactly how this works, and why it works this way, see GetUID().
+ * -- w00t
+ */
+ /* Generate SID */
+ size_t sid = 0;
+ if (Config->sid)
+ {
+ sid = Config->sid;
+ }
+ else
+ {
+ for (const char* x = Config->ServerName; *x; ++x)
+ sid = 5 * sid + *x;
+ for (const char* y = Config->ServerDesc; *y; ++y)
+ sid = 5 * sid + *y;
+ sid = sid % 999;
+
+ Config->sid = sid;
+ }
+
+ this->InitialiseUID();
+
+ // Get XLine to do it's thing.
+ this->XLines->CheckELines();
+ this->XLines->ApplyLines();
+
+
+ CheckDie();
+ int bounditems = BindPorts(true, found_ports, pl);
+
+ printf("\n");
- this->Modules->LoadAll();
+ /*this->Modules->LoadAll();*/
/* Just in case no modules were loaded - fix for bug #101 */
this->BuildISupport();