Paul Donohue
2004-Aug-06 14:57 UTC
[icecast-dev] [PATCH] IceCast2 - aliasing (reimplementation of the patch I posted earlier)
Reimplementation of my earlier patch - more proper aliasing - at the suggestion of Mike -Paul -------------- next part -------------- diff -ur icecast/CVS/Entries IceCast/CVS/Entries --- icecast/CVS/Entries 2003-04-18 11:00:19.000000000 -0400 +++ IceCast/CVS/Entries 2003-04-17 22:14:16.000000000 -0400 @@ -1,4 +1,3 @@ -/.cvsignore/1.3/Wed Jan 15 05:36:15 2003// /AUTHORS/1.2/Fri Aug 9 15:55:01 2002// /COPYING/1.2/Thu Feb 14 00:58:04 2002// /HACKING/1.2/Thu Aug 8 08:26:21 2002// @@ -15,3 +14,4 @@ D/src//// D/web//// D/win32//// +/.cvsignore/1.3/Fri Apr 18 02:14:16 2003// Only in IceCast/CVS: Entries.Log Only in IceCast: Makefile Only in IceCast: Makefile.in Only in IceCast: aclocal.m4 Only in IceCast: autom4te.cache Only in IceCast: compile Only in IceCast/conf: Makefile Only in IceCast/conf: Makefile.in diff -ur icecast/conf/icecast.xml IceCast/conf/icecast.xml --- icecast/conf/icecast.xml 2003-04-10 23:14:26.000000000 -0400 +++ IceCast/conf/icecast.xml 2003-04-18 20:25:41.000000000 -0400 @@ -83,6 +83,11 @@ be relative to the new root, not the original root --> <logdir>/usr/local/icecast/logs</logdir> <webroot>/usr/local/icecast/web</webroot> + + <alias source="/foo" dest="/bar"></alias> + <alias source="/fred" dest="/bob" port="8000"></alias> + <alias source="/soylent" dest="/green" bind-address="127.0.0.1"></alias> + <alias source="/your" dest="/mom" port="8000" bind-address="127.0.0.1"></alias> </paths> <logging> Only in IceCast: config.guess Only in IceCast: config.log Only in IceCast: config.status Only in IceCast: config.sub Only in IceCast: configure Only in IceCast: depcomp Only in IceCast/doc: Makefile Only in IceCast/doc: Makefile.in Only in IceCast: install-sh Only in IceCast: libtool Only in IceCast: ltmain.sh Only in IceCast: missing Only in IceCast: mkinstalldirs Only in IceCast/src: .deps Only in IceCast/src: .libs diff -ur icecast/src/CVS/Entries IceCast/src/CVS/Entries --- icecast/src/CVS/Entries 2003-04-18 11:00:19.000000000 -0400 +++ IceCast/src/CVS/Entries 2003-04-18 09:14:25.000000000 -0400 @@ -6,10 +6,7 @@ /client.c/1.8/Sat Mar 15 02:10:17 2003// /client.h/1.8/Sat Mar 15 02:10:17 2003// /compat.h/1.1/Sat Oct 20 21:28:09 2001// -/config.c/1.32/Sat Mar 15 02:10:17 2003// -/config.h/1.20/Sat Mar 15 02:10:17 2003// /configtest.c/1.5/Sat Mar 15 02:10:17 2003// -/connection.h/1.9/Sat Mar 15 02:10:17 2003// /event.c/1.2/Sat Mar 15 02:10:17 2003// /event.h/1.1/Wed Mar 5 13:03:35 2003// /format.c/1.20/Sat Mar 15 02:10:17 2003// @@ -32,7 +29,6 @@ /refbuf.h/1.3/Sat Mar 15 02:10:17 2003// /sighandler.c/1.4/Sat Mar 15 02:10:17 2003// /sighandler.h/1.1.1.1/Mon Sep 10 02:21:49 2001// -/slave.c/1.24/Thu Mar 27 17:10:02 2003// /slave.h/1.1/Mon Aug 5 14:48:01 2002// /source.c/1.51/Thu Apr 17 03:23:18 2003// /source.h/1.13/Sun Mar 30 13:52:27 2003// @@ -50,4 +46,8 @@ D/httpp//// D/thread//// D/timing//// -/connection.c/1.68/Fri Apr 18 15:00:19 2003// +/config.c/1.32/Fri Apr 18 13:14:25 2003// +/config.h/1.20/Fri Apr 18 13:14:25 2003// +/connection.c/1.67/Fri Apr 18 13:14:25 2003// +/connection.h/1.9/Fri Apr 18 13:14:25 2003// +/slave.c/1.24/Fri Apr 18 13:14:25 2003// Only in IceCast/src: Makefile Only in IceCast/src: Makefile.in Only in IceCast/src: admin.o Only in IceCast/src/avl: .deps Only in IceCast/src/avl: .libs Only in IceCast/src/avl: Makefile Only in IceCast/src/avl: Makefile.in Only in IceCast/src/avl: libiceavl.la Only in IceCast/src/avl: libiceavl_la-avl.lo Only in IceCast/src/avl: libiceavl_la-avl.o Only in IceCast/src: client.o diff -ur icecast/src/config.c IceCast/src/config.c --- icecast/src/config.c 2003-03-14 21:10:17.000000000 -0500 +++ IceCast/src/config.c 2003-04-18 20:20:31.000000000 -0400 @@ -98,6 +98,7 @@ ice_config_dir_t *dirnode, *nextdirnode; relay_server *relay, *nextrelay; mount_proxy *mount, *nextmount; + aliases *alias, *nextalias; int i; if (c->config_filename) @@ -160,6 +161,16 @@ } thread_mutex_unlock(&(_locks.mounts_lock)); + alias = c->aliases; + while(alias) { + nextalias = alias->next; + xmlFree(alias->source); + xmlFree(alias->destination); + xmlFree(alias->bind_address); + free(alias); + alias = nextalias; + } + dirnode = c->dir_list; while(dirnode) { nextdirnode = dirnode->next; @@ -423,6 +434,7 @@ configuration->mounts = mount; mount->max_listeners = -1; + mount->next = NULL; do { if (node == NULL) break; @@ -474,6 +486,8 @@ else configuration->relay = relay; + relay->next = NULL; + do { if (node == NULL) break; if (xmlIsBlankNode(node)) continue; @@ -606,6 +620,9 @@ static void _parse_paths(xmlDocPtr doc, xmlNodePtr node, ice_config_t *configuration) { + char *temp; + aliases *alias, *current, *last; + do { if (node == NULL) break; if (xmlIsBlankNode(node)) continue; @@ -621,7 +638,39 @@ configuration->webroot_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); if(configuration->webroot_dir[strlen(configuration->webroot_dir)-1] == '/') configuration->webroot_dir[strlen(configuration->webroot_dir)-1] = 0; - + } else if (strcmp(node->name, "alias") == 0) { + alias = malloc(sizeof(aliases)); + alias->next = NULL; + alias->source = xmlGetProp(node, "source"); + if(alias->source == NULL) { + free(alias); + continue; + } + alias->destination = xmlGetProp(node, "dest"); + if(alias->destination == NULL) { + xmlFree(alias->source); + free(alias); + continue; + } + temp = NULL; + temp = xmlGetProp(node, "port"); + if(temp != NULL) { + alias->port = atoi(temp); + xmlFree(temp); + } + else + alias->port = -1; + alias->bind_address = xmlGetProp(node, "bind-address"); + current = configuration->aliases; + last = NULL; + while(current) { + last = current; + current = current->next; + } + if(last) + last->next = alias; + else + configuration->aliases = alias; } } while ((node = node->next)); } diff -ur icecast/src/config.h IceCast/src/config.h --- icecast/src/config.h 2003-03-14 21:10:17.000000000 -0500 +++ IceCast/src/config.h 2003-04-18 18:34:46.000000000 -0400 @@ -43,6 +43,14 @@ struct _mount_proxy *next; } mount_proxy; +typedef struct _aliases { + char *source; + char *destination; + int port; + char *bind_address; + struct _aliases *next; +}aliases; + typedef struct { int port; char *bind_address; @@ -89,6 +97,7 @@ char *base_dir; char *log_dir; char *webroot_dir; + aliases *aliases; char *access_log; char *error_log; Only in IceCast/src: config.o diff -ur icecast/src/connection.c IceCast/src/connection.c --- icecast/src/connection.c 2003-04-18 11:00:19.000000000 -0400 +++ IceCast/src/connection.c 2003-04-18 20:45:54.000000000 -0400 @@ -109,11 +109,12 @@ return id; } -connection_t *create_connection(sock_t sock, char *ip) { +connection_t *create_connection(sock_t sock, sock_t serversock, char *ip) { connection_t *con; con = (connection_t *)malloc(sizeof(connection_t)); memset(con, 0, sizeof(connection_t)); con->sock = sock; + con->serversock = serversock; con->con_time = time(NULL); con->id = _next_connection_id(); con->ip = ip; @@ -203,7 +204,7 @@ sock = sock_accept(serversock, ip, MAX_ADDR_LEN); if (sock >= 0) { - con = create_connection(sock, ip); + con = create_connection(sock, serversock, ip); return con; } @@ -648,6 +649,10 @@ int fileserve; char *host; int port; + int i; + char *serverhost; + int serverport; + aliases *alias; ice_config_t *config; int client_limit; @@ -655,6 +660,14 @@ fileserve = config->fileserve; host = config->hostname; port = config->port; + for(i = 0; i < MAX_LISTEN_SOCKETS; i++) { + if(global.serversock[i] == con->serversock) { + serverhost = config->listeners[i].bind_address; + serverport = config->listeners[i].port; + break; + } + } + alias = config->aliases; client_limit = config->client_limit; config_release_config(); @@ -668,13 +681,22 @@ /* there are several types of HTTP GET clients ** media clients, which are looking for a source (eg, URI = /stream.ogg) ** stats clients, which are looking for /admin/stats.xml - ** and director server authorizers, which are looking for /GUID-xxxxxxxx + ** and directory server authorizers, which are looking for /GUID-xxxxxxxx ** (where xxxxxx is the GUID in question) - this isn't implemented yet. ** we need to handle the latter two before the former, as the latter two ** aren't subject to the limits. */ /* TODO: add GUID-xxxxxx */ + /* Handle aliases */ + while(alias) { + if(strcmp(uri, alias->source) == 0 && (alias->port == -1 || alias->port == serverport) && (alias->bind_address == NULL || (serverhost != NULL && strcmp(alias->bind_address, serverhost) == 0))) { + uri = alias->destination; + break; + } + alias = alias->next; + } + /* Dispatch all admin requests */ if (strncmp(uri, "/admin/", 7) == 0) { admin_handle_request(client, uri); @@ -703,8 +725,7 @@ free(fullpath); return; } - else if(fileserve && stat(fullpath, &statbuf) == 0 && - S_ISREG(statbuf.st_mode)) + else if(fileserve && stat(fullpath, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) { fserve_client_create(client, fullpath); free(fullpath); diff -ur icecast/src/connection.h IceCast/src/connection.h --- icecast/src/connection.h 2003-03-14 21:10:17.000000000 -0500 +++ IceCast/src/connection.h 2003-04-18 09:13:23.000000000 -0400 @@ -17,6 +17,7 @@ uint64_t sent_bytes; int sock; + int serversock; int error; char *ip; @@ -31,7 +32,7 @@ void connection_shutdown(void); void connection_accept_loop(void); void connection_close(connection_t *con); -connection_t *create_connection(sock_t sock, char *ip); +connection_t *create_connection(sock_t sock, sock_t serversock, char *ip); int connection_create_source(struct _client_tag *client, connection_t *con, http_parser_t *parser, char *mount); Only in IceCast/src: connection.o Only in IceCast/src: event.o Only in IceCast/src: format.o Only in IceCast/src: format_mp3.o Only in IceCast/src: format_vorbis.o Only in IceCast/src: fserve.o Only in IceCast/src: geturl.o Only in IceCast/src: global.o Only in IceCast/src/httpp: .deps Only in IceCast/src/httpp: .libs Only in IceCast/src/httpp: Makefile Only in IceCast/src/httpp: Makefile.in Only in IceCast/src/httpp: libicehttpp.la Only in IceCast/src/httpp: libicehttpp_la-httpp.lo Only in IceCast/src/httpp: libicehttpp_la-httpp.o Only in IceCast/src: icecast Only in IceCast/src/log: .deps Only in IceCast/src/log: .libs Only in IceCast/src/log: Makefile Only in IceCast/src/log: Makefile.in Only in IceCast/src/log: libicelog.la Only in IceCast/src/log: log.lo Only in IceCast/src/log: log.o Only in IceCast/src: logging.o Only in IceCast/src: main.o Only in IceCast/src/net: .deps Only in IceCast/src/net: .libs Only in IceCast/src/net: Makefile Only in IceCast/src/net: Makefile.in Only in IceCast/src/net: libicenet.la Only in IceCast/src/net: libicenet_la-resolver.lo Only in IceCast/src/net: libicenet_la-resolver.o Only in IceCast/src/net: libicenet_la-sock.lo Only in IceCast/src/net: libicenet_la-sock.o Only in IceCast/src: refbuf.o Only in IceCast/src: sighandler.o diff -ur icecast/src/slave.c IceCast/src/slave.c --- icecast/src/slave.c 2003-03-27 12:10:02.000000000 -0500 +++ IceCast/src/slave.c 2003-04-18 09:13:27.000000000 -0400 @@ -91,7 +91,7 @@ WARN2("Failed to relay stream from master server, couldn't connect to http://%s:%d", server, port); return; } - con = create_connection(streamsock, NULL); + con = create_connection(streamsock, -1, NULL); if(mp3) { /* Some mp3 servers are bitchy, send a user-agent string to make them * send the right response. Only in IceCast/src: slave.o Only in IceCast/src: source.o Only in IceCast/src: stats.o Only in IceCast/src/thread: .deps Only in IceCast/src/thread: .libs Only in IceCast/src/thread: Makefile Only in IceCast/src/thread: Makefile.in Only in IceCast/src/thread: libicethread.la Only in IceCast/src/thread: libicethread_la-thread.lo Only in IceCast/src/thread: libicethread_la-thread.o Only in IceCast/src/timing: .deps Only in IceCast/src/timing: .libs Only in IceCast/src/timing: Makefile Only in IceCast/src/timing: Makefile.in Only in IceCast/src/timing: libicetiming.la Only in IceCast/src/timing: libicetiming_la-timing.lo Only in IceCast/src/timing: libicetiming_la-timing.o Only in IceCast/src: util.o Only in IceCast/src: xslt.o Only in IceCast/src: yp.o Only in IceCast/web: Makefile Only in IceCast/web: Makefile.in Only in IceCast/win32: Makefile Only in IceCast/win32: Makefile.in Only in IceCast/win32/res: Makefile Only in IceCast/win32/res: Makefile.in
Michael Smith
2004-Aug-06 14:57 UTC
[icecast-dev] [PATCH] IceCast2 - aliasing (reimplementation of the patch I posted earlier)
On Saturday 19 April 2003 10:58, Paul Donohue wrote:> Reimplementation of my earlier patch - more proper aliasing - at the > suggestion of Mike > > -PaulSorry this took me a while to get to, Paul. It's committed to cvs now. Mike --- >8 ---- List archives: http://www.xiph.org/archives/ icecast project homepage: http://www.icecast.org/ To unsubscribe from this list, send a message to 'icecast-dev-request@xiph.org' containing only the word 'unsubscribe' in the body. No subject is needed. Unsubscribe messages sent to the list will be ignored/filtered.