<<< Date Index >>>     <<< Thread Index >>>

Re: [patch] Solved problems with file size >2GB



I think people did not like my bug correction =)

On Fri, Apr 21, 2006 at 08:41:11PM -0300, Bruno Cesar Ribas wrote:
> Now anywhere file > 2.5GB appear correctly;
> even at attach list we will have the file in MegaBytes correct.
> 
> This really closes bug report 2191
> 
> All problems were with off_t types, some times used to use 'long' other
> 'unsigned long', that's why we had file size in negative value.
> 
> The patch is attached
> 
> ps: Now we begin to think. It's time to show GB instead of MB for some files
> =) , but that's another patch
> 
> -- 
> Bruno Ribas - ribas@xxxxxxx

> ? patch.diff
> Index: browser.c
> ===================================================================
> RCS file: /cvsroots/mutt/browser.c,v
> retrieving revision 3.19
> diff -u -r3.19 browser.c
> --- browser.c 6 Oct 2005 06:15:00 -0000       3.19
> +++ browser.c 21 Apr 2006 23:21:45 -0000
> @@ -40,6 +40,7 @@
>  #include <unistd.h>
>  #include <sys/stat.h>
>  #include <errno.h>
> +#include <inttypes.h>
>  
>  static struct mapping_t FolderHelp[] = {
>    { N_("Exit"),  OP_EXIT },
> @@ -265,8 +266,8 @@
>      case 's':
>        if (folder->ff->st != NULL)
>        {
> -     snprintf (tmp, sizeof (tmp), "%%%sld", fmt);
> -     snprintf (dest, destlen, tmp, (long) folder->ff->st->st_size);
> +     snprintf (tmp, sizeof (tmp), "%%%s" PRId64 , fmt);
> +     snprintf (dest, destlen, tmp, folder->ff->st->st_size);
>        }
>        else
>       mutt_format_s (dest, destlen, fmt, "");
> Index: buffy.c
> ===================================================================
> RCS file: /cvsroots/mutt/buffy.c,v
> retrieving revision 3.17
> diff -u -r3.17 buffy.c
> --- buffy.c   13 Dec 2005 21:25:10 -0000      3.17
> +++ buffy.c   21 Apr 2006 23:21:45 -0000
> @@ -162,7 +162,7 @@
>      return;
>  
>    if (stat (b->path, &sb) == 0)
> -    b->size = (long) sb.st_size;
> +    b->size = sb.st_size;
>    else
>      b->size = 0;
>    return;
> @@ -240,7 +240,7 @@
>      if (stat ((*tmp)->path, &sb) == 0 && !test_new_folder ((*tmp)->path))
>      {
>        /* some systems out there don't have an off_t type */
> -      (*tmp)->size = (long) sb.st_size;
> +      (*tmp)->size = sb.st_size;
>      }
>      else
>        (*tmp)->size = 0;
> @@ -365,7 +365,7 @@
>       else
>       {
>         /* some other program has deleted mail from the folder */
> -       tmp->size = (long) sb.st_size;
> +       tmp->size = sb.st_size;
>       }
>  #endif
>       if (tmp->newly_created &&
> @@ -405,7 +405,7 @@
>      }
>  #ifdef BUFFY_SIZE
>      else if (Context && Context->path)
> -      tmp->size = (long) sb.st_size; /* update the size */
> +      tmp->size = sb.st_size;        /* update the size */
>  #endif
>  
>      if (!tmp->new)
> Index: buffy.h
> ===================================================================
> RCS file: /cvsroots/mutt/buffy.h,v
> retrieving revision 3.4
> diff -u -r3.4 buffy.h
> --- buffy.h   17 Sep 2005 20:46:10 -0000      3.4
> +++ buffy.h   21 Apr 2006 23:21:45 -0000
> @@ -24,7 +24,7 @@
>  {
>    char *path;
>  #ifdef BUFFY_SIZE
> -  long size;
> +  off_t size;
>  #endif                               /* BUFFY_SIZE */
>    struct buffy_t *next;
>    short new;                 /* mailbox has new mail */
> Index: compose.c
> ===================================================================
> RCS file: /cvsroots/mutt/compose.c,v
> retrieving revision 3.27
> diff -u -r3.27 compose.c
> --- compose.c 17 Sep 2005 20:46:10 -0000      3.27
> +++ compose.c 21 Apr 2006 23:21:47 -0000
> @@ -446,7 +446,7 @@
>  
>      case 'l': /* approx length of current message in bytes */
>       snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
> -     mutt_pretty_size (tmp, sizeof (tmp), menu ? cum_attachs_size(menu) : 0);
> +     mutt_pretty_size (tmp, sizeof (tmp), menu ? 
> (off_t)cum_attachs_size(menu) : (off_t)0);
>       snprintf (buf, buflen, fmt, tmp);
>        break;
>  
> Index: dotlock.c
> ===================================================================
> RCS file: /cvsroots/mutt/dotlock.c,v
> retrieving revision 3.4
> diff -u -r3.4 dotlock.c
> --- dotlock.c 17 Sep 2005 20:46:10 -0000      3.4
> +++ dotlock.c 21 Apr 2006 23:21:47 -0000
> @@ -589,7 +589,7 @@
>  {
>    char lockfile[_POSIX_PATH_MAX + LONG_STRING];
>    char nfslockfile[_POSIX_PATH_MAX + LONG_STRING];
> -  size_t prev_size = 0;
> +  off_t prev_size = 0;
>    int fd;
>    int count = 0;
>    int hard_count = 0;
> Index: edit.c
> ===================================================================
> RCS file: /cvsroots/mutt/edit.c,v
> retrieving revision 3.9
> diff -u -r3.9 edit.c
> --- edit.c    21 Oct 2005 04:35:37 -0000      3.9
> +++ edit.c    21 Apr 2006 23:21:48 -0000
> @@ -33,6 +33,7 @@
>  #include <sys/stat.h>
>  #include <fcntl.h>
>  #include <errno.h>
> +#include <inttypes.h>
>  
>  /*
>   * SLcurses_waddnstr() can't take a "const char *", so this is only
> @@ -106,7 +107,7 @@
>      buf = be_snarf_data (f, buf, max, len, 0, sb.st_size, 0);
>      if (verbose)
>      {
> -      snprintf(tmp, sizeof(tmp), "\"%s\" %lu bytes\n", path, (unsigned long) 
> sb.st_size);
> +      snprintf(tmp, sizeof(tmp), "\"%s\" %" PRId64 " bytes\n", path, 
> sb.st_size);
>        addstr(tmp);
>      }
>      fclose (f);
> Index: handler.c
> ===================================================================
> RCS file: /cvsroots/mutt/handler.c,v
> retrieving revision 3.26
> diff -u -r3.26 handler.c
> --- handler.c 16 Dec 2005 18:49:40 -0000      3.26
> +++ handler.c 21 Apr 2006 23:21:49 -0000
> @@ -1216,10 +1216,10 @@
>      mustfree = 1;
>      fstat (fileno (s->fpin), &st);
>      b = mutt_new_body ();
> -    b->length = (long) st.st_size;
> +    b->length = st.st_size;
>      b->parts = mutt_parse_multipart (s->fpin,
>                 mutt_get_parameter ("boundary", a->parameter),
> -               (long) st.st_size, ascii_strcasecmp ("digest", a->subtype) == 
> 0);
> +               st.st_size, ascii_strcasecmp ("digest", a->subtype) == 0);
>    }
>    else
>      b = a;
> @@ -1373,7 +1373,7 @@
>    {
>      fstat (fileno (s->fpin), &st);
>      b = mutt_new_body ();
> -    b->length = (LOFF_T) st.st_size;
> +    b->length = st.st_size;
>      b->parts = mutt_parse_messageRFC822 (s->fpin, b);
>    }
>    else
> @@ -1453,10 +1453,10 @@
>    {
>      fstat (fileno (s->fpin), &st);
>      b = mutt_new_body ();
> -    b->length = (long) st.st_size;
> +    b->length = st.st_size;
>      b->parts = mutt_parse_multipart (s->fpin,
>                 mutt_get_parameter ("boundary", a->parameter),
> -               (long) st.st_size, ascii_strcasecmp ("digest", a->subtype) == 
> 0);
> +               st.st_size, ascii_strcasecmp ("digest", a->subtype) == 0);
>    }
>    else
>      b = a;
> @@ -1681,7 +1681,7 @@
>        if (length)
>        {
>       mutt_pretty_size (pretty_size, sizeof (pretty_size),
> -                       strtol (length, NULL, 10));
> +                       (off_t) strtoll (length, NULL, 10));
>       state_printf (s, _("(size %s bytes) "), pretty_size);
>        }
>        state_puts (_("has been deleted --]\n"), s);
> Index: hdrline.c
> ===================================================================
> RCS file: /cvsroots/mutt/hdrline.c,v
> retrieving revision 3.18
> diff -u -r3.18 hdrline.c
> --- hdrline.c 10 Jan 2006 19:15:21 -0000      3.18
> +++ hdrline.c 21 Apr 2006 23:21:50 -0000
> @@ -302,7 +302,7 @@
>        break;
>      
>      case 'c':
> -      mutt_pretty_size (buf2, sizeof (buf2), (long) hdr->content->length);
> +      mutt_pretty_size (buf2, sizeof (buf2), (off_t) hdr->content->length);
>        mutt_format_s (dest, destlen, prefix, buf2);
>        break;
>  
> Index: muttlib.c
> ===================================================================
> RCS file: /cvsroots/mutt/muttlib.c,v
> retrieving revision 3.41
> diff -u -r3.41 muttlib.c
> --- muttlib.c 21 Feb 2006 21:52:17 -0000      3.41
> +++ muttlib.c 21 Apr 2006 23:21:52 -0000
> @@ -47,6 +47,7 @@
>  #include <time.h>
>  #include <sys/types.h>
>  #include <utime.h>
> +#include <inttypes.h>
>  
>  BODY *mutt_new_body (void)
>  {
> @@ -811,23 +812,23 @@
>    }
>  }
>  
> -void mutt_pretty_size (char *s, size_t len, long n)
> +void mutt_pretty_size (char *s, size_t len, off_t n)
>  {
>    if (n == 0)
>      strfcpy (s, "0K", len);
>    else if (n < 10189) /* 0.1K - 9.9K */
> -    snprintf (s, len, "%3.1fK", (n < 103) ? 0.1 : n / 1024.0);
> +    snprintf (s, len, "%3.1lfK", (n < 103) ? 0.1 : n / 1024.0);
>    else if (n < 1023949) /* 10K - 999K */
>    {
>      /* 51 is magic which causes 10189/10240 to be rounded up to 10 */
> -    snprintf (s, len, "%ldK", (n + 51) / 1024);
> +    snprintf (s, len, "%" PRId64 "K", (n + 51) / 1024);
>    }
>    else if (n < 10433332) /* 1.0M - 9.9M */
> -    snprintf (s, len, "%3.1fM", n / 1048576.0);
> +    snprintf (s, len, "%3.1lfM", n / 1048576.0);
>    else /* 10M+ */
>    {
>      /* (10433332 + 52428) / 1048576 = 10 */
> -    snprintf (s, len, "%ldM", (n + 52428) / 1048576);
> +    snprintf (s, len, "%" PRId64 "M", (n + 52428) / 1048576);
>    }
>  }
>  
> Index: pager.c
> ===================================================================
> RCS file: /cvsroots/mutt/pager.c,v
> retrieving revision 3.30
> diff -u -r3.30 pager.c
> --- pager.c   21 Oct 2005 04:35:37 -0000      3.30
> +++ pager.c   21 Apr 2006 23:21:53 -0000
> @@ -45,6 +45,7 @@
>  #include <stdlib.h>
>  #include <string.h>
>  #include <errno.h>
> +#include <inttypes.h>
>  
>  #define ISHEADER(x) ((x) == MT_COLOR_HEADER || (x) == MT_COLOR_HDEFAULT)
>  
> @@ -1764,7 +1765,7 @@
>                   buffer : banner);
>        addstr (" -- (");
>        if (last_pos < sb.st_size - 1)
> -     printw ("%d%%)", (int) (100 * last_offset / sb.st_size));
> +     printw ("%" PRId64 "%%)", (off_t) (100 * last_offset / sb.st_size));
>        else
>       addstr (topline == 0 ? "all)" : "end)");
>        BKGDSET (MT_COLOR_NORMAL);
> Index: protos.h
> ===================================================================
> RCS file: /cvsroots/mutt/protos.h,v
> retrieving revision 3.43
> diff -u -r3.43 protos.h
> --- protos.h  9 Jan 2006 19:43:59 -0000       3.43
> +++ protos.h  21 Apr 2006 23:21:54 -0000
> @@ -223,7 +223,7 @@
>  void mutt_prepare_envelope (ENVELOPE *, int);
>  void mutt_unprepare_envelope (ENVELOPE *);
>  void mutt_pretty_mailbox (char *);
> -void mutt_pretty_size (char *, size_t, long);
> +void mutt_pretty_size (char *, size_t, off_t);
>  void mutt_pipe_message (HEADER *);
>  void mutt_print_message (HEADER *);
>  void mutt_print_patchlist (void);
> Index: intl/loadmsgcat.c
> ===================================================================
> RCS file: /cvsroots/mutt/intl/loadmsgcat.c,v
> retrieving revision 3.3
> diff -u -r3.3 loadmsgcat.c
> --- intl/loadmsgcat.c 17 Sep 2005 20:46:11 -0000      3.3
> +++ intl/loadmsgcat.c 21 Apr 2006 23:21:55 -0000
> @@ -342,7 +342,7 @@
>       struct binding *domainbinding;
>  {
>    int fd;
> -  size_t size;
> +  off_t size;
>  #ifdef _LIBC
>    struct stat64 st;
>  #else
> @@ -379,7 +379,7 @@
>  #else
>        __builtin_expect (fstat (fd, &st) != 0, 0)
>  #endif
> -      || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
> +      || __builtin_expect ((size = st.st_size) != st.st_size, 0)
>        || __builtin_expect (size < sizeof (struct mo_file_header), 0))
>      {
>        /* Something went wrong.  */


-- 
Bruno Ribas - ribas@xxxxxxx