[syslinux] TFTP progress indicator
Geert Stappers
stappers at stappers.nl
Fri Apr 24 02:22:44 PDT 2015
On Fri, Apr 24, 2015 at 11:15:25AM +0200, Geert Stappers wrote:
>
> Hello,
>
>
> This is from http://wormfood.net/pxelinux_tftp_progress_display.patch
>
> --- syslinux-6.03-original/core/fs/pxe/pxe.c 2014-10-07 00:27:44.000000000 +0800
> +++ syslinux-6.03/core/fs/pxe/pxe.c 2015-04-16 17:28:49.000000000 +0800
> @@ -197,29 +197,47 @@
> int blocks, bool *have_more)
> {
> struct inode *inode = file->inode;
> struct pxe_pvt_inode *socket = PVT(inode);
> int count = blocks;
> int chunk;
> int bytes_read = 0;
> + int printed = 0; /* The number of bytes output by the percentage display */
Can be removed, see below
> + int percent;
> + bool verbose = true; /* display progress flag - we need to be passed a flag to tell if we're quiet or not, and set this accordingly */
> + int percentage = -1;
>
> count <<= TFTP_BLOCKSIZE_LG2;
> + if ( blocks < 512 ) /* don't display the progress for small files. */
> + verbose=false; /* This should not be needed, once the verbose flag is properly passed from other parts of the program */
> +
> + if (verbose)
> + percent=(count/1000); /* one tenth, of one percent, really */
> +
> while (count) {
> fill_buffer(inode); /* If we have no 'fresh' buffer, get it */
> if (!socket->tftp_bytesleft)
> break;
>
> chunk = count;
> if (chunk > socket->tftp_bytesleft)
> chunk = socket->tftp_bytesleft;
> socket->tftp_bytesleft -= chunk;
> memcpy(buf, socket->tftp_dataptr, chunk);
> socket->tftp_dataptr += chunk;
> buf += chunk;
> bytes_read += chunk;
> + if ( verbose ) {
> + if ( percentage != bytes_read/percent ) { /* only print percentage if it increases */
> + percentage = bytes_read/percent; /* record the current position in the file, as a percentage */
I think that these three lines
> + while (printed--) /* before we print the new percentage, backspace over what we printed previously. */
> + printf("\b");
> + printed = printf("%3d.%.1d%% ", percentage/10, percentage%10);
can be replaced with
printf("\r%3d.%.1d%% ", percentage/10, percentage%10);
So start with a '\r', carriage return.
> + }
> + }
> count -= chunk;
> }
>
>
> if (socket->tftp_bytesleft || (socket->tftp_filepos < inode->size)) {
> fill_buffer(inode);
> *have_more = 1;
>
>
>
Groeten
Geert Stappers
--
Leven en laten leven
More information about the Syslinux
mailing list