mt-daapd-cvs Mailing List for Multi-Threaded DAAP Daemon
Status: Beta
Brought to you by:
andrew40
You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(6) |
Jul
|
Aug
|
Sep
(41) |
Oct
(27) |
Nov
(62) |
Dec
(35) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(33) |
Feb
(34) |
Mar
(51) |
Apr
(32) |
May
(24) |
Jun
(16) |
Jul
(8) |
Aug
(9) |
Sep
(20) |
Oct
(28) |
Nov
(38) |
Dec
(3) |
2006 |
Jan
(46) |
Feb
(43) |
Mar
(46) |
Apr
|
May
(151) |
Jun
(117) |
Jul
(47) |
Aug
(46) |
Sep
(6) |
Oct
(37) |
Nov
(33) |
Dec
(19) |
2007 |
Jan
(29) |
Feb
(1) |
Mar
(16) |
Apr
(56) |
May
(30) |
Jun
(8) |
Jul
(13) |
Aug
(21) |
Sep
(29) |
Oct
(24) |
Nov
(3) |
Dec
(9) |
2008 |
Jan
(5) |
Feb
(2) |
Mar
|
Apr
(9) |
May
(1) |
Jun
(10) |
Jul
|
Aug
|
Sep
(2) |
Oct
|
Nov
|
Dec
|
From: <rp...@us...> - 2008-09-15 21:33:52
|
Revision: 1737 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1737&view=rev Author: rpedde Date: 2008-09-16 04:33:50 +0000 (Tue, 16 Sep 2008) Log Message: ----------- remove aspl license from nsi Modified Paths: -------------- branches/stable-aspl-free/win32/nsi/mt-daapd.nsi.templ Modified: branches/stable-aspl-free/win32/nsi/mt-daapd.nsi.templ =================================================================== --- branches/stable-aspl-free/win32/nsi/mt-daapd.nsi.templ 2008-09-16 04:12:50 UTC (rev 1736) +++ branches/stable-aspl-free/win32/nsi/mt-daapd.nsi.templ 2008-09-16 04:33:50 UTC (rev 1737) @@ -224,8 +224,6 @@ File "${ADMIN_ROOT}\config.html" File "${ADMIN_ROOT}\config.js" File "${ADMIN_ROOT}\config.xml" - File "${ADMIN_ROOT}\aspl-license.txt" - File "${ADMIN_ROOT}\aspl-license.html" File "${ADMIN_ROOT}\zlib-license.txt" File "${ADMIN_ROOT}\zlib-license.html" File "${ADMIN_ROOT}\xiph-license.txt" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-09-15 21:12:53
|
Revision: 1736 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1736&view=rev Author: rpedde Date: 2008-09-16 04:12:50 +0000 (Tue, 16 Sep 2008) Log Message: ----------- Only log fatals to syslog Modified Paths: -------------- branches/stable-aspl-free/src/err.c Modified: branches/stable-aspl-free/src/err.c =================================================================== --- branches/stable-aspl-free/src/err.c 2008-06-09 04:10:20 UTC (rev 1735) +++ branches/stable-aspl-free/src/err.c 2008-09-16 04:12:50 UTC (rev 1736) @@ -179,7 +179,7 @@ } /* always log fatals and level 1 to syslog */ - if(level <= 1) { + if(level < 1) { if(!err_syslog_open) os_opensyslog(); err_syslog_open=1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-09 04:10:26
|
Revision: 1735 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1735&view=rev Author: rpedde Date: 2008-06-08 21:10:20 -0700 (Sun, 08 Jun 2008) Log Message: ----------- Add favicon.ico Modified Paths: -------------- branches/release-1.2-pre/admin-root/Makefile.am Modified: branches/release-1.2-pre/admin-root/Makefile.am =================================================================== --- branches/release-1.2-pre/admin-root/Makefile.am 2008-06-09 00:28:46 UTC (rev 1734) +++ branches/release-1.2-pre/admin-root/Makefile.am 2008-06-09 04:10:20 UTC (rev 1735) @@ -10,7 +10,7 @@ playlist.html playlist.js smart.html smart.js DAAPApplet-0.1.jar \ smartpopup.html applet.html firefly.js CREDITS status.js \ config.js config.xml spinner.gif spinner_stopped.gif util.js \ - pngfix.js no_access.html index.css config.css + pngfix.js no_access.html index.css config.css favicon.ico EXTRA_DIST = ftr.html linkOpaque.gif about.html aspl-license.txt \ gpl-license.txt linkTransparent.gif config-update.html hdr.html \ @@ -19,5 +19,5 @@ playlist.html playlist.js smart.html smart.js DAAPApplet-0.1.jar \ smartpopup.html applet.html firefly.js CREDITS status.js \ config.js config.xml spinner.gif spinner_stopped.gif util.js \ - pngfix.js no_access.html index.css config.css + pngfix.js no_access.html index.css config.css favicon.ico This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-09 00:28:48
|
Revision: 1734 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1734&view=rev Author: rpedde Date: 2008-06-08 17:28:46 -0700 (Sun, 08 Jun 2008) Log Message: ----------- typo Modified Paths: -------------- branches/release-1.2-pre/src/plugins/Makefile.am Modified: branches/release-1.2-pre/src/plugins/Makefile.am =================================================================== --- branches/release-1.2-pre/src/plugins/Makefile.am 2008-06-09 00:20:48 UTC (rev 1733) +++ branches/release-1.2-pre/src/plugins/Makefile.am 2008-06-09 00:28:46 UTC (rev 1734) @@ -25,7 +25,7 @@ out_daap_la_SOURCES=out-daap.c out-daap-proto.c EXTRA_DIST = compat.h rsp.h xml-rpc.h ssc-ffmpeg.c ssc-script.c out-daap.h \ - out-daap-proto.h w32-event.c ssc-wma.c + out-daap-proto.h w32-event.c ssc-wma.cpp AM_CFLAGS = -I.. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-09 00:20:50
|
Revision: 1733 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1733&view=rev Author: rpedde Date: 2008-06-08 17:20:48 -0700 (Sun, 08 Jun 2008) Log Message: ----------- More fixes for win32 build Modified Paths: -------------- branches/release-1.2-pre/src/plugins/Makefile.am branches/release-1.2-pre/win32/FireflyShell/Makefile.am branches/release-1.2-pre/win32/FireflyShell/res/Makefile.am branches/release-1.2-pre/win32/FireflyShell/version.h.templ branches/release-1.2-pre/win32/mt-daapd.rc.templ branches/release-1.2-pre/win32/out-daap/out-daap.rc.templ branches/release-1.2-pre/win32/rsp.rc.templ branches/release-1.2-pre/win32/ssc-ffmpeg.rc.templ branches/release-1.2-pre/win32/ssc-wma/ssc-wma.rc.templ branches/release-1.2-pre/win32/w32-event.rc.templ Modified: branches/release-1.2-pre/src/plugins/Makefile.am =================================================================== --- branches/release-1.2-pre/src/plugins/Makefile.am 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/src/plugins/Makefile.am 2008-06-09 00:20:48 UTC (rev 1733) @@ -25,7 +25,7 @@ out_daap_la_SOURCES=out-daap.c out-daap-proto.c EXTRA_DIST = compat.h rsp.h xml-rpc.h ssc-ffmpeg.c ssc-script.c out-daap.h \ - out-daap-proto.h w32-event.c + out-daap-proto.h w32-event.c ssc-wma.c AM_CFLAGS = -I.. Modified: branches/release-1.2-pre/win32/FireflyShell/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/FireflyShell/Makefile.am 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/FireflyShell/Makefile.am 2008-06-09 00:20:48 UTC (rev 1733) @@ -6,13 +6,14 @@ ConfigPage.cpp ConfigPage.h DosPath.cpp DosPath.h FireflyShell.DEU.rc \ FireflyShell.cpp FireflyShell.h FireflyShell.rc FireflyShell.vcproj \ FireflyShellDEU.vcproj FireflyShellFRA.rc FireflyShellITA.rc \ + FireflyShellFRA.vcproj \ FireflyShellITA.vcproj FireflyShellJPN.rc FireflyShellJPN.vcproj \ FireflyShellNLD.rc FireflyShellNLD.vcproj FireflyShellSWE.rc \ FireflyShellSWE.vcproj IniFile.h LogPage.cpp LogPage.h MainDlg.cpp \ - MainDlg.h NotifyIcon.cpp README.txt ServerEvents.cpp ServerEvents.h \ + MainDlg.h NotifyIcon.cpp NotifyIcon.h ServerEvents.cpp ServerEvents.h \ ServiceControl.cpp ServiceControl.h VersionInfo.cpp VersionInfo.h \ resource.h singleton.h stdafx.cpp stdafx.h version.h.templ version.rc \ - FireflyShell.exe.manifest + FireflyShell.exe.manifest README.txt Modified: branches/release-1.2-pre/win32/FireflyShell/res/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/FireflyShell/res/Makefile.am 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/FireflyShell/res/Makefile.am 2008-06-09 00:20:48 UTC (rev 1733) @@ -1,7 +1,8 @@ # $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ # -EXTRA_DIST = FireflyShell.ico ShellStopped.ico +EXTRA_DIST = FireflyShell.ico ShellStopped.ico ShellRunning.ico \ + logo.bmp Modified: branches/release-1.2-pre/win32/FireflyShell/version.h.templ =================================================================== --- branches/release-1.2-pre/win32/FireflyShell/version.h.templ 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/FireflyShell/version.h.templ 2008-06-09 00:20:48 UTC (rev 1733) @@ -1,13 +1,12 @@ /* Version number of package */ #define VERSION_MAJOR 1 -#define VERSION_MID 0 +#define VERSION_MID 2 #define VERSION_MINOR 0 #define VERSION_BUILD $WCREV$ -#define VERSION_LOCAL "$WCMODS? (LOCAL):$" #define BUILD_DATE "$WCNOW$" #define REPO_DATE "$WCDATE$" #define VERSION_STRIZE2(x) #x #define VERSION_STRIZE(x) VERSION_STRIZE2(x) -#define VERSION_STRING VERSION_STRIZE(VERSION_MAJOR) "." VERSION_STRIZE(VERSION_MID) " svn-" VERSION_STRIZE(VERSION_BUILD) VERSION_LOCAL +#define VERSION_STRING VERSION_STRIZE(VERSION_MAJOR) "." VERSION_STRIZE(VERSION_MID) " svn-" VERSION_STRIZE(VERSION_BUILD) Modified: branches/release-1.2-pre/win32/mt-daapd.rc.templ =================================================================== --- branches/release-1.2-pre/win32/mt-daapd.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/mt-daapd.rc.templ 2008-06-09 00:20:48 UTC (rev 1733) @@ -52,8 +52,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ + FILEVERSION 1,2,0,$WCREV$ + PRODUCTVERSION 1,2,0,$WCREV$ FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L Modified: branches/release-1.2-pre/win32/out-daap/out-daap.rc.templ =================================================================== --- branches/release-1.2-pre/win32/out-daap/out-daap.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/out-daap/out-daap.rc.templ 2008-06-09 00:20:48 UTC (rev 1733) @@ -53,8 +53,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ + FILEVERSION 1,2,0,$WCREV$ + PRODUCTVERSION 1,2,0,$WCREV$ FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L Modified: branches/release-1.2-pre/win32/rsp.rc.templ =================================================================== --- branches/release-1.2-pre/win32/rsp.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/rsp.rc.templ 2008-06-09 00:20:48 UTC (rev 1733) @@ -53,8 +53,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ + FILEVERSION 1,2,0,$WCREV$ + PRODUCTVERSION 1,2,0,$WCREV$ FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L Modified: branches/release-1.2-pre/win32/ssc-ffmpeg.rc.templ =================================================================== --- branches/release-1.2-pre/win32/ssc-ffmpeg.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/ssc-ffmpeg.rc.templ 2008-06-09 00:20:48 UTC (rev 1733) @@ -53,8 +53,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ + FILEVERSION 1,2,0,$WCREV$ + PRODUCTVERSION 1,2,0,$WCREV$ FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L Modified: branches/release-1.2-pre/win32/ssc-wma/ssc-wma.rc.templ =================================================================== --- branches/release-1.2-pre/win32/ssc-wma/ssc-wma.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/ssc-wma/ssc-wma.rc.templ 2008-06-09 00:20:48 UTC (rev 1733) @@ -53,8 +53,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ + FILEVERSION 1,2,0,$WCREV$ + PRODUCTVERSION 1,2,0,$WCREV$ FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L Modified: branches/release-1.2-pre/win32/w32-event.rc.templ =================================================================== --- branches/release-1.2-pre/win32/w32-event.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) +++ branches/release-1.2-pre/win32/w32-event.rc.templ 2008-06-09 00:20:48 UTC (rev 1733) @@ -53,8 +53,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ + FILEVERSION 1,2,0,$WCREV$ + PRODUCTVERSION 1,2,0,$WCREV$ FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-08 22:06:28
|
Revision: 1732 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1732&view=rev Author: rpedde Date: 2008-06-08 15:06:25 -0700 (Sun, 08 Jun 2008) Log Message: ----------- update version strings for win32 build Modified Paths: -------------- branches/release-1.2-pre/win32/Makefile.am branches/release-1.2-pre/win32/mt-daapd.rc.templ branches/release-1.2-pre/win32/out-daap/out-daap.rc.templ branches/release-1.2-pre/win32/rsp.rc.templ branches/release-1.2-pre/win32/ssc-ffmpeg.rc.templ branches/release-1.2-pre/win32/ssc-wma/ssc-wma.rc.templ branches/release-1.2-pre/win32/w32-event.rc.templ Modified: branches/release-1.2-pre/win32/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/Makefile.am 2008-06-08 22:02:26 UTC (rev 1731) +++ branches/release-1.2-pre/win32/Makefile.am 2008-06-08 22:06:25 UTC (rev 1732) @@ -6,4 +6,4 @@ rsp-res.h rsp.def rsp.vcproj ssc-ffmpeg-res.h ssc-ffmpeg.def \ ssc-ffmpeg.vcproj versionize.bat w32-event-res.h w32-event.def \ w32-event.vcproj config.h.templ rsp.rc.templ ssc-ffmpeg.rc.templ \ - w32-event.rc.templ + w32-event.rc.templ mt-daapd.rc.templ Modified: branches/release-1.2-pre/win32/mt-daapd.rc.templ =================================================================== --- branches/release-1.2-pre/win32/mt-daapd.rc.templ 2008-06-08 22:02:26 UTC (rev 1731) +++ branches/release-1.2-pre/win32/mt-daapd.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) @@ -71,12 +71,12 @@ VALUE "Comments", "http://www.fireflymediaserver.org" VALUE "CompanyName", "Ron Pedde" VALUE "FileDescription", "Firefly Service" - VALUE "FileVersion", "1.0 svn-$WCREV$" + VALUE "FileVersion", "svn-$WCREV$" VALUE "InternalName", "firefly" VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" VALUE "OriginalFilename", "firefly.exe" VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" + VALUE "ProductVersion", "svn-$WCREV$" END END BLOCK "VarFileInfo" Modified: branches/release-1.2-pre/win32/out-daap/out-daap.rc.templ =================================================================== --- branches/release-1.2-pre/win32/out-daap/out-daap.rc.templ 2008-06-08 22:02:26 UTC (rev 1731) +++ branches/release-1.2-pre/win32/out-daap/out-daap.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) @@ -72,12 +72,12 @@ VALUE "Comments", "http://www.fireflymediaserver.org" VALUE "CompanyName", "Ron Pedde" VALUE "FileDescription", "DAAP Output Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" + VALUE "FileVersion", "svn-$WCREV$" VALUE "InternalName", "out-daap" VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" VALUE "OriginalFilename", "out-daap.dll" VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" + VALUE "ProductVersion", "svn-$WCREV$" END END BLOCK "VarFileInfo" Modified: branches/release-1.2-pre/win32/rsp.rc.templ =================================================================== --- branches/release-1.2-pre/win32/rsp.rc.templ 2008-06-08 22:02:26 UTC (rev 1731) +++ branches/release-1.2-pre/win32/rsp.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) @@ -72,12 +72,12 @@ VALUE "Comments", "http://www.fireflymediaserver.org" VALUE "CompanyName", "Ron Pedde" VALUE "FileDescription", "RSP Output Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" + VALUE "FileVersion", "svn-$WCREV$" VALUE "InternalName", "rsp" VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" VALUE "OriginalFilename", "rsp.dll" VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" + VALUE "ProductVersion", "svn-$WCREV$" END END BLOCK "VarFileInfo" Modified: branches/release-1.2-pre/win32/ssc-ffmpeg.rc.templ =================================================================== --- branches/release-1.2-pre/win32/ssc-ffmpeg.rc.templ 2008-06-08 22:02:26 UTC (rev 1731) +++ branches/release-1.2-pre/win32/ssc-ffmpeg.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) @@ -72,12 +72,12 @@ VALUE "Comments", "http://www.fireflymediaserver.org" VALUE "CompanyName", "Ron Pedde" VALUE "FileDescription", "FFMPEG Transcoder Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" + VALUE "FileVersion", "svn-$WCREV$" VALUE "InternalName", "ssc-ffmpeg" VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" VALUE "OriginalFilename", "ssc-ffmpeg.dll" VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" + VALUE "ProductVersion", "svn-$WCREV$" END END BLOCK "VarFileInfo" Modified: branches/release-1.2-pre/win32/ssc-wma/ssc-wma.rc.templ =================================================================== --- branches/release-1.2-pre/win32/ssc-wma/ssc-wma.rc.templ 2008-06-08 22:02:26 UTC (rev 1731) +++ branches/release-1.2-pre/win32/ssc-wma/ssc-wma.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) @@ -72,12 +72,12 @@ VALUE "Comments", "http://www.fireflymediaserver.org" VALUE "CompanyName", "Ron Pedde" VALUE "FileDescription", "WMA Transcoder Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" + VALUE "FileVersion", "svn-$WCREV$" VALUE "InternalName", "ssc-wma" VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" VALUE "OriginalFilename", "ssc-wma.dll" VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" + VALUE "ProductVersion", "svn-$WCREV$" END END BLOCK "VarFileInfo" Modified: branches/release-1.2-pre/win32/w32-event.rc.templ =================================================================== --- branches/release-1.2-pre/win32/w32-event.rc.templ 2008-06-08 22:02:26 UTC (rev 1731) +++ branches/release-1.2-pre/win32/w32-event.rc.templ 2008-06-08 22:06:25 UTC (rev 1732) @@ -72,12 +72,12 @@ VALUE "Comments", "http://www.fireflymediaserver.org" VALUE "CompanyName", "Ron Pedde" VALUE "FileDescription", "Win32 Event Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" + VALUE "FileVersion", "svn-$WCREV$" VALUE "InternalName", "w32-event" VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" VALUE "OriginalFilename", "w32-event.dll" VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" + VALUE "ProductVersion", "svn-$WCREV$" END END BLOCK "VarFileInfo" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-08 22:02:28
|
Revision: 1731 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1731&view=rev Author: rpedde Date: 2008-06-08 15:02:26 -0700 (Sun, 08 Jun 2008) Log Message: ----------- Add w32-event.c to dist for windows build Modified Paths: -------------- branches/release-1.2-pre/src/plugins/Makefile.am Modified: branches/release-1.2-pre/src/plugins/Makefile.am =================================================================== --- branches/release-1.2-pre/src/plugins/Makefile.am 2008-06-08 22:01:32 UTC (rev 1730) +++ branches/release-1.2-pre/src/plugins/Makefile.am 2008-06-08 22:02:26 UTC (rev 1731) @@ -25,7 +25,7 @@ out_daap_la_SOURCES=out-daap.c out-daap-proto.c EXTRA_DIST = compat.h rsp.h xml-rpc.h ssc-ffmpeg.c ssc-script.c out-daap.h \ - out-daap-proto.h + out-daap-proto.h w32-event.c AM_CFLAGS = -I.. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-08 22:01:45
|
Revision: 1730 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1730&view=rev Author: rpedde Date: 2008-06-08 15:01:32 -0700 (Sun, 08 Jun 2008) Log Message: ----------- Add rend-win32.c to dist for windows build Modified Paths: -------------- branches/release-1.2-pre/src/Makefile.am Modified: branches/release-1.2-pre/src/Makefile.am =================================================================== --- branches/release-1.2-pre/src/Makefile.am 2008-06-08 22:00:19 UTC (rev 1729) +++ branches/release-1.2-pre/src/Makefile.am 2008-06-08 22:01:32 UTC (rev 1730) @@ -80,4 +80,5 @@ db-sql-sqlite3.h db-sql-sqlite3.c \ w32-eventlog.c w32-eventlog.h w32-service.c w32-service.h \ os-win32.h os-win32.c win32.h db-gdbm.c db-gdbm.h \ - ff-plugins.h ff-dbstruct.h upnp.c upnp.h getopt.c getopt.h + ff-plugins.h ff-dbstruct.h upnp.c upnp.h getopt.c getopt.h \ + rend-win32.c This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-08 22:00:43
|
Revision: 1729 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1729&view=rev Author: rpedde Date: 2008-06-08 15:00:19 -0700 (Sun, 08 Jun 2008) Log Message: ----------- Add getopt.c and getop.h for windows build Modified Paths: -------------- branches/release-1.2-pre/src/Makefile.am Modified: branches/release-1.2-pre/src/Makefile.am =================================================================== --- branches/release-1.2-pre/src/Makefile.am 2008-06-01 23:35:48 UTC (rev 1728) +++ branches/release-1.2-pre/src/Makefile.am 2008-06-08 22:00:19 UTC (rev 1729) @@ -80,4 +80,4 @@ db-sql-sqlite3.h db-sql-sqlite3.c \ w32-eventlog.c w32-eventlog.h w32-service.c w32-service.h \ os-win32.h os-win32.c win32.h db-gdbm.c db-gdbm.h \ - ff-plugins.h ff-dbstruct.h upnp.c upnp.h + ff-plugins.h ff-dbstruct.h upnp.c upnp.h getopt.c getopt.h This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-01 23:35:51
|
Revision: 1728 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1728&view=rev Author: rpedde Date: 2008-06-01 16:35:48 -0700 (Sun, 01 Jun 2008) Log Message: ----------- More typos Modified Paths: -------------- branches/release-1.2-pre/win32/Makefile.am branches/release-1.2-pre/win32/nsi/localizations/Makefile.am Modified: branches/release-1.2-pre/win32/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/Makefile.am 2008-06-01 23:33:31 UTC (rev 1727) +++ branches/release-1.2-pre/win32/Makefile.am 2008-06-01 23:35:48 UTC (rev 1728) @@ -2,7 +2,7 @@ # SUBDIRS = FireflyShell nsi out-daap ssc-wma svcctrl -EXTRA_DIST = ff.ico messages.mc mt-daapd-res.hmt-daapd.sln mt-daapd.vcproj \ +EXTRA_DIST = ff.ico messages.mc mt-daapd-res.h mt-daapd.sln mt-daapd.vcproj \ rsp-res.h rsp.def rsp.vcproj ssc-ffmpeg-res.h ssc-ffmpeg.def \ ssc-ffmpeg.vcproj versionize.bat w32-event-res.h w32-event.def \ w32-event.vcproj config.h.templ rsp.rc.templ ssc-ffmpeg.rc.templ \ Modified: branches/release-1.2-pre/win32/nsi/localizations/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/nsi/localizations/Makefile.am 2008-06-01 23:33:31 UTC (rev 1727) +++ branches/release-1.2-pre/win32/nsi/localizations/Makefile.am 2008-06-01 23:35:48 UTC (rev 1728) @@ -1,7 +1,8 @@ # $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ # -EXTRA_DIST = Dutch.nsh English.nsh French.nsh German.nsh Italian.ns Japanese.nsh Swedish.nsh +EXTRA_DIST = Dutch.nsh English.nsh French.nsh German.nsh Italian.nsh\ + Japanese.nsh Swedish.nsh This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-01 23:33:32
|
Revision: 1727 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1727&view=rev Author: rpedde Date: 2008-06-01 16:33:31 -0700 (Sun, 01 Jun 2008) Log Message: ----------- typos Modified Paths: -------------- branches/release-1.2-pre/configure.in Modified: branches/release-1.2-pre/configure.in =================================================================== --- branches/release-1.2-pre/configure.in 2008-06-01 23:30:32 UTC (rev 1726) +++ branches/release-1.2-pre/configure.in 2008-06-01 23:33:31 UTC (rev 1727) @@ -443,4 +443,4 @@ AC_SUBST(V_NETLIBS) -AC_OUTPUT(src/Makefile src/plugins/Makefile admin-root/Makefile admin-root/lib-js/Makefile admin-root/lib-js/script.aculo.us/Makefile contrib/Makefile contrib/init.d/Makefile src/mdns/Makefile win32/Makefile win32/FireflyShell/Makefile win32/nsi/Makefile win32/out-daap/Makefile win32/ssc-wma/Makefile win32/svcctrl/Makefile win32/nsi/localization/Makefile win32/FierflyShell/res/Makefile Makefile) +AC_OUTPUT(src/Makefile src/plugins/Makefile admin-root/Makefile admin-root/lib-js/Makefile admin-root/lib-js/script.aculo.us/Makefile contrib/Makefile contrib/init.d/Makefile src/mdns/Makefile win32/Makefile win32/FireflyShell/Makefile win32/nsi/Makefile win32/out-daap/Makefile win32/ssc-wma/Makefile win32/svcctrl/Makefile win32/nsi/localizations/Makefile win32/FireflyShell/res/Makefile Makefile) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-06-01 23:30:34
|
Revision: 1726 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1726&view=rev Author: rpedde Date: 2008-06-01 16:30:32 -0700 (Sun, 01 Jun 2008) Log Message: ----------- Forgot to build makefiles for dist target on win32 Modified Paths: -------------- branches/release-1.2-pre/configure.in branches/release-1.2-pre/osx/FireflyPrefs/version.plist Modified: branches/release-1.2-pre/configure.in =================================================================== --- branches/release-1.2-pre/configure.in 2008-05-29 13:42:49 UTC (rev 1725) +++ branches/release-1.2-pre/configure.in 2008-06-01 23:30:32 UTC (rev 1726) @@ -3,7 +3,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(config.h.in) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(mt-daapd,1.2.0-pre1) +AM_INIT_AUTOMAKE(mt-daapd,1.2-pre1) ACLOCAL="$ACLOCAL -I m4 $ACLOCAL_FLAGS" @@ -443,4 +443,4 @@ AC_SUBST(V_NETLIBS) -AC_OUTPUT(src/Makefile src/plugins/Makefile admin-root/Makefile admin-root/lib-js/Makefile admin-root/lib-js/script.aculo.us/Makefile contrib/Makefile contrib/init.d/Makefile src/mdns/Makefile Makefile) +AC_OUTPUT(src/Makefile src/plugins/Makefile admin-root/Makefile admin-root/lib-js/Makefile admin-root/lib-js/script.aculo.us/Makefile contrib/Makefile contrib/init.d/Makefile src/mdns/Makefile win32/Makefile win32/FireflyShell/Makefile win32/nsi/Makefile win32/out-daap/Makefile win32/ssc-wma/Makefile win32/svcctrl/Makefile win32/nsi/localization/Makefile win32/FierflyShell/res/Makefile Makefile) Modified: branches/release-1.2-pre/osx/FireflyPrefs/version.plist =================================================================== --- branches/release-1.2-pre/osx/FireflyPrefs/version.plist 2008-05-29 13:42:49 UTC (rev 1725) +++ branches/release-1.2-pre/osx/FireflyPrefs/version.plist 2008-06-01 23:30:32 UTC (rev 1726) @@ -2,15 +2,15 @@ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> - <key>BuildVersion</key> - <string>54</string> - <key>CFBundleShortVersionString</key> - <string>1.0</string> - <key>CFBundleVersion</key> - <string>1.0</string> - <key>ProjectName</key> - <string>PreferencePaneTemplate</string> - <key>SourceVersion</key> - <string>120000</string> + <key>BuildVersion</key> + <string>1725</string> + <key>CFBundleShortVersionString</key> + <string>1.2-pre1</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>ProjectName</key> + <string>PreferencePaneTemplate</string> + <key>SourceVersion</key> + <string>120000</string> </dict> </plist> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-05-29 13:43:07
|
Revision: 1725 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1725&view=rev Author: rpedde Date: 2008-05-29 06:42:49 -0700 (Thu, 29 May 2008) Log Message: ----------- Add Windows files to dist tarball Modified Paths: -------------- branches/release-1.2-pre/Makefile.am branches/release-1.2-pre/configure.in Added Paths: ----------- branches/release-1.2-pre/win32/FireflyShell/Makefile.am branches/release-1.2-pre/win32/FireflyShell/res/Makefile.am branches/release-1.2-pre/win32/Makefile.am branches/release-1.2-pre/win32/nsi/Makefile.am branches/release-1.2-pre/win32/nsi/localizations/Makefile.am branches/release-1.2-pre/win32/out-daap/Makefile.am branches/release-1.2-pre/win32/ssc-wma/Makefile.am branches/release-1.2-pre/win32/svcctrl/Makefile.am Modified: branches/release-1.2-pre/Makefile.am =================================================================== --- branches/release-1.2-pre/Makefile.am 2008-04-27 03:47:09 UTC (rev 1724) +++ branches/release-1.2-pre/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -1,7 +1,7 @@ # $Id$ # EXTRA_DIST = configure CREDITS -SUBDIRS=src admin-root contrib +SUBDIRS=src admin-root contrib win32 Modified: branches/release-1.2-pre/configure.in =================================================================== --- branches/release-1.2-pre/configure.in 2008-04-27 03:47:09 UTC (rev 1724) +++ branches/release-1.2-pre/configure.in 2008-05-29 13:42:49 UTC (rev 1725) @@ -3,7 +3,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(config.h.in) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(mt-daapd,0.2.1.1) +AM_INIT_AUTOMAKE(mt-daapd,1.2.0-pre1) ACLOCAL="$ACLOCAL -I m4 $ACLOCAL_FLAGS" Added: branches/release-1.2-pre/win32/FireflyShell/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/FireflyShell/Makefile.am (rev 0) +++ branches/release-1.2-pre/win32/FireflyShell/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -0,0 +1,19 @@ +# $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ +# +SUBDIRS = res + +EXTRA_DIST = AboutPage.cpp AboutPage.h AdvancedPage.cpp AdvancedPage.h \ + ConfigPage.cpp ConfigPage.h DosPath.cpp DosPath.h FireflyShell.DEU.rc \ + FireflyShell.cpp FireflyShell.h FireflyShell.rc FireflyShell.vcproj \ + FireflyShellDEU.vcproj FireflyShellFRA.rc FireflyShellITA.rc \ + FireflyShellITA.vcproj FireflyShellJPN.rc FireflyShellJPN.vcproj \ + FireflyShellNLD.rc FireflyShellNLD.vcproj FireflyShellSWE.rc \ + FireflyShellSWE.vcproj IniFile.h LogPage.cpp LogPage.h MainDlg.cpp \ + MainDlg.h NotifyIcon.cpp README.txt ServerEvents.cpp ServerEvents.h \ + ServiceControl.cpp ServiceControl.h VersionInfo.cpp VersionInfo.h \ + resource.h singleton.h stdafx.cpp stdafx.h version.h.templ version.rc \ + FireflyShell.exe.manifest + + + + Added: branches/release-1.2-pre/win32/FireflyShell/res/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/FireflyShell/res/Makefile.am (rev 0) +++ branches/release-1.2-pre/win32/FireflyShell/res/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -0,0 +1,9 @@ +# $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ +# + +EXTRA_DIST = FireflyShell.ico ShellStopped.ico + + + + + Added: branches/release-1.2-pre/win32/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/Makefile.am (rev 0) +++ branches/release-1.2-pre/win32/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -0,0 +1,9 @@ +# $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ +# +SUBDIRS = FireflyShell nsi out-daap ssc-wma svcctrl + +EXTRA_DIST = ff.ico messages.mc mt-daapd-res.hmt-daapd.sln mt-daapd.vcproj \ + rsp-res.h rsp.def rsp.vcproj ssc-ffmpeg-res.h ssc-ffmpeg.def \ + ssc-ffmpeg.vcproj versionize.bat w32-event-res.h w32-event.def \ + w32-event.vcproj config.h.templ rsp.rc.templ ssc-ffmpeg.rc.templ \ + w32-event.rc.templ Added: branches/release-1.2-pre/win32/nsi/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/nsi/Makefile.am (rev 0) +++ branches/release-1.2-pre/win32/nsi/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -0,0 +1,8 @@ +# $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ +# +SUBDIRS = localizations +EXTRA_DIST = manifest.xml mapping.ini mt-daapd-example.conf mt-daapd.nsi.templ \ + nsSCM.dll firefly.log + + + Added: branches/release-1.2-pre/win32/nsi/localizations/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/nsi/localizations/Makefile.am (rev 0) +++ branches/release-1.2-pre/win32/nsi/localizations/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -0,0 +1,8 @@ +# $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ +# + +EXTRA_DIST = Dutch.nsh English.nsh French.nsh German.nsh Italian.ns Japanese.nsh Swedish.nsh + + + + Added: branches/release-1.2-pre/win32/out-daap/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/out-daap/Makefile.am (rev 0) +++ branches/release-1.2-pre/win32/out-daap/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -0,0 +1,5 @@ +# $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ +# +EXTRA_DIST = out-daap.def out-daap.rc.templ out-daap.vcproj resource.h + + Added: branches/release-1.2-pre/win32/ssc-wma/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/ssc-wma/Makefile.am (rev 0) +++ branches/release-1.2-pre/win32/ssc-wma/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -0,0 +1,6 @@ +# $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ +# +EXTRA_DIST = resource.h ssc-wma.def ssc-wma.rc.templ ssc-wma.vcproj + + + Added: branches/release-1.2-pre/win32/svcctrl/Makefile.am =================================================================== --- branches/release-1.2-pre/win32/svcctrl/Makefile.am (rev 0) +++ branches/release-1.2-pre/win32/svcctrl/Makefile.am 2008-05-29 13:42:49 UTC (rev 1725) @@ -0,0 +1,8 @@ +# $Id: Makefile.am 1238 2006-06-18 04:54:13Z rpedde $ +# +EXTRA_DIST = resource.h small.ico stdafx.cpp stdafx.h svcctrl.cpp \ + svcctrl.exe.manifest svcctrl.h svcctrl.ico svcctrl.rc svcctrl.sln \ + svcctrl.vcproj + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-27 03:47:11
|
Revision: 1724 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1724&view=rev Author: rpedde Date: 2008-04-26 20:47:09 -0700 (Sat, 26 Apr 2008) Log Message: ----------- Fix txt records for apple mdns Modified Paths: -------------- branches/release-1.2-pre/src/main.c branches/release-1.2-pre/src/rend-osx.c Modified: branches/release-1.2-pre/src/main.c =================================================================== --- branches/release-1.2-pre/src/main.c 2008-04-26 22:47:44 UTC (rev 1723) +++ branches/release-1.2-pre/src/main.c 2008-04-27 03:47:09 UTC (rev 1724) @@ -541,13 +541,13 @@ servername = conf_get_servername(); memset(txtrecord,0,sizeof(txtrecord)); - txt_add(txtrecord,"txtvers=1"); + txt_add(txtrecord,"%s","txtvers=1"); txt_add(txtrecord,"Database ID=%0X",util_djb_hash_str(servername)); txt_add(txtrecord,"Machine ID=%0X",util_djb_hash_str(servername)); txt_add(txtrecord,"Machine Name=%s",servername); txt_add(txtrecord,"mtd-version=" VERSION); - txt_add(txtrecord,"iTSh Version=131073"); /* iTunes 6.0.4 */ - txt_add(txtrecord,"Version=196610"); /* iTunes 6.0.4 */ + txt_add(txtrecord,"%s","iTSh Version=131073"); /* iTunes 6.0.4 */ + txt_add(txtrecord,"%s","Version=196610"); /* iTunes 6.0.4 */ tmp = conf_alloc_string("general","password",NULL); if(tmp && (strlen(tmp)==0)) tmp=NULL; Modified: branches/release-1.2-pre/src/rend-osx.c =================================================================== --- branches/release-1.2-pre/src/rend-osx.c 2008-04-26 22:47:44 UTC (rev 1723) +++ branches/release-1.2-pre/src/rend-osx.c 2008-04-27 03:47:09 UTC (rev 1724) @@ -141,11 +141,16 @@ dns_service_discovery_ref dns_ref=NULL; char *src,*dst; int len; + char *txt_dup; - src=dst=txt; - while(src && (*src) && (src - txt < MAX_TEXT_LEN)) { + txt_dup = strdup(txt); + if(!txt_dup) + return -1; + + src=dst=txt_dup; + while(src && (*src) && (src - txt_dup < MAX_TEXT_LEN)) { len = (*src); - if((src + len + 1) - txt < MAX_TEXT_LEN) { + if((src + len + 1) - txt_dup < MAX_TEXT_LEN) { memmove(dst,src+1,len); dst += len; if(*src) { @@ -159,7 +164,8 @@ DPRINTF(E_DBG,L_REND,"Registering %s.%s (%d)\n",type,name,port); usPort=htons(port); - dns_ref=DNSServiceRegistrationCreate(name,type,"",usPort,txt,rend_reply,nil); + dns_ref=DNSServiceRegistrationCreate(name,type,"",usPort,txt_dup,rend_reply,nil); + free(txt_dup); if(rend_addtorunloop(dns_ref)) { DPRINTF(E_WARN,L_REND,"Add to runloop failed\n"); return -1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-26 22:47:59
|
Revision: 1723 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1723&view=rev Author: rpedde Date: 2008-04-26 15:47:44 -0700 (Sat, 26 Apr 2008) Log Message: ----------- Fix namespace issue on leopard for plugins Modified Paths: -------------- branches/release-1.2-pre/src/plugins/rsp.c Modified: branches/release-1.2-pre/src/plugins/rsp.c =================================================================== --- branches/release-1.2-pre/src/plugins/rsp.c 2008-04-26 21:23:39 UTC (rev 1722) +++ branches/release-1.2-pre/src/plugins/rsp.c 2008-04-26 22:47:44 UTC (rev 1723) @@ -39,21 +39,21 @@ void rsp_error(WS_CONNINFO *pwsc, PRIVINFO *ppi, int eno, char *estr); /* Globals */ -PLUGIN_OUTPUT_FN _pofn = { plugin_can_handle, plugin_handler, plugin_auth }; -PLUGIN_REND_INFO _pri[] = { +PLUGIN_OUTPUT_FN _rsp_pofn = { plugin_can_handle, plugin_handler, plugin_auth }; +PLUGIN_REND_INFO _rsp_pri[] = { { "_rsp._tcp", NULL }, { NULL, NULL } }; PLUGIN_INPUT_FN *_ppi; -PLUGIN_INFO _pi = { +PLUGIN_INFO _rsp_pi = { PLUGIN_VERSION, /* version */ PLUGIN_OUTPUT, /* type */ "rsp/" VERSION, /* server */ - &_pofn, /* output fns */ + &_rsp_pofn, /* output fns */ NULL, /* event fns */ NULL, /* transcode fns */ - _pri, /* rend info */ + _rsp_pri, /* rend info */ NULL /* transcode info */ }; @@ -152,7 +152,7 @@ */ PLUGIN_INFO *plugin_info(PLUGIN_INPUT_FN *ppi) { _ppi = ppi; - return &_pi; + return &_rsp_pi; } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-26 21:23:42
|
Revision: 1722 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1722&view=rev Author: rpedde Date: 2008-04-26 14:23:39 -0700 (Sat, 26 Apr 2008) Log Message: ----------- make rend-osx threading, not forking, to suppress leopard errors Modified Paths: -------------- branches/release-1.2-pre/src/Makefile.am branches/release-1.2-pre/src/rend-osx.c Modified: branches/release-1.2-pre/src/Makefile.am =================================================================== --- branches/release-1.2-pre/src/Makefile.am 2008-04-26 21:09:32 UTC (rev 1721) +++ branches/release-1.2-pre/src/Makefile.am 2008-04-26 21:23:39 UTC (rev 1722) @@ -19,7 +19,7 @@ endif if COND_REND_OSX -ORENDSRC=rend-osx.c rend-unix.c +ORENDSRC=rend-osx.c endif if COND_REND_AVAHI Modified: branches/release-1.2-pre/src/rend-osx.c =================================================================== --- branches/release-1.2-pre/src/rend-osx.c 2008-04-26 21:09:32 UTC (rev 1721) +++ branches/release-1.2-pre/src/rend-osx.c 2008-04-26 21:23:39 UTC (rev 1722) @@ -26,6 +26,7 @@ #include <unistd.h> #include <pwd.h> #include <pthread.h> +#include <signal.h> #include <sys/types.h> #include <libc.h> @@ -36,14 +37,17 @@ #include "daapd.h" #include "err.h" #include "os-unix.h" -#include "rend-unix.h" +#include "rend.h" CFRunLoopRef rend_runloop; CFRunLoopSourceRef rend_rls; pthread_t rend_tid; +#define MAX_TEXT_LEN 255 + /* Forwards */ void *rend_pipe_monitor(void* arg); +void *rend_runloop_threadproc(void* arg); /* * rend_stoprunloop @@ -109,36 +113,6 @@ } } -/* - * rend_pipe_monitor - */ -void *rend_pipe_monitor(void* arg) { - fd_set rset; - int result; - - - while(1) { - DPRINTF(E_DBG,L_REND,"Waiting for data\n"); - FD_ZERO(&rset); - FD_SET(rend_pipe_to[RD_SIDE],&rset); - - /* sit in a select spin until there is data on the to fd */ - while(((result=select(rend_pipe_to[RD_SIDE] + 1,&rset,NULL,NULL,NULL)) != -1) && - errno != EINTR) { - if(FD_ISSET(rend_pipe_to[RD_SIDE],&rset)) { - DPRINTF(E_DBG,L_REND,"Received a message from daap server\n"); - CFRunLoopSourceSignal(rend_rls); - CFRunLoopWakeUp(rend_runloop); - sleep(1); /* force a reschedule, hopefully */ - } - } - - DPRINTF(E_DBG,L_REND,"Select error!\n"); - /* should really bail here */ - } -} - - /** * Add a text stanza to the buffer (pascal-style multistring) * @@ -151,29 +125,27 @@ strcpy(ptr+1,string); } -/* - * rend_callback - * - * This gets called from the main thread when there is a - * message waiting to be processed. - */ -void rend_callback(void *info) { - REND_MESSAGE msg; +int rend_running(void) { + return TRUE; +} + +int rend_stop(void) { + rend_stoprunloop(); + pthread_join(rend_tid,NULL); + + return 1; +} + +int rend_register(char *name, char *type, int port, char *ifact, char *txt) { unsigned short usPort; dns_service_discovery_ref dns_ref=NULL; char *src,*dst; int len; - /* here, we've seen the message, now we have to process it */ - if(rend_read_message(&msg) != sizeof(msg)) { - DPRINTF(E_FATAL,L_REND,"Rendezvous socket closed (daap server crashed?) Aborting.\n"); - exit(EXIT_FAILURE); - } - - src=dst=msg.txt; - while(src && (*src) && (src - msg.txt < MAX_TEXT_LEN)) { + src=dst=txt; + while(src && (*src) && (src - txt < MAX_TEXT_LEN)) { len = (*src); - if((src + len + 1) - msg.txt < MAX_TEXT_LEN) { + if((src + len + 1) - txt < MAX_TEXT_LEN) { memmove(dst,src+1,len); dst += len; if(*src) { @@ -185,75 +157,80 @@ src += len + 1; } - switch(msg.cmd) { - case REND_MSG_TYPE_REGISTER: - DPRINTF(E_DBG,L_REND,"Registering %s.%s (%d)\n",msg.type,msg.name,msg.port); - usPort=htons(msg.port); - dns_ref=DNSServiceRegistrationCreate(msg.name,msg.type,"",usPort,msg.txt,rend_reply,nil); - if(rend_addtorunloop(dns_ref)) { - DPRINTF(E_WARN,L_REND,"Add to runloop failed\n"); - rend_send_response(-1); - } else { - rend_send_response(0); /* success */ - } - break; - case REND_MSG_TYPE_UNREGISTER: - DPRINTF(E_WARN,L_REND,"Unsupported function: UNREGISTER\n"); - rend_send_response(-1); /* error */ - break; - case REND_MSG_TYPE_STOP: - DPRINTF(E_DBG,L_REND,"Stopping mDNS\n"); - rend_send_response(0); - rend_stoprunloop(); - break; - case REND_MSG_TYPE_STATUS: - DPRINTF(E_DBG,L_REND,"Status inquiry -- returning 1\n"); - rend_send_response(1); /* success */ - break; - default: - break; + DPRINTF(E_DBG,L_REND,"Registering %s.%s (%d)\n",type,name,port); + usPort=htons(port); + dns_ref=DNSServiceRegistrationCreate(name,type,"",usPort,txt,rend_reply,nil); + if(rend_addtorunloop(dns_ref)) { + DPRINTF(E_WARN,L_REND,"Add to runloop failed\n"); + return -1; + } else { + return 0; } } +/** + * not implemeneted + * + * @param name name of service to unregistery + * @param type type of service to unregister + * @param port port of service to nregister + */ +int rend_unregister(char *name, char *type, int port) { + return -1; +} + + +/** + * execute the runloop + * + * @param arg unused + */ +void *rend_runloop_threadproc(void* arg) { + CFRunLoopSourceContext context; + + rend_runloop = CFRunLoopGetCurrent(); + rend_rls = CFRunLoopSourceCreate(NULL,0,&context); + CFRunLoopAddSource(CFRunLoopGetCurrent(),rend_rls,kCFRunLoopDefaultMode); + + DPRINTF(E_DBG,L_REND,"Starting runloop\n"); + CFRunLoopRun(); + DPRINTF(E_DBG,L_REND,"Exiting runloop\n"); + + CFRelease(rend_rls); + + return NULL; +} + + /* * rend_private_init * * start up the rendezvous services */ -int rend_private_init(char *user) { - CFRunLoopSourceContext context; +int rend_init(char *user) { + sigset_t set; - if(os_drop_privs(user)) /* shouldn't be running as root anyway */ + if((sigemptyset(&set) == -1) || + (sigaddset(&set,SIGINT) == -1) || + (sigaddset(&set,SIGHUP) == -1) || + (sigaddset(&set,SIGCHLD) == -1) || + (sigaddset(&set,SIGTERM) == -1) || + (sigaddset(&set,SIGPIPE) == -1) || + (pthread_sigmask(SIG_BLOCK, &set, NULL) == -1)) { + DPRINTF(E_LOG,L_MAIN,"Error setting signal set\n"); return -1; + } - /* need a sigint handler */ DPRINTF(E_DBG,L_REND,"Starting rendezvous services\n"); - memset((void*)&context,0,sizeof(context)); - context.perform = rend_callback; + DPRINTF(E_DBG,L_REND,"Starting runloop thread\n"); - rend_runloop = CFRunLoopGetCurrent(); - rend_rls = CFRunLoopSourceCreate(NULL,0,&context); - CFRunLoopAddSource(CFRunLoopGetCurrent(),rend_rls,kCFRunLoopDefaultMode); - - DPRINTF(E_DBG,L_REND,"Starting polling thread\n"); - - if(pthread_create(&rend_tid,NULL,rend_pipe_monitor,NULL)) { + if(pthread_create(&rend_tid,NULL,rend_runloop_threadproc,NULL)) { DPRINTF(E_FATAL,L_REND,"Could not start thread. Terminating\n"); /* should kill parent, too */ exit(EXIT_FAILURE); } - DPRINTF(E_DBG,L_REND,"Starting runloop\n"); - - CFRunLoopRun(); - - DPRINTF(E_DBG,L_REND,"Exiting runloop\n"); - - CFRelease(rend_rls); - pthread_cancel(rend_tid); - close(rend_pipe_to[RD_SIDE]); - close(rend_pipe_from[WR_SIDE]); return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-26 21:09:53
|
Revision: 1721 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1721&view=rev Author: rpedde Date: 2008-04-26 14:09:32 -0700 (Sat, 26 Apr 2008) Log Message: ----------- logging error Modified Paths: -------------- branches/release-1.2-pre/src/webserver.c Modified: branches/release-1.2-pre/src/webserver.c =================================================================== --- branches/release-1.2-pre/src/webserver.c 2008-04-26 20:38:48 UTC (rev 1720) +++ branches/release-1.2-pre/src/webserver.c 2008-04-26 21:09:32 UTC (rev 1721) @@ -599,7 +599,7 @@ length=strtol(content_length, NULL, 10); if(EINVAL == errno || UINT_MAX - 1 <= length) { - DPRINTF(L_WS_WARN, "Thread %d: Suspicious Content-Length value, ignoring\n"); + DPRINTF(E_WARN, L_WS, "Thread %d: Suspicious Content-Length value, ignoring\n"); return -1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-26 20:38:52
|
Revision: 1720 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1720&view=rev Author: rpedde Date: 2008-04-26 13:38:48 -0700 (Sat, 26 Apr 2008) Log Message: ----------- add Nico's patch for CVE-2008-1771 Modified Paths: -------------- branches/release-1.2-pre/src/webserver.c Modified: branches/release-1.2-pre/src/webserver.c =================================================================== --- branches/release-1.2-pre/src/webserver.c 2008-04-21 13:40:58 UTC (rev 1719) +++ branches/release-1.2-pre/src/webserver.c 2008-04-26 20:38:48 UTC (rev 1720) @@ -597,7 +597,12 @@ return -1; } - length=atoi(content_length); + length=strtol(content_length, NULL, 10); + if(EINVAL == errno || UINT_MAX - 1 <= length) { + DPRINTF(L_WS_WARN, "Thread %d: Suspicious Content-Length value, ignoring\n"); + return -1; + } + DPRINTF(E_DBG,L_WS,"Thread %d: Post var length: %d\n", pwsc->threadno,length); @@ -915,8 +920,13 @@ pwsc->uri); /* now, parse POST args */ - if(pwsc->request_type == RT_POST) - ws_getpostvars(pwsc); + if((pwsc->request_type == RT_POST) && (ws_getpostvars(pwsc) == -1)) { + DPRINTF(E_LOG,L_WS,"Thread %d: Couldn't parse headers - aborting\n", + pwsc->threadno); + pwsc->close=1; + ws_close(pwsc); + return NULL; + } hdrs=1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-21 13:41:49
|
Revision: 1719 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1719&view=rev Author: rpedde Date: 2008-04-21 06:40:58 -0700 (Mon, 21 Apr 2008) Log Message: ----------- Make a new branch based on 1589 toward a 1.2 release Added Paths: ----------- branches/release-1.2-pre/ Copied: branches/release-1.2-pre (from rev 1586, trunk) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-19 19:59:11
|
Revision: 1718 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1718&view=rev Author: rpedde Date: 2008-04-19 12:59:06 -0700 (Sat, 19 Apr 2008) Log Message: ----------- Tag as 0.2.4.2 Added Paths: ----------- tags/release-0.2.4.2/ Copied: tags/release-0.2.4.2 (from rev 1717, branches/fixes-0.2.1.1) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-19 19:57:53
|
Revision: 1717 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1717&view=rev Author: rpedde Date: 2008-04-19 12:57:51 -0700 (Sat, 19 Apr 2008) Log Message: ----------- Force a disconnect after failing to read post vars Modified Paths: -------------- branches/fixes-0.2.1.1/src/webserver.c Modified: branches/fixes-0.2.1.1/src/webserver.c =================================================================== --- branches/fixes-0.2.1.1/src/webserver.c 2008-04-19 19:31:29 UTC (rev 1716) +++ branches/fixes-0.2.1.1/src/webserver.c 2008-04-19 19:57:51 UTC (rev 1717) @@ -871,8 +871,14 @@ pwsc->uri); /* now, parse POST args */ - if(pwsc->request_type == RT_POST) - ws_getpostvars(pwsc); + if((pwsc->request_type == RT_POST) && (ws_getpostvars(pwsc) == -1)) { + DPRINTF(E_LOG,L_WS,"Couldn't process post vars. Aborting connection\n"); + pwsc->error=0; + pwsc->close=1; /* force a full close */ + ws_returnerror(pwsc,500,"Internal server error"); + ws_close(pwsc); + return NULL; + } hdrs=1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-04-19 19:31:30
|
Revision: 1716 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1716&view=rev Author: rpedde Date: 2008-04-19 12:31:29 -0700 (Sat, 19 Apr 2008) Log Message: ----------- Fix port byte-order on osx rendezvous, make bitrate represent bitrate in kbps, and apply Nico's patch for CVS-2008-1771 Modified Paths: -------------- branches/fixes-0.2.1.1/configure.in branches/fixes-0.2.1.1/src/playlist.c branches/fixes-0.2.1.1/src/rend-osx.c branches/fixes-0.2.1.1/src/webserver.c Modified: branches/fixes-0.2.1.1/configure.in =================================================================== --- branches/fixes-0.2.1.1/configure.in 2008-02-21 05:49:30 UTC (rev 1715) +++ branches/fixes-0.2.1.1/configure.in 2008-04-19 19:31:29 UTC (rev 1716) @@ -4,7 +4,7 @@ AC_INIT(config.h.in) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(mt-daapd,0.2.4.1) +AM_INIT_AUTOMAKE(mt-daapd,0.2.4.2) dnl Checks for programs. AC_PROG_CC Modified: branches/fixes-0.2.1.1/src/playlist.c =================================================================== --- branches/fixes-0.2.1.1/src/playlist.c 2008-02-21 05:49:30 UTC (rev 1715) +++ branches/fixes-0.2.1.1/src/playlist.c 2008-04-19 19:31:29 UTC (rev 1716) @@ -55,7 +55,7 @@ */ void pl_dump(void) { SMART_PLAYLIST *pcurrent=pl_smart.next; - + while(pcurrent) { printf("Playlist %s:\n",pcurrent->name); pl_dump_node(pcurrent->root,1); @@ -66,7 +66,7 @@ /* * pl_dump_node * - * recursively dump a node + * recursively dump a node */ void pl_dump_node(PL_NODE *pnode, int indent) { int index; @@ -140,7 +140,7 @@ } boolarg=(pnode->op) & 0x7FFFFFFF; - if(pnode->op & 0x80000000) + if(pnode->op & 0x80000000) not=1; switch(boolarg) { @@ -326,7 +326,7 @@ ival=pmp3->bpm; break; case BITRATE: - ival=pmp3->bitrate / 1024; // bitrate in Kbps + ival=pmp3->bitrate; break; case DATEADDED: ival=pmp3->time_added; @@ -341,7 +341,7 @@ not=1; if(pnode->type==T_STR) { - if(!cval) + if(!cval) cval = ""; DPRINTF(E_DBG,L_PL,"Matching %s to %s\n",cval,pnode->arg2.cval); Modified: branches/fixes-0.2.1.1/src/rend-osx.c =================================================================== --- branches/fixes-0.2.1.1/src/rend-osx.c 2008-02-21 05:49:30 UTC (rev 1715) +++ branches/fixes-0.2.1.1/src/rend-osx.c 2008-04-19 19:31:29 UTC (rev 1716) @@ -77,8 +77,8 @@ else { CFMachPortContext context = { 0, 0, NULL, NULL, NULL }; Boolean shouldFreeInfo; - CFMachPortRef cfMachPort=CFMachPortCreateWithPort(kCFAllocatorDefault, - port, rend_handler, + CFMachPortRef cfMachPort=CFMachPortCreateWithPort(kCFAllocatorDefault, + port, rend_handler, &context, &shouldFreeInfo); CFRunLoopSourceRef rls=CFMachPortCreateRunLoopSource(NULL,cfMachPort,0); @@ -151,7 +151,7 @@ /* * rend_callback * - * This gets called from the main thread when there is a + * This gets called from the main thread when there is a * message waiting to be processed. */ void rend_callback(void *info) { @@ -168,7 +168,7 @@ switch(msg.cmd) { case REND_MSG_TYPE_REGISTER: DPRINTF(E_DBG,L_REND,"Registering %s.%s (%d)\n",msg.type,msg.name,msg.port); - usPort=msg.port; + usPort=htons(msg.port); dns_ref=DNSServiceRegistrationCreate(msg.name,msg.type,"",usPort, "txtvers=1\001Database ID=bedabb1edeadbea7",rend_reply,nil); if(rend_addtorunloop(dns_ref)) { @@ -218,7 +218,7 @@ CFRunLoopAddSource(CFRunLoopGetCurrent(),rend_rls,kCFRunLoopDefaultMode); DPRINTF(E_DBG,L_REND,"Starting polling thread\n"); - + if(pthread_create(&rend_tid,NULL,rend_pipe_monitor,NULL)) { DPRINTF(E_FATAL,L_REND,"Could not start thread. Terminating\n"); /* should kill parent, too */ Modified: branches/fixes-0.2.1.1/src/webserver.c =================================================================== --- branches/fixes-0.2.1.1/src/webserver.c 2008-02-21 05:49:30 UTC (rev 1715) +++ branches/fixes-0.2.1.1/src/webserver.c 2008-04-19 19:31:29 UTC (rev 1716) @@ -100,14 +100,14 @@ int ws_getgetvars(WS_CONNINFO *pwsc, char *string); char *ws_getarg(ARGLIST *root, char *key); int ws_testarg(ARGLIST *root, char *key, char *value); -int ws_findhandler(WS_PRIVATE *pwsp, WS_CONNINFO *pwsc, - void(**preq)(WS_CONNINFO*), - int(**pauth)(char *, char *), - int *addheaders); -int ws_registerhandler(WSHANDLE ws, char *regex, - void(*handler)(WS_CONNINFO*), - int(*auth)(char *, char *), - int addheaders); +int ws_findhandler(WS_PRIVATE *pwsp, WS_CONNINFO *pwsc, + void(**preq)(WS_CONNINFO*), + int(**pauth)(char *, char *), + int *addheaders); +int ws_registerhandler(WSHANDLE ws, char *regex, + void(*handler)(WS_CONNINFO*), + int(*auth)(char *, char *), + int addheaders); int ws_decodepassword(char *header, char **username, char **password); int ws_testrequestheader(WS_CONNINFO *pwsc, char *header, char *value); char *ws_getrequestheader(WS_CONNINFO *pwsc, char *header); @@ -122,7 +122,7 @@ char *ws_dow[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; char *ws_moy[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", - "Aug", "Sep", "Oct", "Nov", "Dec" }; + "Aug", "Sep", "Oct", "Nov", "Dec" }; /* * ws_lock_unsafe @@ -139,8 +139,8 @@ DPRINTF(E_SPAM,L_WS,"Entering ws_lock_unsafe\n"); if((err=pthread_mutex_lock(&ws_unsafe))) { - errno=err; - retval=-1; + errno=err; + retval=-1; } DPRINTF(E_SPAM,L_WS,"Exiting ws_lock_unsafe with retval of %d\n",retval); @@ -162,8 +162,8 @@ DPRINTF(E_SPAM,L_WS,"Entering ws_unlock_unsafe\n"); if((err=pthread_mutex_unlock(&ws_unsafe))) { - errno=err; - retval=-1; + errno=err; + retval=-1; } DPRINTF(E_SPAM,L_WS,"Exiting ws_unlock_unsafe with a retval of %d\n",retval); @@ -188,10 +188,10 @@ WS_PRIVATE *pwsp; DPRINTF(E_SPAM,L_WS,"Entering ws_start\n"); - + if((pwsp=(WS_PRIVATE*)malloc(sizeof(WS_PRIVATE))) == NULL) { - DPRINTF(E_SPAM,L_WS,"Malloc error: %s\n",strerror(errno)); - return NULL; + DPRINTF(E_SPAM,L_WS,"Malloc error: %s\n",strerror(errno)); + return NULL; } memcpy(&pwsp->wsconfig,config,sizeof(WS_PRIVATE)); @@ -203,34 +203,34 @@ pwsp->handlers.next=NULL; if((err=pthread_cond_init(&pwsp->exit_cond, NULL))) { - errno=err; - DPRINTF(E_LOG,L_WS,"Error in pthread_cond_init: %s\n",strerror(errno)); - return NULL; + errno=err; + DPRINTF(E_LOG,L_WS,"Error in pthread_cond_init: %s\n",strerror(errno)); + return NULL; } if((err=pthread_mutex_init(&pwsp->exit_mutex,NULL))) { - errno=err; - DPRINTF(E_LOG,L_WS,"Error in pthread_mutex_init: %s\n",strerror(errno)); - return NULL; + errno=err; + DPRINTF(E_LOG,L_WS,"Error in pthread_mutex_init: %s\n",strerror(errno)); + return NULL; } DPRINTF(E_INF,L_WS,"Preparing to listen on port %d\n",pwsp->wsconfig.port); if((pwsp->server_fd = u_open(pwsp->wsconfig.port)) == -1) { - err=errno; - DPRINTF(E_LOG,L_WS,"Could not open port: %s\n",strerror(errno)); - errno=err; - return NULL; + err=errno; + DPRINTF(E_LOG,L_WS,"Could not open port: %s\n",strerror(errno)); + errno=err; + return NULL; } DPRINTF(E_INF,L_WS,"Starting server thread\n"); if((err=pthread_create(&pwsp->server_tid,NULL,ws_mainthread,(void*)pwsp))) { - DPRINTF(E_LOG,L_WS,"Could not spawn thread: %s\n",strerror(err)); - r_close(pwsp->server_fd); - errno=err; - return NULL; + DPRINTF(E_LOG,L_WS,"Could not spawn thread: %s\n",strerror(err)); + r_close(pwsp->server_fd); + errno=err; + return NULL; } - + /* we're really running */ pwsp->running=1; @@ -241,7 +241,7 @@ /* * ws_remove_dispatch_thread - * + * * remove a dispatch thread from the thread list */ void ws_remove_dispatch_thread(WS_PRIVATE *pwsp, WS_CONNINFO *pwsc) { @@ -250,29 +250,29 @@ DPRINTF(E_SPAM,L_WS,"Entering ws_remove_dispatch_thread\n"); if(pthread_mutex_lock(&pwsp->exit_mutex)) - DPRINTF(E_FATAL,L_WS,"Cannot lock condition mutex\n"); + DPRINTF(E_FATAL,L_WS,"Cannot lock condition mutex\n"); pTail=&(pwsp->connlist); pHead=pwsp->connlist.next; while((pHead) && (pHead->pwsc != pwsc)) { - pTail=pHead; - pHead=pHead->next; + pTail=pHead; + pHead=pHead->next; } if(pHead) { - pwsp->dispatch_threads--; - DPRINTF(E_DBG,L_WS,"With thread %d exiting, %d are still running\n", - pwsc->threadno,pwsp->dispatch_threads); + pwsp->dispatch_threads--; + DPRINTF(E_DBG,L_WS,"With thread %d exiting, %d are still running\n", + pwsc->threadno,pwsp->dispatch_threads); - pTail->next = pHead->next; - - if(pHead->status) - free(pHead->status); - free(pHead); + pTail->next = pHead->next; - /* signal condition in case something is waiting */ - pthread_cond_signal(&pwsp->exit_cond); + if(pHead->status) + free(pHead->status); + free(pHead); + + /* signal condition in case something is waiting */ + pthread_cond_signal(&pwsp->exit_cond); } pthread_mutex_unlock(&pwsp->exit_mutex); @@ -296,10 +296,10 @@ pNew->status=strdup("Initializing"); if(!pNew) - DPRINTF(E_FATAL,L_WS,"Malloc: %s\n",strerror(errno)); - + DPRINTF(E_FATAL,L_WS,"Malloc: %s\n",strerror(errno)); + if(pthread_mutex_lock(&pwsp->exit_mutex)) - DPRINTF(E_FATAL,L_WS,"Cannot lock condition mutex\n"); + DPRINTF(E_FATAL,L_WS,"Cannot lock condition mutex\n"); /* list is locked... */ pwsp->dispatch_threads++; @@ -325,10 +325,10 @@ /* free the ws_handlers */ while(pwsp->handlers.next) { - current=pwsp->handlers.next; - pwsp->handlers.next=current->next; - regfree(¤t->regex); - free(current); + current=pwsp->handlers.next; + pwsp->handlers.next=current->next; + regfree(¤t->regex); + free(current); } pwsp->stop=1; @@ -337,13 +337,13 @@ DPRINTF(E_DBG,L_WS,"ws_stop: closing the server fd\n"); shutdown(pwsp->server_fd,SHUT_RDWR); r_close(pwsp->server_fd); /* this should tick off the listener */ - + /* wait for the server thread to terminate. SHould be quick! */ pthread_join(pwsp->server_tid,&result); /* Give the threads an extra push */ if(pthread_mutex_lock(&pwsp->exit_mutex)) - DPRINTF(E_FATAL,L_WS,"Cannot lock condition mutex\n"); + DPRINTF(E_FATAL,L_WS,"Cannot lock condition mutex\n"); pcl=pwsp->connlist.next; @@ -351,17 +351,17 @@ * should cause the dispatch threads to exit out with an error. */ while(pcl) { - if(pcl->pwsc->fd) { - shutdown(pcl->pwsc->fd,SHUT_RDWR); - r_close(pcl->pwsc->fd); - } - pcl=pcl->next; + if(pcl->pwsc->fd) { + shutdown(pcl->pwsc->fd,SHUT_RDWR); + r_close(pcl->pwsc->fd); + } + pcl=pcl->next; } /* wait for the threads to be done */ while(pwsp->dispatch_threads) { - DPRINTF(E_DBG,L_WS,"ws_stop: I still see %d threads\n",pwsp->dispatch_threads); - pthread_cond_wait(&pwsp->exit_cond, &pwsp->exit_mutex); + DPRINTF(E_DBG,L_WS,"ws_stop: I still see %d threads\n",pwsp->dispatch_threads); + pthread_cond_wait(&pwsp->exit_cond, &pwsp->exit_mutex); } pthread_mutex_unlock(&pwsp->exit_mutex); @@ -378,7 +378,7 @@ * Main thread for webserver - this accepts connections * and spawns a handler thread for each incoming connection. * - * For a persistant connection, these threads will be + * For a persistant connection, these threads will be * long-lived, otherwise, they will terminate as soon as * the request has been honored. * @@ -395,50 +395,50 @@ DPRINTF(E_SPAM,L_WS,"Entering ws_mainthread\n"); while(1) { - pwsc=(WS_CONNINFO*)malloc(sizeof(WS_CONNINFO)); - if(!pwsc) { - /* can't very well service any more threads! */ - DPRINTF(E_FATAL,L_WS,"Error: %s\n",strerror(errno)); - pwsp->running=0; - return NULL; - } + pwsc=(WS_CONNINFO*)malloc(sizeof(WS_CONNINFO)); + if(!pwsc) { + /* can't very well service any more threads! */ + DPRINTF(E_FATAL,L_WS,"Error: %s\n",strerror(errno)); + pwsp->running=0; + return NULL; + } - memset(pwsc,0,sizeof(WS_CONNINFO)); + memset(pwsc,0,sizeof(WS_CONNINFO)); - if((fd=u_accept(pwsp->server_fd,hostname,MAX_HOSTNAME)) == -1) { - DPRINTF(E_LOG,L_WS,"Dispatcher: accept failed: %s\n",strerror(errno)); - shutdown(pwsp->server_fd,SHUT_RDWR); - r_close(pwsp->server_fd); - pwsp->running=0; - free(pwsc); + if((fd=u_accept(pwsp->server_fd,hostname,MAX_HOSTNAME)) == -1) { + DPRINTF(E_LOG,L_WS,"Dispatcher: accept failed: %s\n",strerror(errno)); + shutdown(pwsp->server_fd,SHUT_RDWR); + r_close(pwsp->server_fd); + pwsp->running=0; + free(pwsc); - DPRINTF(E_FATAL,L_WS,"Dispatcher: Aborting\n"); - return NULL; - } + DPRINTF(E_FATAL,L_WS,"Dispatcher: Aborting\n"); + return NULL; + } - pwsc->hostname=strdup(hostname); - pwsc->fd=fd; - pwsc->pwsp = pwsp; + pwsc->hostname=strdup(hostname); + pwsc->fd=fd; + pwsc->pwsp = pwsp; - /* Spawn off a dispatcher to decide what to do with - * the request - */ + /* Spawn off a dispatcher to decide what to do with + * the request + */ - /* don't really care if it locks or not */ - ws_lock_unsafe(); - pwsc->threadno=pwsp->threadno; - pwsp->threadno++; - ws_unlock_unsafe(); + /* don't really care if it locks or not */ + ws_lock_unsafe(); + pwsc->threadno=pwsp->threadno; + pwsp->threadno++; + ws_unlock_unsafe(); - /* now, throw off a dispatch thread */ - if((err=pthread_create(&tid,NULL,ws_dispatcher,(void*)pwsc))) { - pwsc->error=err; - DPRINTF(E_FATAL,L_WS,"Could not spawn thread: %s\n",strerror(err)); - ws_close(pwsc); - } else { - ws_add_dispatch_thread(pwsp,pwsc); - pthread_detach(tid); - } + /* now, throw off a dispatch thread */ + if((err=pthread_create(&tid,NULL,ws_dispatcher,(void*)pwsc))) { + pwsc->error=err; + DPRINTF(E_FATAL,L_WS,"Could not spawn thread: %s\n",strerror(err)); + ws_close(pwsc); + } else { + ws_add_dispatch_thread(pwsp,pwsc); + pthread_detach(tid); + } } DPRINTF(E_SPAM,L_WS,"Exiting ws_mainthred\n"); @@ -474,22 +474,22 @@ DPRINTF(E_DBG,L_WS,"Thread %d: Freeing request vars\n",pwsc->threadno); ws_freearglist(&pwsc->request_vars); if(pwsc->uri) { - free(pwsc->uri); - pwsc->uri=NULL; + free(pwsc->uri); + pwsc->uri=NULL; } - + if((pwsc->close)||(pwsc->error)) { - DPRINTF(E_DBG,L_WS,"Thread %d: Closing fd\n",pwsc->threadno); - shutdown(pwsc->fd,SHUT_RDWR); - r_close(pwsc->fd); - free(pwsc->hostname); - - /* this thread is done */ - ws_remove_dispatch_thread(pwsp, pwsc); + DPRINTF(E_DBG,L_WS,"Thread %d: Closing fd\n",pwsc->threadno); + shutdown(pwsc->fd,SHUT_RDWR); + r_close(pwsc->fd); + free(pwsc->hostname); - free(pwsc); - DPRINTF(E_SPAM,L_WS,"Exiting ws_close (thread terminating)\n"); - pthread_exit(NULL); + /* this thread is done */ + ws_remove_dispatch_thread(pwsp, pwsc); + + free(pwsc); + DPRINTF(E_SPAM,L_WS,"Exiting ws_close (thread terminating)\n"); + pthread_exit(NULL); } DPRINTF(E_SPAM,L_WS,"Exiting ws_close (thread continuing)\n"); } @@ -505,11 +505,11 @@ DPRINTF(E_SPAM,L_WS,"Entering ws_freearglist\n"); while(root->next) { - free(root->next->key); - free(root->next->value); - current=root->next; - root->next=current->next; - free(current); + free(root->next->key); + free(root->next->value); + current=root->next; + root->next=current->next; + free(current); } DPRINTF(E_SPAM,L_WS,"Exiting ws_freearglist\n"); @@ -521,10 +521,10 @@ DPRINTF(E_SPAM,L_WS,"Entering ws_emitheaders\n"); while(pcurrent) { - DPRINTF(E_DBG,L_WS,"Emitting reponse header %s: %s\n",pcurrent->key, - pcurrent->value); - ws_writefd(pwsc,"%s: %s\r\n",pcurrent->key,pcurrent->value); - pcurrent=pcurrent->next; + DPRINTF(E_DBG,L_WS,"Emitting reponse header %s: %s\n",pcurrent->key, + pcurrent->value); + ws_writefd(pwsc,"%s: %s\r\n",pcurrent->key,pcurrent->value); + pcurrent=pcurrent->next; } ws_writefd(pwsc,"\r\n"); @@ -547,36 +547,41 @@ content_length = ws_getarg(&pwsc->request_headers,"Content-Length"); if(!content_length) { - pwsc->error = EINVAL; - return -1; + pwsc->error = EINVAL; + return -1; } - length=atoi(content_length); + length=strtol(content_length, NULL, 10); + if(EINVAL == errno || UINT_MAX -1 <= length) { + DPRINTF(E_WARN,L_WS, "Thread %d: Suspicious Content-Length value, ignoring request\n",pwsc->threadno); + return -1; + } + DPRINTF(E_DBG,L_WS,"Thread %d: Post var length: %d\n", - pwsc->threadno,length); + pwsc->threadno,length); buffer=(char*)malloc(length+1); if(!buffer) { - pwsc->error = errno; - DPRINTF(E_INF,L_WS,"Thread %d: Could not malloc %d bytes\n", - pwsc->threadno, length); - return -1; + pwsc->error = errno; + DPRINTF(E_INF,L_WS,"Thread %d: Could not malloc %d bytes\n", + pwsc->threadno, length); + return -1; } // make the read time out 30 minutes like we said in the // /server-info response if((readtimed(pwsc->fd, buffer, length, 1800.0)) == -1) { - DPRINTF(E_INF,L_WS,"Thread %d: Timeout reading post vars\n", - pwsc->threadno); - pwsc->error=errno; - return -1; + DPRINTF(E_INF,L_WS,"Thread %d: Timeout reading post vars\n", + pwsc->threadno); + pwsc->error=errno; + return -1; } DPRINTF(E_DBG,L_WS,"Thread %d: Read post vars: %s\n",pwsc->threadno,buffer); pwsc->error=ws_getgetvars(pwsc,buffer); - + free(buffer); DPRINTF(E_SPAM,L_WS,"Exiting ws_getpostvars\n"); @@ -600,51 +605,51 @@ /* Break down the headers into some kind of header list */ done=0; while(!done) { - if(readline(pwsc->fd,buffer,sizeof(buffer)) == -1) { - pwsc->error=errno; - DPRINTF(E_INF,L_WS,"Thread %d: Unexpected close\n",pwsc->threadno); - return -1; - } - - DPRINTF(E_DBG,L_WS,"Thread %d: Read: %s",pwsc->threadno,buffer); + if(readline(pwsc->fd,buffer,sizeof(buffer)) == -1) { + pwsc->error=errno; + DPRINTF(E_INF,L_WS,"Thread %d: Unexpected close\n",pwsc->threadno); + return -1; + } - first=buffer; - if(buffer[0] == '\r') - first=&buffer[1]; + DPRINTF(E_DBG,L_WS,"Thread %d: Read: %s",pwsc->threadno,buffer); - /* trim the trailing \n */ - if(first[strlen(first)-1] == '\n') - first[strlen(first)-1] = '\0'; + first=buffer; + if(buffer[0] == '\r') + first=&buffer[1]; - if(strlen(first) == 0) { - DPRINTF(E_DBG,L_WS,"Thread %d: Headers parsed!\n",pwsc->threadno); - done=1; - } else { - /* we have a header! */ - last=first; - strsep(&last,":"); + /* trim the trailing \n */ + if(first[strlen(first)-1] == '\n') + first[strlen(first)-1] = '\0'; - if(!last) { - DPRINTF(E_WARN,L_WS,"Thread %d: Invalid header: %s\n", - pwsc->threadno,first); - } else { - while(*last==' ') - last++; + if(strlen(first) == 0) { + DPRINTF(E_DBG,L_WS,"Thread %d: Headers parsed!\n",pwsc->threadno); + done=1; + } else { + /* we have a header! */ + last=first; + strsep(&last,":"); - while(last[strlen(last)-1] == '\r') - last[strlen(last)-1] = '\0'; + if(!last) { + DPRINTF(E_WARN,L_WS,"Thread %d: Invalid header: %s\n", + pwsc->threadno,first); + } else { + while(*last==' ') + last++; - DPRINTF(E_DBG,L_WS,"Thread %d: Adding header *%s=%s*\n", - pwsc->threadno,first,last); + while(last[strlen(last)-1] == '\r') + last[strlen(last)-1] = '\0'; - if(ws_addarg(&pwsc->request_headers,first,"%s",last)) { - DPRINTF(E_FATAL,L_WS,"Thread %d: Out of memory\n", - pwsc->threadno); - pwsc->error=ENOMEM; - return -1; - } - } - } + DPRINTF(E_DBG,L_WS,"Thread %d: Adding header *%s=%s*\n", + pwsc->threadno,first,last); + + if(ws_addarg(&pwsc->request_headers,first,"%s",last)) { + DPRINTF(E_FATAL,L_WS,"Thread %d: Out of memory\n", + pwsc->threadno); + pwsc->error=ENOMEM; + return -1; + } + } + } } DPRINTF(E_SPAM,L_WS,"Exiting ws_getheaders\n"); @@ -661,10 +666,10 @@ user_agent=ws_getrequestheader(pwsc, "user-agent"); if(user_agent) { - if(strncasecmp(user_agent,"Roku",4) == 0) - space_as_plus=0; - if(strncasecmp(user_agent,"iTunes",6) == 0) - space_as_plus=0; + if(strncasecmp(user_agent,"Roku",4) == 0) + space_as_plus=0; + if(strncasecmp(user_agent,"iTunes",6) == 0) + space_as_plus=0; } return space_as_plus; } @@ -674,7 +679,7 @@ * ws_getgetvars * * parse a GET string of variables (or POST) - * + * */ int ws_getgetvars(WS_CONNINFO *pwsc, char *string) { char *new_string; @@ -685,41 +690,41 @@ int space_as_plus; DPRINTF(E_DBG,L_WS,"Thread %d: Entering ws_getgetvars (%s)\n", - pwsc->threadno,string); + pwsc->threadno,string); space_as_plus=ws_encoding_hack(pwsc); done=0; first=string; - + while((!done) && (first)) { - last=middle=first; - strsep(&last,"&"); - strsep(&middle,"="); - - if(!middle) { - DPRINTF(E_WARN,L_WS,"Thread %d: Bad arg: %s\n", - pwsc->threadno,first); - } else { - key=ws_urldecode(first,space_as_plus); - value=ws_urldecode(middle,space_as_plus); - - DPRINTF(E_DBG,L_WS,"Thread %d: Adding arg %s = %s\n", - pwsc->threadno,key,value); - ws_addarg(&pwsc->request_vars,key,"%s",value); + last=middle=first; + strsep(&last,"&"); + strsep(&middle,"="); - free(key); - free(value); - } - - if(!last) { - DPRINTF(E_DBG,L_WS,"Thread %d: Done parsing GET/POST args!\n", - pwsc->threadno); - done=1; - } else { - first=last; - } + if(!middle) { + DPRINTF(E_WARN,L_WS,"Thread %d: Bad arg: %s\n", + pwsc->threadno,first); + } else { + key=ws_urldecode(first,space_as_plus); + value=ws_urldecode(middle,space_as_plus); + + DPRINTF(E_DBG,L_WS,"Thread %d: Adding arg %s = %s\n", + pwsc->threadno,key,value); + ws_addarg(&pwsc->request_vars,key,"%s",value); + + free(key); + free(value); + } + + if(!last) { + DPRINTF(E_DBG,L_WS,"Thread %d: Done parsing GET/POST args!\n", + pwsc->threadno); + done=1; + } else { + first=last; + } } DPRINTF(E_SPAM,L_WS,"Exiting ws_getgetvars\n"); @@ -749,201 +754,201 @@ int(*auth_handler)(char *, char *); DPRINTF(E_DBG,L_WS,"Thread %d: Entering ws_dispatcher (Connection from %s)\n", - pwsc->threadno, pwsc->hostname); - + pwsc->threadno, pwsc->hostname); + while(!connection_done) { - /* Now, get the request from the other end - * and decide where to dispatch it - */ + /* Now, get the request from the other end + * and decide where to dispatch it + */ - /* DWB: set timeout to 30 minutes as advertised in the - server-info response. */ - if((readlinetimed(pwsc->fd,buffer,sizeof(buffer),1800.0)) < 1) { - pwsc->error=errno; - pwsc->close=1; - DPRINTF(E_WARN,L_WS,"Thread %d: could not read: %s\n", - pwsc->threadno,strerror(errno)); - ws_close(pwsc); - return NULL; - } + /* DWB: set timeout to 30 minutes as advertised in the + server-info response. */ + if((readlinetimed(pwsc->fd,buffer,sizeof(buffer),1800.0)) < 1) { + pwsc->error=errno; + pwsc->close=1; + DPRINTF(E_WARN,L_WS,"Thread %d: could not read: %s\n", + pwsc->threadno,strerror(errno)); + ws_close(pwsc); + return NULL; + } - DPRINTF(E_DBG,L_WS,"Thread %d: got request\n",pwsc->threadno); - DPRINTF(E_DBG - 1,L_WS, "Request: %s", buffer); + DPRINTF(E_DBG,L_WS,"Thread %d: got request\n",pwsc->threadno); + DPRINTF(E_DBG - 1,L_WS, "Request: %s", buffer); - first=last=buffer; - strsep(&last," "); - if(!last) { - pwsc->close=1; - ws_returnerror(pwsc,400,"Bad request\n"); - ws_close(pwsc); - DPRINTF(E_SPAM,L_WS,"Error: bad request. Exiting ws_dispatcher\n"); - return NULL; - } - - if(!strcasecmp(first,"get")) { - pwsc->request_type = RT_GET; - } else if(!strcasecmp(first,"post")) { - pwsc->request_type = RT_POST; - } else { - /* return a 501 not implemented */ - pwsc->error=EINVAL; - pwsc->close=1; - ws_returnerror(pwsc,501,"Not implemented"); - ws_close(pwsc); - DPRINTF(E_SPAM,L_WS,"Error: not get or post. Exiting ws_dispatcher\n"); - return NULL; - } + first=last=buffer; + strsep(&last," "); + if(!last) { + pwsc->close=1; + ws_returnerror(pwsc,400,"Bad request\n"); + ws_close(pwsc); + DPRINTF(E_SPAM,L_WS,"Error: bad request. Exiting ws_dispatcher\n"); + return NULL; + } - first=last; - strsep(&last," "); - pwsc->uri=strdup(first); - - /* Get headers */ - if((ws_getheaders(pwsc)) || (!last)) { /* didn't provide a HTTP/1.x */ - /* error already set */ - DPRINTF(E_LOG,L_WS,"Thread %d: Couldn't parse headers - aborting\n", - pwsc->threadno); - pwsc->close=1; - ws_close(pwsc); - return NULL; - } + if(!strcasecmp(first,"get")) { + pwsc->request_type = RT_GET; + } else if(!strcasecmp(first,"post")) { + pwsc->request_type = RT_POST; + } else { + /* return a 501 not implemented */ + pwsc->error=EINVAL; + pwsc->close=1; + ws_returnerror(pwsc,501,"Not implemented"); + ws_close(pwsc); + DPRINTF(E_SPAM,L_WS,"Error: not get or post. Exiting ws_dispatcher\n"); + return NULL; + } + first=last; + strsep(&last," "); + pwsc->uri=strdup(first); - /* Now that we have the headers, we can - * decide whether or not this is a persistant - * connection */ - if(strncasecmp(last,"HTTP/1.0",8)==0) { /* defaults to non-persistant */ - pwsc->close=!ws_testarg(&pwsc->request_headers,"connection","keep-alive"); - } else { /* default to persistant for HTTP/1.1 and above */ - pwsc->close=ws_testarg(&pwsc->request_headers,"connection","close"); - } + /* Get headers */ + if((ws_getheaders(pwsc)) || (!last)) { /* didn't provide a HTTP/1.x */ + /* error already set */ + DPRINTF(E_LOG,L_WS,"Thread %d: Couldn't parse headers - aborting\n", + pwsc->threadno); + pwsc->close=1; + ws_close(pwsc); + return NULL; + } - DPRINTF(E_DBG,L_WS,"Thread %d: Connection type %s: Connection: %s\n", - pwsc->threadno, last, pwsc->close ? "non-persist" : "persist"); - if(!pwsc->uri) { - pwsc->error=ENOMEM; - pwsc->close=1; /* force a full close */ - DPRINTF(E_LOG,L_WS,"Thread %d: Error allocation URI\n", - pwsc->threadno); - ws_returnerror(pwsc,500,"Internal server error"); - ws_close(pwsc); - return NULL; - } - - /* trim the URI */ - first=pwsc->uri; - strsep(&first,"?"); - - if(first) { /* got some GET args */ - DPRINTF(E_DBG,L_WS,"Thread %d: parsing GET args\n",pwsc->threadno); - ws_getgetvars(pwsc,first); - } + /* Now that we have the headers, we can + * decide whether or not this is a persistant + * connection */ + if(strncasecmp(last,"HTTP/1.0",8)==0) { /* defaults to non-persistant */ + pwsc->close=!ws_testarg(&pwsc->request_headers,"connection","keep-alive"); + } else { /* default to persistant for HTTP/1.1 and above */ + pwsc->close=ws_testarg(&pwsc->request_headers,"connection","close"); + } - /* fix the URI by un urldecoding it */ - - DPRINTF(E_DBG,L_WS,"Thread %d: Original URI: %s\n", - pwsc->threadno,pwsc->uri); - - first=ws_urldecode(pwsc->uri,ws_encoding_hack(pwsc)); - free(pwsc->uri); - pwsc->uri=first; + DPRINTF(E_DBG,L_WS,"Thread %d: Connection type %s: Connection: %s\n", + pwsc->threadno, last, pwsc->close ? "non-persist" : "persist"); - /* Strip out the proxy stuff - iTunes 4.5 */ - first=strstr(pwsc->uri,"://"); - if(first) { - first += 3; - first=strchr(first,'/'); - if(first) { - first=strdup(first); - free(pwsc->uri); - pwsc->uri=first; - } - } - - - DPRINTF(E_DBG,L_WS,"Thread %d: Translated URI: %s\n",pwsc->threadno, - pwsc->uri); + if(!pwsc->uri) { + pwsc->error=ENOMEM; + pwsc->close=1; /* force a full close */ + DPRINTF(E_LOG,L_WS,"Thread %d: Error allocation URI\n", + pwsc->threadno); + ws_returnerror(pwsc,500,"Internal server error"); + ws_close(pwsc); + return NULL; + } - /* now, parse POST args */ - if(pwsc->request_type == RT_POST) - ws_getpostvars(pwsc); + /* trim the URI */ + first=pwsc->uri; + strsep(&first,"?"); - hdrs=1; + if(first) { /* got some GET args */ + DPRINTF(E_DBG,L_WS,"Thread %d: parsing GET args\n",pwsc->threadno); + ws_getgetvars(pwsc,first); + } - handler=ws_findhandler(pwsp,pwsc,&req_handler,&auth_handler,&hdrs); + /* fix the URI by un urldecoding it */ - time(&now); - DPRINTF(E_DBG,L_WS,"Thread %d: Time is %d seconds after epoch\n", - pwsc->threadno,now); - gmtime_r(&now,&now_tm); - DPRINTF(E_DBG,L_WS,"Thread %d: Setting time header\n",pwsc->threadno); - ws_addarg(&pwsc->response_headers,"Date", - "%s, %d %s %d %02d:%02d:%02d GMT", - ws_dow[now_tm.tm_wday],now_tm.tm_mday, - ws_moy[now_tm.tm_mon],now_tm.tm_year + 1900, - now_tm.tm_hour,now_tm.tm_min,now_tm.tm_sec); + DPRINTF(E_DBG,L_WS,"Thread %d: Original URI: %s\n", + pwsc->threadno,pwsc->uri); - if(hdrs) { - ws_addarg(&pwsc->response_headers,"Connection", - pwsc->close ? "close" : "keep-alive"); - - ws_addarg(&pwsc->response_headers,"Server", - "mt-daapd/" VERSION); - - ws_addarg(&pwsc->response_headers,"Content-Type","text/html"); - ws_addarg(&pwsc->response_headers,"Content-Language","en_us"); - } + first=ws_urldecode(pwsc->uri,ws_encoding_hack(pwsc)); + free(pwsc->uri); + pwsc->uri=first; - /* Find the appropriate handler and dispatch it */ - if(handler == -1) { - DPRINTF(E_DBG,L_WS,"Thread %d: Using default handler.\n", - pwsc->threadno); - ws_defaulthandler(pwsp,pwsc); - } else { - DPRINTF(E_DBG,L_WS,"Thread %d: Using non-default handler\n", - pwsc->threadno); + /* Strip out the proxy stuff - iTunes 4.5 */ + first=strstr(pwsc->uri,"://"); + if(first) { + first += 3; + first=strchr(first,'/'); + if(first) { + first=strdup(first); + free(pwsc->uri); + pwsc->uri=first; + } + } - can_dispatch=0; - /* If an auth handler is registered, but it accepts a - * username and password of NULL, then don't bother - * authing. - */ - if((auth_handler) && (auth_handler(NULL,NULL)==0)) { - /* do the auth thing */ - auth=ws_getarg(&pwsc->request_headers,"Authorization"); - if((auth) && (ws_decodepassword(auth,&username,&password) != -1)) { - if(auth_handler(username,password)) - can_dispatch=1; - ws_addarg(&pwsc->request_vars,"HTTP_USER","%s",username); - ws_addarg(&pwsc->request_vars,"HTTP_PASSWD","%s",password); - free(username); /* this frees password too */ - } - if(!can_dispatch) { /* auth failed, or need auth */ - //ws_addarg(&pwsc->response_headers,"Connection","close"); - ws_addarg(&pwsc->response_headers,"WWW-Authenticate", - "Basic realm=\"webserver\""); - ws_returnerror(pwsc,401,"Unauthorized"); - pwsc->error=0; - } - } else { - can_dispatch=1; - } + DPRINTF(E_DBG,L_WS,"Thread %d: Translated URI: %s\n",pwsc->threadno, + pwsc->uri); - if(can_dispatch) { - if(req_handler) - req_handler(pwsc); - else - ws_defaulthandler(pwsp,pwsc); - } - } + /* now, parse POST args */ + if(pwsc->request_type == RT_POST) + ws_getpostvars(pwsc); - if((pwsc->close) || (pwsc->error) || (pwsp->stop)) { - pwsc->close=1; - connection_done=1; - } - ws_close(pwsc); + hdrs=1; + + handler=ws_findhandler(pwsp,pwsc,&req_handler,&auth_handler,&hdrs); + + time(&now); + DPRINTF(E_DBG,L_WS,"Thread %d: Time is %d seconds after epoch\n", + pwsc->threadno,now); + gmtime_r(&now,&now_tm); + DPRINTF(E_DBG,L_WS,"Thread %d: Setting time header\n",pwsc->threadno); + ws_addarg(&pwsc->response_headers,"Date", + "%s, %d %s %d %02d:%02d:%02d GMT", + ws_dow[now_tm.tm_wday],now_tm.tm_mday, + ws_moy[now_tm.tm_mon],now_tm.tm_year + 1900, + now_tm.tm_hour,now_tm.tm_min,now_tm.tm_sec); + + if(hdrs) { + ws_addarg(&pwsc->response_headers,"Connection", + pwsc->close ? "close" : "keep-alive"); + + ws_addarg(&pwsc->response_headers,"Server", + "mt-daapd/" VERSION); + + ws_addarg(&pwsc->response_headers,"Content-Type","text/html"); + ws_addarg(&pwsc->response_headers,"Content-Language","en_us"); + } + + /* Find the appropriate handler and dispatch it */ + if(handler == -1) { + DPRINTF(E_DBG,L_WS,"Thread %d: Using default handler.\n", + pwsc->threadno); + ws_defaulthandler(pwsp,pwsc); + } else { + DPRINTF(E_DBG,L_WS,"Thread %d: Using non-default handler\n", + pwsc->threadno); + + can_dispatch=0; + /* If an auth handler is registered, but it accepts a + * username and password of NULL, then don't bother + * authing. + */ + if((auth_handler) && (auth_handler(NULL,NULL)==0)) { + /* do the auth thing */ + auth=ws_getarg(&pwsc->request_headers,"Authorization"); + if((auth) && (ws_decodepassword(auth,&username,&password) != -1)) { + if(auth_handler(username,password)) + can_dispatch=1; + ws_addarg(&pwsc->request_vars,"HTTP_USER","%s",username); + ws_addarg(&pwsc->request_vars,"HTTP_PASSWD","%s",password); + free(username); /* this frees password too */ + } + + if(!can_dispatch) { /* auth failed, or need auth */ + //ws_addarg(&pwsc->response_headers,"Connection","close"); + ws_addarg(&pwsc->response_headers,"WWW-Authenticate", + "Basic realm=\"webserver\""); + ws_returnerror(pwsc,401,"Unauthorized"); + pwsc->error=0; + } + } else { + can_dispatch=1; + } + + if(can_dispatch) { + if(req_handler) + req_handler(pwsc); + else + ws_defaulthandler(pwsp,pwsc); + } + } + + if((pwsc->close) || (pwsc->error) || (pwsp->stop)) { + pwsc->close=1; + connection_done=1; + } + ws_close(pwsc); } DPRINTF(E_SPAM,L_WS,"Exiting ws_dispatcher\n"); return NULL; @@ -983,15 +988,15 @@ char *useragent; DPRINTF(E_WARN,L_WS,"Thread %d: Entering ws_returnerror (%d: %s)\n", - pwsc->threadno,error,description); + pwsc->threadno,error,description); ws_writefd(pwsc,"HTTP/1.1 %d %s\r\n",error,description); - + /* we'll force a close here unless the user agent is iTunes, which seems to get pissy about it */ useragent = ws_getarg(&pwsc->request_headers,"User-Agent"); if(useragent && (strncmp(useragent,"iTunes",6))) { - pwsc->close=1; - ws_addarg(&pwsc->response_headers,"Connection","close"); + pwsc->close=1; + ws_addarg(&pwsc->response_headers,"Connection","close"); } ws_emitheaders(pwsc); @@ -1001,8 +1006,8 @@ ws_writefd(pwsc,"\r\n<H1>%s</H1>\r\n",description); ws_writefd(pwsc,"Error %d\r\n<hr>\r\n",error); ws_writefd(pwsc,"<i>mt-daapd: %s\r\n<br>",VERSION); - if(errno) - ws_writefd(pwsc,"Error: %s\r\n",strerror(errno)); + if(errno) + ws_writefd(pwsc,"Error: %s\r\n",strerror(errno)); ws_writefd(pwsc,"</i></BODY>\r\n</HTML>\r\n"); @@ -1021,52 +1026,52 @@ char resolved_path[MAXPATHLEN]; int file_fd; off_t len; - + DPRINTF(E_SPAM,L_WS,"Entering ws_defaulthandler\n"); snprintf(path,MAXPATHLEN,"%s/%s",pwsp->wsconfig.web_root,pwsc->uri); if(!realpath(path,resolved_path)) { - pwsc->error=errno; - DPRINTF(E_WARN,L_WS,"Exiting ws_defaulthandler: Cannot resolve %s\n",path); - ws_returnerror(pwsc,404,"Not found"); - ws_close(pwsc); - return; + pwsc->error=errno; + DPRINTF(E_WARN,L_WS,"Exiting ws_defaulthandler: Cannot resolve %s\n",path); + ws_returnerror(pwsc,404,"Not found"); + ws_close(pwsc); + return; } DPRINTF(E_DBG,L_WS,"Thread %d: Preparing to serve %s\n", - pwsc->threadno, resolved_path); + pwsc->threadno, resolved_path); if(strncmp(resolved_path,pwsp->wsconfig.web_root, - strlen(pwsp->wsconfig.web_root))) { - pwsc->error=EINVAL; - DPRINTF(E_WARN,L_WS,"Exiting ws_defaulthandler: Thread %d: " - "Requested file %s out of root\n", - pwsc->threadno,resolved_path); - ws_returnerror(pwsc,403,"Forbidden"); - ws_close(pwsc); - return; + strlen(pwsp->wsconfig.web_root))) { + pwsc->error=EINVAL; + DPRINTF(E_WARN,L_WS,"Exiting ws_defaulthandler: Thread %d: " + "Requested file %s out of root\n", + pwsc->threadno,resolved_path); + ws_returnerror(pwsc,403,"Forbidden"); + ws_close(pwsc); + return; } file_fd=open(resolved_path,O_RDONLY); if(file_fd == -1) { - pwsc->error=errno; - DPRINTF(E_WARN,L_WS,"Exiting ws_defaulthandler: Thread %d: " - "Error opening %s: %s\n", - pwsc->threadno,resolved_path,strerror(errno)); - ws_returnerror(pwsc,404,"Not found"); - ws_close(pwsc); - return; + pwsc->error=errno; + DPRINTF(E_WARN,L_WS,"Exiting ws_defaulthandler: Thread %d: " + "Error opening %s: %s\n", + pwsc->threadno,resolved_path,strerror(errno)); + ws_returnerror(pwsc,404,"Not found"); + ws_close(pwsc); + return; } - + /* set the Content-Length response header */ len=lseek(file_fd,0,SEEK_END); /* FIXME: assumes off_t == long */ if(len != -1) { - /* we have a real length */ - DPRINTF(E_DBG,L_WS,"Length of file is %ld\n",(long)len); - ws_addarg(&pwsc->response_headers,"Content-Length","%ld",(long)len); - lseek(file_fd,0,SEEK_SET); + /* we have a real length */ + DPRINTF(E_DBG,L_WS,"Length of file is %ld\n",(long)len); + ws_addarg(&pwsc->response_headers,"Content-Length","%ld",(long)len); + lseek(file_fd,0,SEEK_SET); } @@ -1078,8 +1083,8 @@ r_close(file_fd); DPRINTF(E_DBG,L_WS,"Exiting ws_defaulthandler: " - "Thread %d: Served successfully\n", - pwsc->threadno); + "Thread %d: Served successfully\n", + pwsc->threadno); return; } @@ -1113,7 +1118,7 @@ retval=ws_getarg(root,key); if(!retval) - return 0; + return 0; return !strcasecmp(value,retval); } @@ -1135,10 +1140,10 @@ ARGLIST *pcurrent=root->next; while((pcurrent)&&(strcasecmp(pcurrent->key,key))) - pcurrent=pcurrent->next; + pcurrent=pcurrent->next; if(pcurrent) - return pcurrent->value; + return pcurrent->value; return NULL; } @@ -1175,7 +1180,7 @@ pnew=(ARGLIST*)malloc(sizeof(ARGLIST)); if((!pnew)||(!newkey)||(!newvalue)) - return -1; + return -1; pnew->key=newkey; pnew->value=newvalue; @@ -1186,17 +1191,17 @@ current=root->next; while(current) { - if(!strcmp(current->key,key)) { - /* got a match! */ - DPRINTF(E_DBG,L_WS,"Updating %s from %s to %s\n", - key,current->value,value); - free(current->value); - current->value = newvalue; - free(newkey); - free(pnew); - return 0; - } - current=current->next; + if(!strcmp(current->key,key)) { + /* got a match! */ + DPRINTF(E_DBG,L_WS,"Updating %s from %s to %s\n", + key,current->value,value); + free(current->value); + current->value = newvalue; + free(newkey); + free(pnew); + return 0; + } + current=current->next; } @@ -1224,49 +1229,49 @@ pnew=(char*)malloc(strlen(string)+1); if(!pnew) - return NULL; + return NULL; src=string; dst=pnew; while(*src) { - switch(*src) { - /* DWB - space gets converted to %20, not +, this definitely breaks compatibility with iTunes */ - /* But the browsers encode space as plus, so when using the web interface, - * anything with a plus is broken. This will end up having to be sniffed - * by remote agent */ - case '+': - if(space_as_plus) { - *dst++=' '; - } else { - *dst++=*src; - } - src++; - break; - case '%': - /* this is hideous */ - src++; - if(*src) { - if((*src <= '9') && (*src >='0')) - val=(*src - '0'); - else if((tolower(*src) <= 'f')&&(tolower(*src) >= 'a')) - val=10+(tolower(*src) - 'a'); - src++; - } - if(*src) { - val *= 16; - if((*src <= '9') && (*src >='0')) - val+=(*src - '0'); - else if((tolower(*src) <= 'f')&&(tolower(*src) >= 'a')) - val+=(10+(tolower(*src) - 'a')); - src++; - } - *dst++=val; - break; - default: - *dst++=*src++; - break; - } + switch(*src) { + /* DWB - space gets converted to %20, not +, this definitely breaks compatibility with iTunes */ + /* But the browsers encode space as plus, so when using the web interface, + * anything with a plus is broken. This will end up having to be sniffed + * by remote agent */ + case '+': + if(space_as_plus) { + *dst++=' '; + } else { + *dst++=*src; + } + src++; + break; + case '%': + /* this is hideous */ + src++; + if(*src) { + if((*src <= '9') && (*src >='0')) + val=(*src - '0'); + else if((tolower(*src) <= 'f')&&(tolower(*src) >= 'a')) + val=10+(tolower(*src) - 'a'); + src++; + } + if(*src) { + val *= 16; + if((*src <= '9') && (*src >='0')) + val+=(*src - '0'); + else if((tolower(*src) <= 'f')&&(tolower(*src) >= 'a')) + val+=(10+(tolower(*src) - 'a')); + src++; + } + *dst++=val; + break; + default: + *dst++=*src++; + break; + } } *dst='\0'; @@ -1285,21 +1290,21 @@ * regerror to display a more interesting error message, * if appropriate. */ -int ws_registerhandler(WSHANDLE ws, char *regex, - void(*handler)(WS_CONNINFO*), - int(*auth)(char *, char *), - int addheaders) { +int ws_registerhandler(WSHANDLE ws, char *regex, + void(*handler)(WS_CONNINFO*), + int(*auth)(char *, char *), + int addheaders) { WS_HANDLER *phandler; WS_PRIVATE *pwsp = (WS_PRIVATE *)ws; phandler=(WS_HANDLER *)malloc(sizeof(WS_HANDLER)); if(!phandler) - return -1; + return -1; if(regcomp(&phandler->regex,regex,REG_EXTENDED | REG_NOSUB)) { - free(phandler); - errno=EINVAL; - return -1; + free(phandler); + errno=EINVAL; + return -1; } phandler->req_handler=handler; @@ -1322,10 +1327,10 @@ * If a handler is found, it returns 0, otherwise, returns * -1 */ -int ws_findhandler(WS_PRIVATE *pwsp, WS_CONNINFO *pwsc, - void(**preq)(WS_CONNINFO*), - int(**pauth)(char *, char *), - int *addheaders) { +int ws_findhandler(WS_PRIVATE *pwsp, WS_CONNINFO *pwsc, + void(**preq)(WS_CONNINFO*), + int(**pauth)(char *, char *), + int *addheaders) { WS_HANDLER *phandler=pwsp->handlers.next; ws_lock_unsafe(); @@ -1333,19 +1338,19 @@ *preq=NULL; DPRINTF(E_DBG,L_WS,"Thread %d: Preparing to find handler\n", - pwsc->threadno); + pwsc->threadno); while(phandler) { - if(!regexec(&phandler->regex,pwsc->uri,0,NULL,0)) { - /* that's a match */ - DPRINTF(E_DBG,L_WS,"Thread %d: URI Match!\n",pwsc->threadno); - *preq=phandler->req_handler; - *pauth=phandler->auth_handler; - *addheaders=phandler->addheaders; - ws_unlock_unsafe(); - return 0; - } - phandler=phandler->next; + if(!regexec(&phandler->regex,pwsc->uri,0,NULL,0)) { + /* that's a match */ + DPRINTF(E_DBG,L_WS,"Thread %d: URI Match!\n",pwsc->threadno); + *preq=phandler->req_handler; + *pauth=phandler->auth_handler; + *addheaders=phandler->addheaders; + ws_unlock_unsafe(); + return 0; + } + phandler=phandler->next; } ws_unlock_unsafe(); @@ -1374,29 +1379,29 @@ *password=NULL; if(ws_lock_unsafe() == -1) - return -1; + return -1; if(!ws_xlat_init) { - ws_xlat_init=1; + ws_xlat_init=1; - memset((char*)&ws_xlat,0xFF,sizeof(ws_xlat)); - for(index=0; index < 26; index++) { - ws_xlat['A' + index] = index; - ws_xlat['a' + index] = index + 26; - } + memset((char*)&ws_xlat,0xFF,sizeof(ws_xlat)); + for(index=0; index < 26; index++) { + ws_xlat['A' + index] = index; + ws_xlat['a' + index] = index + 26; + } - for(index=0; index < 10; index++) { - ws_xlat['0' + index] = index + 52; - } - - ws_xlat['+'] = 62; - ws_xlat['/'] = 63; + for(index=0; index < 10; index++) { + ws_xlat['0' + index] = index + 52; + } + + ws_xlat['+'] = 62; + ws_xlat['/'] = 63; } if(ws_unlock_unsafe() == -1) - return -1; + return -1; /* xlat table is initialized */ - + // Trim leading spaces while((*header) && (*header != ' ')) header++; @@ -1405,17 +1410,17 @@ type=header; base64 = strchr(header,' '); if(!base64) { - // invalid auth header + // invalid auth header DPRINTF(E_DBG,L_WS,"Bad authentication header: %s\n",header); return -1; } - + *base64 = '\0'; base64++; decodebuffer=(unsigned char *)malloc(strlen(base64)); if(!decodebuffer) - return -1; + return -1; DPRINTF(E_DBG,L_WS,"Preparing to decode %s\n",base64); @@ -1426,44 +1431,44 @@ /* this is more than a little sloppy */ while(pin[rack]) { - if(pin[rack] != '=') { - lookup=ws_xlat[pin[rack]]; - if(lookup == 0xFF) { - DPRINTF(E_WARN,L_WS,"Got garbage Authenticate header\n"); - return -1; - } + if(pin[rack] != '=') { + lookup=ws_xlat[pin[rack]]; + if(lookup == 0xFF) { + DPRINTF(E_WARN,L_WS,"Got garbage Authenticate header\n"); + return -1; + } - /* valid character */ - switch(rack) { - case 0: - pout[0]=(lookup << 2); - break; - case 1: - pout[0] |= (lookup >> 4); - pout[1] = (lookup << 4); - break; - case 2: - pout[1] |= (lookup >> 2); - pout[2] = (lookup << 6); - break; - case 3: - pout[2] |= lookup; - break; - } - rack++; - } else { - /* padding char */ - pads++; - rack++; - } + /* valid character */ + switch(rack) { + case 0: + pout[0]=(lookup << 2); + break; + case 1: + pout[0] |= (lookup >> 4); + pout[1] = (lookup << 4); + break; + case 2: + pout[1] |= (lookup >> 2); + pout[2] = (lookup << 6); + break; + case 3: + pout[2] |= lookup; + break; + } + rack++; + } else { + /* padding char */ + pads++; + rack++; + } - if(rack == 4) { - pin += 4; - pout += 3; + if(rack == 4) { + pin += 4; + pout += 3; - len += (3-pads); - rack=0; - } + len += (3-pads); + rack=0; + } } /* we now have the decoded string */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-02-21 05:49:33
|
Revision: 1715 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1715&view=rev Author: rpedde Date: 2008-02-20 21:49:30 -0800 (Wed, 20 Feb 2008) Log Message: ----------- oops Added Paths: ----------- trunk/src/includes.h Added: trunk/src/includes.h =================================================================== --- trunk/src/includes.h (rev 0) +++ trunk/src/includes.h 2008-02-21 05:49:30 UTC (rev 1715) @@ -0,0 +1,35 @@ +/** + * $id: $ + * + * Common includes + */ + +#ifndef _INCLUDES_H_ +#define _INCLUDES_H_ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <id3tag.h> +#include <limits.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#ifdef HAVE_DIRENT_H +# include <dirent.h> +#endif +#ifndef WIN32 +#include <unistd.h> + +# include <netinet/in.h> /* htons and friends */ +#endif +#include <sys/stat.h> + + +#endif /* _INCLUDES_H_ */ + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-02-18 04:47:16
|
Revision: 1714 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1714&view=rev Author: rpedde Date: 2008-02-17 20:47:14 -0800 (Sun, 17 Feb 2008) Log Message: ----------- Make sqlite3 work Modified Paths: -------------- trunk/src/db-sql-sqlite2.c trunk/src/db-sql-sqlite3.c trunk/src/db-sql-sqlite3.h trunk/src/db-sql-updates.c trunk/src/db.c trunk/src/db.h trunk/src/mp3-scanner.c trunk/src/playlists.c Modified: trunk/src/db-sql-sqlite2.c =================================================================== --- trunk/src/db-sql-sqlite2.c 2008-01-12 08:00:53 UTC (rev 1713) +++ trunk/src/db-sql-sqlite2.c 2008-02-18 04:47:14 UTC (rev 1714) @@ -60,7 +60,6 @@ /* Globals */ static pthread_mutex_t db_sqlite2_mutex; -static pthread_mutexattr_t db_sqlite2_mutexattr; static pthread_key_t db_sqlite2_key; static char db_sqlite2_path[PATH_MAX + 1]; extern char *db_sqlite2_initial; @@ -181,7 +180,8 @@ db_sqlite2_unlock(); if(DB_E_SUCCESS == (err = db_sqlite2_exec(pe, E_FATAL, "%s", sql))) { - pmo->id = (uint32_t)db_sqlite2_insert_id(); + if(!pmo->id) + pmo->id = (uint32_t)db_sqlite2_insert_id(); } return err; @@ -276,23 +276,9 @@ * @param version version to set */ void db_sqlite2_set_version(int version) { - IOHANDLE handle; - char *cache_dir; + db_sqlite2_exec(NULL,E_DBG,"update config set value=%d where term='version'", + version); - handle = io_new(); - if(!handle) DPRINTF(E_FATAL,L_DB,"Can't alloc handle in set_version\n"); - - cache_dir = conf_alloc_string("general","cache_dir",NULL); - if(!cache_dir) DPRINTF(E_FATAL,L_DB,"general/cache_dir not set\n"); - - if(!io_open(handle,"file://%s/db.version?mode=w&ascii=1",cache_dir)) { - DPRINTF(E_FATAL,L_DB,"Can't open db.version: %s\n",io_errstr(handle)); - free(cache_dir); - } - - free(cache_dir); - io_printf(handle,"%d\n",version); - io_dispose(handle); } int db_sqlite2_fetch_int(char **pe, int *ival, char *fmt, ...) { @@ -320,63 +306,33 @@ sqlite_freemem(query); db_sqlite2_unlock(); - result = atoi(row[0]); - *ival = result; + if(row) { + result = atoi(row[0]); + *ival = result; + } else { + err = DB_E_NOROWS; + } db_sqlite2_dispose_row(opaque); return err; } /** - * returns the db version of the current database + * returns the db version of the current database. Returns + * zero on error. * * @returns db version */ int db_sqlite2_db_version(void) { char *pe; int version; - IOHANDLE handle; - char *cache_dir; - char linebuffer[20]; - uint32_t bufferlen; - /* first, try and get it from the config table, if it exists */ - - if(DB_E_SUCCESS == - db_sqlite2_fetch_int(&pe, &version,"select value from config where " - "term='version'")) { - db_sqlite2_exec(NULL,E_DBG,"drop table config"); - db_sqlite2_set_version(version); + if(DB_E_SUCCESS == db_sqlite2_fetch_int(&pe, &version, "select value from" + " config where term='version'")) { return version; - } else { - if(pe) free(pe); } - cache_dir = conf_alloc_string("general","cache_dir",NULL); - if(!cache_dir) return 0; - - /* otherwise, read it from the db.version file */ - handle = io_new(); - if(!handle) return 0; - - if(!io_open(handle,"file://%s/db.version?ascii=1",cache_dir)) { - free(cache_dir); - io_dispose(handle); - return 0; - } - - free(cache_dir); - - io_buffer(handle); - bufferlen = sizeof(linebuffer); - if(!io_readline(handle,(unsigned char *)linebuffer,&bufferlen)) { - version = 0; - } else { - version = atoi(linebuffer); - } - - io_dispose(handle); - return version; + return 0; } /** @@ -449,10 +405,11 @@ int version; int max_version; int result; + pthread_mutexattr_t mutexattr; - pthread_mutexattr_init(&db_sqlite2_mutexattr); - pthread_mutexattr_settype(&db_sqlite2_mutexattr,PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&db_sqlite2_mutex,&db_sqlite2_mutexattr); + pthread_mutexattr_init(&mutexattr); + pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&db_sqlite2_mutex,&mutexattr); db_dir = conf_alloc_string("general","cache_dir",NULL); if(!db_dir) { @@ -485,7 +442,7 @@ db_sqlite2_exec(NULL,E_DBG,"drop table songs"); db_sqlite2_exec(NULL,E_FATAL,db_sqlite2_initial); version = DB_SQLITE2_VERSION; - } else if(version != DB_SQLITE2_VERSION) { + } else if(version < DB_SQLITE2_VERSION) { /* have to do the upgrade */ max_version = 0; while(db_sqlite_updates[max_version]) max_version++; @@ -504,6 +461,14 @@ } } + if(version != DB_SQLITE2_VERSION) { + /* existing db too new */ + DPRINTF(E_LOG,L_DB,"DB version %d to new. I only understand %d. Aborting\n", + version,DB_SQLITE2_VERSION); + db_sqlite2_set_error(pe,DB_E_WRONGVERSION); + return DB_E_WRONGVERSION; + } + db_sqlite2_set_version(DB_SQLITE2_VERSION); return DB_E_SUCCESS; @@ -719,7 +684,6 @@ * * @returns autoupdate value */ - int db_sqlite2_insert_id(void) { return sqlite_last_insert_rowid(db_sqlite2_handle()); } @@ -767,5 +731,10 @@ " contentrating INTEGER DEFAULT 0,\n" " bits_per_sample INTEGER DEFAULT 0,\n" " album_artist VARCHAR(1024)\n" /* 40 */ -");\n"; - +");\n" +"create table config (\n" +" term VARCHAR(255) NOT NULL,\n" +" subterm VARCHAR(255) DEFAULT NULL,\n" +" value VARCHAR(1024) NOT NULL\n" +");\n" +"insert into config values ('version','','14');\n"; Modified: trunk/src/db-sql-sqlite3.c =================================================================== --- trunk/src/db-sql-sqlite3.c 2008-01-12 08:00:53 UTC (rev 1713) +++ trunk/src/db-sql-sqlite3.c 2008-02-18 04:47:14 UTC (rev 1714) @@ -29,7 +29,7 @@ */ #ifdef HAVE_CONFIG_H -# include "config.h" +# include "config.h" #endif #define _XOPEN_SOURCE 500 @@ -60,32 +60,231 @@ # define FALSE 0 #endif +typedef struct db_sqlite3_enum_helper_t { + char *query; + sqlite3_stmt *stmt; + const char *ptail; + char **row; +} DB_SQLITE3_EH; /* Globals */ -static pthread_mutex_t db_sqlite3_mutex = PTHREAD_MUTEX_INITIALIZER; /**< sqlite not reentrant */ -static sqlite3_stmt *db_sqlite3_stmt; -static const char *db_sqlite3_ptail; -static char **db_sqlite3_row = NULL; +static pthread_mutex_t db_sqlite3_mutex; static pthread_key_t db_sqlite3_key; static char db_sqlite3_path[PATH_MAX + 1]; -#define DB_SQLITE3_VERSION 13 +#define DB_SQLITE3_VERSION 14 /* Forwards */ static void db_sqlite3_lock(void); static void db_sqlite3_unlock(void); extern char *db_sqlite3_initial; -static int db_sqlite3_enum_begin_helper(char **pe); +static int db_sqlite3_enum_begin_helper(char **pe, void *opaque); static int db_sqlite3_exec(char **pe, int loglevel, char *fmt, ...); +static int db_sqlite3_insert_id(void); +static void db_sqlite3_set_error(char **pe, int error, ...); +static void db_sqlite3_set_version(int version); +static int db_sqlite3_enum_begin(char **pe, void **opaque, char *fmt, ...); +static int db_sqlite3_enum_fetch(char **pe, void *opaque, char ***row); +static int db_sqlite3_fetch_row(char **pe, void **opaque, char ***row, char *fmt, ...); +static void db_sqlite3_dispose_row(void *opaque); +extern char *db_sqlite_updates[]; +/** + * sets the db version of the current database in the db.version + * file in the cache_dir + * + * @param version version to set + */ +void db_sqlite3_set_version(int version) { + db_sqlite3_exec(NULL,E_DBG,"update config set value=%d where term='version'", + version); -int db_sqlite3_add(char **pe, MEDIA_NATIVE *pmo) { +} + +/** + * @param pe error buffer + * @param ppmo returns the result + * @return DB_E_SUCCESS on success, error code with pe allocated otherwise + */ +int db_sqlite3_fetch_item(char **pe, uint32_t id, void **opaque, MEDIA_STRING **ppms) { + return db_sqlite3_fetch_row(pe, opaque, (char***)ppms, "select * from songs where id=%d",id); +} + +int db_sqlite3_fetch_row(char **pe, void **opaque, char ***row, char *fmt, ...) { + DB_SQLITE3_EH *peh; + va_list ap; + int err; + + peh = (DB_SQLITE3_EH*)malloc(sizeof(DB_SQLITE3_EH)); + + if(!peh) { + db_sqlite3_set_error(pe, DB_E_MALLOC); + return DB_E_MALLOC; + } + + *opaque = peh; + memset(peh,0,sizeof(DB_SQLITE3_EH)); + + db_sqlite3_lock(); + va_start(ap,fmt); + peh->query = sqlite3_vmprintf(fmt,ap); + va_end(ap); + + if(DB_E_SUCCESS != (err = db_sqlite3_enum_begin_helper(pe, *opaque))) + return err; + + if(DB_E_SUCCESS != (err = db_sqlite3_enum_fetch(pe, *opaque, row))) { + db_sqlite3_enum_end(NULL, *opaque); + return err; + } + return DB_E_SUCCESS; } /** + * dispose of a row fetched via db_sqlite2_fetch + * + * @param ppms media object to destroy + */ +void db_sqlite3_dispose_item(void *opaque, MEDIA_STRING *ppms) { + db_sqlite3_dispose_row(opaque); +} + +void db_sqlite3_dispose_row(void *opaque) { + if(opaque) + db_sqlite3_enum_end(NULL,opaque); +} + +/** + * some db actions can be optimized by the db itself. + * this is particularly true on prescans, when + * the entire action can be wrapped in a transaction + * + * @param hint hint type (@see ff-dbstruct.h) + */ +void db_sqlite3_hint(int hint) { + return; + + switch(hint) { + case DB_HINT_PRESCAN_START: + db_sqlite3_exec(NULL,E_LOG,"PRAGMA synchronous=off;PRAGMA temp_store=MEMORY;BEGIN;"); + + break; + case DB_HINT_PRESCAN_END: + db_sqlite3_exec(NULL,E_LOG,"END;PRAGMA synchronous=on;"); + break; + } +} + + +/** + * delete a media object by id + * + * @param pe error buffer + * @param id id of media object to delete + * @returns DB_E_SUCCESS on success, error on failure with pe allocated + */ +int db_sqlite3_del(char **pe, uint32_t id) { + return db_sqlite3_exec(pe,E_LOG,"delete from songs where id=%d",id); +} + +/** + * insert a media object into the database + * + * @param pe error buffer + * @param pmo object to add + * @returns DB_E_SUCCESS on success. pmo->id gets updated on add/update + */ +int db_sqlite3_add(char **pe, MEDIA_NATIVE *pmo) { + char *sql; + char *term; + int field,pass; + int offset; + int err; + + db_sqlite3_lock(); + + if(pmo->id) { + /* update query */ + sql = util_asprintf("update songs set "); + for(field = 1; field < SG_LAST; field++) { /* skip id */ + offset = ff_field_data[field].offset; + + switch(ff_field_data[field].type) { + case FT_INT32: + sql = util_aasprintf(sql,"%s = %d%c ",ff_field_data[field].name, + *((uint32_t*)(((void*)pmo)+offset)), + (field == (SG_LAST - 1)) ? ' ' : ','); + break; + case FT_INT64: + sql = util_aasprintf(sql,"%s = %llu%c ",ff_field_data[field].name, + *((uint64_t*)(((void*)pmo)+offset)), + (field == (SG_LAST - 1)) ? ' ' : ','); + break; + case FT_STRING: + term = sqlite3_mprintf("%Q",*(char**)(((void*)pmo)+offset)); + sql = util_aasprintf(sql,"%s = %s%c ",ff_field_data[field].name, + term, (field == (SG_LAST - 1)) ? ' ' : ','); + sqlite3_free(term); + break; + default: + DPRINTF(E_FATAL,L_DB,"Unhandled data type in db_add for '%s'\n", + ff_field_data[field].name); + break; + } + } + sql = util_aasprintf(sql,"where id=%d",pmo->id); + } else { + /* insert query */ + sql = util_asprintf("insert into songs ("); + for(pass = 0; pass < 2; pass++) { + for(field = 1; field < SG_LAST; field++) { /* skip id */ + if(!pass) { + sql = util_aasprintf(sql,"%s%c ",ff_field_data[field].name, + (field == (SG_LAST - 1)) ? ')' : ','); + } else { + offset = ff_field_data[field].offset; + switch(ff_field_data[field].type) { + case FT_INT32: + sql = util_aasprintf(sql,"%d%c ", + *((uint32_t*)(((void*)pmo)+offset)), + (field == (SG_LAST - 1)) ? ')' : ','); + break; + case FT_INT64: + sql = util_aasprintf(sql,"%llu%c ", + *((uint64_t*)(((void*)pmo)+offset)), + (field == (SG_LAST - 1)) ? ')' : ','); + break; + case FT_STRING: + term = sqlite3_mprintf("%Q",*(char**)((((void*)pmo)+offset))); + sql = util_aasprintf(sql,"%s%c ", term, + (field == (SG_LAST - 1)) ? ')' : ','); + sqlite3_free(term); + break; + default: + DPRINTF(E_FATAL,L_DB,"Unhandled data type in db_add for '%s'\n", + ff_field_data[field].name); + break; + } + } + } + if(!pass) + sql = util_aasprintf(sql," values ("); + } + } + db_sqlite3_unlock(); + + if(DB_E_SUCCESS == (err = db_sqlite3_exec(pe, E_FATAL, "%s", sql))) { + if(!pmo->id) + pmo->id = (uint32_t)db_sqlite3_insert_id(); + } + + return err; +} + +/** * get (or create) the db handle */ sqlite3 *db_sqlite3_handle(void) { @@ -191,13 +390,28 @@ */ int db_sqlite3_open(char **pe, char *dsn) { sqlite3 *pdb; + pthread_mutexattr_t mutexattr; + char *db_dir; + int version; + int max_version; + int result; + pthread_mutexattr_init(&mutexattr); + pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&db_sqlite3_mutex,&mutexattr); + + db_dir = conf_alloc_string("general","cache_dir",NULL); + if(!db_dir) { + db_sqlite3_set_error(pe,DB_E_NOPATH); + return DB_E_NOPATH; + } + pthread_key_create(&db_sqlite3_key, (void*)db_sqlite3_freedb); - snprintf(db_sqlite3_path,sizeof(db_sqlite3_path),"%s/songs3.db",dsn); + snprintf(db_sqlite3_path,sizeof(db_sqlite3_path),"%s/songs3.db",db_dir); db_sqlite3_lock(); if(sqlite3_open(db_sqlite3_path,&pdb) != SQLITE_OK) { - db_sqlite2_set_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(pdb)); + db_sqlite3_set_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(pdb)); DPRINTF(E_LOG,L_DB,"db_sqlite3_open: %s (%s)\n",pe ? *pe : "Unknown", db_sqlite3_path); db_sqlite3_unlock(); @@ -206,11 +420,41 @@ sqlite3_close(pdb); db_sqlite3_unlock(); - if(db_sqlite3_db_version() != DB_SQLITE3_VERSION) { + + version = db_sqlite3_db_version(); + + if(!version) { + DPRINTF(E_LOG,L_DB,"Can't determine db version. Forcing full update\n"); db_sqlite3_exec(NULL,E_DBG,"drop table songs"); db_sqlite3_exec(NULL,E_FATAL,db_sqlite3_initial); + version = DB_SQLITE3_VERSION; + } else if(version < DB_SQLITE3_VERSION) { + max_version = 0; + while(db_sqlite_updates[max_version]) max_version++; + + DPRINTF(E_DBG,L_DB,"Current db version: %d\n",version); + DPRINTF(E_DBG,L_DB,"Target db version: %d\n",max_version); + + while(version < max_version) { + DPRINTF(E_LOG,L_DB,"Upgrading db: %d --> %d\n",version, version+1); + result = db_sqlite3_exec(pe,E_LOG,"%s",db_sqlite_updates[version]); + if(result != DB_E_SUCCESS) { + DPRINTF(E_FATAL,L_DB,"Error upgrading db: %s\n", pe ? *pe : "?"); + return result; + } + version++; + } } + if(version != DB_SQLITE3_VERSION) { + /* existing db too new */ + DPRINTF(E_LOG,L_DB,"DB version %d to new. I only understand %d. Aborting\n", + version,DB_SQLITE3_VERSION); + db_sqlite3_set_error(pe,DB_E_WRONGVERSION); + return DB_E_WRONGVERSION; + } + + db_sqlite3_set_version(DB_SQLITE3_VERSION); return DB_E_SUCCESS; } @@ -248,7 +492,7 @@ err=sqlite3_exec(db_sqlite3_handle(),query,NULL,NULL,&perr); if(err != SQLITE_OK) { - db_sqlite2_set_error(pe,DB_E_SQL_ERROR,perr); + db_sqlite3_set_error(pe,DB_E_SQL_ERROR,perr); DPRINTF(loglevel == E_FATAL ? E_LOG : loglevel,L_DB,"Query: %s\n", query); @@ -267,38 +511,70 @@ } /** + * start a db enumeration + */ +int db_sqlite3_enum_items_begin(char **pe, void **opaque) { + return db_sqlite3_enum_begin(pe, opaque, "select * from songs"); +} + +/** * start enumerating rows in a select */ -int db_sqlite3_enum_begin(char **pe) { +int db_sqlite3_enum_begin(char **pe, void **opaque, char *fmt, ...) { + DB_SQLITE3_EH *peh; + va_list ap; + + peh = (DB_SQLITE3_EH*)malloc(sizeof(DB_SQLITE3_EH)); + if(!peh) DPRINTF(E_FATAL,L_DB,"malloc error\n"); + + memset(peh,0,sizeof(DB_SQLITE3_EH)); + + *opaque = peh; + db_sqlite3_lock(); - return db_sqlite3_enum_begin_helper(pe); + + va_start(ap, fmt); + peh->query = sqlite3_vmprintf(fmt,ap); + va_end(ap); + + return db_sqlite3_enum_begin_helper(pe, *opaque); } -int db_sqlite3_enum_begin_helper(char **pe) { +int db_sqlite3_enum_begin_helper(char **pe, void *opaque) { int err; + DB_SQLITE3_EH *peh = (DB_SQLITE3_EH*)opaque; - DPRINTF(E_DBG,L_DB,"Executing: select * from songs\n"); - err=sqlite3_prepare(db_sqlite3_handle(),"select * from songs",-1, - &db_sqlite3_stmt,&db_sqlite3_ptail); + DPRINTF(E_DBG,L_DB,"Executing: %s\n", peh->query); + err=sqlite3_prepare(db_sqlite3_handle(),peh->query,-1, + &peh->stmt,&peh->ptail); + if(err != SQLITE_OK) { - db_sqlite2_set_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(db_sqlite3_handle())); + db_sqlite3_set_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(db_sqlite3_handle())); db_sqlite3_unlock(); return DB_E_SQL_ERROR; } - DPRINTF(E_SPAM,L_DB,"Prepared statement: %08X\n",db_sqlite3_stmt); - /* otherwise, we leave the db locked while we walk through the enums */ - if(db_sqlite3_row) - free(db_sqlite3_row); - db_sqlite3_row=NULL; + if(peh->row) + free(peh->row); + peh->row=NULL; + return DB_E_SUCCESS; } + /** + * simple wrapper around enum_fetch, that casts to items + */ +int db_sqlite3_enum_items_fetch(char **pe, void *opaque, MEDIA_STRING **ppmo) { + return db_sqlite3_enum_fetch(pe,opaque,(char***)ppmo); +} + + +/** * fetch the next row. This will return DB_E_SUCCESS if it got a * row, or it's done. If it's done, the row will be empty, otherwise * it will be full of data. Either way, if fetch fails, you must close. @@ -310,54 +586,52 @@ * DB_E_SUCCESS with a valid row when more data, * DB_E_* on error */ -int db_sqlite3_enum_fetch(char **pe, MEDIA_STRING **ppmo) { +int db_sqlite3_enum_fetch(char **pe, void *opaque, char ***row) { int err; int cols; int idx; int counter=10; - char ***pr = (char ***)ppmo; + DB_SQLITE3_EH *peh = (DB_SQLITE3_EH*)opaque; while(counter--) { - DPRINTF(E_SPAM,L_DB,"Fetching statement: %08X\n",db_sqlite3_stmt); - err=sqlite3_step(db_sqlite3_stmt); + err=sqlite3_step(peh->stmt); if(err != SQLITE_BUSY) break; usleep(1000); } if(err == SQLITE_DONE) { - *pr = NULL; - if(db_sqlite3_row) - free(db_sqlite3_row); - db_sqlite3_row = NULL; + *row = NULL; + if(peh->row) + free(peh->row); + peh->row = NULL; return DB_E_SUCCESS; } if(err == SQLITE_ROW) { - DPRINTF(E_SPAM,L_DB,"Got row\n"); - cols = sqlite3_column_count(db_sqlite3_stmt); + cols = sqlite3_column_count(peh->stmt); - if(!db_sqlite3_row) { + if(!peh->row) { /* gotta alloc space */ - db_sqlite3_row = (char**)malloc((sizeof(char*)) * cols); - if(!db_sqlite3_row) + peh->row = (char**)malloc((sizeof(char*)) * cols); + if(!peh->row) DPRINTF(E_FATAL,L_DB,"Malloc error\n"); } for(idx=0; idx < cols; idx++) { - db_sqlite3_row[idx] = (char*) sqlite3_column_blob(db_sqlite3_stmt,idx); + peh->row[idx] = (char*) sqlite3_column_blob(peh->stmt,idx); } - *pr = db_sqlite3_row; + *row = peh->row; return DB_E_SUCCESS; } - if(db_sqlite3_row) - free(db_sqlite3_row); - db_sqlite3_row = NULL; + if(peh->row) + free(peh->row); + peh->row = NULL; - db_sqlite2_set_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(db_sqlite3_handle())); - sqlite3_finalize(db_sqlite3_stmt); + db_sqlite3_set_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(db_sqlite3_handle())); + sqlite3_finalize(peh->stmt); return DB_E_SQL_ERROR; } @@ -365,16 +639,17 @@ /** * end the db enumeration */ -int db_sqlite3_enum_end(char **pe) { +int db_sqlite3_enum_end(char **pe, void *opaque) { int err; + DB_SQLITE3_EH *peh = (DB_SQLITE3_EH*)opaque; - if(db_sqlite3_row) - free(db_sqlite3_row); - db_sqlite3_row = NULL; + if(peh->row) + free(peh->row); + peh->row = NULL; - err = sqlite3_finalize(db_sqlite3_stmt); + err = sqlite3_finalize(peh->stmt); if(err != SQLITE_OK) { - db_sqlite2_set_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(db_sqlite3_handle())); + db_sqlite3_set_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(db_sqlite3_handle())); db_sqlite3_unlock(); return DB_E_SQL_ERROR; } @@ -386,8 +661,8 @@ /** * restart the enumeration */ -int db_sqlite3_enum_restart(char **pe) { - return db_sqlite3_enum_begin_helper(pe); +int db_sqlite3_enum_restart(char **pe, void *opaque) { + return db_sqlite3_enum_begin_helper(pe, opaque); } /** Modified: trunk/src/db-sql-sqlite3.h =================================================================== --- trunk/src/db-sql-sqlite3.h 2008-01-12 08:00:53 UTC (rev 1713) +++ trunk/src/db-sql-sqlite3.h 2008-02-18 04:47:14 UTC (rev 1714) @@ -28,12 +28,17 @@ /* add a media object */ extern int db_sqlite3_add(char **pe, MEDIA_NATIVE *pmo); +extern int db_sqlite3_del(char **pe, uint32_t id); /* walk through a table */ -extern int db_sqlite3_enum_begin(char **pe); -extern int db_sqlite3_enum_fetch(char **pe, MEDIA_STRING **ppmo); -extern int db_sqlite3_enum_end(char **pe); -extern int db_sqlite3_enum_restart(char **pe); +extern int db_sqlite3_enum_items_begin(char **pe, void **opaque); +extern int db_sqlite3_enum_items_fetch(char **pe, void *opaque, MEDIA_STRING **ppmo); +extern int db_sqlite3_enum_end(char **pe, void *opaque); +extern int db_sqlite3_enum_restart(char **pe, void *opaque); +extern int db_sqlite3_fetch_item(char **pe, uint32_t id, void **opaque, MEDIA_STRING **ppms); +extern void db_sqlite3_dispose_item(void *opaque, MEDIA_STRING *ppms); +extern void db_sqlite3_hint(int hint); + #endif /* _DB_SQL_SQLITE3_ */ Modified: trunk/src/db-sql-updates.c =================================================================== --- trunk/src/db-sql-updates.c 2008-01-12 08:00:53 UTC (rev 1713) +++ trunk/src/db-sql-updates.c 2008-02-18 04:47:14 UTC (rev 1714) @@ -469,6 +469,7 @@ "disabled,sample_count,codectype,idx,has_video,contentrating,bits_per_sample," "album_artist from tempsongs;\n" "commit transaction;\n" - "drop table tempsongs;\n", + "drop table tempsongs;\n" + "update config set value=14 where term='version';\n", NULL /* No more versions! */ }; Modified: trunk/src/db.c =================================================================== --- trunk/src/db.c 2008-01-12 08:00:53 UTC (rev 1713) +++ trunk/src/db.c 2008-02-18 04:47:14 UTC (rev 1714) @@ -241,7 +241,6 @@ #define DB_INT64_COPY(field) pnew->field=util_atoui64(pmos->field) - void db_cache_dump(void) { DB_CACHE_ENTRY *pentry; @@ -388,20 +387,28 @@ db_cache_dump(); /* first, see if it is in the cache */ + DPRINTF(E_DBG,L_DB,"Fetching %d from cache\n",id); config.stats.db_id_fetches++; pentry = db_cache_find(id); if(pentry) { + DPRINTF(E_DBG,L_DB,"Cache hit\n"); config.stats.db_id_hits++; pmn = pentry->pmn; db_cache_promote(pentry); pentry->refcount++; } else { + DPRINTF(E_DBG,L_DB,"Cache miss\n"); if(DB_E_SUCCESS == db_pfn->db_fetch_item(pe, id, &opaque, &pms)) { - pmn = db_string_to_native(pms); + if(pms) { + pmn = db_string_to_native(pms); + db_cache_insert(pmn); + } + db_pfn->db_dispose_item(opaque, pms); - db_cache_insert(pmn); + } else { + DPRINTF(E_DBG,L_DB,"Couldn't fetch from underlying storage\n"); } } db_cache_dump(); @@ -571,6 +578,17 @@ } #endif #ifdef HAVE_LIBSQLITE3 + db_pfn->db_open = db_sqlite3_open; + db_pfn->db_close = db_sqlite3_close; + db_pfn->db_add = db_sqlite3_add; + db_pfn->db_del = db_sqlite3_del; + db_pfn->db_enum_start = db_sqlite3_enum_items_begin; + db_pfn->db_enum_fetch = db_sqlite3_enum_items_fetch; + db_pfn->db_enum_reset = db_sqlite3_enum_restart; + db_pfn->db_enum_end = db_sqlite3_enum_end; + db_pfn->db_fetch_item = db_sqlite3_fetch_item; + db_pfn->db_dispose_item = db_sqlite3_dispose_item; + db_pfn->db_hint = db_sqlite3_hint; #endif if(!db_pfn) { @@ -641,6 +659,8 @@ ppn1 = (DB_PATH_NODE*)p1; ppn2 = (DB_PATH_NODE*)p2; + DPRINTF(E_SPAM,L_DB,"Comparing %s:%d to %s:%d\n",ppn1->path,ppn1->index, + ppn2->path,ppn2->index); result = strcmp(ppn1->path, ppn2->path); if(result) return result; @@ -741,7 +761,14 @@ */ int db_add(char **pe, MEDIA_NATIVE *pmo) { int result; + MEDIA_NATIVE *ptemp; + ptemp = db_fetch_path(NULL, pmo->path, pmo->idx); + if(ptemp) { + pmo->id = ptemp->id; + db_dispose_item(ptemp); + } + pmo->time_modified = (uint32_t)time(NULL); if(!pmo->id) { @@ -816,6 +843,9 @@ if(pinfo->limit == 0) pinfo->limit = INT_MAX; + if(pinfo->playlist_id == 0) + pinfo->playlist_id = 1; + pinfo->priv = (void*)malloc(sizeof(ENUMHELPER)); if(!pinfo->priv) { db_set_error(pe,DB_E_MALLOC); @@ -1327,12 +1357,14 @@ pnode = (DB_PATH_NODE*)rbfind((void*)&path_node,db_path_lookup); if(!pnode) { + DPRINTF(E_DBG,L_DB,"Couldn't find %s:%d\n",path,index); return NULL; } // Mark node as fetched in case we are in a scan pnode->fetched = 1; + DPRINTF(E_DBG,L_DB,"Fetching item %s:%d\n",path,index); return db_fetch_item(pe, pnode->id); } @@ -1568,6 +1600,11 @@ MEDIA_NATIVE *db_string_to_native(MEDIA_STRING *pmos) { MEDIA_NATIVE *pnew; + ASSERT(pmos); + + if(!pmos) + return NULL; + pnew = (MEDIA_NATIVE*)malloc(sizeof(MEDIA_NATIVE)); if(!pnew) return NULL; Modified: trunk/src/db.h =================================================================== --- trunk/src/db.h 2008-01-12 08:00:53 UTC (rev 1713) +++ trunk/src/db.h 2008-02-18 04:47:14 UTC (rev 1714) @@ -88,4 +88,5 @@ #define DB_E_PLAYLIST 0x11 /**< playlist error */ #define DB_E_NOPATH 0x12 /**< cache_dir not specified */ #define DB_E_NOTIMPL 0x13 /**< backend doesn't implement */ + #endif /* _DB_GENERIC_H_ */ Modified: trunk/src/mp3-scanner.c =================================================================== --- trunk/src/mp3-scanner.c 2008-01-12 08:00:53 UTC (rev 1713) +++ trunk/src/mp3-scanner.c 2008-02-18 04:47:14 UTC (rev 1714) @@ -617,6 +617,7 @@ pmp3 = db_fetch_path(NULL,mp3_path,0); if((!pmp3) || (pmp3->time_modified < mod_time)) { + DPRINTF(E_LOG,L_SCAN,"Scanning file %s\n",mp3_path); scan_music_file(path,fname,&sb,is_compdir); } else { DPRINTF(E_DBG,L_SCAN,"Skipping file, not modified\n"); Modified: trunk/src/playlists.c =================================================================== --- trunk/src/playlists.c 2008-01-12 08:00:53 UTC (rev 1713) +++ trunk/src/playlists.c 2008-02-18 04:47:14 UTC (rev 1714) @@ -91,6 +91,8 @@ /** * load a playlist. + * + * FIXME: should leverage add_playlist */ int pl_load(char *filename) { PLAYLIST_NATIVE *ppln; @@ -100,6 +102,7 @@ unsigned char *line; char *sep; uint32_t id; + int added = 1; DPRINTF(E_INF,L_PL,"Loading playlist %s\n",filename); handle = io_new(); @@ -126,8 +129,8 @@ while(io_allocline(handle, &line) && line) { DPRINTF(E_DBG,L_PL,"Loaded line: %s",line); - while((line[strlen(line)-1] == '\n') || (line[strlen(line)-1] == '\r')) - line[strlen(line)-1] = '\0'; + while((line[strlen((char*)line)-1] == '\n') || (line[strlen((char *)line)-1] == '\r')) + line[strlen((char*)line)-1] = '\0'; if(NULL != (sep = strchr((char*)line,':'))) { *sep++ = '\0'; @@ -156,13 +159,43 @@ free(line); } - pcurrent = &pl_list; - while(pcurrent->next) - pcurrent = pcurrent->next; + if(ppln->type & PL_DYNAMIC) { + ppl->pt = sp_init(); + if(ppl->pt) { + if(!sp_parse(ppl->pt,ppl->ppln->query,SP_TYPE_PLAYLIST)) { + DPRINTF(E_LOG,L_MISC,"Bad query in %s: %s\n",ppl->ppln->title,sp_get_error(ppl->pt)); + sp_dispose(ppl->pt); + added = 0; + } + } else { + DPRINTF(E_LOG,L_MISC,"Couldn't init parse tree\n"); + added=0; + } + } - pcurrent->next = ppl; - ppl->next = NULL; + if(added) { + pcurrent = &pl_list; + while(pcurrent->next) + pcurrent = pcurrent->next; + pcurrent->next = ppl; + ppl->next = NULL; + } else { + /* free up the struct */ + if(ppln) { + if(ppln->title) free(ppln->title); + if(ppln->query) free(ppln->query); + if(ppln->path) free(ppln->path); + free(ppln); + } + + if(ppl) { + /* walk the tree... */ + rbdestroy(ppl->prb); + free(ppl); + } + } + io_dispose(handle); return TRUE; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rp...@us...> - 2008-01-12 08:00:55
|
Revision: 1713 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1713&view=rev Author: rpedde Date: 2008-01-12 00:00:53 -0800 (Sat, 12 Jan 2008) Log Message: ----------- Fix osx rendezvous to not fork Modified Paths: -------------- trunk/src/Makefile.am trunk/src/rend-osx.c Modified: trunk/src/Makefile.am =================================================================== --- trunk/src/Makefile.am 2008-01-12 07:32:34 UTC (rev 1712) +++ trunk/src/Makefile.am 2008-01-12 08:00:53 UTC (rev 1713) @@ -19,7 +19,7 @@ endif if COND_REND_OSX -ORENDSRC=rend-osx.c rend-unix.c +ORENDSRC=rend-osx.c endif if COND_REND_AVAHI Modified: trunk/src/rend-osx.c =================================================================== --- trunk/src/rend-osx.c 2008-01-12 07:32:34 UTC (rev 1712) +++ trunk/src/rend-osx.c 2008-01-12 08:00:53 UTC (rev 1713) @@ -26,6 +26,7 @@ #include <unistd.h> #include <pwd.h> #include <pthread.h> +#include <signal.h> #include <sys/types.h> #include <libc.h> @@ -36,14 +37,17 @@ #include "daapd.h" #include "err.h" #include "os-unix.h" -#include "rend-unix.h" +#include "rend.h" CFRunLoopRef rend_runloop; CFRunLoopSourceRef rend_rls; pthread_t rend_tid; +#define MAX_TEXT_LEN 255 + /* Forwards */ void *rend_pipe_monitor(void* arg); +void *rend_runloop_threadproc(void* arg); /* * rend_stoprunloop @@ -109,36 +113,6 @@ } } -/* - * rend_pipe_monitor - */ -void *rend_pipe_monitor(void* arg) { - fd_set rset; - int result; - - - while(1) { - DPRINTF(E_DBG,L_REND,"Waiting for data\n"); - FD_ZERO(&rset); - FD_SET(rend_pipe_to[RD_SIDE],&rset); - - /* sit in a select spin until there is data on the to fd */ - while(((result=select(rend_pipe_to[RD_SIDE] + 1,&rset,NULL,NULL,NULL)) != -1) && - errno != EINTR) { - if(FD_ISSET(rend_pipe_to[RD_SIDE],&rset)) { - DPRINTF(E_DBG,L_REND,"Received a message from daap server\n"); - CFRunLoopSourceSignal(rend_rls); - CFRunLoopWakeUp(rend_runloop); - sleep(1); /* force a reschedule, hopefully */ - } - } - - DPRINTF(E_DBG,L_REND,"Select error!\n"); - /* should really bail here */ - } -} - - /** * Add a text stanza to the buffer (pascal-style multistring) * @@ -151,29 +125,27 @@ strcpy(ptr+1,string); } -/* - * rend_callback - * - * This gets called from the main thread when there is a - * message waiting to be processed. - */ -void rend_callback(void *info) { - REND_MESSAGE msg; +int rend_running(void) { + return TRUE; +} + +int rend_stop(void) { + rend_stoprunloop(); + pthread_join(rend_tid,NULL); + + return 1; +} + +int rend_register(char *name, char *type, int port, char *ifact, char *txt) { unsigned short usPort; dns_service_discovery_ref dns_ref=NULL; char *src,*dst; int len; - /* here, we've seen the message, now we have to process it */ - if(rend_read_message(&msg) != sizeof(msg)) { - DPRINTF(E_FATAL,L_REND,"Rendezvous socket closed (daap server crashed?) Aborting.\n"); - exit(EXIT_FAILURE); - } - - src=dst=msg.txt; - while(src && (*src) && (src - msg.txt < MAX_TEXT_LEN)) { + src=dst=txt; + while(src && (*src) && (src - txt < MAX_TEXT_LEN)) { len = (*src); - if((src + len + 1) - msg.txt < MAX_TEXT_LEN) { + if((src + len + 1) - txt < MAX_TEXT_LEN) { memmove(dst,src+1,len); dst += len; if(*src) { @@ -185,75 +157,80 @@ src += len + 1; } - switch(msg.cmd) { - case REND_MSG_TYPE_REGISTER: - DPRINTF(E_DBG,L_REND,"Registering %s.%s (%d)\n",msg.type,msg.name,msg.port); - usPort=htons(msg.port); - dns_ref=DNSServiceRegistrationCreate(msg.name,msg.type,"",usPort,msg.txt,rend_reply,nil); - if(rend_addtorunloop(dns_ref)) { - DPRINTF(E_WARN,L_REND,"Add to runloop failed\n"); - rend_send_response(-1); - } else { - rend_send_response(0); /* success */ - } - break; - case REND_MSG_TYPE_UNREGISTER: - DPRINTF(E_WARN,L_REND,"Unsupported function: UNREGISTER\n"); - rend_send_response(-1); /* error */ - break; - case REND_MSG_TYPE_STOP: - DPRINTF(E_DBG,L_REND,"Stopping mDNS\n"); - rend_send_response(0); - rend_stoprunloop(); - break; - case REND_MSG_TYPE_STATUS: - DPRINTF(E_DBG,L_REND,"Status inquiry -- returning 1\n"); - rend_send_response(1); /* success */ - break; - default: - break; + DPRINTF(E_DBG,L_REND,"Registering %s.%s (%d)\n",type,name,port); + usPort=htons(port); + dns_ref=DNSServiceRegistrationCreate(name,type,"",usPort,txt,rend_reply,nil); + if(rend_addtorunloop(dns_ref)) { + DPRINTF(E_WARN,L_REND,"Add to runloop failed\n"); + return -1; + } else { + return 0; } } +/** + * not implemeneted + * + * @param name name of service to unregistery + * @param type type of service to unregister + * @param port port of service to nregister + */ +int rend_unregister(char *name, char *type, int port) { + return -1; +} + + +/** + * execute the runloop + * + * @param arg unused + */ +void *rend_runloop_threadproc(void* arg) { + CFRunLoopSourceContext context; + + rend_runloop = CFRunLoopGetCurrent(); + rend_rls = CFRunLoopSourceCreate(NULL,0,&context); + CFRunLoopAddSource(CFRunLoopGetCurrent(),rend_rls,kCFRunLoopDefaultMode); + + DPRINTF(E_DBG,L_REND,"Starting runloop\n"); + CFRunLoopRun(); + DPRINTF(E_DBG,L_REND,"Exiting runloop\n"); + + CFRelease(rend_rls); + + return NULL; +} + + /* * rend_private_init * * start up the rendezvous services */ -int rend_private_init(char *user) { - CFRunLoopSourceContext context; +int rend_init(char *user) { + sigset_t set; - if(os_drop_privs(user)) /* shouldn't be running as root anyway */ + if((sigemptyset(&set) == -1) || + (sigaddset(&set,SIGINT) == -1) || + (sigaddset(&set,SIGHUP) == -1) || + (sigaddset(&set,SIGCHLD) == -1) || + (sigaddset(&set,SIGTERM) == -1) || + (sigaddset(&set,SIGPIPE) == -1) || + (pthread_sigmask(SIG_BLOCK, &set, NULL) == -1)) { + DPRINTF(E_LOG,L_MAIN,"Error setting signal set\n"); return -1; + } - /* need a sigint handler */ DPRINTF(E_DBG,L_REND,"Starting rendezvous services\n"); - memset((void*)&context,0,sizeof(context)); - context.perform = rend_callback; + DPRINTF(E_DBG,L_REND,"Starting runloop thread\n"); - rend_runloop = CFRunLoopGetCurrent(); - rend_rls = CFRunLoopSourceCreate(NULL,0,&context); - CFRunLoopAddSource(CFRunLoopGetCurrent(),rend_rls,kCFRunLoopDefaultMode); - - DPRINTF(E_DBG,L_REND,"Starting polling thread\n"); - - if(pthread_create(&rend_tid,NULL,rend_pipe_monitor,NULL)) { + if(pthread_create(&rend_tid,NULL,rend_runloop_threadproc,NULL)) { DPRINTF(E_FATAL,L_REND,"Could not start thread. Terminating\n"); /* should kill parent, too */ exit(EXIT_FAILURE); } - DPRINTF(E_DBG,L_REND,"Starting runloop\n"); - - CFRunLoopRun(); - - DPRINTF(E_DBG,L_REND,"Exiting runloop\n"); - - CFRelease(rend_rls); - pthread_cancel(rend_tid); - close(rend_pipe_to[RD_SIDE]); - close(rend_pipe_from[WR_SIDE]); return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |