void ssh_packet_wrapper_send_encode_va(SshPacketWrapper down, SshPacketType type, va_list va) { /* Format the packet in a separate buffer. */ ssh_buffer_clear(&down->outgoing_packet); ssh_packet_encode_va(&down->outgoing_packet, type, va); /* Check that we don't overflow maximum buffer size. Drop the packet if we would. */ if (ssh_buffer_len(&down->outgoing) + ssh_buffer_len(&down->outgoing_packet) >= BUFFER_MAX_SIZE) { ssh_debug("ssh_packet_wrapper_send_encode_va: flow control problems; " "outgoing packet dropped."); return; } /* Append the packet to the outgoing buffer. */ ssh_buffer_append(&down->outgoing, ssh_buffer_ptr(&down->outgoing_packet), ssh_buffer_len(&down->outgoing_packet)); /* Reset the callback to ensure that our callback gets called. */ ssh_stream_set_callback(down->stream, ssh_packet_wrapper_callback, (void *)down); }
size_t ssh_packet_encode(SshBuffer *buffer, SshPacketType type, ...) { va_list ap; va_start(ap, type); return ssh_packet_encode_va(buffer, type, ap); }
void ssh_packet_impl_send_encode_va(SshStream up_stream, SshPacketType type, va_list va) { SshPacketImpl up; /* Verify that it is a SshPacketImpl stream. */ if (ssh_stream_get_methods(up_stream) != &ssh_packet_impl_methods) ssh_fatal("ssh_packet_impl_can_receive: not a SshPacketImpl stream"); /* Get the internal context. */ up = (SshPacketImpl)ssh_stream_get_context(up_stream); /* Format the packet in a separate buffer. */ ssh_buffer_clear(&up->outgoing_packet); ssh_packet_encode_va(&up->outgoing_packet, type, va); /* Check that we don't overflow maximum buffer size. Drop the packet if we would. */ if (ssh_buffer_len(&up->outgoing) + ssh_buffer_len(&up->outgoing_packet) >= BUFFER_MAX_SIZE) { ssh_debug("ssh_packet_impl_send_encode_va: " "flow control problems; outgoing packet dropped."); return; } /* Append the packet to the outgoing buffer. */ if (ssh_buffer_append(&up->outgoing, ssh_buffer_ptr(&up->outgoing_packet), ssh_buffer_len(&up->outgoing_packet)) != SSH_BUFFER_OK) { return; } /* Restart reads by upper level. */ ssh_packet_impl_restart_input(up); /* Sanity check that we didn't exceed max buffer size. */ if (ssh_buffer_len(&up->outgoing) > BUFFER_MAX_SIZE) ssh_debug("ssh_packet_impl_send: buffer max size exceeded: size %ld", (long)ssh_buffer_len(&up->outgoing)); }