After our recent screwup with size_t and ssize_t in the download code, I
found the `-Wsign-conversion` flag to GCC to see if we were doing anything
else boneheaded. I didn't find anything quite as bad, but we did have some
goofups- most of our public unsigned methods would return -1 on error, which
is a bit odd in an unsigned context.

Signed-off-by: Dan McGee <[email protected]>
---
 lib/libalpm/add.c        |    4 ++--
 lib/libalpm/alpm.h       |   15 ++++++++-------
 lib/libalpm/alpm_list.c  |    2 +-
 lib/libalpm/alpm_list.h  |    2 +-
 lib/libalpm/backup.c     |    2 +-
 lib/libalpm/be_package.c |    5 ++---
 lib/libalpm/conflict.c   |    2 +-
 lib/libalpm/dload.c      |   10 +++++-----
 lib/libalpm/handle.c     |   15 ++++++++++++---
 lib/libalpm/handle.h     |    4 ++--
 lib/libalpm/package.c    |    8 +++++---
 lib/libalpm/remove.c     |   11 ++++++-----
 lib/libalpm/sync.c       |    4 ++--
 lib/libalpm/trans.c      |    2 +-
 lib/libalpm/util.c       |   13 +++++--------
 src/pacman/callback.c    |   31 ++++++++++++++++++++++---------
 src/pacman/conf.h        |    2 +-
 src/pacman/pacman.c      |    4 ++--
 src/pacman/util.c        |   34 ++++++++++++++++++++--------------
 19 files changed, 99 insertions(+), 71 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index c6751a4..4120b14 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -199,7 +199,7 @@ static int extract_single_file(struct archive *archive,
                                /* case 12: existing dir, ignore it */
                                if(lsbuf.st_mode != entrymode) {
                                        /* if filesystem perms are different 
than pkg perms, warn user */
-                                       int mask = 07777;
+                                       mode_t mask = 07777;
                                        _alpm_log(PM_LOG_WARNING, _("directory 
permissions differ on %s\n"
                                                                "filesystem: %o 
 package: %o\n"), entryname, lsbuf.st_mode & mask,
                                                        entrymode & mask);
@@ -715,7 +715,7 @@ int _alpm_upgrade_packages(pmtrans_t *trans, pmdb_t *db)
                return(0);
        }
 
-       pkg_count = alpm_list_count(trans->add);
+       pkg_count = (int)alpm_list_count(trans->add);
        pkg_current = 1;
 
        /* loop through our package list adding/upgrading one at a time */
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index e9fadca..ae2dc1f 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -128,8 +128,8 @@ int alpm_option_set_logfile(const char *logfile);
 const char *alpm_option_get_lockfile();
 /* no set_lockfile, path is determined from dbpath */
 
-unsigned short alpm_option_get_usesyslog();
-void alpm_option_set_usesyslog(unsigned short usesyslog);
+int alpm_option_get_usesyslog();
+void alpm_option_set_usesyslog(int usesyslog);
 
 alpm_list_t *alpm_option_get_noupgrades();
 void alpm_option_add_noupgrade(const char *pkg);
@@ -154,7 +154,8 @@ int alpm_option_remove_ignoregrp(const char *grp);
 const char *alpm_option_get_arch();
 void alpm_option_set_arch(const char *arch);
 
-void alpm_option_set_usedelta(unsigned short usedelta);
+int alpm_option_get_usedelta();
+void alpm_option_set_usedelta(int usedelta);
 
 pmdb_t *alpm_option_get_localdb();
 alpm_list_t *alpm_option_get_syncdbs();
@@ -195,7 +196,7 @@ typedef enum _pmpkgreason_t {
        PM_PKG_REASON_DEPEND = 1  /* installed as a dependency for another 
package */
 } pmpkgreason_t;
 
-int alpm_pkg_load(const char *filename, unsigned short full, pmpkg_t **pkg);
+int alpm_pkg_load(const char *filename, int full, pmpkg_t **pkg);
 int alpm_pkg_free(pmpkg_t *pkg);
 int alpm_pkg_checkmd5sum(pmpkg_t *pkg);
 char *alpm_fetch_pkgurl(const char *url);
@@ -231,8 +232,8 @@ size_t alpm_pkg_changelog_read(void *ptr, size_t size,
                const pmpkg_t *pkg, const void *fp);
 /*int alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp);*/
 int alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp);
-unsigned short alpm_pkg_has_scriptlet(pmpkg_t *pkg);
-unsigned short alpm_pkg_has_force(pmpkg_t *pkg);
+int alpm_pkg_has_scriptlet(pmpkg_t *pkg);
+int alpm_pkg_has_force(pmpkg_t *pkg);
 
 off_t alpm_pkg_download_size(pmpkg_t *newpkg);
 
@@ -395,7 +396,7 @@ typedef void (*alpm_trans_cb_conv)(pmtransconv_t, void *, 
void *,
 /* Transaction Progress callback */
 typedef void (*alpm_trans_cb_progress)(pmtransprog_t, const char *, int, int, 
int);
 
-unsigned int alpm_trans_get_flags();
+int alpm_trans_get_flags();
 alpm_list_t * alpm_trans_get_add();
 alpm_list_t * alpm_trans_get_remove();
 int alpm_trans_init(pmtransflag_t flags,
diff --git a/lib/libalpm/alpm_list.c b/lib/libalpm/alpm_list.c
index 8b2c7b3..392faa7 100644
--- a/lib/libalpm/alpm_list.c
+++ b/lib/libalpm/alpm_list.c
@@ -573,7 +573,7 @@ void SYMEXPORT *alpm_list_getdata(const alpm_list_t *node)
  *
  * @return the number of list items
  */
-int SYMEXPORT alpm_list_count(const alpm_list_t *list)
+unsigned int SYMEXPORT alpm_list_count(const alpm_list_t *list)
 {
        unsigned int i = 0;
        const alpm_list_t *lp = list;
diff --git a/lib/libalpm/alpm_list.h b/lib/libalpm/alpm_list.h
index f079ecf..66cc7d9 100644
--- a/lib/libalpm/alpm_list.h
+++ b/lib/libalpm/alpm_list.h
@@ -73,7 +73,7 @@ alpm_list_t *alpm_list_last(const alpm_list_t *list);
 void *alpm_list_getdata(const alpm_list_t *entry);
 
 /* misc */
-int alpm_list_count(const alpm_list_t *list);
+unsigned int alpm_list_count(const alpm_list_t *list);
 void *alpm_list_find(const alpm_list_t *haystack, const void *needle, 
alpm_list_fn_cmp fn);
 void *alpm_list_find_ptr(const alpm_list_t *haystack, const void *needle);
 char *alpm_list_find_str(const alpm_list_t *haystack, const char *needle);
diff --git a/lib/libalpm/backup.c b/lib/libalpm/backup.c
index e628131..ab02d90 100644
--- a/lib/libalpm/backup.c
+++ b/lib/libalpm/backup.c
@@ -33,7 +33,7 @@
 #include "util.h"
 
 /* split a backup string "file\thash" into two strings : file and hash */
-int _alpm_backup_split(const char *string, char **file, char **hash)
+static int _alpm_backup_split(const char *string, char **file, char **hash)
 {
        char *str = strdup(string);
        char *ptr;
diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c
index 9c7c161..745e17f 100644
--- a/lib/libalpm/be_package.c
+++ b/lib/libalpm/be_package.c
@@ -239,7 +239,7 @@ static pmpkg_t *pkg_load(const char *pkgfile, unsigned 
short full)
        if(full) {
                /* "checking for conflicts" requires a sorted list, ensure that 
here */
                _alpm_log(PM_LOG_DEBUG, "sorting package filelist for %s\n", 
pkgfile);
-               newpkg->files = alpm_list_msort(newpkg->files, 
alpm_list_count(newpkg->files),
+               newpkg->files = alpm_list_msort(newpkg->files, 
(int)alpm_list_count(newpkg->files),
                                _alpm_str_cmp);
                newpkg->infolevel = INFRQ_ALL;
        } else {
@@ -269,8 +269,7 @@ error:
  * @param pkg address of the package pointer
  * @return 0 on success, -1 on error (pm_errno is set accordingly)
  */
-int SYMEXPORT alpm_pkg_load(const char *filename, unsigned short full,
-               pmpkg_t **pkg)
+int SYMEXPORT alpm_pkg_load(const char *filename, int full, pmpkg_t **pkg)
 {
        ALPM_LOG_FUNC;
 
diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
index e934c01..418409e 100644
--- a/lib/libalpm/conflict.c
+++ b/lib/libalpm/conflict.c
@@ -403,7 +403,7 @@ alpm_list_t *_alpm_db_find_fileconflicts(pmdb_t *db, 
pmtrans_t *trans,
                alpm_list_t *upgrade, alpm_list_t *remove)
 {
        alpm_list_t *i, *j, *conflicts = NULL;
-       int numtargs = alpm_list_count(upgrade);
+       int numtargs = (int)alpm_list_count(upgrade);
        int current;
 
        ALPM_LOG_FUNC;
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 8b3226b..7538e59 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -59,7 +59,7 @@ static char *get_filename(const char *url) {
 static char *get_destfile(const char *path, const char *filename) {
        char *destfile;
        /* len = localpath len + filename len + null */
-       int len = strlen(path) + strlen(filename) + 1;
+       size_t len = strlen(path) + strlen(filename) + 1;
        CALLOC(destfile, len, sizeof(char), RET_ERR(PM_ERR_MEMORY, NULL));
        snprintf(destfile, len, "%s%s", path, filename);
 
@@ -69,7 +69,7 @@ static char *get_destfile(const char *path, const char 
*filename) {
 static char *get_tempfile(const char *path, const char *filename) {
        char *tempfile;
        /* len = localpath len + filename len + '.part' len + null */
-       int len = strlen(path) + strlen(filename) + 6;
+       size_t len = strlen(path) + strlen(filename) + 6;
        CALLOC(tempfile, len, sizeof(char), RET_ERR(PM_ERR_MEMORY, NULL));
        snprintf(tempfile, len, "%s%s.part", path, filename);
 
@@ -92,7 +92,7 @@ static int download_internal(const char *url, const char 
*localpath,
        struct url_stat ust;
        struct stat st;
        int chk_resume = 0, ret = 0;
-       size_t dl_thisfile = 0;
+       off_t dl_thisfile = 0;
        ssize_t nread = 0;
        char *tempfile, *destfile, *filename;
        struct sigaction new_action, old_action;
@@ -199,7 +199,7 @@ static int download_internal(const char *url, const char 
*localpath,
 
        while((nread = fetchIO_read(dlf, buffer, PM_DLBUF_LEN)) > 0) {
                size_t nwritten = 0;
-               nwritten = fwrite(buffer, 1, nread, localf);
+               nwritten = fwrite(buffer, 1, (size_t)nread, localf);
                if((nwritten != nread) || ferror(localf)) {
                        _alpm_log(PM_LOG_ERROR, _("error writing to file '%s': 
%s\n"),
                                        destfile, strerror(errno));
@@ -300,7 +300,7 @@ int _alpm_download_single_file(const char *filename,
        for(i = servers; i; i = i->next) {
                const char *server = i->data;
                char *fileurl = NULL;
-               int len;
+               size_t len;
 
                /* print server + filename into a buffer */
                len = strlen(server) + strlen(filename) + 2;
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index 012d412..5cbf363 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -169,7 +169,7 @@ const char SYMEXPORT *alpm_option_get_lockfile()
        return handle->lockfile;
 }
 
-unsigned short SYMEXPORT alpm_option_get_usesyslog()
+int SYMEXPORT alpm_option_get_usesyslog()
 {
        if (handle == NULL) {
                pm_errno = PM_ERR_HANDLE_NULL;
@@ -223,6 +223,15 @@ const char SYMEXPORT *alpm_option_get_arch()
        return handle->arch;
 }
 
+int SYMEXPORT alpm_option_get_usedelta()
+{
+       if (handle == NULL) {
+               pm_errno = PM_ERR_HANDLE_NULL;
+               return -1;
+       }
+       return handle->usedelta;
+}
+
 pmdb_t SYMEXPORT *alpm_option_get_localdb()
 {
        if (handle == NULL) {
@@ -437,7 +446,7 @@ int SYMEXPORT alpm_option_set_logfile(const char *logfile)
        return(0);
 }
 
-void SYMEXPORT alpm_option_set_usesyslog(unsigned short usesyslog)
+void SYMEXPORT alpm_option_set_usesyslog(int usesyslog)
 {
        handle->usesyslog = usesyslog;
 }
@@ -536,7 +545,7 @@ void SYMEXPORT alpm_option_set_arch(const char *arch)
        if(arch) handle->arch = strdup(arch);
 }
 
-void SYMEXPORT alpm_option_set_usedelta(unsigned short usedelta)
+void SYMEXPORT alpm_option_set_usedelta(int usedelta)
 {
        handle->usedelta = usedelta;
 }
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index a1eb1cd..afb2a1c 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -57,9 +57,9 @@ typedef struct _pmhandle_t {
        alpm_list_t *ignoregrp;   /* List of groups to ignore */
 
        /* options */
-       unsigned short usesyslog;    /* Use syslog instead of logfile? */ /* 
TODO move to frontend */
+       int usesyslog;    /* Use syslog instead of logfile? */ /* TODO move to 
frontend */
+       int usedelta;     /* Download deltas if possible */
        char *arch;       /* Architecture of packages we should allow */
-       unsigned short usedelta;     /* Download deltas if possible */
 } pmhandle_t;
 
 /* global handle variable */
diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
index de17166..a10c829 100644
--- a/lib/libalpm/package.c
+++ b/lib/libalpm/package.c
@@ -295,7 +295,7 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg)
        return pkg->groups;
 }
 
-unsigned short SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg)
+int SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg)
 {
        ALPM_LOG_FUNC;
 
@@ -503,7 +503,9 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t 
size,
        if(pkg->origin == PKG_FROM_CACHE) {
                ret = fread(ptr, 1, size, (FILE*)fp);
        } else if(pkg->origin == PKG_FROM_FILE) {
-               ret = archive_read_data((struct archive*)fp, ptr, size);
+               /* TODO: This is not valid; we can lose error codes here.
+                * For now the cast allows compiling with -Wsign-conversion */
+               ret = (size_t)archive_read_data((struct archive*)fp, ptr, size);
        }
        return(ret);
 }
@@ -541,7 +543,7 @@ int SYMEXPORT alpm_pkg_changelog_close(const pmpkg_t *pkg, 
void *fp)
        return(ret);
 }
 
-unsigned short SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg)
+int SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg)
 {
        ALPM_LOG_FUNC;
 
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index f31fbfb..ddc0987 100644
--- a/lib/libalpm/remove.c
+++ b/lib/libalpm/remove.c
@@ -372,13 +372,14 @@ int _alpm_remove_packages(pmtrans_t *trans, pmdb_t *db)
        ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
        ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
 
-       pkg_count = alpm_list_count(trans->remove);
+       pkg_count = (int)alpm_list_count(trans->remove);
 
        for(targ = trans->remove; targ; targ = targ->next) {
                int position = 0;
                char scriptlet[PATH_MAX];
                info = (pmpkg_t*)targ->data;
                const char *pkgname = NULL;
+               int targcount = (int)alpm_list_count(targ);
 
                if(handle->trans->state == STATE_INTERRUPTED) {
                        return(0);
@@ -410,10 +411,10 @@ int _alpm_remove_packages(pmtrans_t *trans, pmdb_t *db)
                                }
                        }
 
-                       int filenum = alpm_list_count(files);
+                       unsigned int filenum = alpm_list_count(files);
                        double percent = 0.0;
                        alpm_list_t *newfiles;
-                       _alpm_log(PM_LOG_DEBUG, "removing %d files\n", filenum);
+                       _alpm_log(PM_LOG_DEBUG, "removing %ud files\n", 
filenum);
 
                        /* iterate through the list backwards, unlinking files 
*/
                        newfiles = alpm_list_reverse(files);
@@ -424,7 +425,7 @@ int _alpm_remove_packages(pmtrans_t *trans, pmdb_t *db)
                                percent = (double)position / (double)filenum;
                                PROGRESS(trans, PM_TRANS_PROGRESS_REMOVE_START, 
info->name,
                                                (double)(percent * 100), 
pkg_count,
-                                               (pkg_count - 
alpm_list_count(targ) + 1));
+                                               (pkg_count - targcount + 1));
                                position++;
                        }
                        alpm_list_free(newfiles);
@@ -432,7 +433,7 @@ int _alpm_remove_packages(pmtrans_t *trans, pmdb_t *db)
 
                /* set progress to 100% after we finish unlinking files */
                PROGRESS(trans, PM_TRANS_PROGRESS_REMOVE_START, pkgname, 100,
-                        pkg_count, (pkg_count - alpm_list_count(targ) + 1));
+                        pkg_count, (pkg_count - targcount + 1));
 
                /* run the post-remove script if it exists  */
                if(alpm_pkg_has_scriptlet(info) && !(trans->flags & 
PM_TRANS_FLAG_NOSCRIPTLET)) {
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index a1a6ea7..392d66a 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -691,7 +691,7 @@ static int apply_deltas(pmtrans_t *trans)
                        pmdelta_t *d = dlts->data;
                        char *delta, *from, *to;
                        char command[PATH_MAX];
-                       int len = 0;
+                       size_t len = 0;
 
                        delta = _alpm_filecache_find(d->delta);
                        /* the initial package might be in a different cachedir 
*/
@@ -788,7 +788,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, 
alpm_list_t **data)
 {
        alpm_list_t *i, *j, *files = NULL;
        alpm_list_t *deltas = NULL;
-       int replaces = 0;
+       unsigned int replaces = 0;
        int errors = 0;
        const char *cachedir = NULL;
        int ret = -1;
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index c99f596..3ac6af3 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -407,7 +407,7 @@ cleanup:
        return(retval);
 }
 
-unsigned int SYMEXPORT alpm_trans_get_flags()
+int SYMEXPORT alpm_trans_get_flags()
 {
        /* Sanity checks */
        ASSERT(handle != NULL, return(-1));
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index f78d193..9e91658 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -200,8 +200,7 @@ char *_alpm_strtrim(char *str)
 int _alpm_lckmk()
 {
        int fd;
-       pid_t pid;
-       char *dir, *ptr, *spid = NULL;
+       char *dir, *ptr;
        const char *file = alpm_option_get_lockfile();
 
        /* create the dir of the lockfile first */
@@ -216,13 +215,11 @@ int _alpm_lckmk()
        while((fd = open(file, O_WRONLY | O_CREAT | O_EXCL, 0000)) == -1
                        && errno == EINTR);
        if(fd > 0) {
-               pid = getpid();
-               size_t len = snprintf(spid, 0, "%ld\n", (long)pid) + 1;
-               spid = malloc(len);
-               snprintf(spid, len, "%ld\n", (long)pid);
-               while(write(fd, (void *)spid, len) == -1 && errno == EINTR);
+               FILE *f = fdopen(fd, "w");
+               fprintf(f, "%ld\n", (long)getpid());
+               fflush(f);
                fsync(fd);
-               free(spid);
+               fclose(f);
                return(fd);
        }
        return(-1);
diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 1dd3ffb..551e769 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -90,10 +90,10 @@ static float get_update_timediff(int first_call)
 static void fill_progress(const int bar_percent, const int disp_percent,
                const int proglen)
 {
-       const unsigned int hashlen = proglen - 8;
-       const unsigned int hash = bar_percent * hashlen / 100;
-       static unsigned int lasthash = 0, mouth = 0;
-       unsigned int i;
+       const int hashlen = proglen - 8;
+       const int hash = bar_percent * hashlen / 100;
+       static int lasthash = 0, mouth = 0;
+       int i;
 
        if(bar_percent == 0) {
                lasthash = 0;
@@ -323,7 +323,8 @@ void cb_trans_progress(pmtransprog_t event, const char 
*pkgname, int percent,
        int tmp, digits, textlen;
        char *opr = NULL;
        /* used for wide character width determination and printing */
-       int len, wclen, wcwid, padwid;
+       size_t len;
+       int wclen, wcwid, padwid;
        wchar_t *wcstr;
 
        if(config->noprogressbar) {
@@ -396,7 +397,12 @@ void cb_trans_progress(pmtransprog_t event, const char 
*pkgname, int percent,
        wclen += mbstowcs(wcstr + wclen, " ", len - wclen);
        wclen += mbstowcs(wcstr + wclen, pkgname, len - wclen);
 #endif
-       wcwid = wcswidth(wcstr, wclen);
+       if(wclen < 0) {
+               /* we're probably screwed, so... */
+               free(wcstr);
+               return;
+       }
+       wcwid = wcswidth(wcstr, (size_t)wclen);
        padwid = textlen - wcwid;
        /* if padwid is < 0, we need to trim the string so padwid = 0 */
        if(padwid < 0) {
@@ -452,7 +458,8 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
        const int filenamelen = infolen - 27;
        char *fname, *p;
        /* used for wide character width determination and printing */
-       int len, wclen, wcwid, padwid;
+       size_t len;
+       int wclen, wcwid, padwid;
        wchar_t *wcfname;
 
        int totaldownload;
@@ -508,7 +515,7 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
                rate = xfered / (timediff * 1024.0);
 
                /* round elapsed time to the nearest second */
-               eta_s = (int)(timediff + 0.5);
+               eta_s = (unsigned int)(timediff + 0.5);
        } else {
                /* compute current average values */
                timediff = get_update_timediff(0);
@@ -557,7 +564,13 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
        len = strlen(filename) + 1;
        wcfname = calloc(len, sizeof(wchar_t));
        wclen = mbstowcs(wcfname, fname, len);
-       wcwid = wcswidth(wcfname, wclen);
+       if(wclen < 0) {
+               /* we're probably screwed, so... */
+               free(fname);
+               free(wcfname);
+               return;
+       }
+       wcwid = wcswidth(wcfname, (size_t)wclen);
        padwid = filenamelen - wcwid;
        /* if padwid is < 0, we need to trim the string so padwid = 0 */
        if(padwid < 0) {
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index 3c588a7..598657c 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -64,7 +64,7 @@ typedef struct __config_t {
        unsigned short group;
        pmtransflag_t flags;
        unsigned short noask;
-       unsigned int ask;
+       pmtransprog_t ask;
 
        /* conf file options */
        unsigned short chomp; /* I Love Candy! */
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index ac51502..5e824f4 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -612,7 +612,7 @@ static char *get_filename(const char *url) {
 static char *get_destfile(const char *path, const char *filename) {
        char *destfile;
        /* len = localpath len + filename len + null */
-       int len = strlen(path) + strlen(filename) + 1;
+       size_t len = strlen(path) + strlen(filename) + 1;
        destfile = calloc(len, sizeof(char));
        snprintf(destfile, len, "%s%s", path, filename);
 
@@ -622,7 +622,7 @@ static char *get_destfile(const char *path, const char 
*filename) {
 static char *get_tempfile(const char *path, const char *filename) {
        char *tempfile;
        /* len = localpath len + filename len + '.part' len + null */
-       int len = strlen(path) + strlen(filename) + 6;
+       size_t len = strlen(path) + strlen(filename) + 6;
        tempfile = calloc(len, sizeof(char));
        snprintf(tempfile, len, "%s%s.part", path, filename);
 
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 353aae3..94e8f4a 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -232,9 +232,9 @@ char *mdirname(const char *path)
  */
 void indentprint(const char *str, int indent)
 {
-       wchar_t *wcstr;
-       const wchar_t *p;
-       int len, cidx, cols;
+       wchar_t *wcstr, *p;
+       size_t len;
+       int cidx, cols;
 
        if(!str) {
                return;
@@ -260,7 +260,8 @@ void indentprint(const char *str, int indent)
 
        while(*p) {
                if(*p == L' ') {
-                       const wchar_t *q, *next;
+                       const wchar_t *next;
+                       wchar_t *q;
                        p++;
                        if(p == NULL || *p == L' ') continue;
                        next = wcschr(p, L' ');
@@ -271,7 +272,14 @@ void indentprint(const char *str, int indent)
                        len = 0;
                        q = p;
                        while(q < next) {
-                               len += wcwidth(*q++);
+                               int w = wcwidth(*q);
+                               if(w < 0) {
+                                       /* hmm. this is no good, kill this char 
*/
+                                       *q = L'?';
+                                       w = 1;
+                               }
+                               q++;
+                               len += (unsigned)w;
                        }
                        if(len > (cols - cidx - 1)) {
                                /* wrap to a newline and reindent */
@@ -377,7 +385,7 @@ char *strreplace(const char *str, const char *needle, const 
char *replace)
                q = alpm_list_getdata(i);
                if(q > p){
                        /* add chars between this occurence and last occurence, 
if any */
-                       strncpy(newp, p, q - p);
+                       strncpy(newp, p, (unsigned)(q - p));
                        newp += q - p;
                }
                strncpy(newp, replace, replacesz);
@@ -411,7 +419,7 @@ alpm_list_t *strsplit(const char *str, const char splitchar)
        char *dup = NULL;
 
        while((str = strchr(str, splitchar))) {
-               dup = strndup(prev, str - prev);
+               dup = strndup(prev, (size_t)(str - prev));
                if(dup == NULL) {
                        return(NULL);
                }
@@ -430,9 +438,9 @@ alpm_list_t *strsplit(const char *str, const char splitchar)
        return(list);
 }
 
-static int string_length(const char *s)
+static size_t string_length(const char *s)
 {
-       int len;
+       size_t len;
        wchar_t *wcstr;
 
        if(!s) {
@@ -442,7 +450,7 @@ static int string_length(const char *s)
        len = strlen(s) + 1;
        wcstr = calloc(len, sizeof(wchar_t));
        len = mbstowcs(wcstr, s, len);
-       len = wcswidth(wcstr, len);
+       len = (size_t)wcswidth(wcstr, len);
        free(wcstr);
 
        return(len);
@@ -450,16 +458,14 @@ static int string_length(const char *s)
 
 void string_display(const char *title, const char *string)
 {
-       int len = 0;
-
        if(title) {
-               /* compute the length of title + a space */
-               len = string_length(title) + 1;
                printf("%s ", title);
        }
        if(string == NULL || string[0] == '\0') {
                printf(_("None"));
        } else {
+               /* compute the length of title + a space */
+               int len = string_length(title) + 1;
                indentprint(string, len);
        }
        printf("\n");
-- 
1.6.4.4


Reply via email to