1/*** 2 This file is part of PulseAudio. 3 4 Copyright 2004-2006 Lennart Poettering 5 6 PulseAudio is free software; you can redistribute it and/or modify 7 it under the terms of the GNU Lesser General Public License as published 8 by the Free Software Foundation; either version 2.1 of the License, 9 or (at your option) any later version. 10 11 PulseAudio is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public License 17 along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 18***/ 19 20#ifdef HAVE_CONFIG_H 21#include <config.h> 22#endif 23 24#include <stdio.h> 25#include <unistd.h> 26 27#include <pulsecore/module.h> 28#include <pulsecore/macro.h> 29#include <pulsecore/iochannel.h> 30#include <pulsecore/modargs.h> 31#include <pulsecore/protocol-native.h> 32#include <pulsecore/log.h> 33 34PA_MODULE_AUTHOR("Lennart Poettering"); 35PA_MODULE_DESCRIPTION("Native protocol autospawn helper"); 36PA_MODULE_VERSION(PACKAGE_VERSION); 37PA_MODULE_LOAD_ONCE(true); 38 39static const char* const valid_modargs[] = { 40 "fd", 41 NULL, 42}; 43 44int pa__init(pa_module*m) { 45 pa_iochannel *io; 46 pa_modargs *ma; 47 int32_t fd = -1; 48 int r = -1; 49 pa_native_options *options = NULL; 50 51 pa_assert(m); 52 53 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { 54 pa_log("Failed to parse module arguments."); 55 goto finish; 56 } 57 58 if (pa_modargs_get_value_s32(ma, "fd", &fd) < 0 || fd < 0) { 59 pa_log("Invalid file descriptor."); 60 goto finish; 61 } 62 63 m->userdata = pa_native_protocol_get(m->core); 64 65 io = pa_iochannel_new(m->core->mainloop, fd, fd); 66 67 options = pa_native_options_new(); 68 options->module = m; 69 options->auth_anonymous = true; 70 71 pa_native_protocol_connect(m->userdata, io, options); 72 73 r = 0; 74 75finish: 76 if (ma) 77 pa_modargs_free(ma); 78 79 if (options) 80 pa_native_options_unref(options); 81 82 return r; 83} 84 85void pa__done(pa_module*m) { 86 pa_assert(m); 87 88 if (m->userdata) { 89 pa_native_protocol_disconnect(m->userdata, m); 90 pa_native_protocol_unref(m->userdata); 91 } 92} 93