Debug: move errno testing closer to the report-writing, so we know which report caused the error.

Fix: wrptr gets the result from _snprintf, which is int, not size_t.
This commit is contained in:
Enno Rehling 2015-08-17 16:17:08 +02:00
parent df5eaa6ef2
commit dcececf4fa
3 changed files with 42 additions and 24 deletions

View File

@ -1783,6 +1783,7 @@ int write_reports(faction * f, time_t ltime)
bool gotit = false;
struct report_context ctx;
const char *encoding = "UTF-8";
report_type *rtype;
if (noreports) {
return false;
@ -1798,36 +1799,42 @@ int write_reports(faction * f, time_t ltime)
get_seen_interval(&ctx);
}
get_addresses(&ctx);
_mkdir(reportpath());
do {
report_type *rtype = report_types;
if (_access(reportpath(), 0) < 0) {
_mkdir(reportpath());
}
if (errno) {
log_warning("errno was %d before writing reports", errno);
errno = 0;
if (verbosity >= 2) {
log_printf(stdout, "Reports for %s:", factionname(f));
}
for (; rtype != NULL; rtype = rtype->next) {
if (f->options & rtype->flag) {
}
if (verbosity >= 2) {
log_printf(stdout, "Reports for %s:", factionname(f));
}
for (rtype = report_types; rtype != NULL; rtype = rtype->next) {
if (f->options & rtype->flag) {
int error;
do {
char filename[MAX_PATH];
sprintf(filename, "%s/%d-%s.%s", reportpath(), turn, factionid(f),
rtype->extension);
error = 0;
if (rtype->write(filename, &ctx, encoding) == 0) {
gotit = true;
}
}
if (errno) {
char zText[64];
log_warning("retrying, error %d during %s report for faction %s", error, rtype->extension, factionname(f));
sprintf(zText, "waiting %u seconds before we retry", backup / 1000);
perror(zText);
_sleep(backup);
if (backup < maxbackup) {
backup *= 2;
}
error = errno;
errno = 0;
}
} while (error);
}
if (errno) {
char zText[64];
log_warning("retrying, error %d during reports for faction %s", errno, factionname(f));
sprintf(zText, "waiting %u seconds before we retry", backup / 1000);
perror(zText);
_sleep(backup);
if (backup < maxbackup) {
backup *= 2;
}
}
} while (errno);
}
if (!gotit) {
log_warning("No report for faction %s!", factionid(f));
}

View File

@ -7,8 +7,18 @@
#include "bsdstring.h"
int wrptr(char **ptr, size_t * size, size_t bytes)
int wrptr(char **ptr, size_t * size, int result)
{
size_t bytes = (size_t)result;
if (result < 0) {
// _snprintf buffer was too small
if (*size > 0) {
**ptr = 0;
*size = 0;
}
errno = 0;
return ERANGE;
}
if (bytes == 0) {
return 0;
}

View File

@ -2,7 +2,7 @@
#define UTIL_BSDSTRING_H
#include <stddef.h>
extern int wrptr(char **ptr, size_t * size, size_t bytes);
extern int wrptr(char **ptr, size_t * size, int bytes);
#ifndef HAVE_STRLCPY
extern size_t strlcpy(char *dst, const char *src, size_t siz);
@ -16,6 +16,7 @@ extern size_t strlcat(char *dst, const char *src, size_t siz);
extern size_t slprintf(char * dst, size_t size, const char * format, ...);
#endif
#define WARN_STATIC_BUFFER_EX(foo) log_warning("%s: static buffer too small in %s:%d\n", (foo), __FILE__, __LINE__)
#define WARN_STATIC_BUFFER() log_warning("static buffer too small in %s:%d\n", __FILE__, __LINE__)
#define INFO_STATIC_BUFFER() log_info("static buffer too small in %s:%d\n", __FILE__, __LINE__)