#include #include #include "base64.h" void usage(void) { fprint(2, "base64decode [file]\n"); exits("usage"); } static void decode(int fd, char *name) { int n, nb; long tot; char *buf, *outbuf; outbuf = nil; 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(b64d_size(strlen(buf))); nb = b64_decode(buf, strlen(buf), outbuf); outbuf[nb] = 0; 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); } decode(fd, file); }