fetch: always use O_EXCL when creating output files, use unlink if -O is specified
[project/uclient.git] / uclient-fetch.c
index 8dcb97b1349eedcea101c1fcae14ca280b7b89ee..164492128319a7f8e966aa979f29707be56a7809 100644 (file)
@@ -40,6 +40,7 @@ static bool verify = true;
 static const char *output_file;
 static int output_fd = -1;
 static int error_ret;
+static int out_bytes;
 
 static int open_output_file(const char *path, bool create)
 {
@@ -48,20 +49,22 @@ static int open_output_file(const char *path, bool create)
        int ret;
 
        if (create)
-               flags |= O_CREAT;
+               flags |= O_CREAT | O_EXCL;
 
        if (output_file) {
                if (!strcmp(output_file, "-"))
                        return STDOUT_FILENO;
 
+               if (!quiet)
+                       fprintf(stderr, "Writing to stdout\n");
+
+               unlink(output_file);
                return open(output_file, flags, 0644);
        }
 
-       /* Don't automatically overwrite files if the name is derived from the URL */
-       if (create)
-               flags |= O_EXCL;
-
        filename = uclient_get_url_filename(path, "index.html");
+       if (!quiet)
+               fprintf(stderr, "Writing to '%s'\n", filename);
        ret = open(filename, flags, 0644);
        free(filename);
 
@@ -125,6 +128,7 @@ static void read_data_cb(struct uclient *cl)
                if (!len)
                        return;
 
+               out_bytes += len;
                write(output_fd, buf, len);
        }
 }
@@ -143,6 +147,7 @@ static void msg_connecting(struct uclient *cl)
 
 static void init_request(struct uclient *cl)
 {
+       out_bytes = 0;
        uclient_connect(cl);
        msg_connecting(cl);
        uclient_http_set_request_type(cl, "GET");
@@ -151,6 +156,13 @@ static void init_request(struct uclient *cl)
 
 static void eof_cb(struct uclient *cl)
 {
+       if (!cl->data_eof) {
+               if (!quiet)
+                       fprintf(stderr, "Connection reset prematurely\n");
+               error_ret = 4;
+       } else if (!quiet) {
+               fprintf(stderr, "Download completed (%d bytes)\n", out_bytes);
+       }
        request_done(cl);
 }