commit 9bf92cb4c805874b8a7cae803329316a504cfce3
Author: Oswald Buddenhagen <o...@users.sf.net>
Date:   Sun Jul 28 21:02:57 2019 +0200

    fix lots of sign conversion warnings
    
    ... by making a lot of objects unsigned, and some signed.
    casts which lose precision and change the sign in one go (ssize_t and
    time_t to uint on LP64) are made explicit as well.

 src/common.h      |  28 +++++-----
 src/config.c      |  21 +++----
 src/config.h      |   2 +-
 src/driver.c      |   4 +-
 src/driver.h      |  14 ++---
 src/drv_imap.c    | 120 ++++++++++++++++++++--------------------
 src/drv_maildir.c | 138 +++++++++++++++++++++++-----------------------
 src/drv_proxy.c   |  10 ++--
 src/main.c        |  30 +++++-----
 src/socket.c      |  58 ++++++++++---------
 src/socket.h      |  18 +++---
 src/sync.c        |  50 +++++++++--------
 src/sync.h        |   2 +-
 src/util.c        |  70 +++++++++++------------
 14 files changed, 289 insertions(+), 276 deletions(-)

diff --git a/src/common.h b/src/common.h
index 587f8ac..ac8426a 100644
--- a/src/common.h
+++ b/src/common.h
@@ -41,7 +41,7 @@ typedef unsigned long ulong;
 #define stringify(x) stringify__(x)
 
 #define shifted_bit(in, from, to) \
-       (((uint)(in) / (from > to ? from / to : 1) * (to > from ? to / from : 
1)) & to)
+       ((int)(((uint)(in) / (from > to ? from / to : 1) * (to > from ? to / 
from : 1)) & to))
 
 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
 # define ATTR_UNUSED __attribute__((unused))
@@ -107,7 +107,7 @@ extern int Pid;
 extern char Hostname[256];
 extern const char *Home;
 
-extern int BufferLimit;
+extern uint BufferLimit;
 
 extern int new_total[2], new_done[2];
 extern int flags_total[2], flags_done[2];
@@ -133,7 +133,7 @@ typedef struct string_list {
        char string[1];
 } ATTR_PACKED(void *) string_list_t;
 
-void add_string_list_n( string_list_t **list, const char *str, int len );
+void add_string_list_n( string_list_t **list, const char *str, uint len );
 void add_string_list( string_list_t **list, const char *str );
 void free_string_list( string_list_t *list );
 
@@ -144,9 +144,9 @@ void *memrchr( const void *s, int c, size_t n );
 size_t strnlen( const char *str, size_t maxlen );
 #endif
 
-int starts_with( const char *str, int strl, const char *cmp, int cmpl );
-int starts_with_upper( const char *str, int strl, const char *cmp, int cmpl );
-int equals( const char *str, int strl, const char *cmp, int cmpl );
+int starts_with( const char *str, uint strl, const char *cmp, uint cmpl );
+int starts_with_upper( const char *str, uint strl, const char *cmp, uint cmpl 
);
+int equals( const char *str, uint strl, const char *cmp, uint cmpl );
 
 #ifndef HAVE_TIMEGM
 time_t timegm( struct tm *tm );
@@ -157,23 +157,23 @@ void *nfcalloc( size_t sz );
 void *nfrealloc( void *mem, size_t sz );
 char *nfstrndup( const char *str, size_t nchars );
 char *nfstrdup( const char *str );
-int ATTR_PRINTFLIKE(2, 0) nfvasprintf( char **str, const char *fmt, va_list va 
);
-int ATTR_PRINTFLIKE(2, 3) nfasprintf( char **str, const char *fmt, ... );
-int ATTR_PRINTFLIKE(3, 4) nfsnprintf( char *buf, int blen, const char *fmt, 
... );
+uint ATTR_PRINTFLIKE(2, 0) nfvasprintf( char **str, const char *fmt, va_list 
va );
+uint ATTR_PRINTFLIKE(2, 3) nfasprintf( char **str, const char *fmt, ... );
+uint ATTR_PRINTFLIKE(3, 4) nfsnprintf( char *buf, int blen, const char *fmt, 
... );
 void ATTR_NORETURN oob( void );
 
 char *expand_strdup( const char *s );
 
