aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/checksum.c2
-rw-r--r--src/manifest.c19
-rw-r--r--src/mirrors.c40
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