/** * Internally used gnutls callback function for sending encrypted data. */ static ssize_t internal_ssl_write(gnutls_transport_ptr_t transport, char *buffer, size_t length) { uint32_t bytes = 0; idevice_connection_t connection = (idevice_connection_t)transport; debug_info("pre-send length = %zi", length); internal_connection_send(connection, buffer, length, &bytes); debug_info("post-send sent %i bytes", bytes); return bytes; }
/** * Internally used gnutls callback function for sending encrypted data. */ static ssize_t internal_ssl_write(gnutls_transport_ptr_t transport, char *buffer, size_t length) { uint32_t bytes = 0; idevice_error_t res; idevice_connection_t connection = (idevice_connection_t)transport; debug_info("pre-send length = %zi", length); if ((res = internal_connection_send(connection, buffer, length, &bytes)) != IDEVICE_E_SUCCESS) { debug_info("ERROR: internal_connection_send returned %d", res); return -1; } debug_info("post-send sent %i bytes", bytes); return bytes; }
/** * Send data to a device via the given connection. * * @param connection The connection to send data over. * @param data Buffer with data to send. * @param len Size of the buffer to send. * @param sent_bytes Pointer to an uint32_t that will be filled * with the number of bytes actually sent. * * @return IDEVICE_E_SUCCESS if ok, otherwise an error code. */ idevice_error_t idevice_connection_send(idevice_connection_t connection, const char *data, uint32_t len, uint32_t *sent_bytes) { if (!connection || !data || (connection->ssl_data && !connection->ssl_data->session)) { return IDEVICE_E_INVALID_ARG; } if (connection->ssl_data) { ssize_t sent = gnutls_record_send(connection->ssl_data->session, (void*)data, (size_t)len); if ((uint32_t)sent == (uint32_t)len) { *sent_bytes = sent; return IDEVICE_E_SUCCESS; } *sent_bytes = 0; return IDEVICE_E_SSL_ERROR; } return internal_connection_send(connection, data, len, sent_bytes); }
idevice_error_t idevice_connection_send(idevice_connection_t connection, const char *data, uint32_t len, uint32_t *sent_bytes) { if (!connection || !data || (connection->ssl_data && !connection->ssl_data->session)) { return IDEVICE_E_INVALID_ARG; } if (connection->ssl_data) { #ifdef HAVE_OPENSSL int sent = SSL_write(connection->ssl_data->session, (const void*)data, (int)len); debug_info("SSL_write %d, sent %d,content:%s", len, sent,data); #else ssize_t sent = gnutls_record_send(connection->ssl_data->session, (void*)data, (size_t)len); #endif if ((uint32_t)sent == (uint32_t)len) { *sent_bytes = sent; return IDEVICE_E_SUCCESS; } *sent_bytes = 0; return IDEVICE_E_SSL_ERROR; } return internal_connection_send(connection, data, len, sent_bytes); }