mirror of
https://github.com/curl/curl.git
synced 2026-08-06 05:46:13 +03:00
tool_getparam: Support size modifiers for --max-filesize
- Move the size modifier detection code from limit-rate to its own function so that it can also be used with max-filesize. Size modifiers are the suffixes such as G (gigabyte), M (megabyte) etc. For example --max-filesize 1G Ref: https://curl.haxx.se/mail/archive-2017-12/0000.html Closes https://github.com/curl/curl/pull/2179
This commit is contained in:
parent
b399b04902
commit
859ac36021
3 changed files with 69 additions and 36 deletions
|
|
@ -424,6 +424,58 @@ GetFileAndPassword(char *nextarg, char **file, char **password)
|
|||
cleanarg(nextarg);
|
||||
}
|
||||
|
||||
/* Get a size parameter for '--limit-rate' or '--max-filesize'.
|
||||
* We support a 'G', 'M' or 'K' suffix too.
|
||||
*/
|
||||
static ParameterError GetSizeParameter(struct GlobalConfig *global,
|
||||
const char *arg,
|
||||
const char *which,
|
||||
curl_off_t *value_out)
|
||||
{
|
||||
char *unit;
|
||||
curl_off_t value;
|
||||
|
||||
if(curlx_strtoofft(arg, &unit, 0, &value)) {
|
||||
warnf(global, "invalid number specified for %s\n", which);
|
||||
return PARAM_BAD_USE;
|
||||
}
|
||||
|
||||
if(!*unit)
|
||||
unit = (char *)"b";
|
||||
else if(strlen(unit) > 1)
|
||||
unit = (char *)"w"; /* unsupported */
|
||||
|
||||
switch(*unit) {
|
||||
case 'G':
|
||||
case 'g':
|
||||
if(value > (CURL_OFF_T_MAX / (1024*1024*1024)))
|
||||
return PARAM_NUMBER_TOO_LARGE;
|
||||
value *= 1024*1024*1024;
|
||||
break;
|
||||
case 'M':
|
||||
case 'm':
|
||||
if(value > (CURL_OFF_T_MAX / (1024*1024)))
|
||||
return PARAM_NUMBER_TOO_LARGE;
|
||||
value *= 1024*1024;
|
||||
break;
|
||||
case 'K':
|
||||
case 'k':
|
||||
if(value > (CURL_OFF_T_MAX / 1024))
|
||||
return PARAM_NUMBER_TOO_LARGE;
|
||||
value *= 1024;
|
||||
break;
|
||||
case 'b':
|
||||
case 'B':
|
||||
/* for plain bytes, leave as-is */
|
||||
break;
|
||||
default:
|
||||
warnf(global, "unsupported %s unit. Use G, M, K or B!\n", which);
|
||||
return PARAM_BAD_USE;
|
||||
}
|
||||
*value_out = value;
|
||||
return PARAM_OK;
|
||||
}
|
||||
|
||||
ParameterError getparameter(const char *flag, /* f or -long-flag */
|
||||
char *nextarg, /* NULL if unset */
|
||||
bool *usedarg, /* set to TRUE if the arg
|
||||
|
|
@ -589,40 +641,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
|
|||
break;
|
||||
case 'i': /* --limit-rate */
|
||||
{
|
||||
/* We support G, M, K too */
|
||||
char *unit;
|
||||
curl_off_t value;
|
||||
if(curlx_strtoofft(nextarg, &unit, 0, &value)) {
|
||||
warnf(global, "unsupported rate\n");
|
||||
return PARAM_BAD_USE;
|
||||
}
|
||||
ParameterError pe = GetSizeParameter(global, nextarg, "rate", &value);
|
||||
|
||||
if(!*unit)
|
||||
unit = (char *)"b";
|
||||
else if(strlen(unit) > 1)
|
||||
unit = (char *)"w"; /* unsupported */
|
||||
|
||||
switch(*unit) {
|
||||
case 'G':
|
||||
case 'g':
|
||||
value *= 1024*1024*1024;
|
||||
break;
|
||||
case 'M':
|
||||
case 'm':
|
||||
value *= 1024*1024;
|
||||
break;
|
||||
case 'K':
|
||||
case 'k':
|
||||
value *= 1024;
|
||||
break;
|
||||
case 'b':
|
||||
case 'B':
|
||||
/* for plain bytes, leave as-is */
|
||||
break;
|
||||
default:
|
||||
warnf(global, "unsupported rate unit. Use G, M, K or B!\n");
|
||||
return PARAM_BAD_USE;
|
||||
}
|
||||
if(pe != PARAM_OK)
|
||||
return pe;
|
||||
config->recvpersecond = value;
|
||||
config->sendpersecond = value;
|
||||
}
|
||||
|
|
@ -753,9 +776,15 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
|
|||
return PARAM_LIBCURL_DOESNT_SUPPORT;
|
||||
break;
|
||||
case 'y': /* --max-filesize */
|
||||
err = str2offset(&config->max_filesize, nextarg);
|
||||
if(err)
|
||||
return err;
|
||||
{
|
||||
curl_off_t value;
|
||||
ParameterError pe =
|
||||
GetSizeParameter(global, nextarg, "max-filesize", &value);
|
||||
|
||||
if(pe != PARAM_OK)
|
||||
return pe;
|
||||
config->max_filesize = value;
|
||||
}
|
||||
break;
|
||||
case 'z': /* --disable-eprt */
|
||||
config->disable_eprt = toggle;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue