--- /dev/null
+--- a/src/upnp.c
++++ b/src/upnp.c
+@@ -36,6 +36,7 @@
+ #include <uuid/uuid.h>
+ #include "intutil.h"
+ #include "gmediaserver.h"
++#include "webserver.h"
+ #include "schemas/MediaServer.h"
+
+ #define GMEDIASERVER_SSDP_PAUSE 100
+@@ -265,7 +266,7 @@ handle_get_var_request(struct Upnp_State
+ say(3, _("Event device UDN: %s\n"), quotearg(request->DevUDN));
+ say(3, _("Event service ID: %s\n"), quotearg(request->ServiceID));
+ say(3, _("Event variable name: %s\n"), quotearg(request->StateVarName));
+- say(3, _("Event source: %s\n"), inet_ntoa(request->CtrlPtIPAddr));
++ say(3, _("Event source: %s\n"), inet_ntoa((*(struct sockaddr_in *)&request->CtrlPtIPAddr).sin_addr));
+
+ if (strcmp(request->DevUDN, device_udn) != 0) {
+ say(1, _("Discarding event - event device UDN (%s) not recognized\n"), quotearg(request->DevUDN));
+@@ -306,7 +307,7 @@ handle_action_request(struct Upnp_Action
+ say(3, _("Event device UDN: %s\n"), quotearg(request->DevUDN));
+ say(3, _("Event service ID: %s\n"), quotearg(request->ServiceID));
+ say(3, _("Event action name: %s\n"), quotearg(request->ActionName));
+- say(3, _("Event source: %s\n"), inet_ntoa(request->CtrlPtIPAddr));
++ say(3, _("Event source: %s\n"), inet_ntoa((*(struct sockaddr_in *)&request->CtrlPtIPAddr).sin_addr));
+ say_document(4, _("Event action request:\n"), request->ActionRequest);
+
+ if (strcmp(request->DevUDN, device_udn) != 0) {
+@@ -502,9 +503,24 @@ init_upnp(const char *listenip, uint16_t
+ res = UpnpEnableWebserver(TRUE);
+ if (res != UPNP_E_SUCCESS)
+ die(_("cannot enable UPnP web server - %s\n"), upnp_errmsg(res));
+- res = UpnpSetVirtualDirCallbacks(&virtual_dir_callbacks);
+- if (res != UPNP_E_SUCCESS)
+- die(_("cannot set virtual directory callbacks - %s\n"), upnp_errmsg(res));
++
++#define upnp_set_callback(cb, func) \
++ do { \
++ res = UpnpVirtualDir_set_##cb##Callback(func); \
++ if (res != UPNP_E_SUCCESS) \
++ { \
++ die(_("cannot set virtual directory callbacks - %s\n"), \
++ upnp_errmsg(res)); \
++ } \
++ } while(0)
++
++ upnp_set_callback(GetInfo, webserver_get_info);
++ upnp_set_callback(Open, webserver_open);
++ upnp_set_callback(Read, webserver_read);
++ upnp_set_callback(Seek, webserver_seek);
++ upnp_set_callback(Write, webserver_write);
++ upnp_set_callback(Close, webserver_close);
++
+ res = UpnpAddVirtualDir("/files");
+ if (res != UPNP_E_SUCCESS)
+ die(_("cannot add virtual directory for web server - %s\n"), upnp_errmsg(res));
+--- a/src/webserver.c
++++ b/src/webserver.c
+@@ -83,7 +83,7 @@ get_entry_from_url(const char *filename)
+ return get_entry_by_id(id);
+ }
+
+-static int
++int
+ webserver_get_info(const char *filename, struct File_Info *info)
+ {
+ Entry *entry;
+@@ -180,7 +180,7 @@ webserver_get_info(const char *filename,
+ return -1;
+ }
+
+-static UpnpWebFileHandle
++UpnpWebFileHandle
+ webserver_open(const char *filename, enum UpnpOpenFileMode mode)
+ {
+ Entry *entry;
+@@ -277,7 +277,7 @@ webserver_open(const char *filename, enu
+ return NULL;
+ }
+
+-static int
++int
+ webserver_read(UpnpWebFileHandle fh, char *buf, size_t buflen)
+ {
+ WebServerFile *file = (WebServerFile *) fh;
+@@ -307,7 +307,7 @@ webserver_read(UpnpWebFileHandle fh, cha
+ return len;
+ }
+
+-static int
++int
+ webserver_write(UpnpWebFileHandle fh, char *buf, size_t buflen)
+ {
+ WebServerFile *file = (WebServerFile *) fh;
+@@ -317,7 +317,7 @@ webserver_write(UpnpWebFileHandle fh, ch
+ return -1;
+ }
+
+-static int
++int
+ webserver_seek(UpnpWebFileHandle fh, off_t offset, int origin)
+ {
+ WebServerFile *file = (WebServerFile *) fh;
+@@ -396,7 +396,7 @@ webserver_seek(UpnpWebFileHandle fh, off
+ return 0;
+ }
+
+-static int
++int
+ webserver_close(UpnpWebFileHandle fh)
+ {
+ WebServerFile *file = (WebServerFile *) fh;
+@@ -419,12 +419,3 @@ webserver_close(UpnpWebFileHandle fh)
+
+ return 0;
+ }
+-
+-struct UpnpVirtualDirCallbacks virtual_dir_callbacks = {
+- webserver_get_info,
+- webserver_open,
+- webserver_read,
+- webserver_write,
+- webserver_seek,
+- webserver_close
+-};
+--- /dev/null
++++ b/src/webserver.h
+@@ -0,0 +1,6 @@
++int webserver_get_info(const char *filename, struct File_Info *info);
++UpnpWebFileHandle webserver_open(const char *filename, enum UpnpOpenFileMode mode);
++int webserver_read(UpnpWebFileHandle fh, char *buf, size_t buflen);
++int webserver_write(UpnpWebFileHandle fh, char *buf, size_t buflen);
++int webserver_seek(UpnpWebFileHandle fh, off_t offset, int origin);
++int webserver_close(UpnpWebFileHandle fh);
+--- a/src/contentdir.c
++++ b/src/contentdir.c
+@@ -22,6 +22,7 @@
+ #include <stdint.h> /* Gnulib/C99 */
+ #include <inttypes.h> /* ? */
+ #include <sys/stat.h> /* POSIX */
++#include <assert.h>
+ #include "gettext.h" /* Gnulib/gettext */
+ #define _(s) gettext(s)
+ #define N_(s) gettext_noop(s)