|
|
|
@ -248,16 +248,11 @@ static bool tls_fwd_config(sink_t *sink, const format_t *requested_format, forma |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void tls_fwd_init(stream_t *stream, metafile_t *mf, ssrc_t *ssrc) { |
|
|
|
if ((!stream->forwarding_on && !mf->forwarding_on) || !tls_send_to_ep.port) { |
|
|
|
tls_fwd_shutdown(&ssrc->tls_fwd); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (ssrc->tls_fwd) |
|
|
|
return; |
|
|
|
bool tls_fwd_new(tls_fwd_t **tlsp) { |
|
|
|
if (*tlsp) |
|
|
|
return true; |
|
|
|
|
|
|
|
tls_fwd_t *tls_fwd = ssrc->tls_fwd = g_new0(tls_fwd_t, 1); |
|
|
|
tls_fwd_t *tls_fwd = *tlsp = g_new0(tls_fwd_t, 1); |
|
|
|
|
|
|
|
// initialise the connection |
|
|
|
ZERO(tls_fwd->poller); |
|
|
|
@ -270,14 +265,14 @@ void tls_fwd_init(stream_t *stream, metafile_t *mf, ssrc_t *ssrc) { |
|
|
|
#endif |
|
|
|
if (!tls_fwd->ssl_ctx) { |
|
|
|
ilog(LOG_ERR, "Failed to create TLS context"); |
|
|
|
tls_fwd_shutdown(&ssrc->tls_fwd); |
|
|
|
return; |
|
|
|
tls_fwd_shutdown(tlsp); |
|
|
|
return false; |
|
|
|
} |
|
|
|
tls_fwd->ssl = SSL_new(tls_fwd->ssl_ctx); |
|
|
|
if (!tls_fwd->ssl) { |
|
|
|
ilog(LOG_ERR, "Failed to create TLS connection"); |
|
|
|
tls_fwd_shutdown(&ssrc->tls_fwd); |
|
|
|
return; |
|
|
|
tls_fwd_shutdown(tlsp); |
|
|
|
return false; |
|
|
|
} |
|
|
|
} else { |
|
|
|
dbg("Starting TCP connection to %s", endpoint_print_buf(&tls_send_to_ep)); |
|
|
|
@ -287,28 +282,25 @@ void tls_fwd_init(stream_t *stream, metafile_t *mf, ssrc_t *ssrc) { |
|
|
|
ilog(LOG_ERR, "Failed to open/connect TLS/TCP socket to %s: %s", |
|
|
|
endpoint_print_buf(&tls_send_to_ep), |
|
|
|
strerror(errno)); |
|
|
|
tls_fwd_shutdown(&ssrc->tls_fwd); |
|
|
|
return; |
|
|
|
tls_fwd_shutdown(tlsp); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
tls_fwd->poller.state = PS_CONNECTING; |
|
|
|
if (!tls_disable) { |
|
|
|
if (SSL_set_fd(tls_fwd->ssl, tls_fwd->sock.fd) != 1) { |
|
|
|
ilog(LOG_ERR, "Failed to set TLS fd"); |
|
|
|
tls_fwd_shutdown(&ssrc->tls_fwd); |
|
|
|
return; |
|
|
|
tls_fwd_shutdown(tlsp); |
|
|
|
return false; |
|
|
|
} |
|
|
|
tls_fwd->stream = streambuf_new_ptr(&tls_fwd->poller, tls_fwd->ssl, &ssrc_tls_funcs); |
|
|
|
} else { |
|
|
|
tls_fwd->stream = streambuf_new(&tls_fwd->poller, tls_fwd->sock.fd); |
|
|
|
} |
|
|
|
|
|
|
|
tls_fwd->ssrc = ssrc; |
|
|
|
tls_fwd->metafile = mf; |
|
|
|
|
|
|
|
tls_fwd_state(&ssrc->tls_fwd); |
|
|
|
if (!ssrc->tls_fwd) // may have been closed |
|
|
|
return; |
|
|
|
tls_fwd_state(tlsp); |
|
|
|
if (!*tlsp) // may have been closed |
|
|
|
return false; |
|
|
|
|
|
|
|
tls_fwd->format = (format_t) { |
|
|
|
.clockrate = tls_resample, |
|
|
|
@ -317,7 +309,23 @@ void tls_fwd_init(stream_t *stream, metafile_t *mf, ssrc_t *ssrc) { |
|
|
|
}; |
|
|
|
|
|
|
|
sink_init(&tls_fwd->sink); |
|
|
|
tls_fwd->sink.tls_fwd = &ssrc->tls_fwd; |
|
|
|
tls_fwd->sink.tls_fwd = tlsp; |
|
|
|
tls_fwd->sink.add = tls_fwd_add; |
|
|
|
tls_fwd->sink.config = tls_fwd_config; |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void tls_fwd_init(stream_t *stream, metafile_t *mf, ssrc_t *ssrc) { |
|
|
|
if ((!stream->forwarding_on && !mf->forwarding_on) || !tls_send_to_ep.port) { |
|
|
|
tls_fwd_shutdown(&ssrc->tls_fwd); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (!tls_fwd_new(&ssrc->tls_fwd)) |
|
|
|
return; |
|
|
|
|
|
|
|
ssrc->tls_fwd->ssrc = ssrc; |
|
|
|
ssrc->tls_fwd->metafile = mf; |
|
|
|
} |