@@ -20,12 +20,70 @@ import (
20
20
"fmt"
21
21
"io/ioutil"
22
22
"os"
23
+ "strings"
23
24
)
24
25
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
+
25
60
var inPath = flag .String ("i" , "" , "input file to use (defaults to stdin)" )
26
61
var outPath = flag .String ("o" , "" , "output file to use (defaults to stdout)" )
27
62
var pemType = flag .String ("pem" , "" , "if provided, format the output as a PEM block with this type" )
28
63
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
+
29
87
func main () {
30
88
flag .Parse ()
31
89
@@ -35,24 +93,25 @@ func main() {
35
93
os .Exit (1 )
36
94
}
37
95
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 )
44
102
os .Exit (1 )
45
103
}
46
- defer inFile . Close ( )
104
+ vars [ k ] = [] byte ( v )
47
105
}
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 )
53
112
}
54
113
55
- outBytes , err := asciiToDER (string (inBytes ))
114
+ outBytes , err := asciiToDER (string (inBytes ), vars )
56
115
if err != nil {
57
116
fmt .Fprintf (os .Stderr , "Syntax error: %s\n " , err )
58
117
os .Exit (1 )
0 commit comments