#include #include #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) * b64e_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); }