static void init_conn(int fd, struct data *d) { ok1(d->state == 0); d->state++; d->bytes = sizeof(d->buf); io_set_finish(io_new_conn(fd, io_read_partial(d->buf, &d->bytes, io_close_cb, d)), finish_ok, d); }
static struct io_plan *read_json(struct io_conn *conn, struct json_connection *jcon) { jsmntok_t *toks; bool valid; log_io(jcon->log, true, jcon->buffer + jcon->used, jcon->len_read); /* Resize larger if we're full. */ jcon->used += jcon->len_read; if (jcon->used == tal_count(jcon->buffer)) tal_resize(&jcon->buffer, jcon->used * 2); again: toks = json_parse_input(jcon->buffer, jcon->used, &valid); if (!toks) { if (!valid) { log_unusual(jcon->dstate->base_log, "Invalid token in json input: '%.*s'", (int)jcon->used, jcon->buffer); return io_close(conn); } /* We need more. */ goto read_more; } /* Empty buffer? (eg. just whitespace). */ if (tal_count(toks) == 1) { jcon->used = 0; goto read_more; } parse_request(jcon, toks); /* Remove first {}. */ memmove(jcon->buffer, jcon->buffer + toks[0].end, tal_count(jcon->buffer) - toks[0].end); jcon->used -= toks[0].end; tal_free(toks); /* Need to wait for command to finish? */ if (jcon->current) { jcon->len_read = 0; return io_wait(conn, jcon, read_json, jcon); } /* See if we can parse the rest. */ goto again; read_more: tal_free(toks); return io_read_partial(conn, jcon->buffer + jcon->used, tal_count(jcon->buffer) - jcon->used, &jcon->len_read, read_json, jcon); }
static struct io_plan *jcon_connected(struct io_conn *conn, struct lightningd_state *dstate) { struct json_connection *jcon; jcon = tal(dstate, struct json_connection); jcon->dstate = dstate; jcon->used = 0; jcon->buffer = tal_arr(jcon, char, 64); jcon->stop = false; jcon->current = NULL; jcon->log = new_log(jcon, dstate->log_record, "%sjcon fd %i:", log_prefix(dstate->base_log), io_conn_fd(conn)); list_head_init(&jcon->output); io_set_finish(conn, finish_jcon, jcon); return io_duplex(conn, io_read_partial(conn, jcon->buffer, tal_count(jcon->buffer), &jcon->len_read, read_json, jcon), write_json(conn, jcon)); }
static struct io_plan *read_more(struct io_conn *conn, struct data *d) { memset(d->buf, 0, sizeof(d->buf)); return io_read_partial(conn, d->buf, sizeof(d->buf), &d->buflen, read_done, d); }