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:
parent
aab5e5d2b3
commit
4547264a8d
45
src/event.c
45
src/event.c
@ -12,6 +12,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
@ -402,13 +403,11 @@ void event_emit(event_t *event) {
|
|||||||
thread_mutex_unlock(&event_lock);
|
thread_mutex_unlock(&event_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this function needs to extract all the info from the client, source and mount object
|
void event_emit_va(const char *trigger, const char *uri, ...) {
|
||||||
* as after return the pointers become invalid.
|
|
||||||
*/
|
|
||||||
void event_emit_clientevent(const char *trigger, client_t *client, const char *uri) {
|
|
||||||
event_t *event = event_new(trigger);
|
event_t *event = event_new(trigger);
|
||||||
ice_config_t *config;
|
ice_config_t *config;
|
||||||
mount_proxy *mount;
|
const mount_proxy *mount;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
if (!event) {
|
if (!event) {
|
||||||
ICECAST_LOG_ERROR("Can not create 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
|
#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)
|
if (uri)
|
||||||
extra_add(event, EVENT_EXTRA_KEY_URI, 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_emit(event);
|
||||||
event_release(event);
|
event_release(event);
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,10 @@
|
|||||||
#define MAX_REGLISTS_PER_EVENT 8
|
#define MAX_REGLISTS_PER_EVENT 8
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
/* special keys */
|
||||||
|
EVENT_EXTRA_LIST_END,
|
||||||
|
EVENT_EXTRA_CLIENT,
|
||||||
|
/* real keys */
|
||||||
EVENT_EXTRA_KEY_URI,
|
EVENT_EXTRA_KEY_URI,
|
||||||
EVENT_EXTRA_CONNECTION_IP,
|
EVENT_EXTRA_CONNECTION_IP,
|
||||||
EVENT_EXTRA_CLIENT_ROLE,
|
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);
|
void event_registration_push(event_registration_t **er, event_registration_t *tail);
|
||||||
|
|
||||||
/* event signaling */
|
/* event signaling */
|
||||||
void event_emit_clientevent(const char *trigger, client_t *client, const char *uri);
|
void event_emit_va(const char *trigger, const char *uri, ...);
|
||||||
#define event_emit_global(x) event_emit_clientevent((x), NULL, NULL)
|
#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 */
|
/* reading extra from events */
|
||||||
const char * event_extra_get(const event_t *event, const event_extra_key_t key);
|
const char * event_extra_get(const event_t *event, const event_extra_key_t key);
|
||||||
|
Loading…
Reference in New Issue
Block a user