If an error occurs, print an explanatory string rather
authorMartin Pool <mbp@samba.org>
Fri, 10 Nov 2000 03:28:15 +0000 (03:28 +0000)
committerMartin Pool <mbp@samba.org>
Fri, 10 Nov 2000 03:28:15 +0000 (03:28 +0000)
than just an RERR code.

errcode.h
log.c

index f301d30..997e2d2 100644 (file)
--- 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 8928a38..10f34d6 100644 (file)
--- 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