@@ -21,6 +21,7 @@ import (
21
21
"encoding/json"
22
22
"fmt"
23
23
"io"
24
+ "os/exec"
24
25
25
26
properties "github.com/arduino/go-properties-orderedmap"
26
27
@@ -32,6 +33,7 @@ type Discovery struct {
32
33
in io.WriteCloser
33
34
out io.ReadCloser
34
35
outJSON * json.Decoder
36
+ cmd * exec.Cmd
35
37
}
36
38
37
39
// BoardPort is a generic port descriptor
@@ -56,21 +58,27 @@ func NewFromCommandLine(args ...string) (*Discovery, error) {
56
58
return nil , fmt .Errorf ("creating discovery process: %s" , err )
57
59
}
58
60
disc := & Discovery {}
59
- if in , err := cmd .StdinPipe (); err == nil {
60
- disc .in = in
61
+ disc .cmd = cmd
62
+ return disc , nil
63
+ }
64
+
65
+ // Start starts the specified discovery
66
+ func (d * Discovery ) Start () error {
67
+ if in , err := d .cmd .StdinPipe (); err == nil {
68
+ d .in = in
61
69
} else {
62
- return nil , fmt .Errorf ("creating stdin pipe for discovery: %s" , err )
70
+ return fmt .Errorf ("creating stdin pipe for discovery: %s" , err )
63
71
}
64
- if out , err := cmd .StdoutPipe (); err == nil {
65
- disc .out = out
66
- disc .outJSON = json .NewDecoder (disc .out )
72
+ if out , err := d . cmd .StdoutPipe (); err == nil {
73
+ d .out = out
74
+ d .outJSON = json .NewDecoder (d .out )
67
75
} else {
68
- return nil , fmt .Errorf ("creating stdout pipe for discovery: %s" , err )
76
+ return fmt .Errorf ("creating stdout pipe for discovery: %s" , err )
69
77
}
70
- if err := cmd .Start (); err != nil {
71
- return nil , fmt .Errorf ("starting discovery: %s" , err )
78
+ if err := d . cmd .Start (); err != nil {
79
+ return fmt .Errorf ("starting discovery process : %s" , err )
72
80
}
73
- return disc , nil
81
+ return nil
74
82
}
75
83
76
84
// List retrieve the port list from this discovery
@@ -87,11 +95,15 @@ func (d *Discovery) List() ([]*BoardPort, error) {
87
95
88
96
// Close stops the Discovery and free the resources
89
97
func (d * Discovery ) Close () error {
98
+ // TODO: Send QUIT for safe close or terminate process after a small timeout
90
99
if err := d .in .Close (); err != nil {
91
100
return fmt .Errorf ("closing stdin pipe: %s" , err )
92
101
}
93
102
if err := d .out .Close (); err != nil {
94
103
return fmt .Errorf ("closing stdout pipe: %s" , err )
95
104
}
105
+ if d .cmd != nil {
106
+ d .cmd .Process .Kill ()
107
+ }
96
108
return nil
97
109
}
0 commit comments