summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2007-09-27 15:07:23 +0000
committerDenis Vlasenko2007-09-27 15:07:23 +0000
commita36535b0676aab90b0411a85222c4f3c0eede406 (patch)
tree0ecd01d99e6d82a28bc0e03fabdef86aa17411e5
parent6124c37135b2766d785471fe9b3eba9c1a233c66 (diff)
downloadbusybox-a36535b0676aab90b0411a85222c4f3c0eede406.zip
busybox-a36535b0676aab90b0411a85222c4f3c0eede406.tar.gz
wget: -O FILE is allowed to overwrite existing file (compat)
-rw-r--r--networking/wget.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/networking/wget.c b/networking/wget.c
index df1a45b..3f9954c 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -409,8 +409,8 @@ int wget_main(int argc, char **argv)
llist_t *headers_llist = NULL;
#endif
FILE *sfp = NULL; /* socket to web/ftp server */
- FILE *dfp = NULL; /* socket to ftp server (data) */
- char *fname_out = NULL; /* where to direct output (-O) */
+ FILE *dfp; /* socket to ftp server (data) */
+ char *fname_out; /* where to direct output (-O) */
bool got_clen = 0; /* got content-length: from server */
int output_fd = -1;
bool use_proxy = 1; /* Use proxies if env vars are set */
@@ -496,7 +496,7 @@ int wget_main(int argc, char **argv)
}
/* Guess an output filename, if there was no -O FILE */
- if (!fname_out) {
+ if (!(opt & WGET_OPT_OUTNAME)) {
fname_out = bb_get_last_path_component_nostrip(target.path);
/* handle "wget http://kernel.org//" */
if (fname_out[0] == '/' || !fname_out[0])
@@ -504,6 +504,12 @@ int wget_main(int argc, char **argv)
/* -P DIR is considered only if there was no -O FILE */
if (dir_prefix)
fname_out = concat_path_file(dir_prefix, fname_out);
+ } else {
+ if (LONE_DASH(fname_out)) {
+ /* -O - */
+ output_fd = 1;
+ opt &= ~WGET_OPT_CONTINUE;
+ }
}
#if ENABLE_FEATURE_WGET_STATUSBAR
curfile = bb_get_last_path_component_nostrip(fname_out);
@@ -514,10 +520,6 @@ int wget_main(int argc, char **argv)
bb_error_msg_and_die("cannot specify continue (-c) without a filename (-O)"); */
/* Determine where to start transfer */
- if (LONE_DASH(fname_out)) {
- output_fd = 1;
- opt &= ~WGET_OPT_CONTINUE;
- }
if (opt & WGET_OPT_CONTINUE) {
output_fd = open(fname_out, O_WRONLY);
if (output_fd >= 0) {
@@ -744,9 +746,13 @@ int wget_main(int argc, char **argv)
*/
/* Do it before progressmeter (want to have nice error message) */
- if (output_fd < 0)
- output_fd = xopen(fname_out,
- O_WRONLY|O_CREAT|O_EXCL|O_TRUNC);
+ if (output_fd < 0) {
+ int o_flags = O_WRONLY | O_CREAT | O_TRUNC | O_EXCL;
+ /* compat with wget: -O FILE can overwrite */
+ if (opt & WGET_OPT_OUTNAME)
+ o_flags = O_WRONLY | O_CREAT | O_TRUNC;
+ output_fd = xopen(fname_out, o_flags);
+ }
if (!(opt & WGET_OPT_QUIET))
progressmeter(-1);