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

Feature: Allow listen sockets to be of type "virtual"

This commit is contained in:
Philipp Schafft 2018-05-18 13:49:15 +00:00
parent 75be23b550
commit 58848cbe56
4 changed files with 34 additions and 7 deletions

View File

@ -178,6 +178,8 @@ static listener_type_t config_str_to_listener_type(const char *str)
return LISTENER_TYPE_NORMAL;
} else if (strcasecmp(str, "normal") == 0) {
return LISTENER_TYPE_NORMAL;
} else if (strcasecmp(str, "virtual") == 0) {
return LISTENER_TYPE_VIRTUAL;
} else {
ICECAST_LOG_ERROR("Unknown listener type \"%s\", falling back to NORMAL.", str);
return LISTENER_TYPE_NORMAL;

View File

@ -148,7 +148,9 @@ typedef struct _resource {
} resource_t;
typedef enum _listener_type_tag {
LISTENER_TYPE_NORMAL
LISTENER_TYPE_ERROR,
LISTENER_TYPE_NORMAL,
LISTENER_TYPE_VIRTUAL
} listener_type_t;
typedef struct _listener_t {

View File

@ -290,13 +290,19 @@ int listensocket_container_setup(listensocket_container_
}
static int listensocket_container_setup__unlocked(listensocket_container_t *self)
{
listener_type_t type;
size_t i;
int ret = 0;
for (i = 0; i < self->sock_len; i++) {
if (self->sockref[i]) {
listensocket_apply_config(self->sock[i]);
} else {
listensocket_apply_config(self->sock[i]);
type = listensocket_get_type(self->sock[i]);
if (self->sockref[i] && type == LISTENER_TYPE_VIRTUAL) {
if (listensocket_unrefsock(self->sock[i]) == 0) {
self->sockref[i] = 0;
}
} else if (!self->sockref[i] && type != LISTENER_TYPE_VIRTUAL) {
if (listensocket_refsock(self->sock[i]) == 0) {
self->sockref[i] = 1;
} else {
@ -540,10 +546,12 @@ static int listensocket_apply_config__unlocked(listensocket_t *self
listener = self->listener;
}
if (listener->so_sndbuf)
sock_set_send_buffer(self->sock, listener->so_sndbuf);
if (self->sock != SOCK_ERROR) {
if (listener->so_sndbuf)
sock_set_send_buffer(self->sock, listener->so_sndbuf);
sock_set_blocking(self->sock, 0);
sock_set_blocking(self->sock, 0);
}
if (self->listener_update) {
while ((self->listener = config_clear_listener(self->listener)));
@ -706,6 +714,20 @@ int listensocket_release_listener(listensocket_t *self)
return 0;
}
listener_type_t listensocket_get_type(listensocket_t *self)
{
listener_type_t ret;
if (!self)
return LISTENER_TYPE_ERROR;
thread_mutex_lock(&self->lock);
ret = self->listener->type;
thread_mutex_unlock(&self->lock);
return ret;
}
#ifdef HAVE_POLL
static inline int listensocket__poll_fill(listensocket_t *self, struct pollfd *p)
{

View File

@ -25,5 +25,6 @@ int listensocket_unrefsock(listensocket_t *self);
connection_t * listensocket_accept(listensocket_t *self);
const listener_t * listensocket_get_listener(listensocket_t *self);
int listensocket_release_listener(listensocket_t *self);
listener_type_t listensocket_get_type(listensocket_t *self);
#endif