mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-10-29 05:40:23 -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); | ||||
| 
 | ||||
|         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); | ||||
|                 assert(t); | ||||
|                 command->proc(c, t); | ||||
|  |  | |||
|  | @ -15,6 +15,8 @@ struct iochannel { | |||
|     int readable; | ||||
|     int writable; | ||||
| 
 | ||||
|     int no_close; | ||||
| 
 | ||||
|     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->readable = 0; | ||||
|     io->writable = 0; | ||||
|     io->no_close = 0; | ||||
| 
 | ||||
|     if (ifd == ofd) { | ||||
|         assert(ifd >= 0); | ||||
|  | @ -109,10 +112,12 @@ struct iochannel* iochannel_new(struct mainloop*m, int ifd, int ofd) { | |||
| void iochannel_free(struct iochannel*io) { | ||||
|     assert(io); | ||||
| 
 | ||||
|     if (io->ifd >= 0) | ||||
|         close(io->ifd); | ||||
|     if (io->ofd >= 0 && io->ofd != io->ifd) | ||||
|         close(io->ofd); | ||||
|     if (!io->no_close) { | ||||
|         if (io->ifd >= 0) | ||||
|             close(io->ifd); | ||||
|         if (io->ofd >= 0 && io->ofd != io->ifd) | ||||
|             close(io->ofd); | ||||
|     } | ||||
| 
 | ||||
|     if (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->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_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); | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ int module_init(struct core *c, struct module*m) { | |||
|     stdin_inuse = stdout_inuse = 1; | ||||
|     io = iochannel_new(c->mainloop, STDIN_FILENO, STDOUT_FILENO); | ||||
|     assert(io); | ||||
|     iochannel_set_noclose(io, 1); | ||||
| 
 | ||||
|     m->userdata = cli_new(c, io); | ||||
|     assert(m->userdata); | ||||
|  |  | |||
|  | @ -6,12 +6,14 @@ | |||
| 
 | ||||
| #ifdef USE_PROTOCOL_SIMPLE | ||||
|   #include "protocol-simple.h" | ||||
|   #define protocol_free protcol_simple_free | ||||
|   #define protocol_free protocol_simple_free | ||||
|   #define IPV4_PORT 4712 | ||||
| #else | ||||
|   #ifdef USE_PROTOCOL_CLI | ||||
|     #include "protocol-cli.h"  | ||||
|     #define protocol_new protocol_cli_new | ||||
|     #define protocol_free protocol_cli_free | ||||
|     #define IPV4_PORT 4711 | ||||
|   #else | ||||
|     #error "Broken build system" | ||||
|   #endif | ||||
|  | @ -22,7 +24,7 @@ int module_init(struct core *c, struct module*m) { | |||
|     assert(c && m); | ||||
| 
 | ||||
| #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; | ||||
| #else | ||||
|     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) { | ||||
|     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
	
	 Lennart Poettering
						Lennart Poettering