wget: -O FILE is allowed to overwrite existing file (compat)
[oweals/busybox.git] / networking / wget.c
index 86d6f00ecf1a4f2a2db6fc504690962baca32a07..3f9954cf5dcfc440d0e052122f98a155a070860c 100644 (file)
@@ -142,7 +142,7 @@ static void progressmeter(int flag)
                /* last call to progressmeter */
                alarm(0);
                transferred = 0;
-               putc('\n', stderr);
+               fputc('\n', stderr);
        } else {
                if (flag == -1) {
                        /* first call to progressmeter */
@@ -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);