a few modernizations

git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/glitch-free@2346 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2008-05-02 01:25:22 +00:00
parent 06b9140e10
commit bfb2691fac
2 changed files with 30 additions and 28 deletions

View file

@ -77,9 +77,9 @@ struct pa_socket_client {
pa_io_event *io_event; pa_io_event *io_event;
pa_time_event *timeout_event; pa_time_event *timeout_event;
pa_defer_event *defer_event; pa_defer_event *defer_event;
void (*callback)(pa_socket_client*c, pa_iochannel *io, void *userdata); pa_socket_client_cb_t callback;
void *userdata; void *userdata;
int local; pa_bool_t local;
#ifdef HAVE_LIBASYNCNS #ifdef HAVE_LIBASYNCNS
asyncns_t *asyncns; asyncns_t *asyncns;
asyncns_query_t * asyncns_query; asyncns_query_t * asyncns_query;
@ -87,7 +87,7 @@ struct pa_socket_client {
#endif #endif
}; };
static pa_socket_client*pa_socket_client_new(pa_mainloop_api *m) { static pa_socket_client* socket_client_new(pa_mainloop_api *m) {
pa_socket_client *c; pa_socket_client *c;
pa_assert(m); pa_assert(m);
@ -96,11 +96,11 @@ static pa_socket_client*pa_socket_client_new(pa_mainloop_api *m) {
c->mainloop = m; c->mainloop = m;
c->fd = -1; c->fd = -1;
c->io_event = NULL; c->io_event = NULL;
c->defer_event = NULL;
c->timeout_event = NULL; c->timeout_event = NULL;
c->defer_event = NULL;
c->callback = NULL; c->callback = NULL;
c->userdata = NULL; c->userdata = NULL;
c->local = 0; c->local = FALSE;
#ifdef HAVE_LIBASYNCNS #ifdef HAVE_LIBASYNCNS
c->asyncns = NULL; c->asyncns = NULL;
@ -119,15 +119,15 @@ static void free_events(pa_socket_client *c) {
c->io_event = NULL; c->io_event = NULL;
} }
if (c->defer_event) {
c->mainloop->defer_free(c->defer_event);
c->defer_event = NULL;
}
if (c->timeout_event) { if (c->timeout_event) {
c->mainloop->time_free(c->timeout_event); c->mainloop->time_free(c->timeout_event);
c->timeout_event = NULL; c->timeout_event = NULL;
} }
if (c->defer_event) {
c->mainloop->defer_free(c->defer_event);
c->defer_event = NULL;
}
} }
static void do_call(pa_socket_client *c) { static void do_call(pa_socket_client *c) {
@ -177,7 +177,7 @@ finish:
pa_socket_client_unref(c); pa_socket_client_unref(c);
} }
static void connect_fixed_cb(pa_mainloop_api *m, pa_defer_event *e, void *userdata) { static void connect_defer_cb(pa_mainloop_api *m, pa_defer_event *e, void *userdata) {
pa_socket_client *c = userdata; pa_socket_client *c = userdata;
pa_assert(m); pa_assert(m);
@ -223,7 +223,7 @@ static int do_connect(pa_socket_client *c, const struct sockaddr *sa, socklen_t
pa_assert_se(c->io_event = c->mainloop->io_new(c->mainloop, c->fd, PA_IO_EVENT_OUTPUT, connect_io_cb, c)); pa_assert_se(c->io_event = c->mainloop->io_new(c->mainloop, c->fd, PA_IO_EVENT_OUTPUT, connect_io_cb, c));
} else } else
pa_assert_se(c->defer_event = c->mainloop->defer_new(c->mainloop, connect_fixed_cb, c)); pa_assert_se(c->defer_event = c->mainloop->defer_new(c->mainloop, connect_defer_cb, c));
return 0; return 0;
} }
@ -252,8 +252,7 @@ pa_socket_client* pa_socket_client_new_unix(pa_mainloop_api *m, const char *file
memset(&sa, 0, sizeof(sa)); memset(&sa, 0, sizeof(sa));
sa.sun_family = AF_UNIX; sa.sun_family = AF_UNIX;
strncpy(sa.sun_path, filename, sizeof(sa.sun_path)-1); pa_strlcpy(sa.sun_path, filename, sizeof(sa.sun_path));
sa.sun_path[sizeof(sa.sun_path) - 1] = 0;
return pa_socket_client_new_sockaddr(m, (struct sockaddr*) &sa, sizeof(sa)); return pa_socket_client_new_sockaddr(m, (struct sockaddr*) &sa, sizeof(sa));
} }
@ -273,7 +272,7 @@ static int sockaddr_prepare(pa_socket_client *c, const struct sockaddr *sa, size
switch (sa->sa_family) { switch (sa->sa_family) {
case AF_UNIX: case AF_UNIX:
c->local = 1; c->local = TRUE;
break; break;
case AF_INET: case AF_INET:
@ -285,7 +284,7 @@ static int sockaddr_prepare(pa_socket_client *c, const struct sockaddr *sa, size
break; break;
default: default:
c->local = 0; c->local = FALSE;
} }
if ((c->fd = socket(sa->sa_family, SOCK_STREAM, 0)) < 0) { if ((c->fd = socket(sa->sa_family, SOCK_STREAM, 0)) < 0) {
@ -294,6 +293,7 @@ static int sockaddr_prepare(pa_socket_client *c, const struct sockaddr *sa, size
} }
pa_make_fd_cloexec(c->fd); pa_make_fd_cloexec(c->fd);
if (sa->sa_family == AF_INET || sa->sa_family == AF_INET6) if (sa->sa_family == AF_INET || sa->sa_family == AF_INET6)
pa_make_tcp_socket_low_delay(c->fd); pa_make_tcp_socket_low_delay(c->fd);
else else
@ -312,7 +312,7 @@ pa_socket_client* pa_socket_client_new_sockaddr(pa_mainloop_api *m, const struct
pa_assert(sa); pa_assert(sa);
pa_assert(salen > 0); pa_assert(salen > 0);
pa_assert_se(c = pa_socket_client_new(m)); pa_assert_se(c = socket_client_new(m));
if (sockaddr_prepare(c, sa, salen) < 0) if (sockaddr_prepare(c, sa, salen) < 0)
goto fail; goto fail;
@ -361,7 +361,7 @@ pa_socket_client* pa_socket_client_ref(pa_socket_client *c) {
return c; return c;
} }
void pa_socket_client_set_callback(pa_socket_client *c, void (*on_connection)(pa_socket_client *c, pa_iochannel*io, void *userdata), void *userdata) { void pa_socket_client_set_callback(pa_socket_client *c, pa_socket_client_cb_t on_connection, void *userdata) {
pa_assert(c); pa_assert(c);
pa_assert(PA_REFCNT_VALUE(c) >= 1); pa_assert(PA_REFCNT_VALUE(c) >= 1);
@ -489,23 +489,22 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
hints.ai_family = a.type == PA_PARSED_ADDRESS_TCP4 ? PF_INET : (a.type == PA_PARSED_ADDRESS_TCP6 ? PF_INET6 : PF_UNSPEC); hints.ai_family = a.type == PA_PARSED_ADDRESS_TCP4 ? PF_INET : (a.type == PA_PARSED_ADDRESS_TCP6 ? PF_INET6 : PF_UNSPEC);
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
#ifdef HAVE_LIBASYNCNS #if defined(HAVE_LIBASYNCNS)
{ {
asyncns_t *asyncns; asyncns_t *asyncns;
if (!(asyncns = asyncns_new(1))) if (!(asyncns = asyncns_new(1)))
goto finish; goto finish;
c = pa_socket_client_new(m); pa_assert_se(c = socket_client_new(m));
c->asyncns = asyncns; c->asyncns = asyncns;
c->asyncns_io_event = m->io_new(m, asyncns_fd(c->asyncns), PA_IO_EVENT_INPUT, asyncns_cb, c); c->asyncns_io_event = m->io_new(m, asyncns_fd(c->asyncns), PA_IO_EVENT_INPUT, asyncns_cb, c);
c->asyncns_query = asyncns_getaddrinfo(c->asyncns, a.path_or_host, port, &hints); c->asyncns_query = asyncns_getaddrinfo(c->asyncns, a.path_or_host, port, &hints);
pa_assert(c->asyncns_query); pa_assert(c->asyncns_query);
start_timeout(c); start_timeout(c);
} }
#else /* HAVE_LIBASYNCNS */ #elif defined(HAVE_GETADDRINFO)
{ {
#ifdef HAVE_GETADDRINFO
int ret; int ret;
struct addrinfo *res = NULL; struct addrinfo *res = NULL;
@ -520,7 +519,9 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
} }
freeaddrinfo(res); freeaddrinfo(res);
#else /* HAVE_GETADDRINFO */ }
#else
{
struct hostent *host = NULL; struct hostent *host = NULL;
struct sockaddr_in s; struct sockaddr_in s;
@ -546,7 +547,6 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
if ((c = pa_socket_client_new_sockaddr(m, (struct sockaddr*)&s, sizeof(s)))) if ((c = pa_socket_client_new_sockaddr(m, (struct sockaddr*)&s, sizeof(s))))
start_timeout(c); start_timeout(c);
#endif /* HAVE_GETADDRINFO */
} }
#endif /* HAVE_LIBASYNCNS */ #endif /* HAVE_LIBASYNCNS */
} }
@ -561,7 +561,7 @@ finish:
/* Return non-zero when the target sockaddr is considered /* Return non-zero when the target sockaddr is considered
local. "local" means UNIX socket or TCP socket on localhost. Other local. "local" means UNIX socket or TCP socket on localhost. Other
local IP addresses are not considered local. */ local IP addresses are not considered local. */
int pa_socket_client_is_local(pa_socket_client *c) { pa_bool_t pa_socket_client_is_local(pa_socket_client *c) {
pa_assert(c); pa_assert(c);
pa_assert(PA_REFCNT_VALUE(c) >= 1); pa_assert(PA_REFCNT_VALUE(c) >= 1);

View file

@ -34,17 +34,19 @@ struct sockaddr;
typedef struct pa_socket_client pa_socket_client; typedef struct pa_socket_client pa_socket_client;
typedef void (*pa_socket_client_cb_t)(pa_socket_client *c, pa_iochannel*io, void *userdata);
pa_socket_client* pa_socket_client_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port); pa_socket_client* pa_socket_client_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port);
pa_socket_client* pa_socket_client_new_ipv6(pa_mainloop_api *m, uint8_t address[16], uint16_t port); pa_socket_client* pa_socket_client_new_ipv6(pa_mainloop_api *m, uint8_t address[16], uint16_t port);
pa_socket_client* pa_socket_client_new_unix(pa_mainloop_api *m, const char *filename); pa_socket_client* pa_socket_client_new_unix(pa_mainloop_api *m, const char *filename);
pa_socket_client* pa_socket_client_new_sockaddr(pa_mainloop_api *m, const struct sockaddr *sa, size_t salen); pa_socket_client* pa_socket_client_new_sockaddr(pa_mainloop_api *m, const struct sockaddr *sa, size_t salen);
pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char *a, uint16_t default_port); pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char *a, uint16_t default_port);
void pa_socket_client_unref(pa_socket_client *c);
pa_socket_client* pa_socket_client_ref(pa_socket_client *c); pa_socket_client* pa_socket_client_ref(pa_socket_client *c);
void pa_socket_client_unref(pa_socket_client *c);
void pa_socket_client_set_callback(pa_socket_client *c, void (*on_connection)(pa_socket_client *c, pa_iochannel*io, void *userdata), void *userdata); void pa_socket_client_set_callback(pa_socket_client *c, pa_socket_client_cb_t on_connection, void *userdata);
int pa_socket_client_is_local(pa_socket_client *c); pa_bool_t pa_socket_client_is_local(pa_socket_client *c);
#endif #endif