summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2020-12-20 18:44:20 +0100
committerDaniel Stenberg <daniel@haxx.se>2020-12-21 10:52:41 +0100
commita7696c73436f643d5d31ce0c3d48d282c79f4b5d (patch)
treec01a633a45e06f199eba2cd295b60725af7800c0
parente1a4647a42b901d88f9629ce98ff56960e342a74 (diff)
downloadcurl-a7696c73436f643d5d31ce0c3d48d282c79f4b5d.tar.gz
curl: add --create-file-mode [mode]
This option sets the (octal) mode to use for the remote file when one is created, using the SFTP, SCP or FILE protocols. When not set, the default is 0644. Closes #6244
-rw-r--r--docs/cmdline-opts/Makefile.inc1
-rw-r--r--docs/cmdline-opts/create-file-mode.d12
-rw-r--r--docs/options-in-versions1
-rw-r--r--src/tool_cfgable.h1
-rw-r--r--src/tool_getparam.c7
-rw-r--r--src/tool_help.c3
-rw-r--r--src/tool_paramhlp.c25
-rw-r--r--src/tool_paramhlp.h1
-rw-r--r--tests/data/test14631
-rw-r--r--tests/data/test14641
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>