modernize pa_iochannel a bit, add pa_iochannel_get_send_fd()

git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1957 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2007-10-27 12:59:59 +00:00
parent c4d9a2bf85
commit 55e4a3e221
3 changed files with 52 additions and 46 deletions

View file

@ -58,11 +58,11 @@ struct pa_iochannel {
pa_iochannel_cb_t callback; pa_iochannel_cb_t callback;
void*userdata; void*userdata;
int readable; pa_bool_t readable;
int writable; pa_bool_t writable;
int hungup; pa_bool_t hungup;
int no_close; pa_bool_t no_close;
pa_io_event* input_event, *output_event; pa_io_event* input_event, *output_event;
}; };
@ -90,7 +90,7 @@ static void enable_mainloop_sources(pa_iochannel *io) {
static void callback(pa_mainloop_api* m, pa_io_event *e, int fd, pa_io_event_flags_t f, void *userdata) { static void callback(pa_mainloop_api* m, pa_io_event *e, int fd, pa_io_event_flags_t f, void *userdata) {
pa_iochannel *io = userdata; pa_iochannel *io = userdata;
int changed = 0; pa_bool_t changed = FALSE;
pa_assert(m); pa_assert(m);
pa_assert(e); pa_assert(e);
@ -98,19 +98,19 @@ static void callback(pa_mainloop_api* m, pa_io_event *e, int fd, pa_io_event_fla
pa_assert(userdata); pa_assert(userdata);
if ((f & (PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR)) && !io->hungup) { if ((f & (PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR)) && !io->hungup) {
io->hungup = 1; io->hungup = TRUE;
changed = 1; changed = TRUE;
} }
if ((f & PA_IO_EVENT_INPUT) && !io->readable) { if ((f & PA_IO_EVENT_INPUT) && !io->readable) {
io->readable = 1; io->readable = TRUE;
changed = 1; changed = TRUE;
pa_assert(e == io->input_event); pa_assert(e == io->input_event);
} }
if ((f & PA_IO_EVENT_OUTPUT) && !io->writable) { if ((f & PA_IO_EVENT_OUTPUT) && !io->writable) {
io->writable = 1; io->writable = TRUE;
changed = 1; changed = TRUE;
pa_assert(e == io->output_event); pa_assert(e == io->output_event);
} }
@ -136,10 +136,10 @@ pa_iochannel* pa_iochannel_new(pa_mainloop_api*m, int ifd, int ofd) {
io->userdata = NULL; io->userdata = NULL;
io->callback = NULL; io->callback = NULL;
io->readable = 0; io->readable = FALSE;
io->writable = 0; io->writable = FALSE;
io->hungup = 0; io->hungup = FALSE;
io->no_close = 0; io->no_close = FALSE;
io->input_event = io->output_event = NULL; io->input_event = io->output_event = NULL;
@ -182,19 +182,19 @@ void pa_iochannel_free(pa_iochannel*io) {
pa_xfree(io); pa_xfree(io);
} }
int pa_iochannel_is_readable(pa_iochannel*io) { pa_bool_t pa_iochannel_is_readable(pa_iochannel*io) {
pa_assert(io); pa_assert(io);
return io->readable || io->hungup; return io->readable || io->hungup;
} }
int pa_iochannel_is_writable(pa_iochannel*io) { pa_bool_t pa_iochannel_is_writable(pa_iochannel*io) {
pa_assert(io); pa_assert(io);
return io->writable && !io->hungup; return io->writable && !io->hungup;
} }
int pa_iochannel_is_hungup(pa_iochannel*io) { pa_bool_t pa_iochannel_is_hungup(pa_iochannel*io) {
pa_assert(io); pa_assert(io);
return io->hungup; return io->hungup;
@ -208,9 +208,8 @@ ssize_t pa_iochannel_write(pa_iochannel*io, const void*data, size_t l) {
pa_assert(l); pa_assert(l);
pa_assert(io->ofd >= 0); pa_assert(io->ofd >= 0);
r = pa_write(io->ofd, data, l, &io->ofd_type); if ((r = pa_write(io->ofd, data, l, &io->ofd_type)) >= 0) {
if (r >= 0) { io->writable = FALSE;
io->writable = 0;
enable_mainloop_sources(io); enable_mainloop_sources(io);
} }
@ -224,9 +223,8 @@ ssize_t pa_iochannel_read(pa_iochannel*io, void*data, size_t l) {
pa_assert(data); pa_assert(data);
pa_assert(io->ifd >= 0); pa_assert(io->ifd >= 0);
r = pa_read(io->ifd, data, l, &io->ifd_type); if ((r = pa_read(io->ifd, data, l, &io->ifd_type)) >= 0) {
if (r >= 0) { io->readable = FALSE;
io->readable = 0;
enable_mainloop_sources(io); enable_mainloop_sources(io);
} }
@ -235,7 +233,7 @@ ssize_t pa_iochannel_read(pa_iochannel*io, void*data, size_t l) {
#ifdef HAVE_CREDS #ifdef HAVE_CREDS
int pa_iochannel_creds_supported(pa_iochannel *io) { pa_bool_t pa_iochannel_creds_supported(pa_iochannel *io) {
struct sockaddr_un sa; struct sockaddr_un sa;
socklen_t l; socklen_t l;
@ -309,14 +307,14 @@ ssize_t pa_iochannel_write_with_creds(pa_iochannel*io, const void*data, size_t l
mh.msg_flags = 0; mh.msg_flags = 0;
if ((r = sendmsg(io->ofd, &mh, MSG_NOSIGNAL)) >= 0) { if ((r = sendmsg(io->ofd, &mh, MSG_NOSIGNAL)) >= 0) {
io->writable = 0; io->writable = FALSE;
enable_mainloop_sources(io); enable_mainloop_sources(io);
} }
return r; return r;
} }
ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_creds *creds, int *creds_valid) { ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_creds *creds, pa_bool_t *creds_valid) {
ssize_t r; ssize_t r;
struct msghdr mh; struct msghdr mh;
struct iovec iov; struct iovec iov;
@ -358,12 +356,12 @@ ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_cr
creds->gid = u.gid; creds->gid = u.gid;
creds->uid = u.uid; creds->uid = u.uid;
*creds_valid = 1; *creds_valid = TRUE;
break; break;
} }
} }
io->readable = 0; io->readable = FALSE;
enable_mainloop_sources(io); enable_mainloop_sources(io);
} }
@ -379,10 +377,10 @@ void pa_iochannel_set_callback(pa_iochannel*io, pa_iochannel_cb_t _callback, voi
io->userdata = userdata; io->userdata = userdata;
} }
void pa_iochannel_set_noclose(pa_iochannel*io, int b) { void pa_iochannel_set_noclose(pa_iochannel*io, pa_bool_t b) {
pa_assert(io); pa_assert(io);
io->no_close = b; io->no_close = !!b;
} }
void pa_iochannel_socket_peer_to_string(pa_iochannel*io, char*s, size_t l) { void pa_iochannel_socket_peer_to_string(pa_iochannel*io, char*s, size_t l) {
@ -416,3 +414,9 @@ int pa_iochannel_get_recv_fd(pa_iochannel *io) {
return io->ifd; return io->ifd;
} }
int pa_iochannel_get_send_fd(pa_iochannel *io) {
pa_assert(io);
return io->ofd;
}

View file

@ -33,6 +33,7 @@
#include <pulse/mainloop-api.h> #include <pulse/mainloop-api.h>
#include <pulsecore/creds.h> #include <pulsecore/creds.h>
#include <pulsecore/macro.h>
/* A wrapper around UNIX file descriptors for attaching them to the a /* A wrapper around UNIX file descriptors for attaching them to the a
main event loop. Everytime new data may be read or be written to main event loop. Everytime new data may be read or be written to
@ -58,20 +59,20 @@ ssize_t pa_iochannel_write(pa_iochannel*io, const void*data, size_t l);
ssize_t pa_iochannel_read(pa_iochannel*io, void*data, size_t l); ssize_t pa_iochannel_read(pa_iochannel*io, void*data, size_t l);
#ifdef HAVE_CREDS #ifdef HAVE_CREDS
int pa_iochannel_creds_supported(pa_iochannel *io); pa_bool_t pa_iochannel_creds_supported(pa_iochannel *io);
int pa_iochannel_creds_enable(pa_iochannel *io); int pa_iochannel_creds_enable(pa_iochannel *io);
ssize_t pa_iochannel_write_with_creds(pa_iochannel*io, const void*data, size_t l, const pa_creds *ucred); ssize_t pa_iochannel_write_with_creds(pa_iochannel*io, const void*data, size_t l, const pa_creds *ucred);
ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_creds *ucred, int *creds_valid); ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_creds *ucred, pa_bool_t *creds_valid);
#endif #endif
int pa_iochannel_is_readable(pa_iochannel*io); pa_bool_t pa_iochannel_is_readable(pa_iochannel*io);
int pa_iochannel_is_writable(pa_iochannel*io); pa_bool_t pa_iochannel_is_writable(pa_iochannel*io);
int pa_iochannel_is_hungup(pa_iochannel*io); pa_bool_t pa_iochannel_is_hungup(pa_iochannel*io);
/* Don't close the file descirptors when the io channel is freed. By /* Don't close the file descirptors when the io channel is freed. By
* default the file descriptors are closed. */ * default the file descriptors are closed. */
void pa_iochannel_set_noclose(pa_iochannel*io, int b); void pa_iochannel_set_noclose(pa_iochannel*io, pa_bool_t b);
/* Set the callback function that is called whenever data becomes available for read or write */ /* Set the callback function that is called whenever data becomes available for read or write */
typedef void (*pa_iochannel_cb_t)(pa_iochannel*io, void *userdata); typedef void (*pa_iochannel_cb_t)(pa_iochannel*io, void *userdata);
@ -87,5 +88,6 @@ int pa_iochannel_socket_set_sndbuf(pa_iochannel*io, size_t l);
pa_mainloop_api* pa_iochannel_get_mainloop_api(pa_iochannel *io); pa_mainloop_api* pa_iochannel_get_mainloop_api(pa_iochannel *io);
int pa_iochannel_get_recv_fd(pa_iochannel *io); int pa_iochannel_get_recv_fd(pa_iochannel *io);
int pa_iochannel_get_send_fd(pa_iochannel *io);
#endif #endif

View file

@ -662,7 +662,7 @@ static int do_read(pa_pstream *p) {
#ifdef HAVE_CREDS #ifdef HAVE_CREDS
{ {
int b = 0; pa_bool_t b = 0;
if ((r = pa_iochannel_read_with_creds(p->io, d, l, &p->read_creds, &b)) <= 0) if ((r = pa_iochannel_read_with_creds(p->io, d, l, &p->read_creds, &b)) <= 0)
goto fail; goto fail;