summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Lutz <michi@icosahedron.de>2020-05-17 23:32:10 +0200
committerMichael Lutz <michi@icosahedron.de>2020-05-21 20:02:34 +0200
commitc972a63c8cbee7fa8d6d5af2cbbecb8c75ee561a (patch)
tree70d5b6c477666170f07469ba769adc4ec629a91c
parent37bc2f806462b3c2a84891b3aad6db00e935da86 (diff)
downloadopenttd-c972a63c8cbee7fa8d6d5af2cbbecb8c75ee561a.tar.xz
Codechange: Store info about the dedicated server log file in globals with automatic destruction to simplify control flow in openttd_main.
-rw-r--r--src/dedicated.cpp14
-rw-r--r--src/fileio.cpp5
-rw-r--r--src/fileio_func.h8
-rw-r--r--src/openttd.cpp29
4 files changed, 26 insertions, 30 deletions
diff --git a/src/dedicated.cpp b/src/dedicated.cpp
index 8ab035e61..fe3cd7cfb 100644
--- a/src/dedicated.cpp
+++ b/src/dedicated.cpp
@@ -8,9 +8,11 @@
/** @file dedicated.cpp Forking support for dedicated servers. */
#include "stdafx.h"
+#include "fileio_func.h"
+#include <string>
-char *_log_file = nullptr; ///< File to reroute output of a forked OpenTTD to
-FILE *_log_fd = nullptr; ///< File to reroute output of a forked OpenTTD to
+std::string _log_file; ///< File to reroute output of a forked OpenTTD to
+std::unique_ptr<FILE, FileDeleter> _log_fd; ///< File to reroute output of a forked OpenTTD to
#if defined(UNIX)
@@ -38,17 +40,17 @@ void DedicatedFork()
case 0: { // We're the child
/* Open the log-file to log all stuff too */
- _log_fd = fopen(_log_file, "a");
- if (_log_fd == nullptr) {
+ _log_fd.reset(fopen(_log_file.c_str(), "a"));
+ if (!_log_fd) {
perror("Unable to open logfile");
exit(1);
}
/* Redirect stdout and stderr to log-file */
- if (dup2(fileno(_log_fd), fileno(stdout)) == -1) {
+ if (dup2(fileno(_log_fd.get()), fileno(stdout)) == -1) {
perror("Rerouting stdout");
exit(1);
}
- if (dup2(fileno(_log_fd), fileno(stderr)) == -1) {
+ if (dup2(fileno(_log_fd.get()), fileno(stderr)) == -1) {
perror("Rerouting stderr");
exit(1);
}
diff --git a/src/fileio.cpp b/src/fileio.cpp
index 5797c592b..f17a0ffc0 100644
--- a/src/fileio.cpp
+++ b/src/fileio.cpp
@@ -1245,8 +1245,9 @@ void DeterminePaths(const char *exe)
free(tmp);
}
- extern char *_log_file;
- _log_file = str_fmt("%sopenttd.log", _personal_dir);
+ extern std::string _log_file;
+ _log_file = _personal_dir;
+ _log_file += "openttd.log";
}
/**
diff --git a/src/fileio_func.h b/src/fileio_func.h
index dec193193..d95131880 100644
--- a/src/fileio_func.h
+++ b/src/fileio_func.h
@@ -159,4 +159,12 @@ public:
}
};
+/** Helper to manage a FILE with a \c std::unique_ptr. */
+struct FileDeleter {
+ void operator()(FILE *f)
+ {
+ if (f) fclose(f);
+ }
+};
+
#endif /* FILEIO_FUNC_H */
diff --git a/src/openttd.cpp b/src/openttd.cpp
index 980eb2f13..94c6f4a98 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -543,7 +543,7 @@ int openttd_main(int argc, char *argv[])
Dimension resolution = {0, 0};
/* AfterNewGRFScan sets save_config to true after scanning completed. */
bool save_config = false;
- AfterNewGRFScan *scanner = new AfterNewGRFScan(&save_config);
+ std::unique_ptr<AfterNewGRFScan> scanner(new AfterNewGRFScan(&save_config));
bool dedicated = false;
char *debuglog_conn = nullptr;
@@ -637,7 +637,7 @@ int openttd_main(int argc, char *argv[])
DeterminePaths(argv[0]);
if (StrEmpty(mgo.opt)) {
ret = 1;
- goto exit_noshutdown;
+ return ret;
}
char title[80];
@@ -654,12 +654,11 @@ int openttd_main(int argc, char *argv[])
GetString(buf, _load_check_data.error, lastof(buf));
fprintf(stderr, "%s\n", buf);
}
- goto exit_noshutdown;
+ return ret;
}
WriteSavegameInfo(title);
-
- goto exit_noshutdown;
+ return ret;
}
case 'G': scanner->generation_seed = strtoul(mgo.opt, nullptr, 10); break;
case 'c': free(_config_file); _config_file = stredup(mgo.opt); break;
@@ -683,8 +682,7 @@ int openttd_main(int argc, char *argv[])
BaseSounds::FindSets();
BaseMusic::FindSets();
ShowHelp();
-
- goto exit_noshutdown;
+ return ret;
}
DeterminePaths(argv[0]);
@@ -785,8 +783,7 @@ int openttd_main(int argc, char *argv[])
if (!HandleBootstrap()) {
ShutdownGame();
-
- goto exit_bootstrap;
+ return ret;
}
VideoDriver::GetInstance()->ClaimMousePointer();
@@ -842,8 +839,7 @@ int openttd_main(int argc, char *argv[])
CheckForMissingGlyphs();
/* ScanNewGRFFiles now has control over the scanner. */
- ScanNewGRFFiles(scanner);
- scanner = nullptr;
+ ScanNewGRFFiles(scanner.release());
VideoDriver::GetInstance()->MainLoop();
@@ -860,17 +856,6 @@ int openttd_main(int argc, char *argv[])
/* Reset windowing system, stop drivers, free used memory, ... */
ShutdownGame();
-
-exit_noshutdown:
-exit_bootstrap:
-
- delete scanner;
-
- extern FILE *_log_fd;
- if (_log_fd != nullptr) {
- fclose(_log_fd);
- }
-
return ret;
}