Skip to contentSkip to conversation

0001-flashcp-Use-llu-to-print-filestat.st_size.patch

PATCH Fabien Proriol 1 participant 1 message Nov 6, 2014 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

Hello,

There is a display bug in flashcp.
In fact the problem is filestat.st_size can be 64 bits (in my case, Zynq ARM platform).

With command:
flashcp -v IMG.img /dev/mtd0

Results lines are:

Erasing blocks: 40/40 (100%)
Writing data: 1670k/0k (2544%)

......
and at the end:

Erasing blocks: 40/40 (100%)
Writing data: 2544k/0k (100%)) <----- double parenthesis
Verifying data: 2544k/0k (100%))

I wrote a patch to solve this problem...
But I have another question about "written" and "size" variables... The size_t type is potentially not the good type to store filestat.st_size, off_t should be better...

Fabien Proriol

_______________________________________________________________________________

From e65a012df12fa39ed0a6c5a71b5dc952b4c982fc Mon Sep 17 00:00:00 2001
From: Fabien Proriol <[email protected]>
Date: Thu, 6 Nov 2014 15:54:20 +0100
Subject: [PATCH] flashcp: Use %llu to print filestat.st_size

filestat.st_size type is off_t.
For some paltforms, off_t can be 32 or 64bit but there is no C99 format specifier for off_t.
The best way to print it with printf is to cast it to long long and print with %llu

---
  flashcp.c | 32 ++++++++++++++++----------------
  1 file changed, 16 insertions(+), 16 deletions(-)
flashcp.c +0 -1
index d58c81b..04495bd 100644
@@ -296,7 +296,7 @@ int main (int argc,char *argv[])
          * write the entire file to flash *
          **********************************/
 
-       if (flags & FLAG_VERBOSE) log_printf (LOG_NORMAL,"Writing data: 

0k/%luk (0%%)",KB (filestat.st_size));
+ if (flags & FLAG_VERBOSE) log_printf (LOG_NORMAL,"Writing data:

0k/%lluk (0%%)",KB ((unsigned long long)filestat.st_size));
         size = filestat.st_size;
         i = BUFSIZE;
         written = 0;
@@ -304,10 +304,10 @@ int main (int argc,char *argv[])
         {
                 if (size < BUFSIZE) i = size;
                 if (flags & FLAG_VERBOSE)

- log_printf (LOG_NORMAL,"\rWriting data: %dk/%luk
(%lu%%)",
+ log_printf (LOG_NORMAL,"\rWriting data:
%dk/%lluk (%llu%%)",
KB (written + i),
- KB (filestat.st_size),
- PERCENTAGE (written +
i,filestat.st_size));
+ KB ((unsigned long
long)filestat.st_size),
+ PERCENTAGE (written +
i,(unsigned long long)filestat.st_size));

                 /* read from filename */
                 safe_read (fil_fd,filename,src,i,flags & FLAG_VERBOSE);
@@ -325,8 +325,8 @@ int main (int argc,char *argv[])
                                 exit (EXIT_FAILURE);
                         }
                         log_printf (LOG_ERROR,

- "Short write count returned
while writing to x%.8x-0x%.8x on %s: %d/%lu bytes written to flash\n",
- written,written +
i,device,written + result,filestat.st_size);
+ "Short write count returned
while writing to x%.8x-0x%.8x on %s: %d/%llu bytes written to flash\n",
+ written,written +

i,device,written + result,(unsigned long long)filestat.st_size);
                         exit (EXIT_FAILURE);
                 }

@@ -335,10 +335,10 @@ int main (int argc,char *argv[])
}
if (flags & FLAG_VERBOSE)
log_printf (LOG_NORMAL,

-                               "\rWriting data: %luk/%luk (100%%)\n",
-                               KB (filestat.st_size),
-                               KB (filestat.st_size));
-       DEBUG("Wrote %d / %luk bytes\n",written,filestat.st_size);
+                               "\rWriting data: %lluk/%lluk (100%%)\n",
+                               KB ((unsigned long long)filestat.st_size),
+                               KB ((unsigned long long)filestat.st_size));

+ DEBUG("Wrote %d / %lluk bytes\n",written,(unsigned long
long)filestat.st_size);

/**********************************
* verify that flash == file data *
@@ -349,16 +349,16 @@ int main (int argc,char *argv[])

         size = filestat.st_size;
         i = BUFSIZE;
         written = 0;
-       if (flags & FLAG_VERBOSE) log_printf (LOG_NORMAL,"Verifying 
data: 0k/%luk (0%%)",KB (filestat.st_size));
+       if (flags & FLAG_VERBOSE) log_printf (LOG_NORMAL,"Verifying 
data: 0k/%lluk (0%%)",KB ((unsigned long long)filestat.st_size));
         while (size)
         {
                 if (size < BUFSIZE) i = size;
                 if (flags & FLAG_VERBOSE)
                         log_printf (LOG_NORMAL,

- "\rVerifying data: %dk/%luk
(%lu%%)",
+ "\rVerifying data: %dk/%lluk
(%lu%%)",
KB (written + i),
- KB (filestat.st_size),
- PERCENTAGE (written +
i,filestat.st_size));
+ KB ((unsigned long
long)filestat.st_size),
+ PERCENTAGE (written +
i,(unsigned long long)filestat.st_size));

                 /* read from filename */
                 safe_read (fil_fd,filename,src,i,flags & FLAG_VERBOSE);

@@ -380,10 +380,10 @@ int main (int argc,char *argv[])
}
if (flags & FLAG_VERBOSE)
log_printf (LOG_NORMAL,
- "\rVerifying data: %luk/%luk (100%%)\n",
+ "\rVerifying data: %lluk/%lluk (100%%)\n",

                                 KB (filestat.st_size),
                                 KB (filestat.st_size));

- DEBUG("Verified %d / %luk bytes\n",written,filestat.st_size);
+ DEBUG("Verified %d / %lluk bytes\n",written,(unsigned long
long)filestat.st_size);

         exit (EXIT_SUCCESS);

}

Signature · 1 line
2.0.4