1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2025-02-02 15:07:36 -05:00

Feature: Allow adding any keys to events using the new function event_emit_va()

This commit is contained in:
Philipp Schafft 2022-09-16 13:28:18 +00:00
parent aab5e5d2b3
commit 4547264a8d
2 changed files with 37 additions and 17 deletions

View File

@ -12,6 +12,7 @@
#endif
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdbool.h>
@ -402,13 +403,11 @@ void event_emit(event_t *event) {
thread_mutex_unlock(&event_lock);
}
/* this function needs to extract all the info from the client, source and mount object
* as after return the pointers become invalid.
*/
void event_emit_clientevent(const char *trigger, client_t *client, const char *uri) {
void event_emit_va(const char *trigger, const char *uri, ...) {
event_t *event = event_new(trigger);
ice_config_t *config;
mount_proxy *mount;
const mount_proxy *mount;
va_list ap;
if (!event) {
ICECAST_LOG_ERROR("Can not create event.");
@ -442,19 +441,35 @@ void event_emit_clientevent(const char *trigger, client_t *client, const char *u
}
#endif
if (client) {
event->connection_id = client->con->id;
event->connection_time = client->con->con_time;
event->client_admin_command = client->admin_command;
extra_add(event, EVENT_EXTRA_CONNECTION_IP, client->con->ip);
extra_add(event, EVENT_EXTRA_CLIENT_ROLE, client->role);
extra_add(event, EVENT_EXTRA_CLIENT_USERNAME, client->username);
extra_add(event, EVENT_EXTRA_CLIENT_USERAGENT, httpp_getvar(client->parser, "user-agent"));
}
if (uri)
extra_add(event, EVENT_EXTRA_KEY_URI, uri);
va_start(ap, uri);
while (true) {
event_extra_key_t key = va_arg(ap, event_extra_key_t);
if (key == EVENT_EXTRA_LIST_END) {
break;
} else if (key == EVENT_EXTRA_CLIENT) {
client_t *client = va_arg(ap, client_t *);
if (client) {
event->connection_id = client->con->id;
event->connection_time = client->con->con_time;
event->client_admin_command = client->admin_command;
extra_add(event, EVENT_EXTRA_CONNECTION_IP, client->con->ip);
extra_add(event, EVENT_EXTRA_CLIENT_ROLE, client->role);
extra_add(event, EVENT_EXTRA_CLIENT_USERNAME, client->username);
extra_add(event, EVENT_EXTRA_CLIENT_USERAGENT, httpp_getvar(client->parser, "user-agent"));
}
} else {
const char *value = va_arg(ap, const char *);
extra_add(event, key, value);
}
}
va_end(ap);
event_emit(event);
event_release(event);
}

View File

@ -26,6 +26,10 @@
#define MAX_REGLISTS_PER_EVENT 8
typedef enum {
/* special keys */
EVENT_EXTRA_LIST_END,
EVENT_EXTRA_CLIENT,
/* real keys */
EVENT_EXTRA_KEY_URI,
EVENT_EXTRA_CONNECTION_IP,
EVENT_EXTRA_CLIENT_ROLE,
@ -109,8 +113,9 @@ void event_registration_release(event_registration_t *er);
void event_registration_push(event_registration_t **er, event_registration_t *tail);
/* event signaling */
void event_emit_clientevent(const char *trigger, client_t *client, const char *uri);
#define event_emit_global(x) event_emit_clientevent((x), NULL, NULL)
void event_emit_va(const char *trigger, const char *uri, ...);
#define event_emit_clientevent(event,client,uri) event_emit_va((event), (uri), EVENT_EXTRA_CLIENT, (client), EVENT_EXTRA_LIST_END)
#define event_emit_global(event) event_emit_va((event), EVENT_EXTRA_LIST_END)
/* reading extra from events */
const char * event_extra_get(const event_t *event, const event_extra_key_t key);