commit 9338c9a85469715964df85050574df97c9e1340a
Author: Oswald Buddenhagen <o...@kde.org>
Date:   Sun Apr 10 15:32:25 2011 +0200

    unify error reporting
    
    - introduce sys_error() and use it instead of perror() and
      error(strerror()) in all expected error conditions
    - perror() is used only for "something's really wrong with the system"
      kind of errors
    - file names, etc. are quoted if they are not validated yet, so e.g. an
      empty string becomes immediately obvious
    - improve and unify language

 src/compat/config.c  |    2 +-
 src/compat/convert.c |   20 ++++++--------
 src/compat/isync.h   |    1 +
 src/compat/main.c    |    9 +++---
 src/compat/util.c    |   13 +++++++++
 src/config.c         |    3 +-
 src/drv_imap.c       |    7 ++---
 src/drv_maildir.c    |   59 +++++++++++++++++++----------------------
 src/isync.h          |    3 ++
 src/mdconvert.c      |   40 ++++++++++++++++++++--------
 src/socket.c         |   45 +++++++++++++++++---------------
 src/sync.c           |   10 +++---
 src/util.c           |   17 ++++++++++++
 13 files changed, 137 insertions(+), 92 deletions(-)

diff --git a/src/compat/config.c b/src/compat/config.c
index 85a641d..02115b9 100644
--- a/src/compat/config.c
+++ b/src/compat/config.c
@@ -97,7 +97,7 @@ load_config( const char *path, config_t ***stor )
 
        if (!(fp = fopen( path, "r" ))) {
                if (errno != ENOENT)
-                       perror( "fopen" );
+                       sys_error( "Cannot read config file '%s'", path );
                return;
        }
        if (!Quiet && !Debug && !Verbose)
diff --git a/src/compat/convert.c b/src/compat/convert.c
index e71ee4c..583bbcf 100644
--- a/src/compat/convert.c
+++ b/src/compat/convert.c
@@ -28,7 +28,6 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/stat.h>
-#include <errno.h>
 #include <time.h>
 
 #include <db.h>
