diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/checksum.c | 2 | ||||
-rw-r--r-- | src/manifest.c | 19 | ||||
-rw-r--r-- | src/mirrors.c | 40 |
3 files changed, 45 insertions, 16 deletions
diff --git a/src/checksum.c b/src/checksum.c index d511298..d2d0438 100644 --- a/src/checksum.c +++ b/src/checksum.c @@ -58,7 +58,7 @@ char *sha256sum(const char *filename) { perror(filename); return NULL; } - char *result = calloc((SHA256_DIGEST_LENGTH * 2) + 1, sizeof(char)); + char *result = calloc(SHA256_DIGEST_STRING_LENGTH, sizeof(char)); if (!result) { fclose(fp); perror("SHA256 result"); diff --git a/src/manifest.c b/src/manifest.c index d1298cf..e8ce5b2 100644 --- a/src/manifest.c +++ b/src/manifest.c @@ -319,10 +319,9 @@ Manifest *manifest_read(char *file_or_url) { strcat(path, filename); } + char *remote_manifest = join((char *[]) {file_or_url, SPM_GLOBAL.repo_target, filename, NULL}, DIRSEPS); if (exists(path) != 0) { // TODO: Move this out - //char *remote_manifest = join((char *[]) {"http://astroconda.org/spm", SPM_GLOBAL.repo_target, filename, NULL}, DIRSEPS); - char *remote_manifest = join((char *[]) {file_or_url, SPM_GLOBAL.repo_target, filename, NULL}, DIRSEPS); int fetch_status = fetch(remote_manifest, path); if (fetch_status >= 400) { fprintf(stderr, "HTTP %d: %s: %s\n", fetch_status, http_response_str(fetch_status), remote_manifest); @@ -333,7 +332,6 @@ Manifest *manifest_read(char *file_or_url) { free(remote_manifest); return NULL; } - free(remote_manifest); } int valid = 0; @@ -357,6 +355,17 @@ Manifest *manifest_read(char *file_or_url) { Manifest *info = (Manifest *)calloc(1, sizeof(Manifest)); info->packages = (ManifestPackage **)calloc(total_records + 1, sizeof(ManifestPackage *)); + // Record manifest's origin + memset(info->origin, '\0', PACKAGE_MEMBER_ORIGIN_SIZE); + if (remote_manifest != NULL) { + strncpy(info->origin, remote_manifest, PACKAGE_MEMBER_ORIGIN_SIZE); + } + else { + strncpy(info->origin, path, PACKAGE_MEMBER_ORIGIN_SIZE); + } + free(remote_manifest); + + // Check validity of the manifest's formatting and field length if ((valid = manifest_validate()) != 0) { return NULL; } @@ -401,8 +410,8 @@ Manifest *manifest_read(char *file_or_url) { } if (strncmp(parts[7], SPM_MANIFEST_NODATA, strlen(SPM_MANIFEST_NODATA)) != 0) { - memset(info->packages[i]->checksum_sha256, '\0', SHA256_DIGEST_LENGTH); - strncpy(info->packages[i]->checksum_sha256, parts[7], SHA256_DIGEST_LENGTH); + memset(info->packages[i]->checksum_sha256, '\0', SHA256_DIGEST_STRING_LENGTH); + strcpy(info->packages[i]->checksum_sha256, parts[7]); } diff --git a/src/mirrors.c b/src/mirrors.c index 5c18a1c..6b294aa 100644 --- a/src/mirrors.c +++ b/src/mirrors.c @@ -1,4 +1,5 @@ #include "spm.h" +#include "url.h" char **file_readlines(const char *filename) { FILE *fp = NULL; @@ -69,32 +70,51 @@ char **mirror_list(const char *filename) { return result; } -void mirror_clone(Manifest *info, char *dest) { - if (exists(dest) != 0 && mkdir(dest, 0755) != 0) { +void mirror_clone(Manifest *info, char *_dest) { + char *dest = NULL; + if (endswith(_dest, SPM_GLOBAL.repo_target) != 0) { + dest = strdup(_dest); + } + else { + dest = join((char *[]) {_dest, SPM_GLOBAL.repo_target, NULL}, DIRSEPS); + } + + if (exists(dest) != 0 && mkdirs(dest, 0755) != 0) { perror("Unable to create mirror directory"); fprintf(SYSERROR); exit(1); } + printf("Remote: %s\n", info->origin); + printf("Local: %s\n", dest); + for (size_t i = 0; i < info->records; i++) { long response = 0; - char *url = join((char *[]) {info->packages[i]->origin, SPM_GLOBAL.repo_target, info->packages[i]->archive, NULL}, DIRSEPS); + char *archive = join((char *[]) {info->packages[i]->origin, SPM_GLOBAL.repo_target, info->packages[i]->archive, NULL}, DIRSEPS); char *path = join((char *[]) {dest, info->packages[i]->archive, NULL}, DIRSEPS); if (exists(path) == 0) { char *checksum = sha256sum(path); - char *wtf_orig = checksum; - char *wtf_new = info->packages[i]->checksum_sha256; if (strcmp(checksum, info->packages[i]->checksum_sha256) == 0) { - free(url); + printf("Skipped: %s\n", archive); + free(archive); free(path); continue; } } - printf("Downloading: %s\n", url); - if ((response = fetch(url, path)) >= 400) { - fprintf(stderr, "Failed to retrieve (error: %ld): %s\n", response, url); + printf("Fetch: %s\n", archive); + if ((response = fetch(archive, path)) >= 400) { + fprintf(stderr, "WARNING: HTTP(%ld, %s): %s\n", response, http_response_str(response), archive); } - free(url); + free(archive); free(path); } + + // Now fetch a copy of the physical manifest + char *datafile = join((char *[]) {dest, basename(info->origin), NULL}, DIRSEPS); + long response = 0; + if ((response = fetch(info->origin, datafile) >= 400)) { + fprintf(stderr, "WARNING: HTTP(%ld, %s): %s\n", response, http_response_str(response), info->origin); + } + free(dest); + printf("done!\n"); }
\ No newline at end of file |