diff options
-rw-r--r-- | docs/cmdline-opts/Makefile.inc | 1 | ||||
-rw-r--r-- | docs/cmdline-opts/create-file-mode.d | 12 | ||||
-rw-r--r-- | docs/options-in-versions | 1 | ||||
-rw-r--r-- | src/tool_cfgable.h | 1 | ||||
-rw-r--r-- | src/tool_getparam.c | 7 | ||||
-rw-r--r-- | src/tool_help.c | 3 | ||||
-rw-r--r-- | src/tool_paramhlp.c | 25 | ||||
-rw-r--r-- | src/tool_paramhlp.h | 1 | ||||
-rw-r--r-- | tests/data/test1463 | 1 | ||||
-rw-r--r-- | tests/data/test1464 | 1 |
10 files changed, 49 insertions, 4 deletions
diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc index 097be34b6..059002a4e 100644 --- a/docs/cmdline-opts/Makefile.inc +++ b/docs/cmdline-opts/Makefile.inc @@ -40,6 +40,7 @@ DPAGES = \ cookie-jar.d \ cookie.d \ create-dirs.d \ + create-file-mode.d \ crlf.d crlfile.d \ curves.d \ data-ascii.d \ diff --git a/docs/cmdline-opts/create-file-mode.d b/docs/cmdline-opts/create-file-mode.d new file mode 100644 index 000000000..115bacf21 --- /dev/null +++ b/docs/cmdline-opts/create-file-mode.d @@ -0,0 +1,12 @@ +Long: create-file-mode +Help: File mode for created files +Protocols: SFTP SCP FILE +Category: sftp scp file upload +See-also: ftp-create-dirs +Added: 7.75.0 +--- +When curl is used to create files remotely using one of the supported +protocols, this option allows the user to set which 'mode' to set on the file +at creation time, instead of the default 0644. + +This options takes an octal number as argument. diff --git a/docs/options-in-versions b/docs/options-in-versions index 97c416d83..bb2de4614 100644 --- a/docs/options-in-versions +++ b/docs/options-in-versions @@ -30,6 +30,7 @@ --cookie (-b) 4.9 --cookie-jar (-c) 7.9 --create-dirs 7.10.3 +--create-file-mode 7.75.0 --crlf 5.7 --crlfile 7.19.7 --curves 7.73.0 diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h index 6b7f874e1..dc1c5e557 100644 --- a/src/tool_cfgable.h +++ b/src/tool_cfgable.h @@ -193,6 +193,7 @@ struct OperationConfig { long ssl_version_max; long proxy_ssl_version; long ip_version; + long create_file_mode; /* CURLOPT_NEW_FILE_PERMS */ curl_TimeCond timecond; curl_off_t condtime; struct curl_slist *headers; diff --git a/src/tool_getparam.c b/src/tool_getparam.c index b7cfeb62e..c57506609 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -108,6 +108,7 @@ static const struct LongShort aliases[]= { #endif {"*q", "ftp-create-dirs", ARG_BOOL}, {"*r", "create-dirs", ARG_BOOL}, + {"*R", "create-file-mode", ARG_STRING}, {"*s", "max-redirs", ARG_STRING}, {"*t", "proxy-ntlm", ARG_BOOL}, {"*u", "crlf", ARG_BOOL}, @@ -774,6 +775,12 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ config->create_dirs = toggle; break; + case 'R': /* --create-file-mode */ + err = oct2nummax(&config->create_file_mode, nextarg, 0777); + if(err) + return err; + break; + case 's': /* --max-redirs */ /* specified max no of redirects (http(s)), this accepts -1 as a special condition */ diff --git a/src/tool_help.c b/src/tool_help.c index a3323cd59..c78f98fa9 100644 --- a/src/tool_help.c +++ b/src/tool_help.c @@ -181,6 +181,9 @@ static const struct helptxt helptext[] = { {" --create-dirs", "Create necessary local directory hierarchy", CURLHELP_CURL}, + {" --create-file-mode", + "File mode for created files", + CURLHELP_SFTP | CURLHELP_SCP | CURLHELP_FILE}, {" --crlf", "Convert LF to CRLF in upload", CURLHELP_FTP | CURLHELP_SMTP}, diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c index 2f43932ec..a2f20cb17 100644 --- a/src/tool_paramhlp.c +++ b/src/tool_paramhlp.c @@ -129,14 +129,13 @@ void cleanarg(char *str) * getparameter a lot, we must check it for NULL before accessing the str * data. */ - -ParameterError str2num(long *val, const char *str) +static ParameterError getnum(long *val, const char *str, int base) { if(str) { char *endptr = NULL; long num; errno = 0; - num = strtol(str, &endptr, 10); + num = strtol(str, &endptr, base); if(errno == ERANGE) return PARAM_NUMBER_TOO_LARGE; if((endptr != str) && (endptr == str + strlen(str))) { @@ -147,6 +146,24 @@ ParameterError str2num(long *val, const char *str) return PARAM_BAD_NUMERIC; /* badness */ } +ParameterError str2num(long *val, const char *str) +{ + return getnum(val, str, 10); +} + +ParameterError oct2nummax(long *val, const char *str, long max) +{ + ParameterError result = getnum(val, str, 8); + if(result != PARAM_OK) + return result; + else if(*val > max) + return PARAM_NUMBER_TOO_LARGE; + else if(*val < 0) + return PARAM_NEGATIVE_NUMERIC; + + return PARAM_OK; +} + /* * Parse the string and write the long in the given address. Return PARAM_OK * on success, otherwise a parameter error enum. ONLY ACCEPTS POSITIVE NUMBERS! @@ -158,7 +175,7 @@ ParameterError str2num(long *val, const char *str) ParameterError str2unum(long *val, const char *str) { - ParameterError result = str2num(val, str); + ParameterError result = getnum(val, str, 10); if(result != PARAM_OK) return result; if(*val < 0) diff --git a/src/tool_paramhlp.h b/src/tool_paramhlp.h index 664c8b0f5..32b0fc49b 100644 --- a/src/tool_paramhlp.h +++ b/src/tool_paramhlp.h @@ -33,6 +33,7 @@ void cleanarg(char *str); ParameterError str2num(long *val, const char *str); ParameterError str2unum(long *val, const char *str); +ParameterError oct2nummax(long *val, const char *str, long max); ParameterError str2unummax(long *val, const char *str, long max); ParameterError str2udouble(double *val, const char *str, long max); diff --git a/tests/data/test1463 b/tests/data/test1463 index 7e1fe9b84..224bedab4 100644 --- a/tests/data/test1463 +++ b/tests/data/test1463 @@ -37,6 +37,7 @@ curl file category --help <stdout mode="text"> Usage: curl [options...] <url> file: FILE protocol options + --create-file-mode File mode for created files -I, --head Show document info only -r, --range <range> Retrieve only the bytes within RANGE </stdout> diff --git a/tests/data/test1464 b/tests/data/test1464 index 167e80d6d..774147517 100644 --- a/tests/data/test1464 +++ b/tests/data/test1464 @@ -37,6 +37,7 @@ curl file category --help with lower/upper mix <stdout mode="text"> Usage: curl [options...] <url> file: FILE protocol options + --create-file-mode File mode for created files -I, --head Show document info only -r, --range <range> Retrieve only the bytes within RANGE </stdout> |