int pa__init(pa_module*m) { pa_iochannel *io; pa_modargs *ma; pa_bool_t exit_on_eof = FALSE; pa_assert(m); if (m->core->running_as_daemon) { pa_log_info("Running as daemon, refusing to load this module."); return 0; } if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { pa_log("failed to parse module arguments."); goto fail; } if (pa_modargs_get_value_boolean(ma, "exit_on_eof", &exit_on_eof) < 0) { pa_log("exit_on_eof= expects boolean argument."); goto fail; } if (pa_stdio_acquire() < 0) { pa_log("STDIN/STDUSE already in use."); goto fail; } io = pa_iochannel_new(m->core->mainloop, STDIN_FILENO, STDOUT_FILENO); pa_iochannel_set_noclose(io, 1); 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_modargs_free(ma); return 0; fail: if (ma) pa_modargs_free(ma); return -1; }
void pa_cli_protocol_connect(pa_cli_protocol *p, pa_iochannel *io, pa_module *m) { pa_cli *c; pa_assert(p); pa_assert(io); pa_assert(m); if (pa_idxset_size(p->connections)+1 > MAX_CONNECTIONS) { pa_log("Warning! Too many connections (%u), dropping incoming connection.", MAX_CONNECTIONS); pa_iochannel_free(io); return; } c = pa_cli_new(p->core, io, m); pa_cli_set_eof_callback(c, cli_eof_cb, p); pa_idxset_put(p->connections, c, NULL); }
int pa__init(pa_module*m) { pa_iochannel *io; pa_modargs *ma; bool exit_on_eof = false; #ifndef OS_IS_WIN32 int fd; #endif pa_assert(m); if (m->core->running_as_daemon) { pa_log_info("Running as daemon, refusing to load this module."); return 0; } if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { pa_log("failed to parse module arguments."); goto fail; } if (pa_modargs_get_value_boolean(ma, "exit_on_eof", &exit_on_eof) < 0) { pa_log("exit_on_eof= expects boolean argument."); goto fail; } if (pa_stdio_acquire() < 0) { pa_log("STDIN/STDOUT already in use."); goto fail; } /* We try to open the controlling tty anew here. This has the * 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. */ #ifndef OS_IS_WIN32 if ((fd = pa_open_cloexec("/dev/tty", O_RDWR|O_NONBLOCK, 0)) >= 0) { io = pa_iochannel_new(m->core->mainloop, fd, fd); pa_log_debug("Managed to open /dev/tty."); } else #endif { 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); pa_cli_set_eof_callback(m->userdata, exit_on_eof ? eof_and_exit_cb : eof_and_unload_cb, m); pa_modargs_free(ma); return 0; fail: if (ma) pa_modargs_free(ma); return -1; }