diff -r 0a5e583393e1 -r bae5adee8c8c src/main.c --- a/src/main.c Tue Sep 09 15:27:12 2014 +0100 +++ b/src/main.c Fri Oct 17 09:57:19 2014 +0100 @@ -32,9 +32,16 @@ #include #include #include +#ifdef MSWIN_API +#include +#include +#endif #ifdef HAVE_CURL #include #endif +#if !defined(HAVE_CURL) && !defined(MSWIN_API) +#include +#endif #include #include #include @@ -607,6 +614,71 @@ RAZOR_PROPERTY_PROVIDES); } +#ifndef HAVE_CURL +static int +download_local(const char *url, const char *file) +{ + FILE *wfp, *rfp; + char buffer[256], *ptr, *local; + size_t nb, n; + + local = razor_path_from_url(url); + + if (local == NULL) { + fprintf(stderr, + "%s: download manually (curl not available)\n", + file); + return -1; + } else { + rfp = fopen(local, "rb"); + if (rfp == NULL) { + perror(local); + free(local); + return -1; + } + + wfp = fopen(file, "wb"); + if (wfp == NULL) { + perror(file); + fclose(rfp); + free(local); + return -1; + } + + while((nb = fread(buffer, 1, sizeof(buffer), rfp)) > 0) { + ptr = buffer; + while (nb > 0 && (n = fwrite(ptr, 1, nb, wfp)) > 0) { + ptr += n; + nb -= n; + } + + if (nb != 0) { + perror(file); + fclose(wfp); + fclose(rfp); + unlink(file); + free(local); + return -1; + } + } + + if (ferror(rfp)) { + perror(local); + fclose(wfp); + fclose(rfp); + unlink(file); + free(local); + return -1; + } + + fclose(wfp); + fclose(rfp); + free(local); + return 0; + } +} +#endif /* !HAVE_CURL */ + #ifdef HAVE_CURL static int show_progress(void *clientp, @@ -620,65 +692,74 @@ return 0; } -#endif /* HAVE_CURL */ static int -download_if_missing(const char *url, const char *file) +download_with_curl(const char *url, const char *file) { -#ifndef HAVE_CURL - return 1; -#else + FILE *fp; CURL *curl; - struct stat buf; char error[256]; - FILE *fp; CURLcode res; long response; curl = curl_easy_init(); - if (curl == NULL) - return 1; + if (curl == NULL) { + fprintf(stderr, + "%s: download manually (curl failed)\n", file); + return -1; + } curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, show_progress); curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, file); - if (stat(file, &buf) < 0) { - fp = fopen(file, "wb"); - if (fp == NULL) { - fprintf(stderr, - "failed to open %s for writing\n", file); - return -1; - } - curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); - curl_easy_setopt(curl, CURLOPT_URL, url); - res = curl_easy_perform(curl); - fclose(fp); - if (res != CURLE_OK) { - fprintf(stderr, "curl error: %s\n", error); - unlink(file); - return -1; - } - res = curl_easy_getinfo(curl, - CURLINFO_RESPONSE_CODE, &response); - if (res != CURLE_OK) { - fprintf(stderr, "curl error: %s\n", error); - unlink(file); - return -1; - } - if (response != 200) { - fprintf(stderr, " - failed %ld\n", response); - unlink(file); - return -1; - } - fprintf(stderr, "\n"); + fp = fopen(file, "wb"); + if (fp == NULL) { + perror(file); + return -1; } - + curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); + curl_easy_setopt(curl, CURLOPT_URL, url); + res = curl_easy_perform(curl); + fclose(fp); + if (res != CURLE_OK) { + fprintf(stderr, "curl error: %s\n", error); + unlink(file); + return -1; + } + res = curl_easy_getinfo(curl, + CURLINFO_RESPONSE_CODE, &response); + if (res != CURLE_OK) { + fprintf(stderr, "curl error: %s\n", error); + unlink(file); + return -1; + } + if (response != 200) { + fprintf(stderr, " - failed %ld\n", response); + unlink(file); + return -1; + } + fprintf(stderr, "\n"); curl_easy_cleanup(curl); return 0; +} #endif /* HAVE_CURL */ + +static int +download_if_missing(const char *url, const char *file) +{ + struct stat buf; + + if (stat(file, &buf) >= 0) + return 0; + +#ifndef HAVE_CURL + return download_local(url, file); +#else + return download_with_curl(url, file); +#endif } #define YUM_URL "http://download.fedora.redhat.com" \ @@ -704,7 +785,7 @@ return 1; } - printf("downloading from %s.\n", yum_url); + printf("downloading from '%s'.\n", yum_url); snprintf(buffer, sizeof buffer, "%s/repodata/primary.xml.gz", yum_url); if (download_if_missing(buffer, "primary.xml.gz") < 0) @@ -1450,7 +1531,6 @@ razor_transaction_destroy(trans); razor_set_unref(upstream); razor_root_close(root); - razor_atomic_destroy(atomic); if (relocations) razor_relocations_destroy(relocations); return 1;