diff options
Diffstat (limited to 'base64encode.c')
-rw-r--r-- | base64encode.c | 56 |
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 |