static void send_error_packet(int to_peer, int err, const char* msg) { size_t msg_size = strlen(msg); if (msg_size > UINT16_MAX) msg_size = UINT16_MAX; struct xfer_msg m = { .type = XFER_MSG_ERROR, .u.error.err = err, .u.error.msg_size = msg_size, }; send_xfer_msg(to_peer, &m); write_all(to_peer, msg, msg_size); } int xfer_stub_main(const struct cmd_xfer_stub_info* info) { struct xfer_ctx ctx = { .from_peer = STDIN_FILENO, .to_peer = STDOUT_FILENO, .info = info, }; struct errinfo ei = { .want_msg = true }; if (catch_error(do_xfer, &ctx, &ei)) { send_error_packet(ctx.to_peer, ei.err, ei.msg); return 1; } return 0; } #if FBADB_MAIN int xfer_handle_command( const struct start_peer_info* spi, const struct cmd_xfer_stub_info* local, const struct cmd_xfer_stub_info* remote) { struct child* peer = start_peer( spi, make_args_cmd_xfer_stub( CMD_ARG_NAME | CMD_ARG_FORWARDED, remote)); struct xfer_ctx ctx = { .from_peer = peer->fd[1]->fd, .to_peer = peer->fd[0]->fd, .info = local, }; do_xfer(&ctx); return child_status_to_exit_code(child_wait(peer)); }
int network_manager_update(struct network_manager* nm) { // If disabled, do nothing if(chaind_config(nm->chaind)->network.participate != 1) { return 0; } check_peer_discovery(nm); // If we have fewer peers connected than we want, try connecting some while(nm->num_peers < nm->num_peer_goal) { if(start_peer(nm) < 0) { // This can happen if we're out of addresses break; } } update_peers(nm); return 0; }