[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