diff mbox series

[2/3] downloader: add -n/--max-download-speed option

Message ID 20240520063757.2456044-3-dominique.martinet@atmark-techno.com
State Changes Requested
Headers show
Series downloader curl options: add max-download-speed | expand

Commit Message

Dominique Martinet May 20, 2024, 6:37 a.m. UTC
From: Shin-ya Koga <shinya.koga@atmark-techno.com>

Mirror suricatta (-u)'s --max-download-speed option for downloader (-d),
users sometime need to limit download speed on bad connections.

Note ustrtoull parses K/M/G suffixes for us.

Signed-off-by: Shin-ya Koga <shinya.koga@atmark-techno.com>
Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
---
 corelib/downloader.c    | 11 +++++++++--
 doc/source/swupdate.rst |  8 ++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)

Comments

Stefano Babic May 25, 2024, 3:30 p.m. UTC | #1
On 20.05.24 08:37, Dominique Martinet wrote:
> From: Shin-ya Koga <shinya.koga@atmark-techno.com>
>
> Mirror suricatta (-u)'s --max-download-speed option for downloader (-d),
> users sometime need to limit download speed on bad connections.
>
> Note ustrtoull parses K/M/G suffixes for us.
>
> Signed-off-by: Shin-ya Koga <shinya.koga@atmark-techno.com>
> Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
> ---
>   corelib/downloader.c    | 11 +++++++++--
>   doc/source/swupdate.rst |  8 ++++++++
>   2 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/corelib/downloader.c b/corelib/downloader.c
> index a3d74e60f274..04dea8b935ad 100644
> --- a/corelib/downloader.c
> +++ b/corelib/downloader.c
> @@ -36,6 +36,7 @@ static struct option long_options[] = {
>       {"retrywait", required_argument, NULL, 'w'},
>       {"timeout", required_argument, NULL, 't'},
>       {"authentication", required_argument, NULL, 'a'},
> +    {"max-download-speed", required_argument, NULL, 'n'},
>       {NULL, 0, NULL, 0}};
>
>   static channel_data_t channel_options = {
> @@ -202,7 +203,9 @@ void download_print_help(void)
>   	    "\t                         is broken (0 means indefinitely retries) (default: %d)\n"
>   	    "\t  -w, --retrywait      timeout to wait before retrying retries (default: %d)\n"
>   	    "\t  -t, --timeout          timeout to check if a connection is lost (default: %d)\n"
> -	    "\t  -a, --authentication   authentication information as username:password\n",
> +	    "\t  -a, --authentication   authentication information as username:password\n"
> +	    "\t  -n, --max-download-speed <limit>    Set download speed limit.\n"
> +	    "\t                Example: -n 100k; -n 1M; -n 100; -n 1G (default: no limit)\n",
>   	    DL_DEFAULT_RETRIES, DL_LOWSPEED_TIME, CHANNEL_DEFAULT_RESUME_DELAY);
>   }
>
> @@ -220,7 +223,7 @@ int start_download_server(const char *fname, int argc, char *argv[])
>   	/* reset to optind=1 to parse download's argument vector */
>   	optind = 1;
>   	int choice = 0;
> -	while ((choice = getopt_long(argc, argv, "t:u:w:r:a:",
> +	while ((choice = getopt_long(argc, argv, "t:u:w:r:a:n:",
>   				     long_options, NULL)) != -1) {
>   		switch (choice) {
>   		case 't':
> @@ -238,6 +241,10 @@ int start_download_server(const char *fname, int argc, char *argv[])
>   		case 'r':
>   			channel_options.retries = strtoul(optarg, NULL, 10);
>   			break;
> +		case 'n':
> +			channel_options.max_download_speed =
> +				(unsigned int)ustrtoull(optarg, NULL, 10);
> +			break;
>   		case '?':
>   		default:
>   			return -EINVAL;
> diff --git a/doc/source/swupdate.rst b/doc/source/swupdate.rst
> index ff00ca02a144..489604c73a2b 100644
> --- a/doc/source/swupdate.rst
> +++ b/doc/source/swupdate.rst
> @@ -605,6 +605,14 @@ Mandatory arguments are marked with '\*':
>   +----------------+----------+--------------------------------------------+
>   | -a <usr:pwd>   | string   | Send user and password for Basic Auth      |
>   +----------------+----------+--------------------------------------------+
> +| -n <value>     | string   | Maximum download speed to be used.         |
> +|                |          | Value be specified in kB/s, B/s, MB/s      |
> +|                |          | or GB/s. Examples:                         |
> +|                |          | -n 100k : Set limit to 100 kB/s.           |
> +|                |          | -n 500  : Set limit to 500 B/s.            |
> +|                |          | -n 2M   : Set limit to 1 M/s.              |
> +|                |          | -n 1G   : Set limit to 1 G/s.              |
> ++----------------+----------+--------------------------------------------+
>
>   Suricatta command line parameters
>   .................................

Reviewed-by: Stefano Babic <stefano.babic@swupdate.org>
diff mbox series

Patch

diff --git a/corelib/downloader.c b/corelib/downloader.c
index a3d74e60f274..04dea8b935ad 100644
--- a/corelib/downloader.c
+++ b/corelib/downloader.c
@@ -36,6 +36,7 @@  static struct option long_options[] = {
     {"retrywait", required_argument, NULL, 'w'},
     {"timeout", required_argument, NULL, 't'},
     {"authentication", required_argument, NULL, 'a'},
+    {"max-download-speed", required_argument, NULL, 'n'},
     {NULL, 0, NULL, 0}};
 
 static channel_data_t channel_options = {
@@ -202,7 +203,9 @@  void download_print_help(void)
 	    "\t                         is broken (0 means indefinitely retries) (default: %d)\n"
 	    "\t  -w, --retrywait      timeout to wait before retrying retries (default: %d)\n"
 	    "\t  -t, --timeout          timeout to check if a connection is lost (default: %d)\n"
-	    "\t  -a, --authentication   authentication information as username:password\n",
+	    "\t  -a, --authentication   authentication information as username:password\n"
+	    "\t  -n, --max-download-speed <limit>    Set download speed limit.\n"
+	    "\t                Example: -n 100k; -n 1M; -n 100; -n 1G (default: no limit)\n",
 	    DL_DEFAULT_RETRIES, DL_LOWSPEED_TIME, CHANNEL_DEFAULT_RESUME_DELAY);
 }
 
@@ -220,7 +223,7 @@  int start_download_server(const char *fname, int argc, char *argv[])
 	/* reset to optind=1 to parse download's argument vector */
 	optind = 1;
 	int choice = 0;
-	while ((choice = getopt_long(argc, argv, "t:u:w:r:a:",
+	while ((choice = getopt_long(argc, argv, "t:u:w:r:a:n:",
 				     long_options, NULL)) != -1) {
 		switch (choice) {
 		case 't':
@@ -238,6 +241,10 @@  int start_download_server(const char *fname, int argc, char *argv[])
 		case 'r':
 			channel_options.retries = strtoul(optarg, NULL, 10);
 			break;
+		case 'n':
+			channel_options.max_download_speed =
+				(unsigned int)ustrtoull(optarg, NULL, 10);
+			break;
 		case '?':
 		default:
 			return -EINVAL;
diff --git a/doc/source/swupdate.rst b/doc/source/swupdate.rst
index ff00ca02a144..489604c73a2b 100644
--- a/doc/source/swupdate.rst
+++ b/doc/source/swupdate.rst
@@ -605,6 +605,14 @@  Mandatory arguments are marked with '\*':
 +----------------+----------+--------------------------------------------+
 | -a <usr:pwd>   | string   | Send user and password for Basic Auth      |
 +----------------+----------+--------------------------------------------+
+| -n <value>     | string   | Maximum download speed to be used.         |
+|                |          | Value be specified in kB/s, B/s, MB/s      |
+|                |          | or GB/s. Examples:                         |
+|                |          | -n 100k : Set limit to 100 kB/s.           |
+|                |          | -n 500  : Set limit to 500 B/s.            |
+|                |          | -n 2M   : Set limit to 1 M/s.              |
+|                |          | -n 1G   : Set limit to 1 G/s.              |
++----------------+----------+--------------------------------------------+
 
 Suricatta command line parameters
 .................................