OpenTTD Source: src/fileio.cpp File Reference

OpenTTD Source 14.0-beta3

Typedefs | Functions | Variables
fileio.cpp File Reference
`#include "stdafx.h"`
`#include "fileio_func.h"`
`#include "spriteloader/spriteloader.hpp"`
`#include "debug.h"`
`#include "fios.h"`
`#include "string_func.h"`
`#include "tar_type.h"`
`#include <unistd.h>`
`#include <pwd.h>`
`#include <sys/stat.h>`
`#include <sstream>`
`#include <filesystem>`
`#include "safeguards.h"`

Go to the source code of this file.

## Typedefs
typedef std::map< std::string, std::string > | TarLinkList

## Functions
bool | FiosIsValidFile (const std::string &path, const struct dirent *ent, struct stat *sb)
static bool | IsValidSearchPath (Searchpath sp)
| Checks whether the given search path is a valid search path. More...
static void | FillValidSearchPaths (bool only_local_path)
bool | FioCheckFileExists (const std::string &filename, Subdirectory subdir)
| Check whether the given file exists. More...
bool | FileExists (const std::string &filename)
| Test whether the given filename exists. More...
void | FioFCloseFile (FILE *f)
| Close a file in a safe way.
std::string | FioFindFullPath (Subdirectory subdir, const std::string &filename)
| Find a path to the filename in one of the search directories. More...
std::string | FioGetDirectory (Searchpath sp, Subdirectory subdir)
std::string | FioFindDirectory (Subdirectory subdir)
static FILE * | FioFOpenFileSp (const std::string &filename, const char *mode, Searchpath sp, Subdirectory subdir, size_t *filesize)
FILE * | FioFOpenFileTar (const TarFileListEntry &entry, size_t *filesize)
| Opens a file from inside a tar archive. More...
FILE * | FioFOpenFile (const std::string &filename, const char *mode, Subdirectory subdir, size_t *filesize)
| Opens a OpenTTD file somewhere in a personal or global directory. More...
void | FioCreateDirectory (const std::string &name)
| Create a directory with the given name If the parent directory does not exist, it will try to create that as well. More...
void | AppendPathSeparator (std::string &buf)
| Appends, if necessary, the path separator character to the end of the string. More...
static void | TarAddLink (const std::string &srcParam, const std::string &destParam, Subdirectory subdir)
static void | SimplifyFileName (std::string &name)
| Simplify filenames from tars. More...
static std::string | ExtractString (char *buffer, size_t buffer_length)
| Helper to extract a string for the tar header. More...
bool | ExtractTar (const std::string &tar_filename, Subdirectory subdir)
| Extract the tar with the given filename in the directory where the tar resides. More...
static bool | ChangeWorkingDirectoryToExecutable (const char *exe)
| Changes the working directory to the path of the give executable. More...
bool | DoScanWorkingDirectory ()
| Whether we should scan the working directory. More...
static std::string | GetHomeDir ()
| Gets the home directory of the user. More...
void | DetermineBasePaths (const char *exe)
| Determine the base (personal dir and game data dir) paths. More...
void | DeterminePaths (const char *exe, bool only_local_path)
| Acquire the base paths (personal dir and game data dir), fill all other paths (save dir, autosave dir etc) and make the save and scenario directories. More...
void | SanitizeFilename (std::string &filename)
| Sanitizes a filename, i.e. More...
std::unique_ptr< char[]> | ReadFileToMem (const std::string &filename, size_t &lenp, size_t maxsize)
| Load a file into memory. More...
static bool | MatchesExtension (const char *extension, const char *filename)
| Helper to see whether a given filename matches the extension. More...
static uint | ScanPath (FileScanner *fs, const char *extension, const char *path, size_t basepath_length, bool recursive)
| Scan a single directory (and recursively its children) and add any graphics sets that are found. More...
static uint | ScanTar (FileScanner *fs, const char *extension, const TarFileList::value_type &tar)
| Scan the given tar and add graphics sets when it finds one. More...

## Variables
static bool | _do_scan_working_directory = true
| Whether the working directory should be scanned.
std::string | _config_file
| Configuration file of OpenTTD.
std::string | _highscore_file
| The file to store the highscore data in.
static const char *const | _subdirs []
std::array< std::string, NUM_SEARCHPATHS > | _searchpaths
| The search paths OpenTTD could search through. More...
std::vector< Searchpath > | _valid_searchpaths
std::array< TarList, NUM_SUBDIRS > | _tar_list
TarFileList | _tar_filelist [NUM_SUBDIRS]
static TarLinkList | _tar_linklist [NUM_SUBDIRS]
| List of directory links.
std::string | _personal_dir
| custom directory for personal settings, saves, newgrf, etc.

## Detailed Description

Standard In/Out file operations

Definition in file fileio.cpp.

## Function Documentation

## ◆ AppendPathSeparator()

void AppendPathSeparator | ( | std::string & | buf | ) |

Appends, if necessary, the path separator character to the end of the string.

It does not add the path separator to zero-sized strings.

Parameters

  buf | string to append the separator to

Returns
  true iff the operation succeeded

Definition at line 377 of file fileio.cpp.

Referenced by FileScanner::Scan().

## ◆ ChangeWorkingDirectoryToExecutable()

static bool ChangeWorkingDirectoryToExecutable | ( | const char * | exe | ) |
| static

Changes the working directory to the path of the give executable.

For OSX application bundles '.app' is the required extension of the bundle, so when we crop the path to there, when can remove the name of the bundle in the same way we remove the name from the executable name.

Parameters

  exe | the path to the executable

Definition at line 756 of file fileio.cpp.

References StrEqualsIgnoreCase().

## ◆ DetermineBasePaths()

void DetermineBasePaths | ( | const char * | exe | ) |

Determine the base (personal dir and game data dir) paths.

Parameters

  exe | the path to the executable

Definition at line 834 of file fileio.cpp.

References GetHomeDir().

Referenced by DeterminePaths().

## ◆ DeterminePaths()

void DeterminePaths | ( | const char * | exe,
|  | bool | only_local_path
| ) |  |

Acquire the base paths (personal dir and game data dir), fill all other paths (save dir, autosave dir etc) and make the save and scenario directories.

Parameters

  exe | the path from the current path to the executable
  only_local_path | Whether we shouldn't fill searchpaths with global folders.

Definition at line 962 of file fileio.cpp.

References DetermineBasePaths().

## ◆ DoScanWorkingDirectory()

bool DoScanWorkingDirectory | ( |  | ) |

Whether we should scan the working directory.

It should not be scanned if it's the root or the home directory as in both cases a big data directory can cause huge amounts of unrelated files scanned. Furthermore there are nearly no use cases for the home/root directory to have OpenTTD directories.

Returns
  true if it should be scanned.

Definition at line 792 of file fileio.cpp.

References _searchpaths, and SP_WORKING_DIR.

## ◆ ExtractString()

static std::string ExtractString | ( | char * | buffer,
|  | size_t | buffer_length
| ) |  |
| static

Helper to extract a string for the tar header.

We must assume that the tar header contains garbage and is malicious. So, we cannot rely on the string being properly terminated. As such, do not use strlen to determine the actual length (explicitly or implictly via the std::string constructor), but also do not create a string of the buffer length as that makes the string contain essentially garbage.

Parameters

  buffer | The buffer to read from.
  buffer_length | The length of the buffer to read from.

Returns
  The string data.

Definition at line 486 of file fileio.cpp.

References StrMakeValid().

## ◆ ExtractTar()

bool ExtractTar | ( | const std::string & | tar_filename,
|  | Subdirectory | subdir
| ) |  |

Extract the tar with the given filename in the directory where the tar resides.

Parameters

  tar_filename | the name of the tar to extract.
  subdir | The sub directory the tar is in.

Returns
  false on failure.

Definition at line 677 of file fileio.cpp.

## ◆ FileExists()

