[icecast-dev] [PATCH] IceCast2 - socket-based default mount

Paul Donohue icecast at TopQuark.net
Fri Apr 18 08:02:40 PDT 2003


I wrote a patch which makes client connections retain info about which
socket they connected to - this way, you can change the server's behavior
based on which <listen-socket> is being connected to.

In addition, I added a field to the <listen-socket> section of the config
file called <default-mount> which specifies a default file in the
case that one isn't specified (it doesn't have to be a mount point - it
can be any valid URI) - this way, if the user doesn't specify a specific
file or stream or whatever, you can have it default to something.

So, now http://myserver.com:8000/ actually does something :)
and http://myserver.com:8001/ can do something else without running a
separate instance of the server

-Paul

-------------- next part --------------
diff -ur icecast/CVS/Entries IceCast/CVS/Entries
--- icecast/CVS/Entries	2003-04-18 09:15:58.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//
@@ -10,4 +9,9 @@
 /acinclude.m4/1.3/Fri Mar 14 00:45:49 2003//
 /autogen.sh/1.2/Thu Jul 11 03:54:11 2002//
 /configure.in/1.27/Thu Mar 27 17:09:33 2003//
-D
+D/conf////
+D/doc////
+D/src////
+D/web////
+D/win32////
+/.cvsignore/1.3/Fri Apr 18 02:14:16 2003//
diff -ur icecast/CVS/Entries.Log IceCast/CVS/Entries.Log
--- icecast/CVS/Entries.Log	2003-04-18 09:15:59.000000000 -0400
+++ IceCast/CVS/Entries.Log	2003-04-18 09:15:58.000000000 -0400
@@ -1,5 +1 @@
-A D/conf////
-A D/doc////
-A D/src////
-A D/web////
-A D/win32////
+A D/icecast////
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 10:01:45.000000000 -0400
@@ -41,6 +41,7 @@
     <listen-socket>
         <port>8000</port>
         <!-- <bind-address>127.0.0.1</bind-address> -->
+        <default-mount>/index.html</default-mount>
     </listen-socket>
     <!--
     <listen-socket>
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 09:15:59.000000000 -0400
+++ IceCast/src/CVS/Entries	2003-04-18 09:14:25.000000000 -0400
@@ -6,11 +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.c/1.67/Thu Mar 27 17:09:41 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//
@@ -33,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//
@@ -45,4 +40,14 @@
 /xslt.h/1.3/Tue Aug 13 12:46:45 2002//
 /yp.c/1.8/Fri Apr 11 03:00:24 2003//
 /yp.h/1.6/Thu Mar 27 17:10:14 2003//
-D
+D/avl////
+D/log////
+D/net////
+D/httpp////
+D/thread////
+D/timing////
+/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/CVS: Entries.Log
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 10:15:44.000000000 -0400
@@ -127,6 +127,7 @@
         xmlFree(c->error_log);
     for(i=0; i < MAX_LISTEN_SOCKETS; i++) {
         if (c->listeners[i].bind_address) xmlFree(c->listeners[i].bind_address);
+        if (c->listeners[i].default_mount) xmlFree(c->listeners[i].default_mount);
     }
     if (c->master_server) xmlFree(c->master_server);
     if (c->master_password) xmlFree(c->master_password);
@@ -266,6 +267,7 @@
     configuration->port = 0;
     configuration->listeners[0].port = 0;
     configuration->listeners[0].bind_address = NULL;
+    configuration->listeners[0].default_mount = NULL;
     configuration->master_server = NULL;
     configuration->master_server_port = 0;
     configuration->master_update_interval = CONFIG_MASTER_UPDATE_INTERVAL;
@@ -333,6 +335,10 @@
             if (configuration->listeners[0].bind_address) 
                 xmlFree(configuration->listeners[0].bind_address);
             configuration->listeners[0].bind_address = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
+        } else if (strcmp(node->name, "default-mount") == 0) {
+            if (configuration->listeners[0].default_mount) 
+                xmlFree(configuration->listeners[0].default_mount);
+            configuration->listeners[0].default_mount = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
         } else if (strcmp(node->name, "master-server") == 0) {
             if (configuration->master_server) xmlFree(configuration->master_server);
             configuration->master_server = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
@@ -532,6 +538,10 @@
             listener->bind_address = (char *)xmlNodeListGetString(doc, 
                     node->xmlChildrenNode, 1);
         }
+        else if (strcmp(node->name, "default-mount") == 0) {
+            listener->default_mount = (char *)xmlNodeListGetString(doc, 
+                    node->xmlChildrenNode, 1);
+        }
     } 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 09:13:10.000000000 -0400
@@ -46,6 +46,7 @@
 typedef struct {
     int port;
     char *bind_address;
+    char *default_mount;
 } listener_t;
 
 typedef struct ice_config_tag
Only in IceCast/src: config.o
diff -ur icecast/src/connection.c IceCast/src/connection.c
--- icecast/src/connection.c	2003-03-27 12:09:41.000000000 -0500
+++ IceCast/src/connection.c	2003-04-18 09:44:50.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,8 @@
     int fileserve;
     char *host;
     int port;
+    int i;
+    char *default_mount;
     ice_config_t *config;
     int client_limit;
 
@@ -655,6 +658,13 @@
     fileserve = config->fileserve;
     host = config->hostname;
     port = config->port;
+    default_mount = NULL;
+    for(i = 0; i < MAX_LISTEN_SOCKETS; i++) {
+        if(global.serversock[i] == con->serversock) {
+            default_mount = config->listeners[i].default_mount;
+            break;
+        }
+    }
     client_limit = config->client_limit;
     config_release_config();
 
@@ -668,13 +678,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 default requests */
+    if(strcmp(uri, "/") == 0) {
+        if(default_mount == NULL) {
+            client_send_404(client, "The file you requested could not be found");
+            return;
+        }
+        uri = default_mount;
+    }
+
     /* Dispatch all admin requests */
     if (strncmp(uri, "/admin/", 7) == 0) {
         admin_handle_request(client, uri);
@@ -705,6 +724,12 @@
     }
     else if(fileserve && stat(fullpath, &statbuf) == 0) 
     {
+        if(!S_ISREG(statbuf.st_mode) && !S_ISLNK(statbuf.st_mode))
+        {
+          client_send_404(client, "Access denied");
+          free(fullpath);
+          return;
+        }
         fserve_client_create(client, fullpath);
         free(fullpath);
         return;
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
diff -ur icecast/win32/CVS/Entries IceCast/win32/CVS/Entries
--- icecast/win32/CVS/Entries	2003-04-18 09:15:59.000000000 -0400
+++ IceCast/win32/CVS/Entries	2003-04-17 22:14:16.000000000 -0400
@@ -35,4 +35,4 @@
 /resource.h/1.4/Wed Aug 28 20:37:44 2002//
 /running.bmp/1.1/Fri Aug  9 15:55:01 2002/-kb/
 /stopped.bmp/1.1/Fri Aug  9 15:55:01 2002/-kb/
-D
+D/res////
Only in icecast/win32/CVS: Entries.Log
Only in IceCast/win32: Makefile
Only in IceCast/win32: Makefile.in
Only in IceCast/win32/res: Makefile
Only in IceCast/win32/res: Makefile.in


More information about the Icecast-dev mailing list