Skip to content

Commit 74e5139

Browse files
committed
cdba: extract message-sending helper
Instad of hand-coding message sending, create a single wrapper that sends messages to the server. Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent 363bac3 commit 74e5139

File tree

1 file changed

+58
-78
lines changed

1 file changed

+58
-78
lines changed

cdba.c

Lines changed: 58 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
147167
static 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

227227
static 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 {
257253
static 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 {
293284
static 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

323309
static 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

333318
static 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 {
365349
static 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

Comments
 (0)