summary refs log tree commit diff
path: root/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'net.c')
-rw-r--r--net.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/net.c b/net.c
index 73f50d4..e90d3c0 100644
--- a/net.c
+++ b/net.c
@@ -1,5 +1,8 @@
 #include <string.h>
+#include <stdio.h>
+
 #include "net.h"
+#include "err.h"
 
 int net_addr(const char *url, struct addr *adr, enum protocol prot_default) {
 	char *prot_mark;
@@ -24,11 +27,40 @@ int net_addr(const char *url, struct addr *adr, enum protocol prot_default) {
 	} else {
 		adr->prot = prot_default;
 	}
-	adr->type = TYPE_PLAIN;
-	adr->host_len = 0;
-	size_t n = strlen(url);
-	if (n > PATH_MAX) return -1;
-	adr->path_len = n;
-	memcpy(adr->path, url, n);
+
+	if (adr->prot == PROT_FILE) {
+		adr->type = TYPE_PLAIN;
+		adr->host_len = 0;
+		size_t n = strlen(url);
+		if (n >= PATH_MAX) return -1;
+		adr->path_len = n;
+		memcpy(adr->path, url, n + 1);
+	} else {
+		return -1;
+	}
+
 	return 0;
 }
+
+int net_fetch(const struct addr *adr, struct buf *buf) {
+	switch (adr->prot) {
+	case PROT_FILE:
+		{
+			FILE *f = fopen(adr->path, "r/o");
+			if (!f) {
+				perr("file not found");
+				return -1;
+			}
+			buf_init(buf, 1024);
+			char b[256];
+			while (fgets(b, sizeof b, f)) {
+				buf_cat(buf, b, strlen(b));
+			}
+			buf_catc(buf, 0);
+			fclose(f);
+		}
+		return 0;
+	default:
+		return -1;
+	}
+}