Skip to content

Commit c403782

Browse files
authored
Merge pull request #32 from lumag/buf
Extract message sending helpers
2 parents 363bac3 + 771910e commit c403782

File tree

7 files changed

+81
-131
lines changed

7 files changed

+81
-131
lines changed

cdb_assist.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,6 @@ unsigned int cdb_vref(struct cdb_assist *cdb)
344344
void cdb_assist_print_status(struct device *dev)
345345
{
346346
struct cdb_assist *cdb = dev->cdb;
347-
struct msg hdr;
348347
char buf[128];
349348
int n;
350349

@@ -358,10 +357,7 @@ void cdb_assist_print_status(struct device *dev)
358357
cdb->btn[2] ? " btn3" : "",
359358
cdb->vref);
360359

361-
hdr.type = MSG_STATUS_UPDATE;
362-
hdr.len = n;
363-
write(STDOUT_FILENO, &hdr, sizeof(hdr));
364-
write(STDOUT_FILENO, buf, n);
360+
cdba_send_buf(MSG_STATUS_UPDATE, n, buf);
365361
}
366362

367363
void cdb_set_voltage(struct cdb_assist *cdb, unsigned mV)

cdba-server.c

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,10 @@ int tty_open(const char *tty, struct termios *old)
8282
static void fastboot_opened(struct fastboot *fb, void *data)
8383
{
8484
const uint8_t one = 1;
85-
struct msg *msg;
8685

8786
warnx("fastboot connection opened");
8887

89-
msg = alloca(sizeof(*msg) + 1);
90-
msg->type = MSG_FASTBOOT_PRESENT;
91-
msg->len = 1;
92-
memcpy(msg->data, &one, 1);
93-
94-
write(STDOUT_FILENO, msg, sizeof(*msg) + 1);
88+
cdba_send_buf(MSG_FASTBOOT_PRESENT, 1, &one);
9589
}
9690

9791
static void fastboot_info(struct fastboot *fb, const void *buf, size_t len)
@@ -102,14 +96,8 @@ static void fastboot_info(struct fastboot *fb, const void *buf, size_t len)
10296
static void fastboot_disconnect(void *data)
10397
{
10498
const uint8_t zero = 0;
105-
struct msg *msg;
10699

107-
msg = alloca(sizeof(*msg) + 1);
108-
msg->type = MSG_FASTBOOT_PRESENT;
109-
msg->len = 1;
110-
memcpy(msg->data, &zero, 1);
111-
112-
write(STDOUT_FILENO, msg, sizeof(*msg) + 1);
100+
cdba_send_buf(MSG_FASTBOOT_PRESENT, 1, &zero);
113101
}
114102

115103
static struct fastboot_ops fastboot_ops = {
@@ -120,23 +108,20 @@ static struct fastboot_ops fastboot_ops = {
120108

121109
static void msg_select_board(const void *param)
122110
{
123-
struct msg reply = { MSG_SELECT_BOARD, 0 };
124-
125111
selected_device = device_open(param, username, &fastboot_ops);
126112
if (!selected_device) {
127113
fprintf(stderr, "failed to open %s\n", (const char *)param);
128114
quit_invoked = true;
129115
}
130116

131-
write(STDOUT_FILENO, &reply, sizeof(reply));
117+
cdba_send(MSG_SELECT_BOARD);
132118
}
133119

134120
static void *fastboot_payload;
135121
static size_t fastboot_size;
136122

137123
static void msg_fastboot_download(const void *data, size_t len)
138124
{
139-
struct msg reply = { MSG_FASTBOOT_DOWNLOAD, };
140125
size_t new_size = fastboot_size + len;
141126
char *newp;
142127

@@ -152,18 +137,23 @@ static void msg_fastboot_download(const void *data, size_t len)
152137
if (!len) {
153138
device_boot(selected_device, fastboot_payload, fastboot_size);
154139

155-
write(STDOUT_FILENO, &reply, sizeof(reply));
140+
cdba_send(MSG_FASTBOOT_DOWNLOAD);
156141
free(fastboot_payload);
157142
fastboot_payload = NULL;
158143
fastboot_size = 0;
159144
}
160145
}
161146

162-
static void invoke_reply(int reply)
147+
void cdba_send_buf(int type, size_t len, const void *buf)
163148
{
164-
struct msg msg = { reply, };
149+
struct msg msg = {
150+
.type = type,
151+
.len = len
152+
};
165153

166154
write(STDOUT_FILENO, &msg, sizeof(msg));
155+
if (len)
156+
write(STDOUT_FILENO, buf, len);
167157
}
168158

169159
static int handle_stdin(int fd, void *buf)
@@ -206,12 +196,12 @@ static int handle_stdin(int fd, void *buf)
206196
case MSG_POWER_ON:
207197
device_power(selected_device, true);
208198

209-
invoke_reply(MSG_POWER_ON);
199+
cdba_send(MSG_POWER_ON);
210200
break;
211201
case MSG_POWER_OFF:
212202
device_power(selected_device, false);
213203

214-
invoke_reply(MSG_POWER_OFF);
204+
cdba_send(MSG_POWER_OFF);
215205
break;
216206
case MSG_FASTBOOT_DOWNLOAD:
217207
msg_fastboot_download(msg->data, msg->len);

cdba-server.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,7 @@ int watch_run(void);
1414

1515
int tty_open(const char *tty, struct termios *old);
1616

17+
void cdba_send_buf(int type, size_t len, const void *buf);
18+
#define cdba_send(type) cdba_send_buf(type, 0, NULL)
19+
1720
#endif

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);

conmux.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ static int registry_lookup(const char *service, struct conmux_lookup *result)
207207

208208
static int conmux_data(int fd, void *data)
209209
{
210-
struct msg hdr;
211210
char buf[128];
212211
ssize_t n;
213212

@@ -219,10 +218,7 @@ static int conmux_data(int fd, void *data)
219218
fprintf(stderr, "Received EOF from conmux\n");
220219
watch_quit();
221220
} else {
222-
hdr.type = MSG_CONSOLE;
223-
hdr.len = n;
224-
write(STDOUT_FILENO, &hdr, sizeof(hdr));
225-
write(STDOUT_FILENO, buf, n);
221+
cdba_send_buf(MSG_CONSOLE, n, buf);
226222
}
227223

228224
return 0;

0 commit comments

Comments
 (0)