mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-05 13:29:57 -05:00
cli: don't accidentaly set O_NDELAY on stderr
Loading module-cli could have the effect of setting O_NDELAY on stderr, because it was just a dup'ed fd of stdin which module-cli sets O_NDELAY for and which flag is shared between all dupes. Instead of using stdin/stdout directly we now open a new file descriptor for the controlling terminal, which is equally useful as stdin/stdout but gives a new file that does not share O_NDELAY with stdin/stdout. This solves a problem where when running pulseaudio -C resulted in log output being truncated since stdio does not really handle O_NDELAY that well in on its fds.
This commit is contained in:
parent
94f28b9d4b
commit
b4d4f2b856
1 changed files with 21 additions and 3 deletions
|
|
@ -25,6 +25,8 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <pulsecore/module.h>
|
#include <pulsecore/module.h>
|
||||||
#include <pulsecore/iochannel.h>
|
#include <pulsecore/iochannel.h>
|
||||||
|
|
@ -33,6 +35,8 @@
|
||||||
#include <pulsecore/log.h>
|
#include <pulsecore/log.h>
|
||||||
#include <pulsecore/modargs.h>
|
#include <pulsecore/modargs.h>
|
||||||
#include <pulsecore/macro.h>
|
#include <pulsecore/macro.h>
|
||||||
|
#include <pulsecore/core-util.h>
|
||||||
|
#include <pulsecore/core-error.h>
|
||||||
|
|
||||||
#include "module-cli-symdef.h"
|
#include "module-cli-symdef.h"
|
||||||
|
|
||||||
|
|
@ -69,6 +73,7 @@ int pa__init(pa_module*m) {
|
||||||
pa_iochannel *io;
|
pa_iochannel *io;
|
||||||
pa_modargs *ma;
|
pa_modargs *ma;
|
||||||
pa_bool_t exit_on_eof = FALSE;
|
pa_bool_t exit_on_eof = FALSE;
|
||||||
|
int fd;
|
||||||
|
|
||||||
pa_assert(m);
|
pa_assert(m);
|
||||||
|
|
||||||
|
|
@ -92,11 +97,24 @@ int pa__init(pa_module*m) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
io = pa_iochannel_new(m->core->mainloop, STDIN_FILENO, STDOUT_FILENO);
|
/* We try to open the controlling tty anew here. This has the
|
||||||
pa_iochannel_set_noclose(io, 1);
|
* benefit of giving us a new fd that doesn't share the O_NDELAY
|
||||||
|
* flag with fds 0, 1, or 2. Since pa_iochannel_xxx needs O_NDELAY
|
||||||
|
* on its fd using those fds directly could set O_NDELAY which
|
||||||
|
* fprintf() doesn't really like, resulting in truncated output
|
||||||
|
* of log messages, particularly because if stdout and stderr are
|
||||||
|
* dup'ed they share the same O_NDELAY, too. */
|
||||||
|
|
||||||
|
if ((fd = open("/dev/tty", O_RDWR|O_CLOEXEC|O_NONBLOCK)) >= 0) {
|
||||||
|
io = pa_iochannel_new(m->core->mainloop, fd, fd);
|
||||||
|
pa_log_debug("Managed to open /dev/tty.");
|
||||||
|
} else {
|
||||||
|
io = pa_iochannel_new(m->core->mainloop, STDIN_FILENO, STDOUT_FILENO);
|
||||||
|
pa_iochannel_set_noclose(io, TRUE);
|
||||||
|
pa_log_debug("Failed to open /dev/tty, using stdin/stdout fds instead.");
|
||||||
|
}
|
||||||
|
|
||||||
m->userdata = pa_cli_new(m->core, io, m);
|
m->userdata = pa_cli_new(m->core, io, m);
|
||||||
|
|
||||||
pa_cli_set_eof_callback(m->userdata, exit_on_eof ? eof_and_exit_cb : eof_and_unload_cb, m);
|
pa_cli_set_eof_callback(m->userdata, exit_on_eof ? eof_and_exit_cb : eof_and_unload_cb, m);
|
||||||
|
|
||||||
pa_modargs_free(ma);
|
pa_modargs_free(ma);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue