Files
@ r17613:a9b2554a5d79
Branch filter:
Location: cpp/openttd-patchpack/source/src/ini.cpp - annotation
r17613:a9b2554a5d79
3.9 KiB
text/x-c
(svn r22387) -Fix-ish [FS#4601]: Windows' recv seems to return "graceful closed" before having passed the remaining buffer which causes OpenTTD to think all connections are "incorrectly" terminated, i.e. without the "I'm leaving" packet from the client. So let the client wait a tiny bit after sending the "I'm leaving" packet and before gracefully closing the connection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | r9999:dccc36203f8a r9999:dccc36203f8a r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r9999:dccc36203f8a r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r10039:727fb45b0424 r9996:3fee1f809309 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r17418:92b22f19be94 r11352:9d18ed6156c5 r11331:1af5419c9807 r17407:e0911b00f473 r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r17098:afa706d65a49 r17098:afa706d65a49 r17098:afa706d65a49 r17098:afa706d65a49 r17098:afa706d65a49 r9996:3fee1f809309 r9996:3fee1f809309 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r9996:3fee1f809309 r9996:3fee1f809309 r11327:9eecebf69451 r9996:3fee1f809309 r9996:3fee1f809309 r11327:9eecebf69451 r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r11633:d81a7126e4a1 r11633:d81a7126e4a1 r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r11733:c9ae8998c33e r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r9996:3fee1f809309 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r9996:3fee1f809309 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11331:1af5419c9807 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r11331:1af5419c9807 r11352:9d18ed6156c5 r11352:9d18ed6156c5 r9996:3fee1f809309 r9996:3fee1f809309 r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a r17408:1b41bc18943a | /* $Id$ */
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file ini.cpp Definition of the IniItem class, related to reading/writing '*.ini' files. */
#include "stdafx.h"
#include "debug.h"
#include "ini_type.h"
#include "string_func.h"
#include "fileio_func.h"
#if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500)
# define WITH_FDATASYNC
# include <unistd.h>
#endif
#ifdef WIN32
# include <shellapi.h>
# include "core/mem_func.hpp"
#endif
IniFile::IniFile(const char * const *list_group_names) : IniLoadFile(list_group_names)
{
}
/**
* Save the Ini file's data to the disk.
* @param filename the file to save to.
* @return true if saving succeeded.
*/
bool IniFile::SaveToDisk(const char *filename)
{
/*
* First write the configuration to a (temporary) file and then rename
* that file. This to prevent that when OpenTTD crashes during the save
* you end up with a truncated configuration file.
*/
char file_new[MAX_PATH];
strecpy(file_new, filename, lastof(file_new));
strecat(file_new, ".new", lastof(file_new));
FILE *f = fopen(file_new, "w");
if (f == NULL) return false;
for (const IniGroup *group = this->group; group != NULL; group = group->next) {
if (group->comment) fputs(group->comment, f);
fprintf(f, "[%s]\n", group->name);
for (const IniItem *item = group->item; item != NULL; item = item->next) {
if (item->comment != NULL) fputs(item->comment, f);
/* protect item->name with quotes if needed */
if (strchr(item->name, ' ') != NULL ||
item->name[0] == '[') {
fprintf(f, "\"%s\"", item->name);
} else {
fprintf(f, "%s", item->name);
}
fprintf(f, " = %s\n", item->value == NULL ? "" : item->value);
}
}
if (this->comment) fputs(this->comment, f);
/*
* POSIX (and friends) do not guarantee that when a file is closed it is
* flushed to the disk. So we manually flush it do disk if we have the
* APIs to do so. We only need to flush the data as the metadata itself
* (modification date etc.) is not important to us; only the real data is.
*/
#ifdef WITH_FDATASYNC
int ret = fdatasync(fileno(f));
fclose(f);
if (ret != 0) return false;
#else
fclose(f);
#endif
#if defined(WIN32) || defined(WIN64)
/* Allocate space for one more \0 character. */
TCHAR tfilename[MAX_PATH + 1], tfile_new[MAX_PATH + 1];
_tcsncpy(tfilename, OTTD2FS(filename), MAX_PATH);
_tcsncpy(tfile_new, OTTD2FS(file_new), MAX_PATH);
/* SHFileOperation wants a double '\0' terminated string. */
tfilename[MAX_PATH - 1] = '\0';
tfile_new[MAX_PATH - 1] = '\0';
tfilename[_tcslen(tfilename) + 1] = '\0';
tfile_new[_tcslen(tfile_new) + 1] = '\0';
/* Rename file without any user confirmation. */
SHFILEOPSTRUCT shfopt;
MemSetT(&shfopt, 0);
shfopt.wFunc = FO_MOVE;
shfopt.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_SILENT;
shfopt.pFrom = tfile_new;
shfopt.pTo = tfilename;
SHFileOperation(&shfopt);
#else
rename(file_new, filename);
#endif
return true;
}
/* virtual */ FILE *IniFile::OpenFile(const char *filename, size_t *size)
{
/* Open the text file in binary mode to prevent end-of-line translations
* done by ftell() and friends, as defined by K&R. */
return FioFOpenFile(filename, "rb", DATA_DIR, size);
}
/* virtual */ void IniFile::ReportFileError(const char * const pre, const char * const buffer, const char * const post)
{
ShowInfoF("%s%s%s", pre, buffer, post);
}
|