1 package signals
2
3 import (
4 "errors"
5 "strconv"
6 "strings"
7
8 "github.com/Microsoft/hcsshim/internal/protocol/guestrequest"
9 "github.com/Microsoft/hcsshim/internal/protocol/guestresource"
10 )
11
12 var (
13
14
15 ErrInvalidSignal = errors.New("invalid signal value")
16 )
17
18
19
20
21
22
23
24
25 func ValidateSigstrLCOW(sigstr string, signalsSupported bool) (*guestresource.SignalProcessOptionsLCOW, error) {
26
27 if sigstr == "" {
28 if signalsSupported {
29 return &guestresource.SignalProcessOptionsLCOW{Signal: sigTerm}, nil
30 }
31 return nil, nil
32 }
33
34 signal, err := strconv.Atoi(sigstr)
35 if err == nil {
36 return ValidateLCOW(signal, signalsSupported)
37 }
38
39 sigstr = strings.ToUpper(sigstr)
40 if !signalsSupported {
41
42
43
44 switch sigstr {
45 case "TERM", "KILL":
46 return nil, nil
47 default:
48 return nil, ErrInvalidSignal
49 }
50 }
51
52
53 for k, v := range signalMapLcow {
54 if sigstr == k {
55 return &guestresource.SignalProcessOptionsLCOW{Signal: v}, nil
56 }
57 }
58 return nil, ErrInvalidSignal
59 }
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 func ValidateSigstrWCOW(sigstr string, signalsSupported bool) (*guestresource.SignalProcessOptionsWCOW, error) {
75
76 if sigstr == "" {
77 if signalsSupported {
78 return &guestresource.SignalProcessOptionsWCOW{Signal: guestrequest.SignalValueWCOWCtrlShutdown}, nil
79 }
80 return nil, nil
81 }
82
83 signal, err := strconv.Atoi(sigstr)
84 if err == nil {
85 return ValidateWCOW(signal, signalsSupported)
86 }
87
88 sigstr = strings.ToUpper(sigstr)
89 if !signalsSupported {
90
91
92
93 switch sigstr {
94
95 case "CTRLSHUTDOWN", "TERM", "KILL":
96 return nil, nil
97 default:
98 return nil, ErrInvalidSignal
99 }
100 } else {
101
102
103
104 var signalString guestrequest.SignalValueWCOW
105 switch sigstr {
106 case "CTRLC":
107 signalString = guestrequest.SignalValueWCOWCtrlC
108 case "CTRLBREAK":
109 signalString = guestrequest.SignalValueWCOWCtrlBreak
110 case "CTRLCLOSE":
111 signalString = guestrequest.SignalValueWCOWCtrlClose
112 case "CTRLLOGOFF":
113 signalString = guestrequest.SignalValueWCOWCtrlLogOff
114 case "CTRLSHUTDOWN", "TERM":
115
116 signalString = guestrequest.SignalValueWCOWCtrlShutdown
117 case "KILL":
118 return nil, nil
119 default:
120 return nil, ErrInvalidSignal
121 }
122
123 return &guestresource.SignalProcessOptionsWCOW{Signal: signalString}, nil
124 }
125 }
126
127
128
129
130
131
132 func ValidateLCOW(signal int, signalsSupported bool) (*guestresource.SignalProcessOptionsLCOW, error) {
133 if !signalsSupported {
134
135
136
137 switch signal {
138 case ctrlShutdown, sigTerm, sigKill:
139 return nil, nil
140 default:
141 return nil, ErrInvalidSignal
142 }
143 }
144
145
146 for _, v := range signalMapLcow {
147 if signal == v {
148 return &guestresource.SignalProcessOptionsLCOW{Signal: signal}, nil
149 }
150 }
151 return nil, ErrInvalidSignal
152 }
153
154
155
156
157
158
159
160
161
162
163
164
165 func ValidateWCOW(signal int, signalsSupported bool) (*guestresource.SignalProcessOptionsWCOW, error) {
166 if !signalsSupported {
167
168
169
170 switch signal {
171
172 case ctrlShutdown, sigTerm, sigKill:
173 return nil, nil
174 default:
175 return nil, ErrInvalidSignal
176 }
177 } else {
178
179
180
181 var signalString guestrequest.SignalValueWCOW
182 switch signal {
183 case ctrlC:
184 signalString = guestrequest.SignalValueWCOWCtrlC
185 case ctrlBreak:
186 signalString = guestrequest.SignalValueWCOWCtrlBreak
187 case ctrlClose:
188 signalString = guestrequest.SignalValueWCOWCtrlClose
189 case ctrlLogOff:
190 signalString = guestrequest.SignalValueWCOWCtrlLogOff
191 case ctrlShutdown, sigTerm:
192
193 signalString = guestrequest.SignalValueWCOWCtrlShutdown
194 case sigKill:
195 return nil, nil
196 default:
197 return nil, ErrInvalidSignal
198 }
199
200 return &guestresource.SignalProcessOptionsWCOW{Signal: signalString}, nil
201 }
202 }
203
View as plain text