@@ -144,10 +144,30 @@ static int fork_ssh(const char *host, const char *cmd, int *pipes)
144144 return 0 ;
145145}
146146
147+ #define cdba_send (fd , type ) cdba_send_buf(fd, type, 0, NULL)
148+ static int cdba_send_buf (int fd , int type , size_t len , const void * buf )
149+ {
150+ int ret ;
151+
152+ struct msg msg = {
153+ .type = type ,
154+ .len = len
155+ };
156+
157+ ret = write (fd , & msg , sizeof (msg ));
158+ if (ret < 0 )
159+ return ret ;
160+
161+ if (len )
162+ ret = write (fd , buf , len );
163+
164+ return ret < 0 ? ret : 0 ;
165+ }
166+
147167static int tty_callback (int * ssh_fds )
148168{
169+ static const char ctrl_a = 0x1 ;
149170 static bool special ;
150- struct msg hdr ;
151171 char buf [32 ];
152172 ssize_t k ;
153173 ssize_t n ;
@@ -157,59 +177,39 @@ static int tty_callback(int *ssh_fds)
157177 return n ;
158178
159179 for (k = 0 ; k < n ; k ++ ) {
160- if (buf [k ] == 0x1 ) {
180+ if (buf [k ] == ctrl_a ) {
161181 special = true;
162182 } else if (special ) {
163183 switch (buf [k ]) {
164184 case 'q' :
165185 quit = true;
166186 break ;
167187 case 'P' :
168- hdr .type = MSG_POWER_ON ;
169- hdr .len = 0 ;
170- write (ssh_fds [0 ], & hdr , sizeof (hdr ));
188+ cdba_send (ssh_fds [0 ], MSG_POWER_ON );
171189 break ;
172190 case 'p' :
173- hdr .type = MSG_POWER_OFF ;
174- hdr .len = 0 ;
175- write (ssh_fds [0 ], & hdr , sizeof (hdr ));
191+ cdba_send (ssh_fds [0 ], MSG_POWER_OFF );
176192 break ;
177193 case 's' :
178- hdr .type = MSG_STATUS_UPDATE ;
179- hdr .len = 0 ;
180- write (ssh_fds [0 ], & hdr , sizeof (hdr ));
194+ cdba_send (ssh_fds [0 ], MSG_STATUS_UPDATE );
181195 break ;
182196 case 'V' :
183- hdr .type = MSG_VBUS_ON ;
184- hdr .len = 0 ;
185- write (ssh_fds [0 ], & hdr , sizeof (hdr ));
197+ cdba_send (ssh_fds [0 ], MSG_VBUS_ON );
186198 break ;
187199 case 'v' :
188- hdr .type = MSG_VBUS_OFF ;
189- hdr .len = 0 ;
190- write (ssh_fds [0 ], & hdr , sizeof (hdr ));
200+ cdba_send (ssh_fds [0 ], MSG_VBUS_OFF );
191201 break ;
192202 case 'a' :
193- hdr .type = MSG_CONSOLE ;
194- hdr .len = 1 ;
195-
196- write (ssh_fds [0 ], & hdr , sizeof (hdr ));
197- write (ssh_fds [0 ], "\001" , 1 );
203+ cdba_send_buf (ssh_fds [0 ], MSG_CONSOLE , 1 , & ctrl_a );
198204 break ;
199205 case 'B' :
200- hdr .type = MSG_SEND_BREAK ;
201- hdr .len = 0 ;
202- write (ssh_fds [0 ], & hdr , sizeof (hdr ));
206+ cdba_send (ssh_fds [0 ], MSG_SEND_BREAK );
203207 break ;
204208 }
205209
206210 special = false;
207211 } else {
208- hdr .type = MSG_CONSOLE ;
209- hdr .len = 1 ;
210-
211- write (ssh_fds [0 ], & hdr , sizeof (hdr ));
212- write (ssh_fds [0 ], buf + k , 1 );
212+ cdba_send_buf (ssh_fds [0 ], MSG_CONSOLE , 1 , buf + k );
213213 }
214214 }
215215
@@ -226,14 +226,10 @@ static struct list_head work_items = LIST_INIT(work_items);
226226
227227static void list_boards_fn (struct work * work , int ssh_stdin )
228228{
229- struct msg msg ;
230- ssize_t n ;
231-
232- msg .type = MSG_LIST_DEVICES ;
233- msg .len = 0 ;
229+ int ret ;
234230
235- n = write (ssh_stdin , & msg , sizeof ( msg ) );
236- if (n < 0 )
231+ ret = cdba_send (ssh_stdin , MSG_LIST_DEVICES );
232+ if (ret < 0 )
237233 err (1 , "failed to send board list request" );
238234
239235 free (work );
@@ -257,17 +253,12 @@ struct board_info_request {
257253static void board_info_fn (struct work * work , int ssh_stdin )
258254{
259255 struct board_info_request * board = container_of (work , struct board_info_request , work );
260- size_t blen = strlen (board -> board ) + 1 ;
261- struct msg * msg ;
262- ssize_t n ;
263-
264- msg = alloca (sizeof (* msg ) + blen );
265- msg -> type = MSG_BOARD_INFO ;
266- msg -> len = blen ;
267- memcpy (msg -> data , board -> board , blen );
256+ int ret ;
268257
269- n = write (ssh_stdin , msg , sizeof (* msg ) + blen );
270- if (n < 0 )
258+ ret = cdba_send_buf (ssh_stdin , MSG_BOARD_INFO ,
259+ strlen (board -> board ) + 1 ,
260+ board -> board );
261+ if (ret < 0 )
271262 err (1 , "failed to send board info request" );
272263
273264 free (work );
@@ -293,17 +284,12 @@ struct select_board {
293284static void select_board_fn (struct work * work , int ssh_stdin )
294285{
295286 struct select_board * board = container_of (work , struct select_board , work );
296- size_t blen = strlen (board -> board ) + 1 ;
297- struct msg * msg ;
298- ssize_t n ;
299-
300- msg = alloca (sizeof (* msg ) + blen );
301- msg -> type = MSG_SELECT_BOARD ;
302- msg -> len = blen ;
303- memcpy (msg -> data , board -> board , blen );
287+ int ret ;
304288
305- n = write (ssh_stdin , msg , sizeof (* msg ) + blen );
306- if (n < 0 )
289+ ret = cdba_send_buf (ssh_stdin , MSG_SELECT_BOARD ,
290+ strlen (board -> board ) + 1 ,
291+ board -> board );
292+ if (ret < 0 )
307293 err (1 , "failed to send power on request" );
308294
309295 free (work );
@@ -322,21 +308,19 @@ static void request_select_board(const char *board)
322308
323309static void request_power_on_fn (struct work * work , int ssh_stdin )
324310{
325- struct msg msg = { MSG_POWER_ON , };
326- ssize_t n ;
311+ int ret ;
327312
328- n = write (ssh_stdin , & msg , sizeof ( msg ) );
329- if (n < 0 )
313+ ret = cdba_send (ssh_stdin , MSG_POWER_ON );
314+ if (ret < 0 )
330315 err (1 , "failed to send power on request" );
331316}
332317
333318static void request_power_off_fn (struct work * work , int ssh_stdin )
334319{
335- struct msg msg = { MSG_POWER_OFF , };
336- ssize_t n ;
320+ int ret ;
337321
338- n = write (ssh_stdin , & msg , sizeof ( msg ) );
339- if (n < 0 )
322+ ret = cdba_send (ssh_stdin , MSG_POWER_OFF );
323+ if (ret < 0 )
340324 err (1 , "failed to send power off request" );
341325}
342326
@@ -365,29 +349,25 @@ struct fastboot_download_work {
365349static void fastboot_work_fn (struct work * _work , int ssh_stdin )
366350{
367351 struct fastboot_download_work * work = container_of (_work , struct fastboot_download_work , work );
368- struct msg * msg ;
369- size_t left ;
370- ssize_t n ;
352+ ssize_t left ;
353+ int ret ;
371354
372355 left = MIN (2048 , work -> size - work -> offset );
373356
374- msg = alloca (sizeof (* msg ) + left );
375- msg -> type = MSG_FASTBOOT_DOWNLOAD ;
376- msg -> len = left ;
377- memcpy (msg -> data , (char * )work -> data + work -> offset , left );
378-
379- n = write (ssh_stdin , msg , sizeof (* msg ) + msg -> len );
380- if (n < 0 && errno == EAGAIN ) {
357+ ret = cdba_send_buf (ssh_stdin , MSG_FASTBOOT_DOWNLOAD ,
358+ left ,
359+ (char * )work -> data + work -> offset );
360+ if (ret < 0 && errno == EAGAIN ) {
381361 list_add (& work_items , & _work -> node );
382362 return ;
383- } else if (n < 0 ) {
363+ } else if (ret < 0 ) {
384364 err (1 , "failed to write fastboot message" );
385365 }
386366
387- work -> offset += msg -> len ;
367+ work -> offset += left ;
388368
389369 /* We've sent the entire image, and a zero length packet */
390- if (!msg -> len )
370+ if (!left )
391371 free (work );
392372 else
393373 list_add (& work_items , & _work -> node );
0 commit comments