aboutsummaryrefslogtreecommitdiff
path: root/src/mirrors.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mirrors.c')
-rw-r--r--src/mirrors.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/mirrors.c b/src/mirrors.c
new file mode 100644
index 0000000..5c18a1c
--- /dev/null
+++ b/src/mirrors.c
@@ -0,0 +1,100 @@
+#include "spm.h"
+
+char **file_readlines(const char *filename) {
+ FILE *fp = NULL;
+ char **result = NULL;
+ char *buffer = NULL;
+ size_t lines = 0;
+
+ if ((fp = fopen(filename, "r")) == NULL) {
+ perror(filename);
+ fprintf(SYSERROR);
+ return NULL;
+ }
+
+ // Allocate buffer
+ if ((buffer = calloc(BUFSIZ + 1, sizeof(char))) == NULL) {
+ perror("line buffer");
+ fprintf(SYSERROR);
+ fclose(fp);
+ return NULL;
+ }
+
+ // count number the of lines in the file
+ while ((fgets(buffer, BUFSIZ, fp)) != NULL) {
+ lines++;
+ }
+
+ if (!lines) {
+ free(buffer);
+ fclose(fp);
+ return NULL;
+ }
+
+ rewind(fp);
+
+ // Populate results array
+ result = calloc(lines + 1, sizeof(char *));
+ for (size_t i = 0; i < lines; i++) {
+ if (fgets(buffer, BUFSIZ, fp) == NULL) {
+ break;
+ }
+ result[i] = strdup(buffer);
+ }
+
+ free(buffer);
+ fclose(fp);
+ return result;
+}
+
+char **mirror_list(const char *filename) {
+ char **mirrors = file_readlines(filename);
+ char **result = NULL;
+ size_t count;
+ for (count = 0; mirrors[count] != NULL; count++);
+
+ if (!count) {
+ return NULL;
+ }
+
+ result = calloc(count + 1, sizeof(char **));
+ for (size_t i = 0; mirrors[i] != NULL; i++) {
+ if (startswith(mirrors[i], "#") == 0 || isempty(mirrors[i])) {
+ continue;
+ }
+ result[i] = join((char *[]) {mirrors[i], SPM_GLOBAL.repo_target, NULL}, DIRSEPS);
+ free(mirrors[i]);
+ }
+ free(mirrors);
+ return result;
+}
+
+void mirror_clone(Manifest *info, char *dest) {
+ if (exists(dest) != 0 && mkdir(dest, 0755) != 0) {
+ perror("Unable to create mirror directory");
+ fprintf(SYSERROR);
+ exit(1);
+ }
+
+ 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 *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);
+ 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);
+ }
+ free(url);
+ free(path);
+ }
+} \ No newline at end of file