bool FileExists | ( | const std::string & | filename | ) |

Test whether the given filename exists.

Parameters

  filename | the file to test.

Returns
  true if and only if the file exists.

Definition at line 140 of file fileio.cpp.

References OTTD2FS().

Referenced by NetworkHTTPInitialize().

## ◆ FioCheckFileExists()

bool FioCheckFileExists | ( | const std::string & | filename,
|  | Subdirectory | subdir
| ) |  |

Check whether the given file exists.

Parameters

  filename | the file to try for existence.
  subdir | the subdirectory to look in

Returns
  true if and only if the file can be opened

Definition at line 126 of file fileio.cpp.

References FioFCloseFile(), and FioFOpenFile().

Referenced by FillGRFDetails(), GetMusicCatEntryData(), GetMusicCatEntryName(), GRFLoadConfig(), and SaveLoadWindow::OnTimeout().

## ◆ FioCreateDirectory()

void FioCreateDirectory | ( | const std::string & | name | ) |

Create a directory with the given name If the parent directory does not exist, it will try to create that as well.

Parameters

  name | the new name of the directory

Definition at line 349 of file fileio.cpp.

## ◆ FioFindFullPath()

std::string FioFindFullPath | ( | Subdirectory | subdir,
|  | const std::string & | filename
| ) |  |

Find a path to the filename in one of the search directories.

Parameters

  subdir | Subdirectory to try.
  filename | Filename to look for.

Returns
  String containing the path if the path was found, else an empty string.

Definition at line 159 of file fileio.cpp.

References NUM_SUBDIRS.

Referenced by MidiFile::GetSMFFile(), DriverFactoryBase::MarkVideoDriverOperational(), and DriverFactoryBase::SelectDriverImpl().

## ◆ FioFOpenFile()

FILE* FioFOpenFile | ( | const std::string & | filename,
|  | const char * | mode,
|  | Subdirectory | subdir,
|  | size_t * | filesize
| ) |  |

Opens a OpenTTD file somewhere in a personal or global directory.

Parameters

  filename | Name of the file to open.
  subdir | Subdirectory to open.

Returns
  File handle of the opened file, or `nullptr` if the file is not available.

Definition at line 263 of file fileio.cpp.

References NO_DIRECTORY, and NUM_SUBDIRS.

Referenced by _ValidateSignatureFile(), ScriptFileChecksumCreator::AddFile(), ScenarioScanner::AddFile(), CalcGRFMD5Sum(), CalculateHashV1(), MD5File::CheckMD5(), GraphicsSet::CheckMD5(), DebugPrint(), FioCheckFileExists(), GetFileTitle(), MidiFile::LoadFile(), Squirrel::LoadFile(), TextfileWindow::LoadTextfile(), IniFile::OpenFile(), RandomAccessFile::RandomAccessFile(), ReadRawLanguageStrings(), MidiFile::ReadSMFHeader(), DriverFactoryBase::SelectDriverImpl(), CrashLog::WriteCrashLog(), and MidiFile::WriteSMF().

## ◆ FioFOpenFileTar()

FILE* FioFOpenFileTar | ( | const TarFileListEntry & | entry,
|  | size_t * | filesize
| ) |  |

Opens a file from inside a tar archive.

Parameters

  | entry | The entry to open.
  [out] | filesize | If not `nullptr`, size of the opened file.

Returns
  File handle of the opened file, or `nullptr` if the file is not available.

Note
  The file is read from within the tar file, and may not return `EOF` after reading the whole file.

Definition at line 243 of file fileio.cpp.

## ◆ GetHomeDir()

static std::string GetHomeDir | ( |  | ) |
| static

Gets the home directory of the user.

May return an empty string in the unlikely scenario that the home directory cannot be found.

Returns
  User's home directory

Definition at line 814 of file fileio.cpp.

Referenced by DetermineBasePaths().

## ◆ IsValidSearchPath()

static bool IsValidSearchPath | ( | Searchpath | sp | ) |
| static

