X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/a039749b4c21e3439dc06fcdd5355828f1f95463..8ee3d639b2733276a93d92132ff4d8102ceb4d94:/log.c diff --git a/log.c b/log.c index 8928a386..aef3ac8a 100644 --- a/log.c +++ b/log.c @@ -1,6 +1,7 @@ /* -*- c-file-style: "linux"; -*- - Copyright (C) 1998-2000 by Andrew Tridgell + Copyright (C) 1998-2001 by Andrew Tridgell + Copyright (C) 2000-2001 by Martin Pool This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,9 +19,11 @@ */ /* - logging and utility functions - + Logging and utility functions. tridge, May 1998 + + Mapping to human-readable messages added by Martin Pool + , Oct 2000. */ #include "rsync.h" @@ -28,6 +31,43 @@ static char *logfname; static FILE *logfile; static int log_error_fd = -1; + +struct { + int code; + char const *name; +} const rerr_names[] = { + { RERR_SYNTAX , "syntax or usage error" }, + { RERR_PROTOCOL , "protocol incompatibility" }, + { RERR_FILESELECT , "errors selecting input/output files, dirs" }, + { RERR_UNSUPPORTED , "requested action not supported" }, + { RERR_SOCKETIO , "error in socket IO" }, + { RERR_FILEIO , "error in file IO" }, + { RERR_STREAMIO , "error in rsync protocol data stream" }, + { RERR_MESSAGEIO , "errors with program diagnostics" }, + { RERR_IPC , "error in IPC code" }, + { RERR_SIGNAL , "received SIGUSR1 or SIGINT" }, + { RERR_WAITCHILD , "some error returned by waitpid()" }, + { RERR_MALLOC , "error allocating core memory buffers" }, + { RERR_TIMEOUT , "timeout in data send/receive" }, + { 0, NULL } +}; + + + +/* + * Map from rsync error code to name, or return NULL. + */ +static char const *rerr_name(int code) +{ + int i; + for (i = 0; rerr_names[i].name; i++) { + if (rerr_names[i].code == code) + return rerr_names[i].name; + } + return NULL; +} + + static void logit(int priority, char *buf) { if (logfname) { @@ -132,7 +172,7 @@ void rwrite(enum logcode code, char *buf, int len) return; } - /* then try to pass it to the other end */ + /* if that fails, try to pass it to the other end */ if (am_server && io_multiplex_write(code, buf, len)) { return; } @@ -382,7 +422,15 @@ void log_recv(struct file_struct *file, struct stats *initial_stats) } } -/* called when the transfer is interrupted for some reason */ + + + +/* + * Called when the transfer is interrupted for some reason. + * + * Code is one of the RERR_* codes from errcode.h, or terminating + * successfully. + */ void log_exit(int code, const char *file, int line) { if (code == 0) { @@ -392,11 +440,20 @@ void log_exit(int code, const char *file, int line) (double)stats.total_read, (double)stats.total_size); } else { - rprintf(FLOG,"transfer interrupted (code %d) at %s(%d)\n", - code, file, line); + const char *name; + + name = rerr_name(code); + if (!name) + name = "unexplained error"; + + rprintf(FLOG,"transfer interrupted: %s (code %d) at %s(%d)\n", + name, code, file, line); } } + + + /* log the incoming transfer of a file for interactive use, this will be called at the end where the client was run