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:
parent
75be23b550
commit
58848cbe56
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user