github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/cmds/core/base64/base64.go (about) 1 // Copyright 2021 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // base64 - encode and decode base64 from stdin or file to stdout 6 7 // Synopsis: 8 // base64 [-d] [FILE] 9 10 // Description: 11 // Encode or decode a file to or from base64 encoding. 12 // -d decode data (default is to encode) 13 // For stdin, on standard Unix systems, you can use /dev/stdin 14 15 package main 16 17 import ( 18 "encoding/base64" 19 "errors" 20 "flag" 21 "fmt" 22 "io" 23 "log" 24 "os" 25 ) 26 27 var ( 28 decode = flag.Bool("d", false, "Decode") 29 errBadUsage = errors.New("usage: base64 [-d] [file]") 30 ) 31 32 func do(r io.Reader, w io.Writer, decode bool) error { 33 op := "decoding" 34 if decode { 35 r = base64.NewDecoder(base64.RawStdEncoding, r) 36 } else { 37 op = "encoding" 38 w = base64.NewEncoder(base64.RawStdEncoding, w) 39 } 40 41 if _, err := io.Copy(w, r); err != nil { 42 return fmt.Errorf("error %s the data: %w", op, err) 43 } 44 return nil 45 } 46 47 // run runs the base64 command. Why use ...string? 48 // makes testing a tad easier (so we don't have an if in main() 49 // allows us, should we wish, in future, to go with using 50 // names[1] as out. base64 commands are very nonstandard. 51 func run(stdin io.Reader, stdout io.Writer, decode bool, names ...string) error { 52 switch len(names) { 53 case 0: 54 case 1: 55 f, err := os.Open(names[0]) 56 if err != nil { 57 return err 58 } 59 stdin = f 60 default: 61 return errBadUsage 62 } 63 64 return do(stdin, stdout, decode) 65 } 66 67 func main() { 68 flag.Parse() 69 if err := run(os.Stdin, os.Stdout, *decode, flag.Args()...); err != nil { 70 log.Fatalf("base64: %v", err) 71 } 72 }