Checks whether the given search path is a valid search path.

Parameters

  sp | the search path to check

Returns
  true if the search path is valid

Definition at line 80 of file fileio.cpp.

References _searchpaths.

## ◆ MatchesExtension()

static bool MatchesExtension | ( | const char * | extension,
|  | const char * | filename
| ) |  |
| static

Helper to see whether a given filename matches the extension.

Parameters

  extension | The extension to look for.
  filename | The filename to look in for the extension.

Returns
  True iff the extension is nullptr, or the filename ends with it.

Definition at line 1134 of file fileio.cpp.

References StrEqualsIgnoreCase().

Referenced by ScanTar().

## ◆ ReadFileToMem()

std::unique_ptr<char[]> ReadFileToMem | ( | const std::string & | filename,
|  | size_t & | lenp,
|  | size_t | maxsize
| ) |  |

Load a file into memory.

Parameters

  | filename | Name of the file to load.
  [out] | lenp | Length of loaded data.
  | maxsize | Maximum size to load.

Returns
  Pointer to new memory containing the loaded data, or `nullptr` if loading failed.

Note
  If maxsize less than the length of the file, loading fails.

Definition at line 1107 of file fileio.cpp.

Referenced by ReadLanguagePack().

## ◆ SanitizeFilename()

void SanitizeFilename | ( | std::string & | filename | ) |

Sanitizes a filename, i.e.

removes all illegal characters from it.

Parameters

  filename | the filename

Definition at line 1085 of file fileio.cpp.

## ◆ ScanPath()

static uint ScanPath | ( | FileScanner * | fs,
|  | const char * | extension,
|  | const char * | path,
|  | size_t | basepath_length,
|  | bool | recursive
| ) |  |
| static

Scan a single directory (and recursively its children) and add any graphics sets that are found.

Parameters

  fs | the file scanner to add the files to
  extension | the extension of files to search for.
  path | full path we're currently at
  basepath_length | from where in the path are we 'based' on the search path
  recursive | whether to recursively search the sub directories

Definition at line 1151 of file fileio.cpp.

References ttd_opendir().

Referenced by FileScanner::Scan().

## ◆ ScanTar()

static uint ScanTar | ( | FileScanner * | fs,
|  | const char * | extension,
|  | const TarFileList::value_type & | tar
| ) |  |
| static

Scan the given tar and add graphics sets when it finds one.

Parameters

  fs | the file scanner to scan for
  extension | the extension of files to search for.
  tar | the tar to search in.

Definition at line 1191 of file fileio.cpp.

References FileScanner::AddFile(), and MatchesExtension().

## ◆ SimplifyFileName()

static void SimplifyFileName | ( | std::string & | name | ) |
| static

Simplify filenames from tars.

Replace '/' by #PATHSEPCHAR, and force 'name' to lowercase.

Parameters

  name | Filename to process.

Definition at line 410 of file fileio.cpp.

## Variable Documentation

## ◆ _searchpaths

std::array<std::string, NUM_SEARCHPATHS> _searchpaths

The search paths OpenTTD could search through.

At least one of the slots has to be filled with a path. An empty string tells that there is no such path for the current operating system.

Definition at line 57 of file fileio.cpp.

Referenced by DoScanWorkingDirectory(), and IsValidSearchPath().

## ◆ _subdirs

const char* const _subdirs[]
| static

Initial value:
= {
"",
"save" PATHSEP,
"save" PATHSEP "autosave" PATHSEP,
"scenario" PATHSEP,
"scenario" PATHSEP "heightmap" PATHSEP,
"gm" PATHSEP,
"data" PATHSEP,
"baseset" PATHSEP,
"newgrf" PATHSEP,
"lang" PATHSEP,
"ai" PATHSEP,
"ai" PATHSEP "library" PATHSEP,
"game" PATHSEP,
"game" PATHSEP "library" PATHSEP,
"screenshot" PATHSEP,
"social_integration" PATHSEP,
}

Definition at line 39 of file fileio.cpp.