From c972a63c8cbee7fa8d6d5af2cbbecb8c75ee561a Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Sun, 17 May 2020 23:32:10 +0200 Subject: Codechange: Store info about the dedicated server log file in globals with automatic destruction to simplify control flow in openttd_main. --- src/dedicated.cpp | 14 ++++++++------ src/fileio.cpp | 5 +++-- src/fileio_func.h | 8 ++++++++ src/openttd.cpp | 29 +++++++---------------------- 4 files changed, 26 insertions(+), 30 deletions(-) (limited to 'src') 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 -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 _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 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; } -- cgit v1.2.3-70-g09d2