@@ -20,12 +20,70 @@ import (
2020 "fmt"
2121 "io/ioutil"
2222 "os"
23+ "strings"
2324)
2425
26+ // pairs conforms to flag.Value. Each time Set() is called, it collects another
27+ // k=v pair into itself.
28+ type pairs map [string ]string
29+
30+ func (p pairs ) String () string {
31+ return ""
32+ }
33+
34+ func (p pairs ) Set (pair string ) error {
35+ if pair == "" || p == nil {
36+ return nil
37+ }
38+
39+ split := strings .SplitN (pair , "=" , 2 )
40+ if len (split ) != 2 {
41+ return fmt .Errorf ("missing \" =\" : %q" , pair )
42+ }
43+
44+ p [split [0 ]] = split [1 ]
45+ return nil
46+ }
47+
48+ var defines = make (map [string ]string )
49+ var fileDefines = make (map [string ]string )
50+
51+ func init () {
52+ flag .Var (pairs (defines ), "d" ,
53+ `pair of the form a=b; define("a", "b") is inserted at the start of the input` +
54+ "\n may occur multiple times" )
55+ flag .Var (pairs (fileDefines ), "df" ,
56+ `like -d, except the second value is interpreted as a binary file to read` +
57+ "\n may occur multiple times" )
58+ }
59+
2560var inPath = flag .String ("i" , "" , "input file to use (defaults to stdin)" )
2661var outPath = flag .String ("o" , "" , "output file to use (defaults to stdout)" )
2762var pemType = flag .String ("pem" , "" , "if provided, format the output as a PEM block with this type" )
2863
64+ func readAll (path string ) []byte {
65+ var file * os.File
66+ if path == "" {
67+ file = os .Stdin
68+ } else {
69+ var err error
70+ file , err = os .Open (path )
71+ if err != nil {
72+ fmt .Fprintf (os .Stderr , "Error opening %s: %s\n " , path , err )
73+ os .Exit (1 )
74+ }
75+ defer file .Close ()
76+ }
77+
78+ buf , err := ioutil .ReadAll (file )
79+ if err != nil {
80+ fmt .Fprintf (os .Stderr , "Error reading %s: %s\n " , path , err )
81+ os .Exit (1 )
82+ }
83+
84+ return buf
85+ }
86+
2987func main () {
3088 flag .Parse ()
3189
@@ -35,24 +93,25 @@ func main() {
3593 os .Exit (1 )
3694 }
3795
38- inFile := os . Stdin
39- if * inPath != "" {
40- var err error
41- inFile , err = os . Open ( * inPath )
42- if err != nil {
43- fmt .Fprintf (os .Stderr , "Error opening %s: %s \n " , * inPath , err )
96+ inBytes := readAll ( * inPath )
97+
98+ vars := make ( map [ string ][] byte )
99+ for k , v := range defines {
100+ if _ , ok := vars [ k ]; ok {
101+ fmt .Fprintf (os .Stderr , "Error: tried to define %q with flags twice \n " , k )
44102 os .Exit (1 )
45103 }
46- defer inFile . Close ( )
104+ vars [ k ] = [] byte ( v )
47105 }
48-
49- inBytes , err := ioutil .ReadAll (inFile )
50- if err != nil {
51- fmt .Fprintf (os .Stderr , "Error reading input: %s\n " , err )
52- os .Exit (1 )
106+ for k , v := range fileDefines {
107+ if _ , ok := vars [k ]; ok {
108+ fmt .Fprintf (os .Stderr , "Error: tried to define %q with flags twice\n " , k )
109+ os .Exit (1 )
110+ }
111+ vars [k ] = readAll (v )
53112 }
54113
55- outBytes , err := asciiToDER (string (inBytes ))
114+ outBytes , err := asciiToDER (string (inBytes ), vars )
56115 if err != nil {
57116 fmt .Fprintf (os .Stderr , "Syntax error: %s\n " , err )
58117 os .Exit (1 )
0 commit comments