summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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>