Commit 57526067 authored by Max Kellermann's avatar Max Kellermann

output/raop: move code to raop_session_new()

.. and fix a few memory leaks.
parent 0545bab3
...@@ -51,50 +51,86 @@ raop_output_quark(void) ...@@ -51,50 +51,86 @@ raop_output_quark(void)
return g_quark_from_static_string("raop_output"); return g_quark_from_static_string("raop_output");
} }
static struct raop_data * static void
new_raop_data(GError **error_r) raop_session_free(struct raop_session_data *session)
{ {
struct raop_data *ret = g_new(struct raop_data, 1); assert(session != NULL);
int i; assert(session->raop_list == NULL);
ret->control_mutex = g_mutex_new(); ntp_server_close(&session->ntp);
ret->next = NULL; if (session->data_mutex != NULL)
ret->is_master = 0; g_mutex_free(session->data_mutex);
ret->started = 0;
ret->paused = 0;
if (raop_session == NULL) { if (session->list_mutex != NULL)
raop_session = g_new(struct raop_session_data, 1); g_mutex_free(session->list_mutex);
raop_session->raop_list = NULL;
ntp_server_init(&raop_session->ntp); if (raop_session->data_fd >= 0)
raop_session->ctrl.port = 6001; close(raop_session->data_fd);
raop_session->ctrl.fd = -1;
raop_session->play_state.playing = false;
raop_session->play_state.seq_num = (short) g_random_int();
raop_session->play_state.rtptime = g_random_int();
raop_session->play_state.sync_src = g_random_int();
raop_session->play_state.last_send.tv_sec = 0;
raop_session->play_state.last_send.tv_usec = 0;
if (!RAND_bytes(raop_session->encrypt.iv, sizeof(raop_session->encrypt.iv)) || !RAND_bytes(raop_session->encrypt.key, sizeof(raop_session->encrypt.key))) { if (raop_session->ctrl.fd >= 0)
close(raop_session->ctrl.fd);
g_free(session);
}
static struct raop_session_data *
raop_session_new(GError **error_r)
{
struct raop_session_data *session = g_new(struct raop_session_data, 1);
session->raop_list = NULL;
session->data_mutex = g_mutex_new();
session->list_mutex = g_mutex_new();
ntp_server_init(&session->ntp);
session->ctrl.port = 6001;
session->ctrl.fd = -1;
session->play_state.playing = false;
session->play_state.seq_num = (short) g_random_int();
session->play_state.rtptime = g_random_int();
session->play_state.sync_src = g_random_int();
session->play_state.last_send.tv_sec = 0;
session->play_state.last_send.tv_usec = 0;
session->data_fd = -1;
if (!RAND_bytes(session->encrypt.iv, sizeof(session->encrypt.iv)) ||
!RAND_bytes(session->encrypt.key, sizeof(session->encrypt.key))) {
raop_session_free(session);
g_set_error(error_r, raop_output_quark(), 0, g_set_error(error_r, raop_output_quark(), 0,
"RAND_bytes error code=%ld", ERR_get_error()); "RAND_bytes error code=%ld", ERR_get_error());
return NULL; return NULL;
} }
memcpy(raop_session->encrypt.nv, raop_session->encrypt.iv, sizeof(raop_session->encrypt.nv)); memcpy(session->encrypt.nv, session->encrypt.iv, sizeof(session->encrypt.nv));
for (i = 0; i < 16; i++) { for (unsigned i = 0; i < 16; i++) {
printf("0x%x ", raop_session->encrypt.key[i]); printf("0x%x ", session->encrypt.key[i]);
} }
printf("\n"); printf("\n");
AES_set_encrypt_key(raop_session->encrypt.key, 128, &raop_session->encrypt.ctx); AES_set_encrypt_key(session->encrypt.key, 128, &session->encrypt.ctx);
raop_session->data_fd = -1; memset(session->buffer, 0, RAOP_BUFFER_SIZE);
memset(raop_session->buffer, 0, RAOP_BUFFER_SIZE); session->bufferSize = 0;
raop_session->bufferSize = 0;
return session;
}
raop_session->data_mutex = g_mutex_new(); static struct raop_data *
raop_session->list_mutex = g_mutex_new(); new_raop_data(GError **error_r)
{
struct raop_data *ret = g_new(struct raop_data, 1);
ret->control_mutex = g_mutex_new();
ret->next = NULL;
ret->is_master = 0;
ret->started = 0;
ret->paused = 0;
if (raop_session == NULL &&
(raop_session = raop_session_new(error_r)) == NULL) {
g_mutex_free(ret->control_mutex);
g_free(ret);
return NULL;
} }
return ret; return ret;
...@@ -749,15 +785,8 @@ raop_output_remove(struct raop_data *rd) ...@@ -749,15 +785,8 @@ raop_output_remove(struct raop_data *rd)
prev->next = rd->next; prev->next = rd->next;
} else { } else {
raop_session->raop_list = rd->next; raop_session->raop_list = rd->next;
if (raop_session->raop_list == NULL) {
// TODO clean up everything else
raop_session->play_state.playing = false;
close(raop_session->data_fd);
ntp_server_close(&raop_session->ntp);
close(raop_session->ctrl.fd);
}
} }
if (rd->is_master && raop_session->raop_list) { if (rd->is_master && raop_session->raop_list != NULL) {
raop_session->raop_list->is_master = true; raop_session->raop_list->is_master = true;
} }
rd->next = NULL; rd->next = NULL;
...@@ -768,6 +797,11 @@ raop_output_remove(struct raop_data *rd) ...@@ -768,6 +797,11 @@ raop_output_remove(struct raop_data *rd)
iter = iter->next; iter = iter->next;
} }
g_mutex_unlock(raop_session->list_mutex); g_mutex_unlock(raop_session->list_mutex);
if (raop_session->raop_list == NULL) {
raop_session_free(raop_session);
raop_session = NULL;
}
} }
static void static void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment