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

View File

@ -7,8 +7,18 @@
#include "bsdstring.h" #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) { if (bytes == 0) {
return 0; return 0;
} }

View File

@ -2,7 +2,7 @@
#define UTIL_BSDSTRING_H #define UTIL_BSDSTRING_H
#include <stddef.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 #ifndef HAVE_STRLCPY
extern size_t strlcpy(char *dst, const char *src, size_t siz); 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, ...); extern size_t slprintf(char * dst, size_t size, const char * format, ...);
#endif #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 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__) #define INFO_STATIC_BUFFER() log_info("static buffer too small in %s:%d\n", __FILE__, __LINE__)