mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-31 22:25:33 -04:00
cli protocol
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@28 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
6eddcc2f85
commit
81447ed392
7 changed files with 94 additions and 8 deletions
|
|
@ -111,7 +111,7 @@ static void line_callback(struct ioline *line, const char *s, void *userdata) {
|
||||||
l = strcspn(s, delimiter);
|
l = strcspn(s, delimiter);
|
||||||
|
|
||||||
for (command = commands; command->name; command++)
|
for (command = commands; command->name; command++)
|
||||||
if (!strncmp(s, command->name, l)) {
|
if (strlen(command->name) == l && !strncmp(s, command->name, l)) {
|
||||||
struct tokenizer *t = tokenizer_new(s, command->args);
|
struct tokenizer *t = tokenizer_new(s, command->args);
|
||||||
assert(t);
|
assert(t);
|
||||||
command->proc(c, t);
|
command->proc(c, t);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ struct iochannel {
|
||||||
int readable;
|
int readable;
|
||||||
int writable;
|
int writable;
|
||||||
|
|
||||||
|
int no_close;
|
||||||
|
|
||||||
struct mainloop_source* input_source, *output_source;
|
struct mainloop_source* input_source, *output_source;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -83,6 +85,7 @@ struct iochannel* iochannel_new(struct mainloop*m, int ifd, int ofd) {
|
||||||
io->callback = NULL;
|
io->callback = NULL;
|
||||||
io->readable = 0;
|
io->readable = 0;
|
||||||
io->writable = 0;
|
io->writable = 0;
|
||||||
|
io->no_close = 0;
|
||||||
|
|
||||||
if (ifd == ofd) {
|
if (ifd == ofd) {
|
||||||
assert(ifd >= 0);
|
assert(ifd >= 0);
|
||||||
|
|
@ -109,10 +112,12 @@ struct iochannel* iochannel_new(struct mainloop*m, int ifd, int ofd) {
|
||||||
void iochannel_free(struct iochannel*io) {
|
void iochannel_free(struct iochannel*io) {
|
||||||
assert(io);
|
assert(io);
|
||||||
|
|
||||||
|
if (!io->no_close) {
|
||||||
if (io->ifd >= 0)
|
if (io->ifd >= 0)
|
||||||
close(io->ifd);
|
close(io->ifd);
|
||||||
if (io->ofd >= 0 && io->ofd != io->ifd)
|
if (io->ofd >= 0 && io->ofd != io->ifd)
|
||||||
close(io->ofd);
|
close(io->ofd);
|
||||||
|
}
|
||||||
|
|
||||||
if (io->input_source)
|
if (io->input_source)
|
||||||
mainloop_source_free(io->input_source);
|
mainloop_source_free(io->input_source);
|
||||||
|
|
@ -162,3 +167,8 @@ void iochannel_set_callback(struct iochannel*io, void (*callback)(struct iochann
|
||||||
io->callback = callback;
|
io->callback = callback;
|
||||||
io->userdata = userdata;
|
io->userdata = userdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iochannel_set_noclose(struct iochannel*io, int b) {
|
||||||
|
assert(io);
|
||||||
|
io->no_close = b;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ ssize_t iochannel_read(struct iochannel*io, void*data, size_t l);
|
||||||
int iochannel_is_readable(struct iochannel*io);
|
int iochannel_is_readable(struct iochannel*io);
|
||||||
int iochannel_is_writable(struct iochannel*io);
|
int iochannel_is_writable(struct iochannel*io);
|
||||||
|
|
||||||
|
void iochannel_set_noclose(struct iochannel*io, int b);
|
||||||
|
|
||||||
void iochannel_set_callback(struct iochannel*io, void (*callback)(struct iochannel*io, void *userdata), void *userdata);
|
void iochannel_set_callback(struct iochannel*io, void (*callback)(struct iochannel*io, void *userdata), void *userdata);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ int module_init(struct core *c, struct module*m) {
|
||||||
stdin_inuse = stdout_inuse = 1;
|
stdin_inuse = stdout_inuse = 1;
|
||||||
io = iochannel_new(c->mainloop, STDIN_FILENO, STDOUT_FILENO);
|
io = iochannel_new(c->mainloop, STDIN_FILENO, STDOUT_FILENO);
|
||||||
assert(io);
|
assert(io);
|
||||||
|
iochannel_set_noclose(io, 1);
|
||||||
|
|
||||||
m->userdata = cli_new(c, io);
|
m->userdata = cli_new(c, io);
|
||||||
assert(m->userdata);
|
assert(m->userdata);
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,14 @@
|
||||||
|
|
||||||
#ifdef USE_PROTOCOL_SIMPLE
|
#ifdef USE_PROTOCOL_SIMPLE
|
||||||
#include "protocol-simple.h"
|
#include "protocol-simple.h"
|
||||||
#define protocol_free protcol_simple_free
|
#define protocol_free protocol_simple_free
|
||||||
|
#define IPV4_PORT 4712
|
||||||
#else
|
#else
|
||||||
#ifdef USE_PROTOCOL_CLI
|
#ifdef USE_PROTOCOL_CLI
|
||||||
#include "protocol-cli.h"
|
#include "protocol-cli.h"
|
||||||
#define protocol_new protocol_cli_new
|
#define protocol_new protocol_cli_new
|
||||||
#define protocol_free protocol_cli_free
|
#define protocol_free protocol_cli_free
|
||||||
|
#define IPV4_PORT 4711
|
||||||
#else
|
#else
|
||||||
#error "Broken build system"
|
#error "Broken build system"
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -22,7 +24,7 @@ int module_init(struct core *c, struct module*m) {
|
||||||
assert(c && m);
|
assert(c && m);
|
||||||
|
|
||||||
#ifdef USE_TCP_SOCKETS
|
#ifdef USE_TCP_SOCKETS
|
||||||
if (!(s = socket_server_new_ipv4(c->mainloop, INADDR_LOOPBACK, 4712)))
|
if (!(s = socket_server_new_ipv4(c->mainloop, INADDR_LOOPBACK, IPV4_PORT)))
|
||||||
return -1;
|
return -1;
|
||||||
#else
|
#else
|
||||||
if (!(s = socket_server_new_unix(c->mainloop, "/tmp/polypsimple")))
|
if (!(s = socket_server_new_unix(c->mainloop, "/tmp/polypsimple")))
|
||||||
|
|
@ -42,5 +44,5 @@ int module_init(struct core *c, struct module*m) {
|
||||||
void module_done(struct core *c, struct module*m) {
|
void module_done(struct core *c, struct module*m) {
|
||||||
assert(c && m);
|
assert(c && m);
|
||||||
|
|
||||||
protocol_simple_free(m->userdata);
|
protocol_free(m->userdata);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
59
src/protocol-cli.c
Normal file
59
src/protocol-cli.c
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "protocol-cli.h"
|
||||||
|
#include "cli.h"
|
||||||
|
|
||||||
|
struct protocol_cli {
|
||||||
|
struct core *core;
|
||||||
|
struct socket_server*server;
|
||||||
|
struct idxset *connections;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void cli_eof_cb(struct cli*c, void*userdata) {
|
||||||
|
struct protocol_cli *p = userdata;
|
||||||
|
assert(c && p);
|
||||||
|
|
||||||
|
idxset_remove_by_data(p->connections, c, NULL);
|
||||||
|
cli_free(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void on_connection(struct socket_server*s, struct iochannel *io, void *userdata) {
|
||||||
|
struct protocol_cli *p = userdata;
|
||||||
|
struct cli *c;
|
||||||
|
assert(s && io && p);
|
||||||
|
|
||||||
|
c = cli_new(p->core, io);
|
||||||
|
assert(c);
|
||||||
|
cli_set_eof_callback(c, cli_eof_cb, p);
|
||||||
|
|
||||||
|
idxset_put(p->connections, c, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct protocol_cli* protocol_cli_new(struct core *core, struct socket_server *server) {
|
||||||
|
struct protocol_cli* p;
|
||||||
|
assert(core && server);
|
||||||
|
|
||||||
|
p = malloc(sizeof(struct protocol_cli));
|
||||||
|
assert(p);
|
||||||
|
p->core = core;
|
||||||
|
p->server = server;
|
||||||
|
p->connections = idxset_new(NULL, NULL);
|
||||||
|
|
||||||
|
socket_server_set_callback(p->server, on_connection, p);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void free_connection(void *p, void *userdata) {
|
||||||
|
assert(p);
|
||||||
|
cli_free(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void protocol_cli_free(struct protocol_cli *p) {
|
||||||
|
assert(p);
|
||||||
|
|
||||||
|
idxset_free(p->connections, free_connection, NULL);
|
||||||
|
socket_server_free(p->server);
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
12
src/protocol-cli.h
Normal file
12
src/protocol-cli.h
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef fooprotocolclihfoo
|
||||||
|
#define fooprotocolclihfoo
|
||||||
|
|
||||||
|
#include "core.h"
|
||||||
|
#include "socket-server.h"
|
||||||
|
|
||||||
|
struct protocol_cli;
|
||||||
|
|
||||||
|
struct protocol_cli* protocol_cli_new(struct core *core, struct socket_server *server);
|
||||||
|
void protocol_cli_free(struct protocol_cli *n);
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Add table
Add a link
Reference in a new issue