-int map_name( const char *arg, char **result, int reserve, const char *in, 
const char *out );
+int map_name( const char *arg, char **result, uint reserve, const char *in, 
const char *out );
 
 #define DEFINE_ARRAY_TYPE(T) \
        typedef struct { \
                T *data; \
-               int size; \
+               uint size; \
        } ATTR_PACKED(T *) T##_array_t; \
        typedef struct { \
                T##_array_t array; \
-               int alloc; \
+               uint alloc; \
        } ATTR_PACKED(T *) T##_array_alloc_t; \
        static INLINE T *T##_array_append( T##_array_alloc_t *arr ) \
        { \
@@ -199,7 +199,7 @@ int find_uint_array( const uint_array_t array, uint value );
 void arc4_init( void );
 uchar arc4_getbyte( void );
 
-int bucketsForSize( int size );
+uint bucketsForSize( uint size );
 
 typedef struct list_head {
        struct list_head *next, *prev;
@@ -210,7 +210,7 @@ typedef struct notifier {
        void (*cb)( int what, void *aux );
        void *aux;
 #ifdef HAVE_SYS_POLL_H
-       int index;
+       uint index;
 #else
        int fd;
        short events;
diff --git a/src/config.c b/src/config.c
index f22e259..8cb56c6 100644
--- a/src/config.c
+++ b/src/config.c
@@ -121,13 +121,13 @@ parse_int( conffile_t *cfile )
        return ret;
 }
 
-int
+uint
 parse_size( conffile_t *cfile )
 {
        char *p;
-       int ret;
+       uint ret;
 
-       ret = strtol (cfile->val, &p, 10);
+       ret = strtoul( cfile->val, &p, 10 );
        if (*p == 'k' || *p == 'K')
                ret *= 1024, p++;
        else if (*p == 'm' || *p == 'M')
@@ -319,7 +319,8 @@ load_config( const char *where, int pseudo )
        group_conf_t *group, **groupapp = &groups;
        string_list_t *chanlist, **chanlistapp;
        char *arg, *p;
-       int len, cops, gcops, max_size, ms, i;
+       uint len, max_size;
+       int cops, gcops, ms, i;
        char path[_POSIX_PATH_MAX];
        char buf[1024];
 
@@ -354,7 +355,7 @@ load_config( const char *where, int pseudo )
                        if (drivers[i]->parse_store( &cfile, &store )) {
                                if (store) {
                                        if (!store->max_size)
-                                               store->max_size = INT_MAX;
+                                               store->max_size = UINT_MAX;
                                        if (!store->flat_delim)
                                                store->flat_delim = "";
                                        *storeapp = store;
@@ -371,7 +372,7 @@ load_config( const char *where, int pseudo )
                        channel->expire_unread = global_conf.expire_unread;
                        channel->use_internal_date = 
global_conf.use_internal_date;
                        cops = 0;
-                       max_size = -1;
+                       max_size = UINT_MAX;
                        while (getcline( &cfile ) && cfile.cmd) {
                                if (!strcasecmp( "MaxSize", cfile.cmd ))
                                        max_size = parse_size( &cfile );
@@ -422,9 +423,9 @@ load_config( const char *where, int pseudo )
                        } else if (merge_ops( cops, channel->ops ))
                                cfile.err = 1;
                        else {
-                               if (max_size >= 0) {
+                               if (max_size != UINT_MAX) {
                                        if (!max_size)
-                                               max_size = INT_MAX;
+                                               max_size = UINT_MAX;
                                        channel->stores[M]->max_size = 
channel->stores[S]->max_size = max_size;
                                }
                                *channelapp = channel;
@@ -487,8 +488,8 @@ load_config( const char *where, int pseudo )
                else if (!strcasecmp( "BufferLimit", cfile.cmd ))
                {
                        BufferLimit = parse_size( &cfile );
-                       if (BufferLimit <= 0) {
-                               error( "%s:%d: BufferLimit must be positive\n", 
cfile.file, cfile.line );
+                       if (!BufferLimit) {
+                               error( "%s:%d: BufferLimit cannot be zero\n", 
cfile.file, cfile.line );
                                cfile.err = 1;
                        }
                }
diff --git a/src/config.h b/src/config.h
index 779c3ee..a8d6089 100644
--- a/src/config.h
+++ b/src/config.h
@@ -42,7 +42,7 @@ char *get_arg( conffile_t *cfile, int required, int *comment 
);
 
 char parse_bool( conffile_t *cfile );
 int parse_int( conffile_t *cfile );
-int parse_size( conffile_t *cfile );
+uint parse_size( conffile_t *cfile );
 int getcline( conffile_t *cfile );
 int merge_ops( int cops, int ops[] );
 int load_config( const char *filename, int pseudo );
diff --git a/src/driver.c b/src/driver.c
index e28d817..b86c117 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -27,10 +27,10 @@
 
 driver_t *drivers[N_DRIVERS] = { &maildir_driver, &imap_driver };
 
-int
+uint
 count_generic_messages( message_t *msgs )
 {
-       int count = 0;
+       uint count = 0;
        for (; msgs; msgs = msgs->next)
                count++;
        return count;
diff --git a/src/driver.h b/src/driver.h
index 18f8bfd..8b8f09d 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -39,7 +39,7 @@ typedef struct store_conf {
        const char *flat_delim;
        const char *map_inbox;
        const char *trash;
-       int max_size; /* off_t is overkill */
+       uint max_size; /* off_t is overkill */
        char trash_remote_new, trash_only_new;
 } store_conf_t;
 
@@ -65,7 +65,7 @@ typedef struct message {
        struct sync_rec *srec;
        char *msgid; /* owned */
        /* string_list_t *keywords; */
-       int size; /* zero implies "not fetched" */
+       uint size; /* zero implies "not fetched" */
        uint uid;
        uchar flags, status;
        char tuid[TUIDL];
@@ -93,7 +93,7 @@ typedef struct store {
 
 typedef struct {
        char *data;
-       int len;
+       uint len;
        time_t date;
        uchar flags;
 } msg_data_t;
@@ -174,10 +174,10 @@ struct driver {
        /* Open the selected mailbox.
         * Note that this should not directly complain about failure to open. */
        void (*open_box)( store_t *ctx,
-                         void (*cb)( int sts, int uidvalidity, void *aux ), 
void *aux );
+                         void (*cb)( int sts, uint uidvalidity, void *aux ), 
void *aux );
 
        /* Return the minimal UID the next stored message will have. */
-       int (*get_uidnext)( store_t *ctx );
+       uint (*get_uidnext)( store_t *ctx );
 
        /* Confirm that the open mailbox is empty. */
        int (*confirm_box_empty)( store_t *ctx );
@@ -253,13 +253,13 @@ struct driver {
        void (*commit_cmds)( store_t *ctx );
 
        /* Get approximate amount of memory occupied by the driver. */
-       int (*get_memory_usage)( store_t *ctx );
+       uint (*get_memory_usage)( store_t *ctx );
 
        /* Get the FAIL_* state of the driver. */
        int (*get_fail_state)( store_conf_t *conf );
 };
 
-int count_generic_messages( message_t * );
+uint count_generic_messages( message_t * );
 void free_generic_messages( message_t * );
 
 void parse_generic_store( store_conf_t *store, conffile_t *cfg );
diff --git a/src/drv_imap.c b/src/drv_imap.c
index 6133da9..9da6443 100644
--- a/src/drv_imap.c
+++ b/src/drv_imap.c
@@ -53,7 +53,7 @@ typedef struct imap_server_conf {
        char *pass;
        char *pass_cmd;
        int max_in_progress;
-       int cap_mask;
+       uint cap_mask;
        string_list_t *auth_mechs;
 #ifdef HAVE_LIBSSL
        char ssl_type;
@@ -79,7 +79,7 @@ typedef struct {
 typedef struct _list {
        struct _list *next, *child;
        char *val;
-       int len;
+       uint len;
 } list_t;
 
 #define MAX_LIST_DEPTH 5
@@ -99,8 +99,8 @@ struct imap_store {
        const char *label; /* foreign */
        const char *prefix;
        const char *name;
-       int ref_count;
-       uint opts;
+       uint ref_count;
+       int opts;
        enum { SST_BAD, SST_HALF, SST_GOOD } state;
        /* trash folder's existence is not confirmed yet */
        enum { TrashUnknown, TrashChecking, TrashKnown } trashnc;
@@ -122,7 +122,7 @@ struct imap_store {
        int nexttag, num_in_progress;
        imap_cmd_t *pending, **pending_append;
        imap_cmd_t *in_progress, **in_progress_append;
-       int buffer_mem; /* memory currently occupied by buffers in the queue */
+       uint buffer_mem; /* memory currently occupied by buffers in the queue */
 
        /* Used during sequential operations like connect */
        enum { GreetingPending = 0, GreetingBad, GreetingOk, GreetingPreauth } 
greeting;
@@ -156,7 +156,7 @@ struct imap_cmd {
                int (*cont)( imap_store_t *ctx, imap_cmd_t *cmd, const char 
*prompt );
                void (*done)( imap_store_t *ctx, imap_cmd_t *cmd, int response 
);
                char *data;
-               int data_len;
+               uint data_len;
                uint uid; /* to identify fetch responses */
                char high_prio; /* if command is queued, put it at the front of 
the queue. */
                char to_trash; /* we are storing to trash, not current. */
@@ -193,7 +193,7 @@ typedef struct {
 } imap_cmd_find_new_t;
 
 typedef struct {
-       int ref_count;
+       uint ref_count;
        int ret_val;
 } imap_cmd_refcounted_state_t;
 
@@ -252,7 +252,7 @@ static const char *Flags[] = {
 };
 
 static imap_cmd_t *
-new_imap_cmd( int size )
+new_imap_cmd( uint size )
 {
        imap_cmd_t *cmd = nfmalloc( size );
        memset( &cmd->param, 0, sizeof(cmd->param) );
@@ -284,7 +284,8 @@ done_imap_cmd( imap_store_t *ctx, imap_cmd_t *cmd, int 
response )
 static void
 send_imap_cmd( imap_store_t *ctx, imap_cmd_t *cmd )
 {
-       int bufl, litplus, iovcnt = 1;
+       int litplus, iovcnt = 1;
+       uint bufl;
        const char *buffmt;
        conn_iovec_t iov[3];
        char buf[4096];
@@ -308,9 +309,9 @@ DIAG_POP
        if (DFlags & DEBUG_NET) {
                if (ctx->num_in_progress)
                        printf( "(%d in progress) ", ctx->num_in_progress );
-               if (starts_with( cmd->cmd, -1, "LOGIN", 5 ))
+               if (starts_with( cmd->cmd, UINT_MAX, "LOGIN", 5 ))
                        printf( "%s>>> %d LOGIN <user> <pass>\n", ctx->label, 
cmd->tag );
-               else if (starts_with( cmd->cmd, -1, "AUTHENTICATE PLAIN", 18 ))
+               else if (starts_with( cmd->cmd, UINT_MAX, "AUTHENTICATE PLAIN", 
18 ))
                        printf( "%s>>> %d AUTHENTICATE PLAIN <authdata>\n", 
ctx->label, cmd->tag );
                else
                        printf( "%s>>> %s", ctx->label, buf );
@@ -445,7 +446,7 @@ imap_vprintf( const char *fmt, va_list ap )
 {
        const char *s;
        char *d, *ed;
-       int maxlen;
+       uint maxlen;
        char c;
        char buf[4096];
 
@@ -455,14 +456,14 @@ imap_vprintf( const char *fmt, va_list ap )
        for (;;) {
                c = *fmt;
                if (!c || c == '%') {
-                       int l = fmt - s;
+                       uint l = (uint)(fmt - s);
                        if (d + l > ed)
                                oob();
                        memcpy( d, s, l );
                        d += l;
                        if (!c)
-                               return nfstrndup( buf, d - buf );
-                       maxlen = INT_MAX;
+                               return nfstrndup( buf, (uint)(d - buf) );
+                       maxlen = UINT_MAX;
                        c = *++fmt;
                        if (c == '\\') {
                                c = *++fmt;
@@ -485,7 +486,7 @@ imap_vprintf( const char *fmt, va_list ap )
                                                fputs( "Fatal: unsupported 
string length specification. Please report a bug.\n", stderr );
                                                abort();
                                        }
-                                       maxlen = va_arg( ap , int );
+                                       maxlen = va_arg( ap , uint );
                                        c = *++fmt;
                                }
                                if (c == 'c') {
@@ -572,7 +573,7 @@ imap_done_simple_msg( imap_store_t *ctx ATTR_UNUSED,
 }
 
 static imap_cmd_refcounted_state_t *
-imap_refcounted_new_state( int sz )
+imap_refcounted_new_state( uint sz )
 {
        imap_cmd_refcounted_state_t *sts = nfmalloc( sz );
        sts->ref_count = 1; /* so forced sync does not cause an early exit */
@@ -781,7 +782,7 @@ parse_imap_list( imap_store_t *ctx, char **sp, 
parse_list_state_t *sts )
                        goto next2;
                } else if (ctx && *s == '{') {
                        /* literal */
-                       bytes = cur->len = strtol( s + 1, &s, 10 );
+                       bytes = (int)(cur->len = strtoul( s + 1, &s, 10 ));
                        if (*s != '}' || *++s)
                                goto bail;
 
@@ -789,7 +790,7 @@ parse_imap_list( imap_store_t *ctx, char **sp, 
parse_list_state_t *sts )
                        s[cur->len] = 0;
 
                  getbytes:
-                       n = socket_read( &ctx->conn, s, bytes );
+                       n = socket_read( &ctx->conn, s, (uint)bytes );
                        if (n < 0) {
                          badeof:
                                error( "IMAP error: unexpected EOF from %s\n", 
ctx->conn.name );
@@ -826,7 +827,7 @@ parse_imap_list( imap_store_t *ctx, char **sp, 
parse_list_state_t *sts )
                                        goto bail;
                                *d++ = c;
                        }
-                       cur->len = d - p;
+                       cur->len = (uint)(d - p);
                        cur->val = nfstrndup( p, cur->len );
                } else {
                        /* atom */
@@ -834,7 +835,7 @@ parse_imap_list( imap_store_t *ctx, char **sp, 
parse_list_state_t *sts )
                        for (; *s && !isspace( (uchar)*s ); s++)
                                if (sts->level && *s == ')')
                                        break;
-                       cur->len = s - p;
+                       cur->len = (uint)(s - p);
                        if (equals( p, cur->len, "NIL", 3 ))
                                cur->val = NIL;
                        else
@@ -969,8 +970,8 @@ parse_fetch_rsp( imap_store_t *ctx, list_t *list, char *s 
ATTR_UNUSED )
        imap_message_t *cur;
        msg_data_t *msgdata;
        imap_cmd_t *cmdp;
-       int mask = 0, status = 0, size = 0;
-       uint i, uid = 0;
+       uchar mask = 0, status = 0;
+       uint i, uid = 0, size = 0;
        time_t date = 0;
 
        if (!is_list( list )) {
@@ -1039,9 +1040,9 @@ parse_fetch_rsp( imap_store_t *ctx, list_t *list, char *s 
ATTR_UNUSED )
                                        tmp = tmp->next;
                                        if (!is_atom( tmp ))
                                                goto bfail;
-                                       int off, in_msgid = 0;
+                                       uint off, in_msgid = 0;
                                        for (char *val = tmp->val, *end; (end = 
strchr( val, '\n' )); val = end + 1) {
-                                               int len = (int)(end - val);
+                                               uint len = (uint)(end - val);
                                                if (len && end[-1] == '\r')
                                                        len--;
                                                if (!len)
@@ -1136,7 +1137,7 @@ parse_capability( imap_store_t *ctx, char *cmd )
        ctx->auth_mechs = 0;
        ctx->caps = 0x80000000;
        while ((arg = next_arg( &cmd ))) {
-               if (starts_with( arg, -1, "AUTH=", 5 )) {
+               if (starts_with( arg, UINT_MAX, "AUTH=", 5 )) {
                        add_string_list( &ctx->auth_mechs, arg + 5 );
                } else {
                        for (i = 0; i < as(cap_list); i++)
@@ -1237,7 +1238,7 @@ parse_list_rsp_p1( imap_store_t *ctx, list_t *list, char 
*cmd ATTR_UNUSED )
 
 // Use this to check whether a full path refers to the actual IMAP INBOX.
 static int
-is_inbox( imap_store_t *ctx, const char *arg, int argl )
+is_inbox( imap_store_t *ctx, const char *arg, uint argl )
 {
        if (!starts_with_upper( arg, argl, "INBOX", 5 ))
                return 0;
@@ -1248,7 +1249,7 @@ is_inbox( imap_store_t *ctx, const char *arg, int argl )
 
 // Use this to check whether a path fragment collides with the canonical INBOX.
 static int
-is_INBOX( imap_store_t *ctx, const char *arg, int argl )
+is_INBOX( imap_store_t *ctx, const char *arg, uint argl )
 {
        if (!starts_with( arg, argl, "INBOX", 5 ))
                return 0;
@@ -1262,7 +1263,7 @@ parse_list_rsp_p2( imap_store_t *ctx, list_t *list, char 
*cmd ATTR_UNUSED )
 {
        string_list_t *narg;
        char *arg;
-       int argl, l;
+       uint argl, l;
 
        if (!is_atom( list )) {
                error( "IMAP error: malformed LIST response\n" );
@@ -1308,7 +1309,7 @@ parse_list_rsp_p2( imap_store_t *ctx, list_t *list, char 
*cmd ATTR_UNUSED )
 static int
 prepare_name( char **buf, const imap_store_t *ctx, const char *prefix, const 
char *name )
 {
-       int pl = strlen( prefix );
+       uint pl = strlen( prefix );
 
        switch (map_name( name, buf, pl, "/", ctx->delimiter )) {
        case -1:
@@ -1329,7 +1330,7 @@ prepare_box( char **buf, const imap_store_t *ctx )
        const char *name = ctx->name;
 
        return prepare_name( buf, ctx,
-           (starts_with( name, -1, "INBOX", 5 ) && (!name[5] || name[5] == 
'/')) ? "" : ctx->prefix, name );
+           (starts_with( name, UINT_MAX, "INBOX", 5 ) && (!name[5] || name[5] 
== '/')) ? "" : ctx->prefix, name );
 }
 
 static int
@@ -1500,7 +1501,7 @@ imap_socket_read( void *aux )
                                resp = RESP_OK;
                        } else {
                                if (!strcmp( "NO", arg )) {
-                                       if (cmdp->param.create && cmd && 
starts_with( cmd, -1, "[TRYCREATE]", 11 )) { /* APPEND or UID COPY */
+                                       if (cmdp->param.create && cmd && 
starts_with( cmd, UINT_MAX, "[TRYCREATE]", 11 )) { /* APPEND or UID COPY */
                                                imap_cmd_trycreate_t *cmd2 =
                                                        (imap_cmd_trycreate_t 
*)new_imap_cmd( sizeof(*cmd2) );
                                                cmd2->orig_cmd = cmdp;
@@ -1516,9 +1517,9 @@ imap_socket_read( void *aux )
                                } else /*if (!strcmp( "BAD", arg ))*/
                                        resp = RESP_CANCEL;
                                error( "IMAP command '%s' returned an error: %s 
%s\n",
-                                      starts_with( cmdp->cmd, -1, "LOGIN", 5 ) 
?
+                                      starts_with( cmdp->cmd, UINT_MAX, 
"LOGIN", 5 ) ?
                                           "LOGIN <user> <pass>" :
-                                          starts_with( cmdp->cmd, -1, 
"AUTHENTICATE PLAIN", 18 ) ?
+                                          starts_with( cmdp->cmd, UINT_MAX, 
"AUTHENTICATE PLAIN", 18 ) ?
                                               "AUTHENTICATE PLAIN <authdata>" :
                                                cmdp->cmd,
                                       arg, cmd ? cmd : "" );
@@ -2142,7 +2143,7 @@ imap_open_store_authenticate2( imap_store_t *ctx )
                                                skipped_login = 1;
 #ifdef HAVE_LIBSASL
                                } else {
-                                       int len = strlen( cmech->string );
+                                       uint len = strlen( cmech->string );
                                        if (saslend + len + 2 > saslmechs + 
sizeof(saslmechs))
                                                oob();
                                        *saslend++ = ' ';
@@ -2374,7 +2375,7 @@ imap_get_box_path( store_t *gctx ATTR_UNUSED )
 
 typedef struct {
        imap_cmd_t gen;
-       void (*callback)( int sts, int uidvalidity, void *aux );
+       void (*callback)( int sts, uint uidvalidity, void *aux );
        void *callback_aux;
 } imap_cmd_open_box_t;
 
@@ -2384,7 +2385,7 @@ static void imap_open_box_p4( imap_store_t *, 
imap_cmd_open_box_t *, int );
 
 static void
 imap_open_box( store_t *gctx,
-               void (*cb)( int sts, int uidvalidity, void *aux ), void *aux )
+               void (*cb)( int sts, uint uidvalidity, void *aux ), void *aux )
 {
        imap_store_t *ctx = (imap_store_t *)gctx;
        imap_cmd_open_box_t *cmd;
@@ -2441,7 +2442,7 @@ imap_open_box_p4( imap_store_t *ctx, imap_cmd_open_box_t 
*cmdp, int response )
        cmdp->callback( response, ctx->uidvalidity, cmdp->callback_aux );
 }
 
-static int
+static uint
 imap_get_uidnext( store_t *gctx )
 {
        imap_store_t *ctx = (imap_store_t *)gctx;
@@ -2534,14 +2535,15 @@ imap_prepare_load_box( store_t *gctx, int opts )
 
 enum { WantSize = 1, WantTuids = 2, WantMsgids = 4 };
 typedef struct {
-       int first, last, flags;
+       uint first, last;
+       int flags;
 } imap_range_t;
 
 static void
-imap_set_range( imap_range_t *ranges, int *nranges, int low_flags, int 
high_flags, int maxlow )
+imap_set_range( imap_range_t *ranges, uint *nranges, int low_flags, int 
high_flags, uint maxlow )
 {
        if (low_flags != high_flags) {
-               for (int r = 0; r < *nranges; r++) {
+               for (uint r = 0; r < *nranges; r++) {
                        if (ranges[r].first > maxlow)
                                break; /* Range starts above split point; so do 
all subsequent ranges. */
                        if (ranges[r].last < maxlow)
@@ -2555,7 +2557,7 @@ imap_set_range( imap_range_t *ranges, int *nranges, int 
low_flags, int high_flag
                        break;
                }
        }
-       for (int r = 0; r < *nranges; r++)
+       for (uint r = 0; r < *nranges; r++)
                ranges[r].flags |= (ranges[r].last <= maxlow) ? low_flags : 
high_flags;
 }
 
@@ -2573,7 +2575,7 @@ imap_load_box( store_t *gctx, uint minuid, uint maxuid, 
uint newuid, uint seenui
                void (*cb)( int sts, message_t *msgs, int total_msgs, int 
recent_msgs, void *aux ), void *aux )
 {
        imap_store_t *ctx = (imap_store_t *)gctx;
-       int i, j, bl;
+       uint i, j, bl;
        char buf[1000];
 
        if (!ctx->total_msgs) {
@@ -2585,11 +2587,11 @@ imap_load_box( store_t *gctx, uint minuid, uint maxuid, 
uint newuid, uint seenui
                        for (bl = 0; i < excs.size && bl < 960; i++) {
                                if (bl)
                                        buf[bl++] = ',';
-                               bl += sprintf( buf + bl, "%u", excs.data[i] );
+                               bl += (uint)sprintf( buf + bl, "%u", 
excs.data[i] );
                                j = i;
                                for (; i + 1 < excs.size && excs.data[i + 1] == 
excs.data[i] + 1; i++) {}
                                if (i != j)
-                                       bl += sprintf( buf + bl, ":%u", 
excs.data[i] );
+                                       bl += (uint)sprintf( buf + bl, ":%u", 
excs.data[i] );
                        }
                        imap_submit_load( ctx, buf, shifted_bit( ctx->opts, 
OPEN_OLD_IDS, WantMsgids ), sts );
                }
@@ -2600,7 +2602,7 @@ imap_load_box( store_t *gctx, uint minuid, uint maxuid, 
uint newuid, uint seenui
                        ranges[0].first = minuid;
                        ranges[0].last = maxuid;
                        ranges[0].flags = 0;
-                       int nranges = 1;
+                       uint nranges = 1;
                        if (ctx->opts & (OPEN_OLD_SIZE | OPEN_NEW_SIZE))
                                imap_set_range( ranges, &nranges, shifted_bit( 
ctx->opts, OPEN_OLD_SIZE, WantSize),
                                                                  shifted_bit( 
ctx->opts, OPEN_NEW_SIZE, WantSize), seenuid );
@@ -2608,7 +2610,7 @@ imap_load_box( store_t *gctx, uint minuid, uint maxuid, 
uint newuid, uint seenui
                                imap_set_range( ranges, &nranges, 0, WantTuids, 
newuid - 1 );
                        if (ctx->opts & OPEN_OLD_IDS)
                                imap_set_range( ranges, &nranges, WantMsgids, 
0, seenuid );
-                       for (int r = 0; r < nranges; r++) {
+                       for (uint r = 0; r < nranges; r++) {
                                sprintf( buf, "%u:%u", ranges[r].first, 
ranges[r].last );
                                imap_submit_load( ctx, buf, ranges[r].flags, 
sts );
                        }
@@ -2634,14 +2636,14 @@ imap_sort_msgs_comp( const void *a_, const void *b_ )
 static void
 imap_sort_msgs( imap_store_t *ctx )
 {
-       int count = count_generic_messages( ctx->msgs );
+       uint count = count_generic_messages( ctx->msgs );
        if (count <= 1)
                return;
 
        message_t **t = nfmalloc( sizeof(*t) * count );
 
        message_t *m = ctx->msgs;
-       for (int i = 0; i < count; i++) {
+       for (uint i = 0; i < count; i++) {
                t[i] = m;
                m = m->next;
        }
@@ -2650,7 +2652,7 @@ imap_sort_msgs( imap_store_t *ctx )
 
        ctx->msgs = t[0];
 
-       int j;
+       uint j;
        for (j = 0; j < count - 1; j++)
                t[j]->next = t[j + 1];
        ctx->msgapp = &t[j]->next;
@@ -2727,7 +2729,7 @@ imap_fetch_msg_p2( imap_store_t *ctx, imap_cmd_t *gcmd, 
int response )
 
 /******************* imap_set_msg_flags *******************/
 
-static int
+static uint
 imap_make_flags( int flags, char *buf )
 {
        const char *s;
@@ -2903,7 +2905,7 @@ imap_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
        imap_store_t *ctx = (imap_store_t *)gctx;
        imap_cmd_out_uid_t *cmd;
        char *buf;
-       int d;
+       uint d;
        char flagstr[128], datestr[64];
 
        d = 0;
@@ -2923,12 +2925,12 @@ imap_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
                cmd->gen.param.create = 1;
                cmd->gen.param.to_trash = 1;
                if (prepare_trash( &buf, ctx ) < 0) {
-                       cb( DRV_BOX_BAD, -1, aux );
+                       cb( DRV_BOX_BAD, 0, aux );
                        return;
                }
        } else {
                if (prepare_box( &buf, ctx ) < 0) {
-                       cb( DRV_BOX_BAD, -1, aux );
+                       cb( DRV_BOX_BAD, 0, aux );
                        return;
                }
        }
@@ -3055,7 +3057,7 @@ imap_list_store( store_t *gctx, int flags,
        // path      | P [i] | i [P] | P
        //
        int pfx_is_empty = !*ctx->prefix;
-       int pfx_is_inbox = !pfx_is_empty && is_inbox( ctx, ctx->prefix, -1 );
+       int pfx_is_inbox = !pfx_is_empty && is_inbox( ctx, ctx->prefix, 
UINT_MAX );
        if (((flags & (LIST_PATH | LIST_PATH_MAYBE)) || pfx_is_empty) && 
!pfx_is_inbox && !(ctx->listed & LIST_PATH)) {
                ctx->listed |= LIST_PATH;
                if (pfx_is_empty)
@@ -3116,7 +3118,7 @@ imap_commit_cmds( store_t *gctx )
 
 /******************* imap_get_memory_usage *******************/
 
-static int
+static uint
 imap_get_memory_usage( store_t *gctx )
 {
        imap_store_t *ctx = (imap_store_t *)gctx;
@@ -3183,16 +3185,16 @@ imap_parse_store( conffile_t *cfg, store_conf_t 
**storep )
                        /* The imap[s]: syntax is just a backwards compat hack. 
*/
                        arg = cfg->val;
 #ifdef HAVE_LIBSSL
-                       if (starts_with( arg, -1, "imaps:", 6 )) {
+                       if (starts_with( arg, UINT_MAX, "imaps:", 6 )) {
                                arg += 6;
                                server->ssl_type = SSL_IMAPS;
                                if (server->sconf.ssl_versions == -1)
                                        server->sconf.ssl_versions = SSLv3 | 
TLSv1 | TLSv1_1 | TLSv1_2;
                        } else
 #endif
-                       if (starts_with( arg, -1, "imap:", 5 ))
+                       if (starts_with( arg, UINT_MAX, "imap:", 5 ))
                                arg += 5;
-                       if (starts_with( arg, -1, "//", 2 ))
+                       if (starts_with( arg, UINT_MAX, "//", 2 ))
                                arg += 2;
                        if (arg != cfg->val)
                                warn( "%s:%d: Notice: URL notation is 
deprecated; use a plain host name and possibly 'SSLType IMAPS' instead\n", 
cfg->file, cfg->line );
diff --git a/src/drv_maildir.c b/src/drv_maildir.c
index 656eeb4..8108390 100644
--- a/src/drv_maildir.c
+++ b/src/drv_maildir.c
@@ -69,8 +69,7 @@ typedef struct {
 
 typedef struct {
        store_t gen;
-       uint opts;
-       int uvfd, uvok, is_inbox, fresh[3];
+       int opts, uvfd, uvok, is_inbox, fresh[3];
        uint minuid, maxuid, newuid, seenuid, uidvalidity, nuid;
        uint_array_t excs;
        char *path; /* own */
@@ -143,7 +142,7 @@ maildir_join_path( maildir_store_conf_t *conf, int 
in_inbox, const char *box )
 {
        char *out, *p;
        const char *prefix;
-       int pl, bl, n;
+       uint pl, bl, n;
        char c;
 
        if (in_inbox || conf->sub_style == SUB_MAILDIRPP) {
@@ -328,7 +327,7 @@ maildir_list_maildirpp( maildir_store_t *ctx, int flags, 
const char *inbox )
                add_string_list( &ctx->boxes, "INBOX" );
 
        char path[_POSIX_PATH_MAX];
-       int pathLen = nfsnprintf( path, _POSIX_PATH_MAX, "%s/", inbox );
+       uint pathLen = nfsnprintf( path, _POSIX_PATH_MAX, "%s/", inbox );
        if (!(dir = opendir( path ))) {
                if (errno == ENOENT || errno == ENOTDIR)
                        return 0;
@@ -353,7 +352,7 @@ maildir_list_maildirpp( maildir_store_t *ctx, int flags, 
const char *inbox )
                        if (!(flags & (LIST_PATH | LIST_PATH_MAYBE)))
                                continue;
                        // Explained in maildir_list_recurse().
-                       if (starts_with( ent, -1, "INBOX", 5 ) && (!ent[5] || 
ent[5] == '.')) {
+                       if (starts_with( ent, UINT_MAX, "INBOX", 5 ) && 
(!ent[5] || ent[5] == '.')) {
                                if (!warned) {
                                        warned = 1;
                                        path[pathLen] = 0;
@@ -363,10 +362,10 @@ maildir_list_maildirpp( maildir_store_t *ctx, int flags, 
const char *inbox )
                        }
                        effName += 6;
                }
-               nfsnprintf( path + pathLen, _POSIX_PATH_MAX - pathLen, 
"%s/cur", de->d_name );
+               nfsnprintf( path + pathLen, _POSIX_PATH_MAX - (int)pathLen, 
"%s/cur", de->d_name );
                if (!stat( path, &st ) && S_ISDIR(st.st_mode)) {
-                       int nl = nfsnprintf( name, _POSIX_PATH_MAX, "INBOX/%s", 
ent );
-                       for (int i = 6; i < nl; i++) {
+                       uint nl = nfsnprintf( name, _POSIX_PATH_MAX, 
"INBOX/%s", ent );
+                       for (uint i = 6; i < nl; i++) {
                                if (name[i] == '.')
                                        name[i] = '/';
                        }
@@ -386,12 +385,12 @@ static int maildir_list_path( maildir_store_t *ctx, int 
flags, const char *inbox
 
 static int
 maildir_list_recurse( maildir_store_t *ctx, int isBox, int flags,
-                      const char *inbox, int inboxLen, const char *basePath, 
int basePathLen,
-                      char *path, int pathLen, char *name, int nameLen )
+                      const char *inbox, uint inboxLen, const char *basePath, 
uint basePathLen,
+                      char *path, uint pathLen, char *name, uint nameLen )
 {
        DIR *dir;
        int style = ((maildir_store_conf_t *)ctx->gen.conf)->sub_style;
-       int pl, nl;
+       uint pl, nl;
        struct dirent *de;
        struct stat st;
 
@@ -411,7 +410,7 @@ maildir_list_recurse( maildir_store_t *ctx, int isBox, int 
flags,
                const char *ent = de->d_name;
                if (ent[0] == '.' && (!ent[1] || (ent[1] == '.' && !ent[2])))
                        continue;
-               pl = nfsnprintf( path + pathLen, _POSIX_PATH_MAX - pathLen, 
"%s", ent );
+               pl = nfsnprintf( path + pathLen, _POSIX_PATH_MAX - 
(int)pathLen, "%s", ent );
                if (pl == 3 && (!memcmp( ent, "cur", 3 ) || !memcmp( ent, 
"new", 3 ) || !memcmp( ent, "tmp", 3 )))
                        continue;
                pl += pathLen;
@@ -442,14 +441,14 @@ maildir_list_recurse( maildir_store_t *ctx, int isBox, 
int flags,
                        // actual INBOX after prefix stripping, so drop it. 
This applies
                        // only to the fully uppercased spelling, as our 
canonical box
                        // names are case-sensitive (unlike IMAP's INBOX).
-                       if (!nameLen && equals( ent, -1, "INBOX", 5 )) {
+                       if (!nameLen && equals( ent, UINT_MAX, "INBOX", 5 )) {
                                path[pathLen] = 0;
                                warn( "Maildir warning: ignoring INBOX in 
%s\n", path );
                                continue;
                        }
-                       nl = nameLen + nfsnprintf( name + nameLen, 
_POSIX_PATH_MAX - nameLen, "%s", ent );
+                       nl = nameLen + nfsnprintf( name + nameLen, 
_POSIX_PATH_MAX - (int)nameLen, "%s", ent );
                        path[pl++] = '/';
-                       nfsnprintf( path + pl, _POSIX_PATH_MAX - pl, "cur" );
+                       nfsnprintf( path + pl, _POSIX_PATH_MAX - (int)pl, "cur" 
);
                        if (!stat( path, &st ) && S_ISDIR(st.st_mode))
                                add_string_list( &ctx->boxes, name );
                        path[pl] = 0;
@@ -522,7 +521,7 @@ static const char *subdirs[] = { "cur", "new", "tmp" };
 typedef struct {
        char *base;
        char *msgid;
-       int size;
+       uint size;
        uint uid;
        uchar recent;
        char tuid[TUIDL];
@@ -533,7 +532,7 @@ DEFINE_ARRAY_TYPE(msg_t)
 static void
 maildir_free_scan( msg_t_array_alloc_t *msglist )
 {
-       int i;
+       uint i;
 
        if (msglist->array.data) {
                for (i = 0; i < msglist->array.size; i++)
@@ -545,7 +544,7 @@ maildir_free_scan( msg_t_array_alloc_t *msglist )
 #define _24_HOURS (3600 * 24)
 
 static int
-maildir_clear_tmp( char *buf, int bufsz, int bl )
+maildir_clear_tmp( char *buf, uint bufsz, uint bl )
 {
        DIR *dirp;
        struct dirent *entry;
@@ -560,7 +559,7 @@ maildir_clear_tmp( char *buf, int bufsz, int bl )
        }
        time( &now );
        while ((entry = readdir( dirp ))) {
-               nfsnprintf( buf + bl, bufsz - bl, "%s", entry->d_name );
+               nfsnprintf( buf + bl, (int)bufsz - (int)bl, "%s", entry->d_name 
);
                if (stat( buf, &st )) {
                        if (errno != ENOENT)
                                sys_error( "Maildir error: cannot access %s", 
buf );
@@ -578,7 +577,7 @@ maildir_clear_tmp( char *buf, int bufsz, int bl )
 }
 
 static int
-make_box_dir( char *buf, int bl )
+make_box_dir( char *buf, uint bl )
 {
        char *p;
 
@@ -586,7 +585,7 @@ make_box_dir( char *buf, int bl )
                return 0;
        p = memrchr( buf, '/', bl - 1 );
        *p = 0;
-       if (make_box_dir( buf, (int)(p - buf) ))
+       if (make_box_dir( buf, (uint)(p - buf) ))
                return -1;
        *p = '/';
        return mkdir( buf, 0700 );
@@ -595,11 +594,11 @@ make_box_dir( char *buf, int bl )
 static int
 maildir_validate( const char *box, int create, maildir_store_t *ctx )
 {
-       int i, bl, ret;
+       int i, ret;
        struct stat st;
        char buf[_POSIX_PATH_MAX];
 
-       bl = nfsnprintf( buf, sizeof(buf) - 4, "%s/", box );
+       uint bl = nfsnprintf( buf, sizeof(buf) - 4, "%s/", box );
        if (stat( buf, &st )) {
                if (errno != ENOENT) {
                        sys_error( "Maildir error: cannot access mailbox '%s'", 
box );
@@ -682,7 +681,7 @@ maildir_store_uidval( maildir_store_t *ctx )
        {
                n = sprintf( buf, "%u\n%u\n", ctx->uidvalidity, ctx->nuid );
                lseek( ctx->uvfd, 0, SEEK_SET );
-               if (write( ctx->uvfd, buf, n ) != n || ftruncate( ctx->uvfd, n 
) || (UseFSync && fdatasync( ctx->uvfd ))) {
+               if (write( ctx->uvfd, buf, (uint)n ) != n || ftruncate( 
ctx->uvfd, n ) || (UseFSync && fdatasync( ctx->uvfd ))) {
                        error( "Maildir error: cannot write UIDVALIDITY.\n" );
                        return DRV_BOX_BAD;
                }
@@ -694,7 +693,7 @@ maildir_store_uidval( maildir_store_t *ctx )
 static int
 maildir_init_uidval( maildir_store_t *ctx )
 {
-       ctx->uidvalidity = time( 0 );
+       ctx->uidvalidity = (uint)time( 0 );
        ctx->nuid = 0;
        ctx->uvok = 0;
 #ifdef USE_DB
@@ -843,10 +842,11 @@ maildir_compare( const void *l, const void *r )
 {
        const msg_t *lm = (const msg_t *)l, *rm = (const msg_t *)r;
        char *ldot, *rdot, *ldot2, *rdot2, *lseq, *rseq;
-       int ret, llen, rlen;
+       uint llen, rlen;
+       int ret;
 
-       if ((ret = lm->uid - rm->uid))
-               return ret;
+       if (lm->uid != rm->uid)  // Can't subtract, the result might not fit 
into signed int.
+               return lm->uid > rm->uid ? 1 : -1;
 
        /* No UID, so sort by arrival date. We should not do this, but we rely
           on the suggested unique file name scheme - we have no choice. */
@@ -854,21 +854,21 @@ maildir_compare( const void *l, const void *r )
           faster than numeric. */
        if (!(ldot = strchr( lm->base, '.' )) || !(rdot = strchr( rm->base, '.' 
)))
                goto stronly; /* Should never happen ... */
-       llen = ldot - lm->base, rlen = rdot - rm->base;
+       llen = (uint)(ldot - lm->base), rlen = (uint)(rdot - rm->base);
        /* The shorter number is smaller. Really. This won't trigger with any
           mail created after Sep 9 2001 anyway. */
-       if ((ret = llen - rlen))
+       if ((ret = (int)llen - (int)rlen))
                return ret;
        if ((ret = memcmp( lm->base, rm->base, llen )))
                return ret;
 
        ldot++, rdot++;
 
-       if ((llen = strtol( ldot, &ldot2, 10 ))) {
-               if (!(rlen = strtol( rdot, &rdot2, 10 )))
+       if ((llen = strtoul( ldot, &ldot2, 10 ))) {
+               if (!(rlen = strtoul( rdot, &rdot2, 10 )))
                        goto stronly; /* Comparing apples to oranges ... */
                /* Classical PID specs */
-               if ((ret = llen - rlen)) {
+               if ((ret = (int)llen - (int)rlen)) {
                  retpid:
                        /* Handle PID wraparound. This works only on systems
                           where PIDs are not reused too fast */
@@ -882,7 +882,7 @@ maildir_compare( const void *l, const void *r )
 
        if (!(ldot2 = strchr( ldot, '.' )) || !(rdot2 = strchr( rdot, '.' )))
                goto stronly; /* Should never happen ... */
-       llen = ldot2 - ldot, rlen = rdot2 - rdot;
+       llen = (uint)(ldot2 - ldot), rlen = (uint)(rdot2 - rdot);
 
        if (((lseq = memchr( ldot, '#', llen )) && (rseq = memchr( rdot, '#', 
rlen ))) ||
            ((lseq = memchr( ldot, 'M', llen )) && (rseq = memchr( rdot, 'M', 
rlen ))))
@@ -913,8 +913,8 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t 
*msglist )
        DBC *dbc;
 #endif /* USE_DB */
        msg_t *entry;
-       int i, bl, fnl, ret;
-       uint uid;
+       int ret;
+       uint i, bl, fnl, uid;
        time_t now, stamps[2];
        struct stat st;
        char buf[_POSIX_PATH_MAX], nbuf[_POSIX_PATH_MAX];
@@ -1113,11 +1113,11 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t 
*msglist )
                                else
                                        u = ru = strchr( entry->base, 
conf->info_delimiter );
                                fnl = (u ?
-                                       nfsnprintf( buf + bl, sizeof(buf) - bl, 
"%s/%.*s,U=%u%s", subdirs[entry->recent], (int)(u - entry->base), entry->base, 
uid, ru ) :
-                                       nfsnprintf( buf + bl, sizeof(buf) - bl, 
"%s/%s,U=%u", subdirs[entry->recent], entry->base, uid ))
+                                       nfsnprintf( buf + bl, _POSIX_PATH_MAX - 
(int)bl, "%s/%.*s,U=%u%s", subdirs[entry->recent], (int)(u - entry->base), 
entry->base, uid, ru ) :
+                                       nfsnprintf( buf + bl, _POSIX_PATH_MAX - 
(int)bl, "%s/%s,U=%u", subdirs[entry->recent], entry->base, uid ))
                                        - 4;
                                memcpy( nbuf, buf, bl + 4 );
-                               nfsnprintf( nbuf + bl + 4, sizeof(nbuf) - bl - 
4, "%s", entry->base );
+                               nfsnprintf( nbuf + bl + 4, _POSIX_PATH_MAX - 
(int)bl - 4, "%s", entry->base );
                                if (rename( nbuf, buf )) {
                                        if (errno != ENOENT) {
                                                sys_error( "Maildir error: 
cannot rename %s to %s", nbuf, buf );
@@ -1138,7 +1138,7 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t 
*msglist )
                        if (!want_size && !want_tuid && !want_msgid)
                                continue;
                        if (!fnl)
-                               nfsnprintf( buf + bl, sizeof(buf) - bl, 
"%s/%s", subdirs[entry->recent], entry->base );
+                               nfsnprintf( buf + bl, _POSIX_PATH_MAX - 
(int)bl, "%s/%s", subdirs[entry->recent], entry->base );
                        if (want_size) {
                                if (stat( buf, &st )) {
                                        if (errno != ENOENT) {
@@ -1147,7 +1147,7 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t 
*msglist )
                                        }
                                        goto retry;
                                }
-                               entry->size = st.st_size;
+                               entry->size = (uint)st.st_size;
                        }
                        if (want_tuid || want_msgid) {
                                if (!(f = fopen( buf, "r" ))) {
@@ -1157,10 +1157,10 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t 
*msglist )
                                        }
                                        goto retry;
                                }
-                               int off, in_msgid = 0;
+                               uint off, in_msgid = 0;
                                char lnbuf[1000];  // Says RFC2822
                                while ((want_tuid || want_msgid) && fgets( 
lnbuf, sizeof(lnbuf), f )) {
-                                       int bufl = strlen( lnbuf );
+                                       uint bufl = strlen( lnbuf );
                                        if (bufl && lnbuf[bufl - 1] == '\n')
                                                --bufl;
                                        if (bufl && lnbuf[bufl - 1] == '\r')
@@ -1252,7 +1252,7 @@ maildir_select_box( store_t *gctx, const char *name )
        ctx->usedb = 0;
 #endif /* USE_DB */
        ctx->fresh[0] = ctx->fresh[1] = 0;
-       if (starts_with( name, -1, "INBOX", 5 ) && (!name[5] || name[5] == 
'/')) {
+       if (starts_with( name, UINT_MAX, "INBOX", 5 ) && (!name[5] || name[5] 
== '/')) {
                if (!name[5]) {
                        ctx->path = nfstrdup( conf->inbox );
                        ctx->is_inbox = 1;
@@ -1276,7 +1276,7 @@ maildir_get_box_path( store_t *gctx )
 
 static void
 maildir_open_box( store_t *gctx,
-                  void (*cb)( int sts, int uidvalidity, void *aux ), void *aux 
)
+                  void (*cb)( int sts, uint uidvalidity, void *aux ), void 
*aux )
 {
        maildir_store_t *ctx = (maildir_store_t *)gctx;
        int ret;
@@ -1321,7 +1321,7 @@ maildir_open_box( store_t *gctx,
        cb( ret, ctx->uidvalidity, aux );
 }
 
-static int
+static uint
 maildir_get_uidnext( store_t *gctx ATTR_UNUSED )
 {
        return 0;
@@ -1355,11 +1355,11 @@ maildir_delete_box( store_t *gctx,
                     void (*cb)( int sts, void *aux ), void *aux )
 {
        maildir_store_t *ctx = (maildir_store_t *)gctx;
-       int i, bl, ret = DRV_OK;
+       int i, ret = DRV_OK;
        struct stat st;
        char buf[_POSIX_PATH_MAX];
 
-       bl = nfsnprintf( buf, sizeof(buf) - 4, "%s/", ctx->path );
+       uint bl = nfsnprintf( buf, sizeof(buf) - 4, "%s/", ctx->path );
        if (stat( buf, &st )) {
                if (errno != ENOENT) {
                        sys_error( "Maildir error: cannot access mailbox '%s'", 
ctx->path );
@@ -1369,11 +1369,11 @@ maildir_delete_box( store_t *gctx,
                error( "Maildir error: '%s' is no valid mailbox\n", ctx->path );
                ret = DRV_BOX_BAD;
        } else if ((ret = maildir_clear_tmp( buf, sizeof(buf), bl )) == DRV_OK) 
{
-               nfsnprintf( buf + bl, sizeof(buf) - bl, ".uidvalidity" );
+               nfsnprintf( buf + bl, _POSIX_PATH_MAX - (int)bl, ".uidvalidity" 
);
                if (unlink( buf ) && errno != ENOENT)
                        goto badrm;
 #ifdef USE_DB
-               nfsnprintf( buf + bl, sizeof(buf) - bl, ".isyncuidmap.db" );
+               nfsnprintf( buf + bl, _POSIX_PATH_MAX - (int)bl, 
".isyncuidmap.db" );
                if (unlink( buf ) && errno != ENOENT)
                        goto badrm;
 #endif
@@ -1426,7 +1426,7 @@ maildir_load_box( store_t *gctx, uint minuid, uint 
maxuid, uint newuid, uint see
        maildir_store_t *ctx = (maildir_store_t *)gctx;
        message_t **msgapp;
        msg_t_array_alloc_t msglist;
-       int i;
+       uint i;
 
        ctx->minuid = minuid;
        ctx->maxuid = maxuid;
@@ -1453,7 +1453,7 @@ maildir_rescan( maildir_store_t *ctx )
        message_t **msgapp;
        maildir_message_t *msg;
        msg_t_array_alloc_t msglist;
-       int i;
+       uint i;
 
        ctx->fresh[0] = ctx->fresh[1] = 0;
        if (maildir_scan( ctx, &msglist ) != DRV_OK)
@@ -1550,8 +1550,8 @@ maildir_fetch_msg( store_t *gctx, message_t *gmsg, 
msg_data_t *data,
        cb( DRV_OK, aux );
 }
 
-static int
-maildir_make_flags( char info_delimiter, int flags, char *buf )
+static uint
+maildir_make_flags( char info_delimiter, uchar flags, char *buf )
 {
        uint i, d;
 
@@ -1571,11 +1571,11 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
 {
        maildir_store_t *ctx = (maildir_store_t *)gctx;
        const char *box;
-       int ret, fd, bl;
+       int ret, fd;
        uint uid;
        char buf[_POSIX_PATH_MAX], nbuf[_POSIX_PATH_MAX], fbuf[NUM_FLAGS + 3], 
base[128];
 
-       bl = nfsnprintf( base, sizeof(base), "%lld.%d_%d.%s", (long long)time( 
0 ), Pid, ++MaildirCount, Hostname );
+       uint bl = nfsnprintf( base, sizeof(base), "%lld.%d_%d.%s", (long 
long)time( 0 ), Pid, ++MaildirCount, Hostname );
        if (!to_trash) {
 #ifdef USE_DB
                if (ctx->usedb) {
@@ -1592,7 +1592,7 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
                                cb( ret, 0, aux );
                                return;
                        }
-                       nfsnprintf( base + bl, sizeof(base) - bl, ",U=%u", uid 
);
+                       nfsnprintf( base + bl, (int)sizeof(base) - (int)bl, 
",U=%u", uid );
                }
                box = ctx->path;
        } else {
@@ -1623,7 +1623,7 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int 
to_trash,
        }
        ret = write( fd, data->data, data->len );
        free( data->data );
-       if (ret != data->len || (UseFSync && (ret = fsync( fd )))) {
+       if (ret != (int)data->len || (UseFSync && (ret = fsync( fd )))) {
                if (ret < 0)
                        sys_error( "Maildir error: cannot write %s", buf );
                else
@@ -1675,27 +1675,27 @@ maildir_set_msg_flags( store_t *gctx, message_t *gmsg, 
uint uid ATTR_UNUSED, int
        maildir_store_t *ctx = (maildir_store_t *)gctx;
        maildir_message_t *msg = (maildir_message_t *)gmsg;
        char *s, *p;
-       uint i;
-       int j, ret, ol, fl, bbl, bl, tl;
+       uint i, j, ol, fl, bbl, bl, tl;
+       int ret;
        char buf[_POSIX_PATH_MAX], nbuf[_POSIX_PATH_MAX];
 
-       bbl = nfsnprintf( buf, sizeof(buf), "%s/", ctx->path );
+       bbl = nfsnprintf( buf, _POSIX_PATH_MAX, "%s/", ctx->path );
        memcpy( nbuf, ctx->path, bbl - 1 );
        memcpy( nbuf + bbl - 1, "/cur/", 5 );
        for (;;) {
-               bl = bbl + nfsnprintf( buf + bbl, sizeof(buf) - bbl, "%s/", 
subdirs[gmsg->status & M_RECENT] );
+               bl = bbl + nfsnprintf( buf + bbl, _POSIX_PATH_MAX - (int)bbl, 
"%s/", subdirs[gmsg->status & M_RECENT] );
                ol = strlen( msg->base );
-               if ((int)sizeof(buf) - bl < ol + 3 + NUM_FLAGS)
+               if (_POSIX_PATH_MAX - bl < ol + 3 + NUM_FLAGS)
                        oob();
                memcpy( buf + bl, msg->base, ol + 1 );
                memcpy( nbuf + bl, msg->base, ol + 1 );
                if ((s = strstr( nbuf + bl, conf->info_prefix ))) {
                        s += 3;
-                       fl = ol - (s - (nbuf + bl));
+                       fl = ol - (uint)(s - (nbuf + bl));
                        for (i = 0; i < as(Flags); i++) {
                                if ((p = strchr( s, Flags[i] ))) {
                                        if (del & (1 << i)) {
-                                               memmove( p, p + 1, fl - (p - s) 
);
+                                               memmove( p, p + 1, fl - 
(uint)(p - s) );
                                                fl--;
                                        }
                                } else if (add & (1 << i)) {
@@ -1796,15 +1796,15 @@ maildir_close_box( store_t *gctx,
 {
        maildir_store_t *ctx = (maildir_store_t *)gctx;
        message_t *msg;
-       int basel, retry, ret;
+       int retry, ret;
        char buf[_POSIX_PATH_MAX];
 
        for (;;) {
                retry = 0;
-               basel = nfsnprintf( buf, sizeof(buf), "%s/", ctx->path );
+               uint basel = nfsnprintf( buf, sizeof(buf), "%s/", ctx->path );
                for (msg = ctx->msgs; msg; msg = msg->next)
                        if (!(msg->status & M_DEAD) && (msg->flags & 
F_DELETED)) {
-                               nfsnprintf( buf + basel, sizeof(buf) - basel, 
"%s/%s", subdirs[msg->status & M_RECENT], ((maildir_message_t *)msg)->base );
+                               nfsnprintf( buf + basel, _POSIX_PATH_MAX - 
(int)basel, "%s/%s", subdirs[msg->status & M_RECENT], ((maildir_message_t 
*)msg)->base );
                                if (unlink( buf )) {
                                        if (errno == ENOENT)
                                                retry = 1;
@@ -1845,7 +1845,7 @@ maildir_commit_cmds( store_t *gctx )
        (void) gctx;
 }
 
-static int
+static uint
 maildir_get_memory_usage( store_t *gctx ATTR_UNUSED )
 {
        return 0;
diff --git a/src/drv_proxy.c b/src/drv_proxy.c
index 6a62f22..076640f 100644
--- a/src/drv_proxy.c
+++ b/src/drv_proxy.c
@@ -27,7 +27,7 @@
 typedef struct {
        store_t gen;
        const char *label; // foreign
-       int ref_count;
+       uint ref_count;
        driver_t *real_driver;
        store_t *real_store;
 
@@ -58,7 +58,7 @@ debugn( const char *msg, ... )
 static const char Flags[] = { 'D', 'F', 'R', 'S', 'T' };
 
 static char *
-proxy_make_flags( int flags, char *buf )
+proxy_make_flags( uchar flags, char *buf )
 {
        uint i, d;
 
@@ -79,13 +79,13 @@ proxy_store_deref( proxy_store_t *ctx )
 static int curr_tag;
 
 typedef struct {
-       int ref_count;
+       uint ref_count;
        int tag;
        proxy_store_t *ctx;
 } gen_cmd_t;
 
 static gen_cmd_t *
-proxy_cmd_new( proxy_store_t *ctx, int sz )
+proxy_cmd_new( proxy_store_t *ctx, uint sz )
 {
        gen_cmd_t *cmd = nfmalloc( sz );
        cmd->ref_count = 2;
@@ -200,7 +200,7 @@ proxy_@name@( store_t *gctx@decl_args@, void (*cb)( 
@decl_cb_args@void *aux ), v
 //# DEFINE load_box_print_args
        if (excs.size) {
                debugn( "  excs:" );
-               for (int t = 0; t < excs.size; t++)
+               for (uint t = 0; t < excs.size; t++)
                        debugn( " %d", excs.data[t] );
                debug( "\n" );
        }
diff --git a/src/main.c b/src/main.c
index d9d9bfc..febf5a4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -25,6 +25,7 @@
 #include <stdlib.h>
 #include <stddef.h>
 #include <unistd.h>
+#include <limits.h>
 #include <string.h>
 #include <fcntl.h>
 #include <signal.h>
@@ -44,7 +45,7 @@ int Pid;              /* for maildir and imap */
 char Hostname[256];    /* for maildir */
 const char *Home;      /* for config */
 
-int BufferLimit = 10 * 1024 * 1024;
+uint BufferLimit = 10 * 1024 * 1024;
 
 static int chans_total, chans_done;
 static int boxes_total, boxes_done;
@@ -220,7 +221,7 @@ matches( const char *t, const char *p )
 static int
 is_inbox( const char *name )
 {
-       return starts_with( name, -1, "INBOX", 5 ) && (!name[5] || name[5] == 
'/');
+       return starts_with( name, UINT_MAX, "INBOX", 5 ) && (!name[5] || 
name[5] == '/');
 }
 
 static int
@@ -242,11 +243,11 @@ filter_boxes( string_list_t *boxes, const char *prefix, 
string_list_t *patterns
        string_list_t *cpat;
        char **boxarr = 0;
        const char *ps;
-       int not, fnot, pfxl, num = 0, rnum = 0;
+       uint not, fnot, pfxl, num = 0, rnum = 0;
 
        pfxl = prefix ? strlen( prefix ) : 0;
        for (; boxes; boxes = boxes->next) {
-               if (!starts_with( boxes->string, -1, prefix, pfxl ))
+               if (!starts_with( boxes->string, UINT_MAX, prefix, pfxl ))
                        continue;
                fnot = 1;
                for (cpat = patterns; cpat; cpat = cpat->next) {
@@ -328,7 +329,8 @@ add_named_channel( chan_ent_t ***chanapp, char *channame, 
int ops[] )
        chan_ent_t *ce;
        box_ent_t *boxes = 0, **mboxapp = &boxes, *mbox;
        char *boxp, *nboxp;
-       int boxl, boxlist = 0;
+       size_t boxl;
+       char boxlist = 0;
 
        if ((boxp = strchr( channame, ':' )))
                *boxp++ = 0;
@@ -347,7 +349,7 @@ add_named_channel( chan_ent_t ***chanapp, char *channame, 
int ops[] )
                do {
                        nboxp = strpbrk( boxp, ",\n" );
                        if (nboxp) {
-                               boxl = nboxp - boxp;
+                               boxl = (uint)(nboxp - boxp);
                                *nboxp++ = 0;
                        } else {
                                boxl = strlen( boxp );
@@ -440,7 +442,7 @@ main( int argc, char **argv )
                                                return 1;
                                        }
                                        config = argv[oind++];
-                               } else if (starts_with( opt, -1, "config=", 7 ))
+                               } else if (starts_with( opt, UINT_MAX, 
"config=", 7 ))
                                        config = opt + 7;
                                else if (!strcmp( opt, "all" ))
                                        mvars->all = 1;
@@ -457,7 +459,7 @@ main( int argc, char **argv )
                                                DFlags |= QUIET;
                                } else if (!strcmp( opt, "verbose" )) {
                                        DFlags |= VERBOSE;
-                               } else if (starts_with( opt, -1, "debug", 5 )) {
+                               } else if (starts_with( opt, UINT_MAX, "debug", 
5 )) {
                                        opt += 5;
                                        if (!*opt)
                                                op = VERBOSE | DEBUG_ALL;
@@ -484,7 +486,7 @@ main( int argc, char **argv )
                                        cops |= XOP_PULL, ops[M] |= 
XOP_HAVE_TYPE;
                                else if (!strcmp( opt, "push" ))
                                        cops |= XOP_PUSH, ops[M] |= 
XOP_HAVE_TYPE;
-                               else if (starts_with( opt, -1, "create", 6 )) {
+                               else if (starts_with( opt, UINT_MAX, "create", 
6 )) {
                                        opt += 6;
                                        op = OP_CREATE|XOP_HAVE_CREATE;
                                  lcop:
@@ -497,11 +499,11 @@ main( int argc, char **argv )
                                        else
                                                goto badopt;
                                        ops[M] |= op & 
(XOP_HAVE_CREATE|XOP_HAVE_REMOVE|XOP_HAVE_EXPUNGE);
-                               } else if (starts_with( opt, -1, "remove", 6 )) 
{
+                               } else if (starts_with( opt, UINT_MAX, 
"remove", 6 )) {
                                        opt += 6;
                                        op = OP_REMOVE|XOP_HAVE_REMOVE;
                                        goto lcop;
-                               } else if (starts_with( opt, -1, "expunge", 7 
)) {
+                               } else if (starts_with( opt, UINT_MAX, 
"expunge", 7 )) {
                                        opt += 7;
                                        op = OP_EXPUNGE|XOP_HAVE_EXPUNGE;
                                        goto lcop;
@@ -515,7 +517,7 @@ main( int argc, char **argv )
                                        ops[M] |= 
XOP_HAVE_TYPE|XOP_PULL|XOP_PUSH;
                                else if (!strcmp( opt, "noop" ))
                                        ops[M] |= XOP_HAVE_TYPE;
-                               else if (starts_with( opt, -1, "pull", 4 )) {
+                               else if (starts_with( opt, UINT_MAX, "pull", 4 
)) {
                                        op = XOP_PULL;
                                  lcac:
                                        opt += 4;
@@ -526,7 +528,7 @@ main( int argc, char **argv )
                                                goto rlcac;
                                        } else
                                                goto badopt;
-                               } else if (starts_with( opt, -1, "push", 4 )) {
+                               } else if (starts_with( opt, UINT_MAX, "push", 
4 )) {
                                        op = XOP_PUSH;
                                        goto lcac;
                                } else {
@@ -972,7 +974,7 @@ store_connected( int sts, void *aux )
                                const char *pat = cpat->string;
                                if (*pat != '!') {
                                        char buf[8];
-                                       int bufl = snprintf( buf, sizeof(buf), 
"%s%s", nz( mvars->chan->boxes[t], "" ), pat );
+                                       uint bufl = nfsnprintf( buf, 
sizeof(buf), "%s%s", nz( mvars->chan->boxes[t], "" ), pat );
                                        int flags = 0;
                                        /* Partial matches like "INB*" or even 
"*" are not considered,
                                         * except implicity when the INBOX 
lives under Path. */
diff --git a/src/socket.c b/src/socket.c
index b7bffd5..e33ff53 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -233,7 +233,6 @@ static int
 init_ssl_ctx( const server_conf_t *conf )
 {
        server_conf_t *mconf = (server_conf_t *)conf;
-       int options = 0;
 
        if (conf->SSLContext)
                return conf->ssl_ctx_valid;
@@ -248,6 +247,7 @@ init_ssl_ctx( const server_conf_t *conf )
                return 0;
        }
 
+       uint options = 0;
        if (!(conf->ssl_versions & SSLv3))
                options |= SSL_OP_NO_SSLv3;
        if (!(conf->ssl_versions & TLSv1))
@@ -662,9 +662,9 @@ socket_close( conn_t *sock )
 }
 
 static int
-prepare_read( conn_t *sock, char **buf, int *len )
+prepare_read( conn_t *sock, char **buf, uint *len )
 {
-       int n = sock->offset + sock->bytes;
+       uint n = sock->offset + sock->bytes;
        if (!(*len = sizeof(sock->buf) - n)) {
                error( "Socket error: receive buffer full. Probably protocol 
error.\n" );
                socket_fail( sock );
@@ -675,7 +675,7 @@ prepare_read( conn_t *sock, char **buf, int *len )
 }
 
 static int
-do_read( conn_t *sock, char *buf, int len )
+do_read( conn_t *sock, char *buf, uint len )
 {
        int n;
 
@@ -684,10 +684,10 @@ do_read( conn_t *sock, char *buf, int len )
                conf_wakeup( &sock->fd_timeout, sock->conf->timeout );
 #ifdef HAVE_LIBSSL
        if (sock->ssl) {
-               if ((n = ssl_return( "read from", sock, SSL_read( sock->ssl, 
buf, len ) )) <= 0)
+               if ((n = ssl_return( "read from", sock, SSL_read( sock->ssl, 
buf, (int)len ) )) <= 0)
                        return n;
 
-               if (n == len && SSL_pending( sock->ssl ))
+               if (n == (int)len && SSL_pending( sock->ssl ))
                        conf_wakeup( &sock->ssl_fake, 0 );
        } else
 #endif
@@ -710,7 +710,8 @@ static void
 socket_fill_z( conn_t *sock )
 {
        char *buf;
-       int len, ret;
+       uint len;
+       int ret;
 
        if (prepare_read( sock, &buf, &len ) < 0)
                return;
@@ -730,7 +731,7 @@ socket_fill_z( conn_t *sock )
        if (!sock->in_z->avail_out)
                conf_wakeup( &sock->z_fake, 0 );
 
-       if ((len = (char *)sock->in_z->next_out - buf)) {
+       if ((len = (uint)((char *)sock->in_z->next_out - buf))) {
                sock->bytes += len;
                sock->read_callback( sock->callback_aux );
        }
@@ -748,21 +749,22 @@ socket_fill( conn_t *sock )
                sock->in_z->next_in = (uchar *)sock->z_buf;
                if ((ret = do_read( sock, sock->z_buf, sizeof(sock->z_buf) )) 
<= 0)
                        return;
-               sock->in_z->avail_in = ret;
+               sock->in_z->avail_in = (uint)ret;
                socket_fill_z( sock );
        } else
 #endif
        {
                char *buf;
-               int len;
+               uint len;
 
                if (prepare_read( sock, &buf, &len ) < 0)
                        return;
 
-               if ((len = do_read( sock, buf, len )) <= 0)
+               int n;
+               if ((n = do_read( sock, buf, len )) <= 0)
                        return;
 
-               sock->bytes += len;
+               sock->bytes += (uint)n;
                sock->read_callback( sock->callback_aux );
        }
 }
@@ -775,9 +777,9 @@ socket_expect_read( conn_t *conn, int expect )
 }
 
 int
-socket_read( conn_t *conn, char *buf, int len )
+socket_read( conn_t *conn, char *buf, uint len )
 {
-       int n = conn->bytes;
+       uint n = conn->bytes;
        if (!n && conn->state == SCK_EOF)
                return -1;
        if (n > len)
@@ -787,14 +789,14 @@ socket_read( conn_t *conn, char *buf, int len )
                conn->offset = 0;
        else
                conn->offset += n;
-       return n;
+       return (int)n;
 }
 
 char *
 socket_read_line( conn_t *b )
 {
        char *p, *s;
-       int n;
+       uint n;
 
        s = b->buf + b->offset;
        p = memchr( s + b->scanoff, '\n', b->bytes - b->scanoff );
@@ -808,7 +810,7 @@ socket_read_line( conn_t *b )
                        return (void *)~0;
                return 0;
        }
-       n = p + 1 - s;
+       n = (uint)(p + 1 - s);
        b->offset += n;
        b->bytes -= n;
        b->scanoff = 0;
@@ -819,14 +821,14 @@ socket_read_line( conn_t *b )
 }
 
 static int
-do_write( conn_t *sock, char *buf, int len )
+do_write( conn_t *sock, char *buf, uint len )
 {
        int n;
 
        assert( sock->fd >= 0 );
 #ifdef HAVE_LIBSSL
        if (sock->ssl)
-               return ssl_return( "write to", sock, SSL_write( sock->ssl, buf, 
len ) );
+               return ssl_return( "write to", sock, SSL_write( sock->ssl, buf, 
(int)len ) );
 #endif
        n = write( sock->fd, buf, len );
        if (n < 0) {
@@ -837,7 +839,7 @@ do_write( conn_t *sock, char *buf, int len )
                        n = 0;
                        conf_notifier( &sock->notify, POLLIN, POLLOUT );
                }
-       } else if (n != len) {
+       } else if (n != (int)len) {
                conf_notifier( &sock->notify, POLLIN, POLLOUT );
        }
        return n;
@@ -862,11 +864,12 @@ do_queued_write( conn_t *conn )
                return 0;
 
        while ((bc = conn->write_buf)) {
-               int n, len = bc->len - conn->write_offset;
+               int n;
+               uint len = bc->len - conn->write_offset;
                if ((n = do_write( conn, bc->data + conn->write_offset, len )) 
< 0)
                        return -1;
-               if (n != len) {
-                       conn->write_offset += n;
+               if (n != (int)len) {
+                       conn->write_offset += (uint)n;
                        conn->writing = 1;
                        return 0;
                }
@@ -901,7 +904,7 @@ do_flush( conn_t *conn )
        buff_chunk_t *bc = conn->append_buf;
 #ifdef HAVE_LIBZ
        if (conn->out_z) {
-               int buf_avail = conn->append_avail;
+               uint buf_avail = conn->append_avail;
                if (!conn->z_written)
                        return;
                do {
@@ -922,7 +925,7 @@ do_flush( conn_t *conn )
                                error( "Fatal: Compression error: %s\n", 
z_err_msg( ret, conn->out_z ) );
                                abort();
                        }
-                       bc->len = (char *)conn->out_z->next_out - bc->data;
+                       bc->len = (uint)((char *)conn->out_z->next_out - 
bc->data);
                        if (bc->len) {
                                do_append( conn, bc );
                                bc = 0;
@@ -948,7 +951,8 @@ do_flush( conn_t *conn )
 void
 socket_write( conn_t *conn, conn_iovec_t *iov, int iovcnt )
 {
-       int i, buf_avail, len, offset = 0, total = 0;
+       int i;
+       uint buf_avail, len, offset = 0, total = 0;
        buff_chunk_t *bc;
 
        for (i = 0; i < iovcnt; i++)
@@ -992,7 +996,7 @@ socket_write( conn_t *conn, conn_iovec_t *iov, int iovcnt )
                                        error( "Fatal: Compression error: 
%s\n", z_err_msg( ret, conn->out_z ) );
                                        abort();
                                }
-                               bc->len = (char *)conn->out_z->next_out - 
bc->data;
+                               bc->len = (uint)((char *)conn->out_z->next_out 
- bc->data);
                                buf_avail = conn->out_z->avail_out;
                                len -= conn->out_z->avail_in;
                                conn->z_written = 1;
diff --git a/src/socket.h b/src/socket.h
index f80c2ef..82dea29 100644
--- a/src/socket.h
+++ b/src/socket.h
@@ -61,7 +61,7 @@ typedef struct {
 
 typedef struct buff_chunk {
        struct buff_chunk *next;
-       int len;
+       uint len;
        char data[1];
 } buff_chunk_t;
 
@@ -104,15 +104,15 @@ typedef struct {
        buff_chunk_t *write_buf, **write_buf_append; /* buffer head & tail */
        int writing;
 #ifdef HAVE_LIBZ
-       int append_avail; /* space left in accumulating buffer */
+       uint append_avail; /* space left in accumulating buffer */
 #endif
-       int write_offset; /* offset into buffer head */
-       int buffer_mem; /* memory currently occupied by buffers in the queue */
+       uint write_offset; /* offset into buffer head */
+       uint buffer_mem; /* memory currently occupied by buffers in the queue */
 
        /* reading */
-       int offset; /* start of filled bytes in buffer */
-       int bytes; /* number of filled bytes in buffer */
-       int scanoff; /* offset to continue scanning for newline at, relative to 
'offset' */
+       uint offset; /* start of filled bytes in buffer */
+       uint bytes; /* number of filled bytes in buffer */
+       uint scanoff; /* offset to continue scanning for newline at, relative 
to 'offset' */
        char buf[100000];
 #ifdef HAVE_LIBZ
        char z_buf[100000];
@@ -141,12 +141,12 @@ void socket_start_tls(conn_t *conn, void (*cb)( int ok, 
void *aux ) );
 void socket_start_deflate( conn_t *conn );
 void socket_close( conn_t *sock );
 void socket_expect_read( conn_t *sock, int expect );
-int socket_read( conn_t *sock, char *buf, int len ); /* never waits */
+int socket_read( conn_t *sock, char *buf, uint len ); /* never waits */
 char *socket_read_line( conn_t *sock ); /* don't free return value; never 
waits */
 typedef enum { KeepOwn = 0, GiveOwn } ownership_t;
 typedef struct {
        char *buf;
-       int len;
+       uint len;
        ownership_t takeOwn;
 } conn_iovec_t;
 void socket_write( conn_t *sock, conn_iovec_t *iov, int iovcnt );
diff --git a/src/sync.c b/src/sync.c
index 7becade..fbd2a53 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -99,10 +99,11 @@ Fprintf( FILE *f, const char *msg, ... )
 
 static const char Flags[] = { 'D', 'F', 'R', 'S', 'T' };
 
-static int
+static uchar
 parse_flags( const char *buf )
 {
-       uint flags, i, d;
+       uint i, d;
+       uchar flags;
 
        for (flags = i = d = 0; i < as(Flags); i++)
                if (buf[d] == Flags[i]) {
@@ -112,8 +113,8 @@ parse_flags( const char *buf )
        return flags;
 }
 
-static int
-make_flags( int flags, char *buf )
+static uint
+make_flags( uchar flags, char *buf )
 {
        uint i, d;
 
@@ -159,8 +160,9 @@ typedef struct {
        const char *orig_name[2];
        message_t *msgs[2], *new_msgs[2];
        uint_array_alloc_t trashed_msgs[2];
-       int state[2], opts[2], ref_count, nsrecs, ret, lfd, existing, replayed;
-       int new_pending[2], flags_pending[2], trash_pending[2];
+       int state[2], opts[2], lfd, ret, existing;
+       uint ref_count, nsrecs, replayed;
+       uint new_pending[2], flags_pending[2], trash_pending[2];
        uint maxuid[2];     // highest UID that was already propagated
        uint newmaxuid[2];  // highest UID that is currently being propagated
        uint uidval[2];     // UID validity value
@@ -303,10 +305,10 @@ copy_msg( copy_vars_t *vars )
 static void msg_stored( int sts, uint uid, void *aux );
 
 static void
-copy_msg_bytes( char **out_ptr, const char *in_buf, int *in_idx, int in_len, 
int in_cr, int out_cr )
+copy_msg_bytes( char **out_ptr, const char *in_buf, uint *in_idx, uint in_len, 
int in_cr, int out_cr )
 {
        char *out = *out_ptr;
-       int idx = *in_idx;
+       uint idx = *in_idx;
        if (out_cr != in_cr) {
                char c;
                if (out_cr) {
@@ -336,13 +338,13 @@ static int
 copy_msg_convert( int in_cr, int out_cr, copy_vars_t *vars )
 {
        char *in_buf = vars->data.data;
-       int in_len = vars->data.len;
-       int idx = 0, sbreak = 0, ebreak = 0;
-       int lines = 0, hdr_crs = 0, bdy_crs = 0, app_cr = 0, extra = 0;
+       uint in_len = vars->data.len;
+       uint idx = 0, sbreak = 0, ebreak = 0;
+       uint lines = 0, hdr_crs = 0, bdy_crs = 0, app_cr = 0, extra = 0;
        if (vars->srec) {
          nloop: ;
-               int start = idx;
-               int line_crs = 0;
+               uint start = idx;
+               uint line_crs = 0;
                while (idx < in_len) {
                        char c = in_buf[idx++];
                        if (c == '\r') {
@@ -570,7 +572,7 @@ static char *
 clean_strdup( const char *s )
 {
        char *cs;
-       int i;
+       uint i;
 
        cs = nfstrdup( s );
        for (i = 0; cs[i]; i++)
@@ -690,7 +692,7 @@ load_state( sync_vars_t *svars )
        sync_rec_t *srec, *nsrec;
        char *s;
        FILE *jfp;
-       int ll;
+       uint ll;
        uint smaxxuid = 0;
        char c;
        struct stat st;
@@ -836,7 +838,7 @@ load_state( sync_vars_t *svars )
 
        svars->newmaxuid[M] = svars->maxuid[M];
        svars->newmaxuid[S] = svars->maxuid[S];
-       int line = 0;
+       uint line = 0;
        if ((jfp = fopen( svars->jname, "r" ))) {
                if (!lock_state( svars ))
                        goto jbail;
@@ -864,7 +866,7 @@ load_state( sync_vars_t *svars )
                                int tn;
                                uint t1, t2, t3;
                                if ((c = buf[0]) == '#' ?
-                                     (tn = 0, (sscanf( buf + 2, "%u %u %n", 
&t1, &t2, &tn ) < 2) || !tn || (ll - tn != TUIDL + 2)) :
+                                     (tn = 0, (sscanf( buf + 2, "%u %u %n", 
&t1, &t2, &tn ) < 2) || !tn || (ll - (uint)tn != TUIDL + 2)) :
                                      c == 'S' || c == '!' ?
                                        (sscanf( buf + 2, "%u", &t1 ) != 1) :
                                        c == 'F' || c == 'T' || c == '+' || c 
== '&' || c == '-' || c == '=' || c == '|' ?
@@ -983,11 +985,11 @@ delete_state( sync_vars_t *svars )
        }
 }
 
-static void box_confirmed( int sts, int uidvalidity, void *aux );
+static void box_confirmed( int sts, uint uidvalidity, void *aux );
 static void box_confirmed2( sync_vars_t *svars, int t );
 static void box_deleted( int sts, void *aux );
 static void box_created( int sts, void *aux );
-static void box_opened( int sts, int uidvalidity, void *aux );
+static void box_opened( int sts, uint uidvalidity, void *aux );
 static void box_opened2( sync_vars_t *svars, int t );
 static void load_box( sync_vars_t *svars, int t, uint minwuid, uint_array_t 
mexcs );
 
@@ -1063,7 +1065,7 @@ sync_boxes( store_t *ctx[], const char *names[], int 
present[], channel_conf_t *
 }
 
 static void
-box_confirmed( int sts, int uidvalidity, void *aux )
+box_confirmed( int sts, uint uidvalidity, void *aux )
 {
        DECL_SVARS;
 
@@ -1164,7 +1166,7 @@ box_created( int sts, void *aux )
 }
 
 static void
-box_opened( int sts, int uidvalidity, void *aux )
+box_opened( int sts, uint uidvalidity, void *aux )
 {
        DECL_SVARS;
 
@@ -1250,7 +1252,7 @@ box_opened2( sync_vars_t *svars, int t )
                                opts[1-t] |= OPEN_NEW;
                        if (chan->ops[t] & OP_EXPUNGE)
                                opts[1-t] |= OPEN_FLAGS;
-                       if (chan->stores[t]->max_size != INT_MAX) {
+                       if (chan->stores[t]->max_size != UINT_MAX) {
                                if (chan->ops[t] & OP_RENEW)
                                        opts[1-t] |= OPEN_OLD_SIZE;
                                if (chan->ops[t] & OP_NEW)
@@ -1321,7 +1323,7 @@ box_opened2( sync_vars_t *svars, int t )
        sync_deref( svars );
 }
 
-static int
+static uint
 get_seenuid( sync_vars_t *svars, int t )
 {
        uint seenuid = 0;
@@ -1707,7 +1709,7 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int 
recent_msgs, void *aux
                        }
                }
                debug( "%d excess messages remain\n", todel );
-               if (svars->chan->expire_unread < 0 && (uint)alive * 2 > 
svars->chan->max_messages) {
+               if (svars->chan->expire_unread < 0 && alive * 2 > 
svars->chan->max_messages) {
                        error( "%s: %d unread messages in excess of MaxMessages 
(%d).\n"
                               "Please set ExpireUnread to decide outcome. 
Skipping mailbox.\n",
                               svars->orig_name[S], alive, 
svars->chan->max_messages );
diff --git a/src/sync.h b/src/sync.h
index be26660..cbc3e22 100644
--- a/src/sync.h
+++ b/src/sync.h
@@ -52,7 +52,7 @@ typedef struct channel_conf {
        char *sync_state;
        string_list_t *patterns;
        int ops[2];
-       uint max_messages; /* for slave only */
+       int max_messages; /* for slave only */
        signed char expire_unread;
        char use_internal_date;
 } channel_conf_t;
diff --git a/src/util.c b/src/util.c
index f66f564..2c22db3 100644
--- a/src/util.c
+++ b/src/util.c
@@ -23,6 +23,7 @@
 #include "common.h"
 
 #include <assert.h>
+#include <limits.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -163,7 +164,7 @@ sys_error( const char *msg, ... )
 }
 
 void
-add_string_list_n( string_list_t **list, const char *str, int len )
+add_string_list_n( string_list_t **list, const char *str, uint len )
 {
        string_list_t *elem;
 
@@ -232,32 +233,30 @@ strnlen( const char *str, size_t maxlen )
 #endif
 
 int
-starts_with( const char *str, int strl, const char *cmp, int cmpl )
+starts_with( const char *str, uint strl, const char *cmp, uint cmpl )
 {
-       if (strl < 0)
+       if (strl == UINT_MAX)
                strl = strnlen( str, cmpl + 1 );
        return (strl >= cmpl) && !memcmp( str, cmp, cmpl );
 }
 
 int
-starts_with_upper( const char *str, int strl, const char *cmp, int cmpl )
+starts_with_upper( const char *str, uint strl, const char *cmp, uint cmpl )
 {
-       int i;
-
-       if (strl < 0)
+       if (strl == UINT_MAX)
                strl = strnlen( str, cmpl + 1 );
        if (strl < cmpl)
                return 0;
-       for (i = 0; i < cmpl; i++)
+       for (uint i = 0; i < cmpl; i++)
                if (str[i] != cmp[i] && toupper( str[i] ) != cmp[i])
                        return 0;
        return 1;
 }
 
 int
-equals( const char *str, int strl, const char *cmp, int cmpl )
+equals( const char *str, uint strl, const char *cmp, uint cmpl )
 {
-       if (strl < 0)
+       if (strl == UINT_MAX)
                strl = strnlen( str, cmpl + 1 );
        return (strl == cmpl) && !memcmp( str, cmp, cmpl );
 }
@@ -334,14 +333,14 @@ oob( void )
        abort();
 }
 
-int
+uint
 nfsnprintf( char *buf, int blen, const char *fmt, ... )
 {
-       int ret;
+       uint ret;
        va_list va;
 
        va_start( va, fmt );
-       if (blen <= 0 || (uint)(ret = vsnprintf( buf, blen, fmt, va )) >= 
(uint)blen)
+       if (blen <= 0 || (ret = (uint)vsnprintf( buf, (uint)blen, fmt, va )) >= 
(uint)blen)
                oob();
        va_end( va );
        return ret;
@@ -399,19 +398,19 @@ nfstrdup( const char *str )
        return nfstrndup( str, strlen( str ) );
 }
 
-int
+uint
 nfvasprintf( char **str, const char *fmt, va_list va )
 {
        int ret = vasprintf( str, fmt, va );
        if (ret < 0)
                oom();
-       return ret;
+       return (uint)ret;
 }
 
-int
+uint
 nfasprintf( char **str, const char *fmt, ... )
 {
-       int ret;
+       uint ret;
        va_list va;
 
        va_start( va, fmt );
@@ -457,7 +456,7 @@ expand_strdup( const char *s )
                        q = Home;
                } else {
                        if ((p = strchr( s, '/' ))) {
-                               r = nfstrndup( s, (int)(p - s) );
+                               r = nfstrndup( s, (uint)(p - s) );
                                pw = getpwnam( r );
                                free( r );
                        } else
@@ -474,10 +473,10 @@ expand_strdup( const char *s )
 
 /* Return value: 0 = ok, -1 = out found in arg, -2 = in found in arg but no 
out specified */
 int
-map_name( const char *arg, char **result, int reserve, const char *in, const 
char *out )
+map_name( const char *arg, char **result, uint reserve, const char *in, const 
char *out )
 {
        char *p;
-       int i, l, ll, num, inl, outl;
+       uint i, l, ll, num, inl, outl;
 
        assert( arg );
        l = strlen( arg );
@@ -534,7 +533,10 @@ map_name( const char *arg, char **result, int reserve, 
const char *in, const cha
 static int
 compare_uints( const void *l, const void *r )
 {
-       return *(const uint *)l - *(const uint *)r;
+       uint li = *(const uint *)l, ri = *(const uint *)r;
+       if (li != ri)  // Can't subtract, the result might not fit into signed 
int.
+               return li > ri ? 1 : -1;
+       return 0;
 }
 
 void
@@ -546,16 +548,16 @@ sort_uint_array( uint_array_t array )
 int
 find_uint_array( uint_array_t array, uint value )
 {
-       int bot = 0, top = array.size - 1;
-       while (bot <= top) {
-               int i = (bot + top) / 2;
+       uint bot = 0, top = array.size;
+       while (bot < top) {
+               uint i = (bot + top) / 2;
                uint elt = array.data[i];
                if (elt == value)
                        return 1;
                if (elt < value)
                        bot = i + 1;
                else
-                       top = i - 1;
+                       top = i;
        }
        return 0;
 }
@@ -614,13 +616,13 @@ static const uchar prime_deltas[] = {
     1, 29,  3, 21,  7, 17, 15,  9, 43, 35, 15,  0,  0,  0,  0,  0
 };
 
-int
-bucketsForSize( int size )
+uint
+bucketsForSize( uint size )
 {
-       int base = 4, bits = 2;
+       uint base = 4, bits = 2;
 
        for (;;) {
-               int prime = base + prime_deltas[bits];
+               uint prime = base + prime_deltas[bits];
                if (prime >= size)
                        return prime;
                base <<= 1;
@@ -655,7 +657,7 @@ static notifier_t *notifiers;
 static int changed;  /* Iterator may be invalid now. */
 #ifdef HAVE_SYS_POLL_H
 static struct pollfd *pollfds;
-static int npolls, rpolls;
+static uint npolls, rpolls;
 #else
 # ifdef HAVE_SYS_SELECT_H
 #  include <sys/select.h>
@@ -666,7 +668,7 @@ void
 init_notifier( notifier_t *sn, int fd, void (*cb)( int, void * ), void *aux )
 {
 #ifdef HAVE_SYS_POLL_H
-       int idx = npolls++;
+       uint idx = npolls++;
        if (rpolls < npolls) {
                rpolls = npolls;
                pollfds = nfrealloc( pollfds, npolls * sizeof(*pollfds) );
@@ -688,7 +690,7 @@ void
 conf_notifier( notifier_t *sn, short and_events, short or_events )
 {
 #ifdef HAVE_SYS_POLL_H
-       int idx = sn->index;
+       uint idx = sn->index;
        pollfds[idx].events = (pollfds[idx].events & and_events) | or_events;
 #else
        sn->events = (sn->events & and_events) | or_events;
@@ -700,7 +702,7 @@ wipe_notifier( notifier_t *sn )
 {
        notifier_t **snp;
 #ifdef HAVE_SYS_POLL_H
-       int idx;
+       uint idx;
 #endif
 
        for (snp = &notifiers; *snp != sn; snp = &(*snp)->next)
@@ -803,7 +805,7 @@ event_wait( void )
                break;
        }
        for (sn = notifiers; sn; sn = sn->next) {
-               int n = sn->index;
+               uint n = sn->index;
                if ((m = pollfds[n].revents)) {
                        assert( !(m & POLLNVAL) );
                        sn->cb( m | shifted_bit( m, POLLHUP, POLLIN ), sn->aux 
);


_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to