about summary refs log tree commit diff stats
path: root/base64encode.c
diff options
context:
space:
mode:
Diffstat (limited to 'base64encode.c')
-rw-r--r--base64encode.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/base64encode.c b/base64encode.c
new file mode 100644
index 0000000..b6f0fe6
--- /dev/null
+++ b/base64encode.c
@@ -0,0 +1,56 @@
+#include <u.h>
+#include <libc.h>
+#include "base64.h"
+
+void
+usage(void)
+{
+	fprint(2, "base64encode [file]\n");
+	exits("usage");
+}
+
+static void 
+encode(int fd, char *name)
+{
+	int n;
+	long tot;
+	char *buf, *outbuf;
+	buf = nil;
+	tot = 0;
+	for(;;){
+		buf = realloc(buf, tot+8192);
+		if(buf == nil)
+			sysfatal("realloc: %r");
+		if((n = read(fd, buf+tot, 8192)) < 0)
+			sysfatal("read: %r");
+		if(n == 0)
+			break;
+		tot += n;
+	}
+	buf[tot] = 0;
+	outbuf =  malloc(1 + (sizeof(char) * b64d_size(strlen(buf))));
+	b64_encode(buf, strlen(buf), outbuf);
+	if((n=write(1,  outbuf, strlen(outbuf))) != strlen(outbuf))
+		sysfatal("writing bytes failed");
+}
+
+void
+main(int argc, char **argv)
+{
+	int fd;
+	char *file;
+	fd = 0;
+	file = "stdin";
+	ARGBEGIN{
+	default:
+		usage();
+	}ARGEND
+	if(argc != 0 && argc != 1)
+		usage();
+	if(argc == 1){
+		file = argv[0];
+ 		if((fd = open(file, OREAD)) < 0)
+			sysfatal("can'topen %s", file);
+	}
+	encode(fd, file);
+}
\ No newline at end of file