From af642a61b369ae6e488d674e17aa5242ae9d34d1 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 10 Nov 2000 03:28:15 +0000 Subject: [PATCH] If an error occurs, print an explanatory string rather than just an RERR code. --- errcode.h | 24 +++++++++++++++++++++- log.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/errcode.h b/errcode.h index f301d309..997e2d22 100644 --- a/errcode.h +++ b/errcode.h @@ -1,4 +1,26 @@ -/* error codes returned by rsync */ +/* -*- c-file-style: "linux"; -*- + + Copyright (C) 1998-2000 by Andrew Tridgell + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + * error codes returned by rsync. If you change these, please also update the + * string mappings in log.c + */ #define RERR_SYNTAX 1 /* syntax or usage error */ #define RERR_PROTOCOL 2 /* protocol incompatibility */ diff --git a/log.c b/log.c index 8928a386..10f34d6f 100644 --- a/log.c +++ b/log.c @@ -28,6 +28,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 , "status returned when sent SIGUSR1, 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) { @@ -382,7 +419,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 +437,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 -- 2.34.1