@@ -97,10 +96,9 @@ convert( config_t *box )
        for (i = 0; i < 3; i++) {
                nfsnprintf( buf, sizeof(buf), "%s/%s", mboxdir, subdirs[i] );
                if (stat( buf, &sb )) {
-                       fprintf( stderr, "ERROR: stat %s: %s (errno %d)\n", buf,
-                                strerror(errno), errno );
+                       sys_error( "ERROR: cannot access %s", buf );
                        fprintf( stderr,
-                                "ERROR: %s does not appear to be a valid 
maildir style mailbox\n",
+                                "ERROR: '%s' does not appear to be a valid 
maildir style mailbox\n",
                                 mboxdir );
                        goto err1;
                }
@@ -111,7 +109,7 @@ convert( config_t *box )
        nfsnprintf( sname, sizeof(sname), "%s/.mbsyncstate", mboxdir );
 
        if ((fd = open( ilname, O_WRONLY|O_CREAT, 0600 )) < 0) {
-               perror( ilname );
+               sys_error( "Cannot create %s", ilname );
                goto err1;
        }
 #if SEEK_SET != 0
@@ -121,20 +119,20 @@ convert( config_t *box )
        lck.l_type = F_WRLCK;
 #endif
        if (fcntl( fd, F_SETLKW, &lck )) {
-               perror( ilname );
+               sys_error( "Cannot lock %s", ilname );
          err2:
                close( fd );
                goto err1;
        }
 
        if (!(fp = fopen( iuvname, "r" ))) {
-               perror( iuvname );
+               sys_error( "Cannot open %s", iuvname );
                goto err2;
        }
        fscanf( fp, "%d", &uidval );
        fclose( fp );
        if (!(fp = fopen( imuname, "r" ))) {
-               perror( imuname );
+               sys_error( "Cannot open %s", imuname );
                goto err2;
        }
        fscanf( fp, "%d", &maxuid );
@@ -162,7 +160,7 @@ convert( config_t *box )
        for (i = 0; i < 2; i++) {
                bl = nfsnprintf( buf, sizeof(buf), "%s/%s/", mboxdir, 
subdirs[i] );
                if (!(d = opendir( buf ))) {
-                       perror( "opendir" );
+                       sys_error( "Cannot list %s", buf );
                  err4:
                        free( msgs );
                        if (db)
@@ -199,7 +197,7 @@ convert( config_t *box )
        qsort( msgs, nmsgs, sizeof(msg_t), compare_uids );
 
        if (!(fp = fopen( sname, "w" ))) {
-               perror( sname );
+               sys_error( "Cannot create %s", sname );
                goto err4;
        }
        if (box->max_messages) {
@@ -238,7 +236,7 @@ convert( config_t *box )
                rename( iumname, diumname );
        } else {
                if (!(fp = fopen( uvname, "w" ))) {
-                       perror( uvname );
+                       sys_error( "Cannot create %s", uvname );
                        goto err4;
                }
                fprintf( fp, "%d\n%d\n", uidval, maxuid );
diff --git a/src/compat/isync.h b/src/compat/isync.h
index 2bb0030..3965397 100644
--- a/src/compat/isync.h
+++ b/src/compat/isync.h
@@ -100,4 +100,5 @@ char *nfstrdup( const char *str );
 int nfvasprintf( char **str, const char *fmt, va_list va );
 int nfasprintf( char **str, const char *fmt, ... );
 int nfsnprintf( char *buf, int blen, const char *fmt, ... );
+void sys_error( const char *, ... );
 void ATTR_NORETURN oob( void );
diff --git a/src/compat/main.c b/src/compat/main.c
index 1b21f0e..6d7da36 100644
--- a/src/compat/main.c
+++ b/src/compat/main.c
@@ -29,7 +29,6 @@
 #include <limits.h>
 #include <pwd.h>
 #include <stdio.h>
-#include <errno.h>
 #include <string.h>
 #include <ctype.h>
 #include <dirent.h>
@@ -337,7 +336,7 @@ main( int argc, char **argv )
                        struct dirent *de;
 
                        if (!(dir = opendir( xmaildir ))) {
-                               fprintf( stderr, "%s: %s\n", xmaildir, 
strerror(errno) );
+                               sys_error( "Cannot list '%s'", xmaildir );
                                return 1;
                        }
                        while ((de = readdir( dir ))) {
@@ -380,13 +379,13 @@ main( int argc, char **argv )
                        outconfig = path2;
                }
                if ((fd = creat( outconfig, 0666 )) < 0) {
-                       fprintf( stderr, "Error: cannot write new config %s: 
%s\n", outconfig, strerror(errno) );
+                       sys_error( "Error: cannot create config file '%s'", 
outconfig );
                        return 1;
                }
        } else {
                strcpy( path2, "/tmp/mbsyncrcXXXXXX" );
                if ((fd = mkstemp( path2 )) < 0) {
-                       fprintf( stderr, "Can't create temp file\n" );
+                       sys_error( "Error: cannot create temporary config file" 
);
                        return 1;
                }
        }
@@ -433,6 +432,6 @@ main( int argc, char **argv )
                                add_arg( &args, find_box( argv[optind] 
)->channel_name );
        }
        execvp( args[0], args );
-       perror( args[0] );
+       sys_error( "Cannot execute %s", args[0] );
        return 1;
 }
diff --git a/src/compat/util.c b/src/compat/util.c
index 7ac085b..1cb0f79 100644
--- a/src/compat/util.c
+++ b/src/compat/util.c
@@ -27,6 +27,19 @@
 #include <pwd.h>
 #include <ctype.h>
 
+void
+sys_error( const char *msg, ... )
+{
+       va_list va;
+       char buf[1024];
+
+       va_start( va, msg );
+       if ((unsigned)vsnprintf( buf, sizeof(buf), msg, va ) >= sizeof(buf))
+               oob();
+       va_end( va );
+       perror( buf );
+}
+
 char *
 next_arg( char **s )
 {
diff --git a/src/config.c b/src/config.c
index ef7641a..ed0466f 100644
--- a/src/config.c
+++ b/src/config.c
@@ -25,7 +25,6 @@
 
 #include <unistd.h>
 #include <limits.h>
-#include <errno.h>
 #include <pwd.h>
 #include <sys/types.h>
 #include <string.h>
@@ -272,7 +271,7 @@ load_config( const char *where, int pseudo )
                info( "Reading configuration file %s\n", cfile.file );
 
        if (!(cfile.fp = fopen( cfile.file, "r" ))) {
-               perror( "Cannot open config file" );
+               sys_error( "Cannot open config file '%s'", cfile.file );
                return 1;
        }
        buf[sizeof(buf) - 1] = 0;
diff --git a/src/drv_imap.c b/src/drv_imap.c
index 2f661e9..496f93c 100644
--- a/src/drv_imap.c
+++ b/src/drv_imap.c
@@ -30,7 +30,6 @@
 #include <stdio.h>
 #include <stddef.h>
 #include <limits.h>
-#include <errno.h>
 #include <string.h>
 #include <ctype.h>
 
@@ -838,7 +837,7 @@ imap_socket_read( void *aux )
                if (*arg == '*') {
                        arg = next_arg( &cmd );
                        if (!arg) {
-                               error( "IMAP error: unable to parse untagged 
response\n" );
+                               error( "IMAP error: malformed untagged 
response\n" );
                                break;
                        }
 
@@ -1848,8 +1847,8 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, 
int *err )
                else if (!strcasecmp( "CertificateFile", cfg->cmd )) {
                        server->sconf.cert_file = expand_strdup( cfg->val );
                        if (access( server->sconf.cert_file, R_OK )) {
-                               error( "%s:%d: CertificateFile '%s': %s\n",
-                                      cfg->file, cfg->line, 
server->sconf.cert_file, strerror( errno ) );
+                               sys_error( "%s:%d: CertificateFile '%s'",
+                                          cfg->file, cfg->line, 
server->sconf.cert_file );
                                *err = 1;
                        }
                } else if (!strcasecmp( "RequireSSL", cfg->cmd ))
diff --git a/src/drv_maildir.c b/src/drv_maildir.c
index 0d70c74..ed10118 100644
--- a/src/drv_maildir.c
+++ b/src/drv_maildir.c
@@ -101,7 +101,7 @@ maildir_open_store( store_conf_t *conf,
        struct stat st;
 
        if (stat( conf->path, &st ) || !S_ISDIR(st.st_mode)) {
-               error( "Maildir error: cannot open store %s\n", conf->path );
+               error( "Maildir error: cannot open store '%s'\n", conf->path );
                cb( 0, aux );
                return;
        }
@@ -167,7 +167,7 @@ maildir_list( store_t *gctx,
        struct dirent *de;
 
        if (!(dir = opendir( gctx->conf->path ))) {
-               error( "%s: %s\n", gctx->conf->path, strerror(errno) );
+               sys_error( "Maildir error: cannot list %s", gctx->conf->path );
                gctx->bad_callback( gctx->bad_callback_aux );
                cb( DRV_CANCELED, aux );
                return -1;
@@ -235,8 +235,7 @@ maildir_validate( const char *prefix, const char *box, int 
create, maildir_store
                if (errno == ENOENT) {
                        if (create) {
                                if (mkdir( buf, 0700 )) {
-                                       error( "Maildir error: mkdir %s: %s 
(errno %d)\n",
-                                              buf, strerror(errno), errno );
+                                       sys_error( "Maildir error: cannot 
create mailbox '%s'", buf );
                                        ctx->gen.bad_callback( 
ctx->gen.bad_callback_aux );
                                        return DRV_CANCELED;
                                }
@@ -244,8 +243,7 @@ maildir_validate( const char *prefix, const char *box, int 
create, maildir_store
                                for (i = 0; i < 3; i++) {
                                        memcpy( buf + bl, subdirs[i], 4 );
                                        if (mkdir( buf, 0700 )) {
-                                               error( "Maildir error: mkdir 
%s: %s (errno %d)\n",
-                                                      buf, strerror(errno), 
errno );
+                                               sys_error( "Maildir error: 
cannot create directory %s", buf );
                                                return DRV_BOX_BAD;
                                        }
                                }
@@ -254,8 +252,7 @@ maildir_validate( const char *prefix, const char *box, int 
create, maildir_store
                                return DRV_BOX_BAD;
                        }
                } else {
-                       error( "Maildir error: stat %s: %s (errno %d)\n",
-                              buf, strerror(errno), errno );
+                       sys_error( "Maildir error: cannot access mailbox '%s'", 
buf );
                        return DRV_BOX_BAD;
                }
        } else {
@@ -273,8 +270,7 @@ maildir_validate( const char *prefix, const char *box, int 
create, maildir_store
                memcpy( buf + bl, "tmp/", 5 );
                bl += 4;
                if (!(dirp = opendir( buf ))) {
-                       error( "Maildir error: opendir: %s: %s (errno %d)\n",
-                              buf, strerror(errno), errno );
+                       sys_error( "Maildir error: cannot list %s", buf );
                        return DRV_BOX_BAD;
                }
                time( &now );
@@ -282,16 +278,14 @@ maildir_validate( const char *prefix, const char *box, 
int create, maildir_store
                        nfsnprintf( buf + bl, sizeof(buf) - bl, "%s", 
entry->d_name );
                        if (stat( buf, &st )) {
                                if (errno != ENOENT)
-                                       error( "Maildir error: stat: %s: %s 
(errno %d)\n",
-                                              buf, strerror(errno), errno );
+                                       sys_error( "Maildir error: cannot 
access %s", buf );
                        } else if (S_ISREG(st.st_mode) && now - st.st_ctime >= 
_24_HOURS) {
                                /* this should happen infrequently enough that 
it won't be
                                 * bothersome to the user to display when it 
occurs.
                                 */
                                info( "Maildir notice: removing stale file 
%s\n", buf );
                                if (unlink( buf ) && errno != ENOENT)
-                                       error( "Maildir error: unlink: %s: %s 
(errno %d)\n",
-                                              buf, strerror(errno), errno );
+                                       sys_error( "Maildir error: cannot 
remove %s", buf );
                        }
                }
                closedir( dirp );
@@ -532,7 +526,7 @@ maildir_scan( maildir_store_t *ctx, msglist_t *msglist )
                for (i = 0; i < 2; i++) {
                        memcpy( buf + bl, subdirs[i], 4 );
                        if (!(d = opendir( buf ))) {
-                               perror( buf );
+                               sys_error( "Maildir error: cannot list %s", buf 
);
 #ifdef USE_DB
                                if (!ctx->db)
 #endif /* USE_DB */
@@ -672,7 +666,7 @@ maildir_scan( maildir_store_t *ctx, msglist_t *msglist )
                                if (rename( nbuf, buf )) {
                                  notok:
                                        if (errno != ENOENT) {
-                                               perror( buf );
+                                               sys_error( "Maildir error: 
cannot rename %s to %s", nbuf, buf );
                                                maildir_uidval_unlock( ctx );
                                                maildir_free_scan( msglist );
                                                return DRV_BOX_BAD;
@@ -791,7 +785,7 @@ maildir_select( store_t *gctx, int minuid, int maxuid, int 
*excs, int nexcs,
        nfsnprintf( uvpath, sizeof(uvpath), "%s/.uidvalidity", gctx->path );
 #ifndef USE_DB
        if ((ctx->uvfd = open( uvpath, O_RDWR|O_CREAT, 0600 )) < 0) {
-               perror( uvpath );
+               sys_error( "Cannot write %s", uvpath );
                return cb( DRV_BOX_BAD, aux );
        }
 #else
@@ -806,7 +800,7 @@ maildir_select( store_t *gctx, int minuid, int maxuid, int 
*excs, int nexcs,
                                if ((ctx->uvfd = open( uvpath, O_RDWR|O_CREAT, 
0600 )) >= 0)
                                        goto fnok;
                        }
-                       perror( uvpath );
+                       sys_error( "Maildir error: cannot write %s", uvpath );
                        return cb( DRV_BOX_BAD, aux );
                }
          dbok:
@@ -815,7 +809,7 @@ maildir_select( store_t *gctx, int minuid, int maxuid, int 
*excs, int nexcs,
 #endif
                lck.l_type = F_WRLCK;
                if (fcntl( ctx->uvfd, F_SETLKW, &lck )) {
-                       perror( uvpath );
+                       sys_error( "Maildir error: cannot lock %s", uvpath );
                  bork:
                        close( ctx->uvfd );
                        ctx->uvfd = -1;
@@ -911,12 +905,13 @@ maildir_rescan( maildir_store_t *ctx )
 }
 
 static int
-maildir_again( maildir_store_t *ctx, maildir_message_t *msg, const char *fn )
+maildir_again( maildir_store_t *ctx, maildir_message_t *msg,
+               const char *err, const char *fn, const char *fn2 )
 {
        int ret;
 
        if (errno != ENOENT) {
-               perror( fn );
+               sys_error( err, fn, fn2 );
                return DRV_BOX_BAD;
        }
        if ((ret = maildir_rescan( ctx )) != DRV_OK)
@@ -938,14 +933,14 @@ maildir_fetch_msg( store_t *gctx, message_t *gmsg, 
msg_data_t *data,
                nfsnprintf( buf, sizeof(buf), "%s/%s/%s", gctx->path, 
subdirs[gmsg->status & M_RECENT], msg->base );
                if ((fd = open( buf, O_RDONLY )) >= 0)
                        break;
-               if ((ret = maildir_again( ctx, msg, buf )) != DRV_OK)
+               if ((ret = maildir_again( ctx, msg, "Cannot open %s", buf, 0 )) 
!= DRV_OK)
                        return cb( ret, aux );
        }
        fstat( fd, &st );
        data->len = st.st_size;
        data->data = nfmalloc( data->len );
        if (read( fd, data->data, data->len ) != data->len) {
-               perror( buf );
+               sys_error( "Maildir error: cannot read %s", buf );
                close( fd );
                return cb( DRV_MSG_BAD, aux );
        }
@@ -1007,7 +1002,7 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
        nfsnprintf( buf, sizeof(buf), "%s%s/tmp/%s%s", prefix, box, base, fbuf 
);
        if ((fd = open( buf, O_WRONLY|O_CREAT|O_EXCL, 0600 )) < 0) {
                if (errno != ENOENT) {
-                       perror( buf );
+                       sys_error( "Maildir error: cannot create %s", buf );
                        free( data->data );
                        return cb( DRV_BOX_BAD, 0, aux );
                }
@@ -1016,7 +1011,7 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
                        return cb( ret, 0, aux );
                }
                if ((fd = open( buf, O_WRONLY|O_CREAT|O_EXCL, 0600 )) < 0) {
-                       perror( buf );
+                       sys_error( "Maildir error: cannot create %s", buf );
                        free( data->data );
                        return cb( DRV_BOX_BAD, 0, aux );
                }
@@ -1025,9 +1020,9 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
        free( data->data );
        if (ret != data->len) {
                if (ret < 0)
-                       perror( buf );
+                       sys_error( "Maildir error: cannot write %s", buf );
                else
-                       error( "Maildir error: %s: partial write\n", buf );
+                       error( "Maildir error: cannot write %s. Disk full?\n", 
buf );
                close( fd );
                return cb( DRV_BOX_BAD, 0, aux );
        }
@@ -1035,7 +1030,7 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
        /* Moving seen messages to cur/ is strictly speaking incorrect, but 
makes mutt happy. */
        nfsnprintf( nbuf, sizeof(nbuf), "%s%s/%s/%s%s", prefix, box, 
subdirs[!(data->flags & F_SEEN)], base, fbuf );
        if (rename( buf, nbuf )) {
-               perror( nbuf );
+               sys_error( "Maildir error: cannot rename %s to %s", buf, nbuf );
                return cb( DRV_BOX_BAD, 0, aux );
        }
        return cb( DRV_OK, uid, aux );
@@ -1098,7 +1093,7 @@ maildir_set_flags( store_t *gctx, message_t *gmsg, int 
uid, int add, int del,
                }
                if (!rename( buf, nbuf ))
                        break;
-               if ((ret = maildir_again( ctx, msg, buf )) != DRV_OK)
+               if ((ret = maildir_again( ctx, msg, "Maildir error: cannot 
rename %s to %s", buf, nbuf )) != DRV_OK)
                        return cb( ret, aux );
        }
        free( msg->base );
@@ -1152,11 +1147,11 @@ maildir_trash_msg( store_t *gctx, message_t *gmsg,
                        if (!rename( buf, nbuf ))
                                break;
                        if (errno != ENOENT) {
-                               perror( nbuf );
+                               sys_error( "Maildir error: cannot move %s to 
%s", buf, nbuf );
                                return cb( DRV_BOX_BAD, aux );
                        }
                }
-               if ((ret = maildir_again( ctx, msg, buf )) != DRV_OK)
+               if ((ret = maildir_again( ctx, msg, "Maildir error: cannot move 
%s to %s", buf, nbuf )) != DRV_OK)
                        return cb( ret, aux );
        }
        gmsg->status |= M_DEAD;
@@ -1190,7 +1185,7 @@ maildir_close( store_t *gctx,
                                        if (errno == ENOENT)
                                                retry = 1;
                                        else
-                                               perror( buf );
+                                               sys_error( "Maildir error: 
cannot remove %s", buf );
                                } else {
                                        msg->status |= M_DEAD;
                                        gctx->count--;
diff --git a/src/isync.h b/src/isync.h
index e96dba2..3ff119f 100644
--- a/src/isync.h
+++ b/src/isync.h
@@ -85,6 +85,7 @@ typedef struct {
        int fd;
        int state;
        const server_conf_t *conf; /* needed during connect */
+       char *name;
 #ifdef HAVE_LIBSSL
        SSL *ssl;
 #endif
@@ -371,6 +372,7 @@ static INLINE void socket_init( conn_t *conn,
        conn->write_callback = write_callback;
        conn->callback_aux = aux;
        conn->fd = -1;
+       conn->name = 0;
        conn->write_buf_append = &conn->write_buf;
 }
 void socket_connect( conn_t *conn, void (*cb)( int ok, void *aux ) );
@@ -402,6 +404,7 @@ void info( const char *, ... );
 void infon( const char *, ... );
 void warn( const char *, ... );
 void error( const char *, ... );
+void sys_error( const char *, ... );
 
 char *next_arg( char ** );
 
diff --git a/src/mdconvert.c b/src/mdconvert.c
index c2fbf25..e911c28 100644
--- a/src/mdconvert.c
+++ b/src/mdconvert.c
@@ -35,6 +35,26 @@
 
 #define EXE "mdconvert"
 
+static void
+oob( void )
+{
+       fputs( "Fatal: buffer too small. Please report a bug.\n", stderr );
+       abort();
+}
+
+static void
+sys_error( const char *msg, ... )
+{
+       va_list va;
+       char buf[1024];
+
+       va_start( va, msg );
+       if ((unsigned)vsnprintf( buf, sizeof(buf), msg, va ) >= sizeof(buf))
+               oob();
+       va_end( va );
+       perror( buf );
+}
+
 static int
 nfsnprintf( char *buf, int blen, const char *fmt, ... )
 {
@@ -42,10 +62,8 @@ nfsnprintf( char *buf, int blen, const char *fmt, ... )
        va_list va;
 
        va_start( va, fmt );
-       if (blen <= 0 || (unsigned)(ret = vsnprintf( buf, blen, fmt, va )) >= 
(unsigned)blen) {
-               fputs( "Fatal: buffer too small. Please report a bug.\n", 
stderr );
-               abort();
-       }
+       if (blen <= 0 || (unsigned)(ret = vsnprintf( buf, blen, fmt, va )) >= 
(unsigned)blen)
+               oob();
        va_end( va );
        return ret;
 }
@@ -81,15 +99,15 @@ convert( const char *box, int altmap )
        nfsnprintf( tdpath, sizeof(tdpath), "%s.tmp", dpath );
        if ((sfd = open( spath, O_RDWR )) < 0) {
                if (errno != ENOENT)
-                       perror( spath );
+                       sys_error( "Cannot write %s", spath );
                return 1;
        }
        if (fcntl( sfd, F_SETLKW, &lck )) {
-               perror( spath );
+               sys_error( "Cannot lock %s", spath );
                goto sbork;
        }
        if ((dfd = open( tdpath, O_RDWR|O_CREAT, 0600 )) < 0) {
-               perror( tdpath );
+               sys_error( "Cannot create %s", tdpath );
                goto sbork;
        }
        if (db_create( &db, 0, 0 )) {
@@ -138,7 +156,7 @@ convert( const char *box, int altmap )
        for (i = 0; i < 2; i++) {
                bl = nfsnprintf( buf, sizeof(buf), "%s/%s/", box, subdirs[i] );
                if (!(d = opendir( buf ))) {
-                       perror( "opendir" );
+                       sys_error( "Cannot list %s", buf );
                        goto dbork;
                }
                while ((e = readdir( d ))) {
@@ -185,7 +203,7 @@ convert( const char *box, int altmap )
                        if (rename( buf, buf2 )) {
                                if (errno == ENOENT)
                                        goto again;
-                               perror( buf );
+                               sys_error( "Cannot rename %s to %s", buf, buf2 
);
                          ebork:
                                closedir( d );
                                goto dbork;
@@ -198,11 +216,11 @@ convert( const char *box, int altmap )
        db->close( db, 0 );
        close( dfd );
        if (rename( tdpath, dpath )) {
-               perror( dpath );
+               sys_error( "Cannot rename %s to %s", tdpath, dpath );
                return 1;
        }
        if (unlink( spath ))
-               perror( spath );
+               sys_error( "Cannot remove %s", spath );
        close( sfd );
        return 0;
 }
diff --git a/src/socket.c b/src/socket.c
index abb3fac..eb5714c 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -79,15 +79,15 @@ ssl_return( const char *func, conn_t *conn, int ret )
        case SSL_ERROR_SSL:
                if (!(err = ERR_get_error())) {
                        if (ret == 0)
-                               error( "SSL_%s: unexpected EOF\n", func );
+                               error( "Socket error: secure %s %s: unexpected 
EOF\n", func, conn->name );
                        else
-                               error( "SSL_%s: %s\n", func, strerror( errno ) 
);
+                               sys_error( "Socket error: secure %s %s", func, 
conn->name );
                } else {
-                       error( "SSL_%s: %s\n", func, ERR_error_string( err, 0 ) 
);
+                       error( "Socket error: secure %s %s: %s\n", func, 
conn->name, ERR_error_string( err, 0 ) );
                }
                break;
        default:
-               error( "SSL_%s: unhandled SSL error %d\n", func, err );
+               error( "Socket error: secure %s %s: unhandled SSL error %d\n", 
func, conn->name, err );
                break;
        }
        if (conn->state == SCK_STARTTLS)
@@ -160,8 +160,7 @@ verify_cert( const server_conf_t *conf, conn_t *sock )
                        break;
                }
                if (!(fp = fopen( conf->cert_file, "rt" ))) {
-                       error( "Unable to load CertificateFile '%s': %s\n",
-                              conf->cert_file, strerror( errno ) );
+                       sys_error( "Unable to load CertificateFile '%s'", 
conf->cert_file );
                        return -1;
                }
                err = -1;
@@ -197,7 +196,7 @@ verify_cert( const server_conf_t *conf, conn_t *sock )
        X509_STORE_CTX_cleanup( &xsc );
        if (!err)
                return 0;
-       error( "Error, can't verify certificate: %s (%d)\n",
+       error( "Error, cannot verify certificate: %s (%d)\n",
               X509_verify_cert_error_string( err ), err );
 
        X509_NAME_oneline( X509_get_subject_name( cert ), buf, sizeof(buf) );
@@ -284,7 +283,7 @@ socket_start_tls( conn_t *conn, int (*cb)( int ok, void 
*aux ) )
 static int
 start_tls_p2( conn_t *conn )
 {
-       switch (ssl_return( "connect", conn, SSL_connect( conn->ssl ) )) {
+       switch (ssl_return( "connect to", conn, SSL_connect( conn->ssl ) )) {
        case -1:
                start_tls_p3( conn, 0 );
                return -1;
@@ -335,7 +334,8 @@ socket_connect( conn_t *sock, void (*cb)( int ok, void *aux 
) )
 
        /* open connection to IMAP server */
        if (conf->tunnel) {
-               infon( "Starting tunnel '%s'... ", conf->tunnel );
+               nfasprintf( &sock->name, "tunnel '%s'", conf->tunnel );
+               infon( "Starting %s... ", sock->name );
 
                if (socketpair( PF_UNIX, SOCK_STREAM, 0, a )) {
                        perror( "socketpair" );
@@ -385,11 +385,12 @@ socket_connect( conn_t *sock, void (*cb)( int ok, void 
*aux ) )
                fcntl( s, F_SETFL, O_NONBLOCK );
                add_fd( s, socket_fd_cb, sock );
 
-               infon( "Connecting to %s (%s:%hu) ... ",
-                      conf->host, inet_ntoa( addr.sin_addr ), ntohs( 
addr.sin_port ) );
+               nfasprintf( &sock->name, "%s (%s:%hu)",
+                           conf->host, inet_ntoa( addr.sin_addr ), ntohs( 
addr.sin_port ) );
+               infon( "Connecting to %s... ", sock->name );
                if (connect( s, (struct sockaddr *)&addr, sizeof(addr) )) {
                        if (errno != EINPROGRESS) {
-                               perror( "connect" );
+                               sys_error( "Cannot connect to %s", sock->name );
                                socket_close_internal( sock );
                                goto bail;
                        }
@@ -414,19 +415,17 @@ socket_connected( conn_t *conn )
        int soerr;
        socklen_t selen = sizeof(soerr);
 
-       infon( "Connecting to %s: ", conn->conf->host );
        if (getsockopt( conn->fd, SOL_SOCKET, SO_ERROR, &soerr, &selen )) {
                perror( "getsockopt" );
                exit( 1 );
        }
        if (soerr) {
                errno = soerr;
-               perror( "connect" );
+               sys_error( "Cannot connect to %s", conn->name );
                socket_close_internal( conn );
                socket_connect_bail( conn );
                return;
        }
-       info( "ok\n" );
        socket_connected2( conn );
 }
 
@@ -441,6 +440,8 @@ socket_connected2( conn_t *conn )
 static void
 socket_connect_bail( conn_t *conn )
 {
+       free( conn->name );
+       conn->name = 0;
        conn->callbacks.connect( 0, conn->callback_aux );
 }
 
@@ -451,6 +452,8 @@ socket_close( conn_t *sock )
 {
        if (sock->fd >= 0)
                socket_close_internal( sock );
+       free( sock->name );
+       sock->name = 0;
 #ifdef HAVE_LIBSSL
        if (sock->ssl) {
                SSL_free( sock->ssl );
@@ -478,7 +481,7 @@ socket_fill( conn_t *sock )
        if (sock->ssl) {
                int any = 0;
                for (;;) {
-                       if ((n = ssl_return( "read", sock, SSL_read( sock->ssl, 
buf, len ) )) < 0)
+                       if ((n = ssl_return( "read from", sock, SSL_read( 
sock->ssl, buf, len ) )) < 0)
                                return;
                        if (!n) {
                                if (!any)
@@ -499,11 +502,11 @@ socket_fill( conn_t *sock )
 #endif
        {
                if ((n = read( sock->fd, buf, len )) < 0) {
-                       perror( "read" );
+                       sys_error( "Socket error: read from %s", sock->name );
                        socket_fail( sock );
                        return;
                } else if (!n) {
-                       error( "read: unexpected EOF\n" );
+                       error( "Socket error: read from %s: unexpected EOF\n", 
sock->name );
                        socket_fail( sock );
                        return;
                }
@@ -562,12 +565,12 @@ do_write( conn_t *sock, char *buf, int len )
        assert( sock->fd >= 0 );
 #ifdef HAVE_LIBSSL
        if (sock->ssl)
-               return ssl_return( "write", sock, SSL_write( sock->ssl, buf, 
len ) );
+               return ssl_return( "write to", sock, SSL_write( sock->ssl, buf, 
len ) );
 #endif
        n = write( sock->fd, buf, len );
        if (n < 0) {
                if (errno != EAGAIN && errno != EWOULDBLOCK) {
-                       perror( "write" );
+                       sys_error( "Socket error: write to %s", sock->name );
                        socket_fail( sock );
                } else {
                        n = 0;
@@ -659,7 +662,7 @@ socket_fd_cb( int events, void *aux )
        conn_t *conn = (conn_t *)aux;
 
        if (events & POLLERR) {
-               error( "Unidentified socket error.\n" );
+               error( "Unidentified socket error from %s.\n", conn->name );
                socket_fail( conn );
                return;
        }
diff --git a/src/sync.c b/src/sync.c
index bba516a..fa8825a 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -40,7 +40,7 @@ void
 Fclose( FILE *f )
 {
        if (fclose( f ) == EOF) {
-               perror( "cannot close file" );
+               sys_error( "Error: cannot close file. Disk full?" );
                exit( 1 );
        }
 }
@@ -55,7 +55,7 @@ Fprintf( FILE *f, const char *msg, ... )
        r = vfprintf( f, msg, va );
        va_end( va );
        if (r < 0) {
-               perror( "cannot write file" );
+               sys_error( "Error: cannot write file. Disk full?" );
                exit( 1 );
        }
 }
@@ -518,7 +518,7 @@ sync_boxes( store_t *ctx[], const char *names[], 
channel_conf_t *chan,
                free( csname );
        }
        if (!(s = strrchr( svars->dname, '/' ))) {
-               error( "Error: invalid SyncState '%s'\n", svars->dname );
+               error( "Error: invalid SyncState location '%s'\n", svars->dname 
);
                free( svars->dname );
                free( svars );
                cb( SYNC_BAD(S), aux );
@@ -526,7 +526,7 @@ sync_boxes( store_t *ctx[], const char *names[], 
channel_conf_t *chan,
        }
        *s = 0;
        if (mkdir( svars->dname, 0700 ) && errno != EEXIST) {
-               error( "Error: cannot create SyncState directory '%s': %s\n", 
svars->dname, strerror(errno) );
+               sys_error( "Error: cannot create SyncState directory '%s'", 
svars->dname );
                free( svars->dname );
                free( svars );
                cb( SYNC_BAD(S), aux );
@@ -544,7 +544,7 @@ sync_boxes( store_t *ctx[], const char *names[], 
channel_conf_t *chan,
        lck.l_type = F_WRLCK;
 #endif
        if ((svars->lfd = open( svars->lname, O_WRONLY|O_CREAT, 0666 )) < 0) {
-               error( "Error: cannot create lock file %s: %s\n", svars->lname, 
strerror(errno) );
+               sys_error( "Error: cannot create lock file %s", svars->lname );
                svars->ret = SYNC_FAIL;
                sync_bail2( svars );
                return;
diff --git a/src/util.c b/src/util.c
index b63508b..e796f41 100644
--- a/src/util.c
+++ b/src/util.c
@@ -120,6 +120,23 @@ error( const char *msg, ... )
        va_end( va );
 }
 
+void
+sys_error( const char *msg, ... )
+{
+       va_list va;
+       char buf[1024];
+
+       if (need_nl) {
+               putchar( '\n' );
+               need_nl = 0;
+       }
+       va_start( va, msg );
+       if ((unsigned)vsnprintf( buf, sizeof(buf), msg, va ) >= sizeof(buf))
+               oob();
+       va_end( va );
+       perror( buf );
+}
+
 char *
 next_arg( char **s )
 {

------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to