From e9a65f13808cb4d9bd044de47ace5db008ebb117 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sun, 12 Jan 2020 19:05:26 -0800 Subject: minidlna: update to latest master Removed inactive maintainer. Cleaned up Makefile to remove old options. Switched to PKG_INSTALL for consistency. Added PKG_BUILD_PARALLEL for faster compilation. Fixed license info. Removed '' from enabled for consistency. Ran init script through shellcheck. Batched config file writes. Switched it to use procd. The -S parameter changes it to foreground. It stands for systemd. Added a sysctl tweak to get rid of warning. Signed-off-by: Rosen Penev --- multimedia/minidlna/Makefile | 40 ++--- multimedia/minidlna/files/minidlna.config | 3 +- multimedia/minidlna/files/minidlna.init | 61 ++++--- multimedia/minidlna/files/minidlna.sysctl | 2 + ...l_instances_of_magic_container_s_as_const.patch | 125 -------------- ...ap_container_definitions_into_a_structure.patch | 118 ------------- .../patches/004-reduce_duplication_in_sql_c.patch | 192 --------------------- multimedia/minidlna/patches/010-lg.patch | 24 +++ ...ap_container_definitions_into_a_structure.patch | 124 +++++++++++++ ...l_instances_of_magic_container_s_as_const.patch | 125 ++++++++++++++ multimedia/minidlna/patches/040-heroes.patch | 27 +++ .../minidlna/patches/050-no-cover-resizing.patch | 80 +++++++++ .../patches/060-reduce_duplication_in_sql_c.patch | 192 +++++++++++++++++++++ multimedia/minidlna/patches/070-return-void.patch | 21 +++ 14 files changed, 643 insertions(+), 491 deletions(-) create mode 100644 multimedia/minidlna/files/minidlna.sysctl delete mode 100644 multimedia/minidlna/patches/002-mark_all_instances_of_magic_container_s_as_const.patch delete mode 100644 multimedia/minidlna/patches/003-wrap_container_definitions_into_a_structure.patch delete mode 100644 multimedia/minidlna/patches/004-reduce_duplication_in_sql_c.patch create mode 100644 multimedia/minidlna/patches/010-lg.patch create mode 100644 multimedia/minidlna/patches/020-wrap_container_definitions_into_a_structure.patch create mode 100644 multimedia/minidlna/patches/030-mark_all_instances_of_magic_container_s_as_const.patch create mode 100644 multimedia/minidlna/patches/040-heroes.patch create mode 100644 multimedia/minidlna/patches/050-no-cover-resizing.patch create mode 100644 multimedia/minidlna/patches/060-reduce_duplication_in_sql_c.patch create mode 100644 multimedia/minidlna/patches/070-return-void.patch (limited to 'multimedia') diff --git a/multimedia/minidlna/Makefile b/multimedia/minidlna/Makefile index d6bc34fe6..bf52e9184 100644 --- a/multimedia/minidlna/Makefile +++ b/multimedia/minidlna/Makefile @@ -12,18 +12,17 @@ PKG_RELEASE:=3 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://git.code.sf.net/p/minidlna/git -PKG_SOURCE_DATE:=2018-04-10 -PKG_SOURCE_VERSION:=799e6cf505ec470b2bf0ae4118143380aa16b837 -PKG_MIRROR_HASH:=67cc817e671de99e5a3f5ed237f89e22470f1de94819bcaba86c0ba821104af5 +PKG_SOURCE_DATE:=2019-12-09 +PKG_SOURCE_VERSION:=0763719f2776f91114bc5564919896f28e078c77 +PKG_MIRROR_HASH:=93030a80eff44c0ec13f54daf3b2ba345b70ef8645e0343a34092f37d6f9e8dd -PKG_LICENSE:=GPL-2.0 BSD-3-Clause +PKG_MAINTAINER:= +PKG_LICENSE:=GPL-2.0-or-later BSD-3-Clause PKG_LICENSE_FILES:=COPYING LICENCE.miniupnpd -PKG_MAINTAINER:=Knyazkov Dmitry - PKG_FIXUP:=autoreconf - -PKG_BUILD_PARALLEL:=0 +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 PKG_BUILD_DEPENDS:=util-linux include $(INCLUDE_DIR)/package.mk @@ -49,37 +48,24 @@ define Package/minidlna/conffiles /etc/config/minidlna endef -TARGET_CPPFLAGS += \ - -I$(ICONV_PREFIX)/include \ - -I$(INTL_PREFIX)/include \ - -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 \ - -TARGET_LDFLAGS += \ - -L$(ICONV_PREFIX)/lib \ - -L$(INTL_PREFIX)/lib \ - -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \ - -MAKE_FLAGS +=\ - CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ - LDFLAGS="$(TARGET_LDFLAGS)" \ - ICONV_LIBS="-liconv $(if $(INTL_FULL),-lintl)" \ - CONFIGURE_ARGS +=\ --with-libiconv-prefix="$(ICONV_PREFIX)" \ --with-libintl-prefix="$(INTL_PREFIX)" \ --with-os-name="OpenWrt Linux" \ --with-os-version="$(LINUX_VERSION)" \ - --with-os-url="http://openwrt.org/" \ + --with-os-url="https://openwrt.org/" \ --with-db-path="/var/run/minidlna" \ - --with-log-path="/var/log" \ + --with-log-path="/var/log" define Package/minidlna/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/minidlnad $(1)/usr/bin/minidlna + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/minidlnad $(1)/usr/sbin/minidlnad $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/minidlna.init $(1)/etc/init.d/minidlna $(INSTALL_DIR) $(1)/etc/config $(INSTALL_CONF) ./files/minidlna.config $(1)/etc/config/minidlna + $(INSTALL_DIR) $(1)/etc/sysctl.d + $(INSTALL_CONF) ./files/minidlna.sysctl $(1)/etc/sysctl.d/30-minidlna.conf endef $(eval $(call BuildPackage,minidlna)) diff --git a/multimedia/minidlna/files/minidlna.config b/multimedia/minidlna/files/minidlna.config index cdde73ff3..4ffeadb07 100644 --- a/multimedia/minidlna/files/minidlna.config +++ b/multimedia/minidlna/files/minidlna.config @@ -1,11 +1,10 @@ config minidlna config - option 'enabled' '0' + option enabled '0' option user 'minidlna' option port '8200' option interface 'br-lan' option friendly_name 'OpenWrt DLNA Server' option db_dir '/var/run/minidlna' - option log_dir '/var/log/minidlna' option inotify '1' option enable_tivo '0' option wide_links '0' diff --git a/multimedia/minidlna/files/minidlna.init b/multimedia/minidlna/files/minidlna.init index 909b09871..6dcc104ea 100644 --- a/multimedia/minidlna/files/minidlna.init +++ b/multimedia/minidlna/files/minidlna.init @@ -1,17 +1,13 @@ #!/bin/sh /etc/rc.common # Copyright (C) 2010 OpenWrt.org -START=50 +START=81 -SERVICE_USE_PID=1 -SERVICE_PID_FILE=/var/run/minidlna/minidlna.pid +PROG=/usr/sbin/minidlnad +USE_PROCD=1 MINIDLNA_CONFIG_FILE="/var/etc/minidlna.conf" -minidlna_cfg_append() { - echo "$1" >> "$MINIDLNA_CONFIG_FILE" -} - minidlna_cfg_addbool() { local cfg="$1" local key="$2" @@ -20,7 +16,7 @@ minidlna_cfg_addbool() { config_get_bool val "$cfg" "$key" "$def" [ "$val" -gt 0 ] && val="yes" || val="no" - minidlna_cfg_append "$key=$val" + echo "$key=$val" } minidlna_cfg_addstr() { @@ -30,12 +26,12 @@ minidlna_cfg_addstr() { local val config_get val "$cfg" "$key" "$def" - [ -n "$val" ] && minidlna_cfg_append "$key=$val" + [ -n "$val" ] && echo "$key=$val" } minidlna_cfg_add_media_dir() { local val=$1 - minidlna_cfg_append "media_dir=$val" + echo "media_dir=$val" } minidlna_create_config() { @@ -46,18 +42,18 @@ minidlna_create_config() { config_get port "$cfg" port config_get interface "$cfg" interface - [ -z "$interface" -o -t "$port" ] && return 1 + { [ -z "$interface" ] || [ -t "$port" ]; } && return 1 mkdir -p /var/etc - echo "# this file is generated automatically, don't edit" > "$MINIDLNA_CONFIG_FILE" + { + echo "# this file is generated automatically, don't edit" - minidlna_cfg_append "port=$port" - minidlna_cfg_append "network_interface=$interface" + echo "port=$port" + echo "network_interface=$interface" minidlna_cfg_addstr "$cfg" friendly_name minidlna_cfg_addstr "$cfg" user minidlna_cfg_addstr "$cfg" db_dir - minidlna_cfg_addstr "$cfg" log_dir minidlna_cfg_addstr "$cfg" log_level 'error' minidlna_cfg_addbool "$cfg" inotify '1' minidlna_cfg_addbool "$cfg" enable_tivo '0' @@ -72,16 +68,16 @@ minidlna_create_config() { minidlna_cfg_addstr "$cfg" root_container '.' minidlna_cfg_addstr "$cfg" uuid '019f9a56-ff60-44c0-9edc-eae88d09fa05' config_list_foreach "$cfg" "media_dir" minidlna_cfg_add_media_dir + } > "$MINIDLNA_CONFIG_FILE" return 0 } -start() { +start_service() { local enabled local db_dir - local log_dir local user - local var + local val config_load 'minidlna' config_get_bool enabled config 'enabled' '0' @@ -89,20 +85,31 @@ start() { [ "$enabled" -gt 0 ] || return 1 config_get val "config" uuid - [ "$val" = '' ] && uci set minidlna.config.uuid=$(cat /proc/sys/kernel/random/uuid) && uci commit + [ "$val" = '' ] && uci set minidlna.config.uuid="$(cat /proc/sys/kernel/random/uuid)" && uci commit minidlna_create_config config || return 1 config_get db_dir config 'db_dir' '/var/run/minidlna' - config_get log_dir config 'log_dir' '/var/log/minidlna' - config_get user config 'user' 'root' - - mkdir -m 0755 -p "$db_dir" "$log_dir" - chown -R "$user" "$db_dir" "$log_dir" + config_get user config 'user' 'minidlna' + + [ -d "$db_dir" ] || { + mkdir -m 755 -p "$db_dir" + chown -R "$user":"$user" "$db_dir" + } + + procd_open_instance + procd_set_param command "$PROG" + procd_append_param command -S -f "$MINIDLNA_CONFIG_FILE" + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_set_param respawn + procd_close_instance +} - service_start /usr/bin/minidlna -f "$MINIDLNA_CONFIG_FILE" +reload_service() { + procd_send_signal "$PROG" } -stop() { - service_stop /usr/bin/minidlna +service_triggers() { + procd_add_reload_trigger "minidlna" } diff --git a/multimedia/minidlna/files/minidlna.sysctl b/multimedia/minidlna/files/minidlna.sysctl new file mode 100644 index 000000000..aaf460e14 --- /dev/null +++ b/multimedia/minidlna/files/minidlna.sysctl @@ -0,0 +1,2 @@ +# this is the desired value for minidlna +fs.inotify.max_user_watches=65536 diff --git a/multimedia/minidlna/patches/002-mark_all_instances_of_magic_container_s_as_const.patch b/multimedia/minidlna/patches/002-mark_all_instances_of_magic_container_s_as_const.patch deleted file mode 100644 index cb1f2febc..000000000 --- a/multimedia/minidlna/patches/002-mark_all_instances_of_magic_container_s_as_const.patch +++ /dev/null @@ -1,125 +0,0 @@ -From d297624e533d6d4274c750e3769749c3d7f121c8 Mon Sep 17 00:00:00 2001 -From: Daniel Kamil Kozar -Date: Sat, 15 Dec 2018 16:34:30 +0100 -Subject: [PATCH] Mark all instances of magic_container_s as const - ---- - containers.c | 38 +++++++++++++++++++------------------- - containers.h | 6 +++--- - scanner.c | 2 +- - upnpsoap.c | 6 +++--- - 4 files changed, 26 insertions(+), 26 deletions(-) - ---- a/containers.c -+++ b/containers.c -@@ -25,23 +25,23 @@ - - #define NINETY_DAYS "7776000" - --const char *music_id = MUSIC_ID; --const char *music_all_id = MUSIC_ALL_ID; --const char *music_genre_id = MUSIC_GENRE_ID; --const char *music_artist_id = MUSIC_ARTIST_ID; --const char *music_album_id = MUSIC_ALBUM_ID; --const char *music_plist_id = MUSIC_PLIST_ID; --const char *music_dir_id = MUSIC_DIR_ID; --const char *video_id = VIDEO_ID; --const char *video_all_id = VIDEO_ALL_ID; --const char *video_dir_id = VIDEO_DIR_ID; --const char *image_id = IMAGE_ID; --const char *image_all_id = IMAGE_ALL_ID; --const char *image_date_id = IMAGE_DATE_ID; --const char *image_camera_id = IMAGE_CAMERA_ID; --const char *image_dir_id = IMAGE_DIR_ID; -+static const char *music_id = MUSIC_ID; -+static const char *music_all_id = MUSIC_ALL_ID; -+static const char *music_genre_id = MUSIC_GENRE_ID; -+static const char *music_artist_id = MUSIC_ARTIST_ID; -+static const char *music_album_id = MUSIC_ALBUM_ID; -+static const char *music_plist_id = MUSIC_PLIST_ID; -+static const char *music_dir_id = MUSIC_DIR_ID; -+static const char *video_id = VIDEO_ID; -+static const char *video_all_id = VIDEO_ALL_ID; -+static const char *video_dir_id = VIDEO_DIR_ID; -+static const char *image_id = IMAGE_ID; -+static const char *image_all_id = IMAGE_ALL_ID; -+static const char *image_date_id = IMAGE_DATE_ID; -+static const char *image_camera_id = IMAGE_CAMERA_ID; -+static const char *image_dir_id = IMAGE_DIR_ID; - --struct magic_container_s magic_containers[] = -+const struct magic_container_s magic_containers[] = - { - /* Alternate root container */ - { NULL, -@@ -124,7 +124,7 @@ struct magic_container_s magic_container - { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0 } - }; - --struct magic_container_s * -+const struct magic_container_s * - in_magic_container(const char *id, int flags, const char **real_id) - { - size_t len; -@@ -154,7 +154,7 @@ in_magic_container(const char *id, int f - return NULL; - } - --struct magic_container_s * -+const struct magic_container_s * - check_magic_container(const char *id, int flags) - { - int i; ---- a/containers.h -+++ b/containers.h -@@ -30,7 +30,7 @@ struct magic_container_s { - int required_flags; - }; - --extern struct magic_container_s magic_containers[]; -+extern const struct magic_container_s magic_containers[]; - --struct magic_container_s *in_magic_container(const char *id, int flags, const char **real_id); --struct magic_container_s *check_magic_container(const char *id, int flags); -+const struct magic_container_s *in_magic_container(const char *id, int flags, const char **real_id); -+const struct magic_container_s *check_magic_container(const char *id, int flags); ---- a/scanner.c -+++ b/scanner.c -@@ -587,7 +587,7 @@ CreateDatabase(void) - } - for( i=0; magic_containers[i].objectid_match; i++ ) - { -- struct magic_container_s *magic = &magic_containers[i]; -+ const struct magic_container_s *magic = &magic_containers[i]; - if (!magic->name) - continue; - if( sql_get_int_field(db, "SELECT 1 from OBJECTS where OBJECT_ID = '%s'", magic->objectid_match) == 0 ) ---- a/upnpsoap.c -+++ b/upnpsoap.c -@@ -800,7 +800,7 @@ add_res(char *size, char *duration, char - } - - static int --get_child_count(const char *object, struct magic_container_s *magic) -+get_child_count(const char *object, const struct magic_container_s *magic) - { - int ret; - -@@ -1292,7 +1292,7 @@ BrowseContentDirectory(struct upnphttp * - "" - "<DIDL-Lite" - CONTENT_DIRECTORY_SCHEMAS; -- struct magic_container_s *magic; -+ const struct magic_container_s *magic; - char *zErrMsg = NULL; - char *sql, *ptr; - struct Response args; -@@ -1807,7 +1807,7 @@ SearchContentDirectory(struct upnphttp * - "" - "<DIDL-Lite" - CONTENT_DIRECTORY_SCHEMAS; -- struct magic_container_s *magic; -+ const struct magic_container_s *magic; - char *zErrMsg = NULL; - char *sql, *ptr; - struct Response args; diff --git a/multimedia/minidlna/patches/003-wrap_container_definitions_into_a_structure.patch b/multimedia/minidlna/patches/003-wrap_container_definitions_into_a_structure.patch deleted file mode 100644 index a4fb39bfb..000000000 --- a/multimedia/minidlna/patches/003-wrap_container_definitions_into_a_structure.patch +++ /dev/null @@ -1,118 +0,0 @@ -From e0065b8343bc963a89556449e00f1d20086cc1f1 Mon Sep 17 00:00:00 2001 -From: Daniel Kamil Kozar -Date: Sat, 15 Dec 2018 16:26:37 +0100 -Subject: [PATCH] Wrap container definitions into a structure - ---- - containers.c | 25 +++++++++++++++++++++++++ - containers.h | 8 ++++++++ - scanner.c | 33 ++++++--------------------------- - 3 files changed, 39 insertions(+), 27 deletions(-) - ---- a/containers.c -+++ b/containers.c -@@ -23,6 +23,31 @@ - #include "containers.h" - #include "log.h" - -+const struct container_s containers[] = { -+ { "0","-1", "root" }, -+ { MUSIC_ID, "0", "Music" }, -+ { MUSIC_ALL_ID, MUSIC_ID, "All Music" }, -+ { MUSIC_GENRE_ID, MUSIC_ID, "Genre" }, -+ { MUSIC_ARTIST_ID, MUSIC_ID, "Artist" }, -+ { MUSIC_ALBUM_ID, MUSIC_ID, "Album" }, -+ { MUSIC_DIR_ID, MUSIC_ID, "Folders" }, -+ { MUSIC_PLIST_ID, MUSIC_ID, "Playlists" }, -+ -+ { VIDEO_ID, "0", "Video" }, -+ { VIDEO_ALL_ID, VIDEO_ID, "All Video" }, -+ { VIDEO_DIR_ID, VIDEO_ID, "Folders" }, -+ -+ { IMAGE_ID, "0", "Pictures" }, -+ { IMAGE_ALL_ID, IMAGE_ID, "All Pictures" }, -+ { IMAGE_DATE_ID, IMAGE_ID, "Date Taken" }, -+ { IMAGE_CAMERA_ID, IMAGE_ID, "Camera" }, -+ { IMAGE_DIR_ID, IMAGE_ID, "Folders" }, -+ -+ { BROWSEDIR_ID, "0", "Browse Folders" }, -+ -+ { 0, 0, 0 } -+}; -+ - #define NINETY_DAYS "7776000" - - static const char *music_id = MUSIC_ID; ---- a/containers.h -+++ b/containers.h -@@ -16,6 +16,14 @@ - * along with MiniDLNA. If not, see . - */ - -+struct container_s { -+ const char *object_id; -+ const char *parent_id; -+ const char *name; -+}; -+ -+extern const struct container_s containers[]; -+ - struct magic_container_s { - const char *name; - const char *objectid_match; ---- a/scanner.c -+++ b/scanner.c -@@ -529,30 +529,7 @@ insert_file(const char *name, const char - int - CreateDatabase(void) - { -- int ret, i; -- const char *containers[] = { "0","-1", "root", -- MUSIC_ID, "0", _("Music"), -- MUSIC_ALL_ID, MUSIC_ID, _("All Music"), -- MUSIC_GENRE_ID, MUSIC_ID, _("Genre"), -- MUSIC_ARTIST_ID, MUSIC_ID, _("Artist"), -- MUSIC_ALBUM_ID, MUSIC_ID, _("Album"), -- MUSIC_DIR_ID, MUSIC_ID, _("Folders"), -- MUSIC_PLIST_ID, MUSIC_ID, _("Playlists"), -- -- VIDEO_ID, "0", _("Video"), -- VIDEO_ALL_ID, VIDEO_ID, _("All Video"), -- VIDEO_DIR_ID, VIDEO_ID, _("Folders"), -- -- IMAGE_ID, "0", _("Pictures"), -- IMAGE_ALL_ID, IMAGE_ID, _("All Pictures"), -- IMAGE_DATE_ID, IMAGE_ID, _("Date Taken"), -- IMAGE_CAMERA_ID, IMAGE_ID, _("Camera"), -- IMAGE_DIR_ID, IMAGE_ID, _("Folders"), -- -- BROWSEDIR_ID, "0", _("Browse Folders"), -- 0 }; -- -- ret = sql_exec(db, create_objectTable_sqlite); -+ int ret = sql_exec(db, create_objectTable_sqlite); - if( ret != SQLITE_OK ) - goto sql_failed; - ret = sql_exec(db, create_detailTable_sqlite); -@@ -576,16 +553,18 @@ CreateDatabase(void) - ret = sql_exec(db, "INSERT into SETTINGS values ('UPDATE_ID', '0')"); - if( ret != SQLITE_OK ) - goto sql_failed; -- for( i=0; containers[i]; i=i+3 ) -+ for( int i=0; containers[i].name; ++i ) - { -+ const struct container_s *c = &containers[i]; -+ const char *name = _(c->name); - ret = sql_exec(db, "INSERT into OBJECTS (OBJECT_ID, PARENT_ID, DETAIL_ID, CLASS, NAME)" - " values " - "('%s', '%s', %lld, 'container.storageFolder', '%q')", -- containers[i], containers[i+1], GetFolderMetadata(containers[i+2], NULL, NULL, NULL, 0), containers[i+2]); -+ c->object_id, c->parent_id, GetFolderMetadata(name, NULL, NULL, NULL, 0), name); - if( ret != SQLITE_OK ) - goto sql_failed; - } -- for( i=0; magic_containers[i].objectid_match; i++ ) -+ for( int i=0; magic_containers[i].objectid_match; i++ ) - { - const struct magic_container_s *magic = &magic_containers[i]; - if (!magic->name) diff --git a/multimedia/minidlna/patches/004-reduce_duplication_in_sql_c.patch b/multimedia/minidlna/patches/004-reduce_duplication_in_sql_c.patch deleted file mode 100644 index c23721732..000000000 --- a/multimedia/minidlna/patches/004-reduce_duplication_in_sql_c.patch +++ /dev/null @@ -1,192 +0,0 @@ -From be9de8b2e0864b46498496af9ffdc31c0e7b764a Mon Sep 17 00:00:00 2001 -From: Daniel Kamil Kozar -Date: Sun, 16 Dec 2018 14:21:58 +0100 -Subject: [PATCH] Reduce duplication in sql.c - ---- - sql.c | 166 ++++++++++++++++++++-------------------------------------- - 1 file changed, 58 insertions(+), 108 deletions(-) - ---- a/sql.c -+++ b/sql.c -@@ -65,122 +65,72 @@ sql_get_table(sqlite3 *db, const char *s - return ret; - } - -+#define sql_get_field(type, column_get_fn) \ -+ va_list ap;\ -+ int counter, result;\ -+ char *sql;\ -+ type ret;\ -+ sqlite3_stmt *stmt;\ -+ \ -+ va_start(ap, fmt);\ -+ sql = sqlite3_vmprintf(fmt, ap);\ -+ va_end(ap);\ -+\ -+ /*DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql); */ \ -+\ -+ switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))\ -+ {\ -+ case SQLITE_OK:\ -+ break;\ -+ default:\ -+ DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql);\ -+ sqlite3_free(sql);\ -+ return -1;\ -+ }\ -+\ -+ for (counter = 0;\ -+ ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;\ -+ counter++) {\ -+ /* While SQLITE_BUSY has a built in timeout,\ -+ * SQLITE_LOCKED does not, so sleep */\ -+ if (result == SQLITE_LOCKED)\ -+ sleep(1);\ -+ }\ -+\ -+ switch (result)\ -+ {\ -+ case SQLITE_DONE:\ -+ /* no rows returned */\ -+ ret = 0;\ -+ break;\ -+ case SQLITE_ROW:\ -+ if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)\ -+ {\ -+ ret = 0;\ -+ break;\ -+ }\ -+ ret = column_get_fn(stmt, 0);\ -+ break;\ -+ default:\ -+ DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql);\ -+ ret = -1;\ -+ break;\ -+ }\ -+ sqlite3_free(sql);\ -+ sqlite3_finalize(stmt);\ -+\ -+ return ret; -+ - int - sql_get_int_field(sqlite3 *db, const char *fmt, ...) - { -- va_list ap; -- int counter, result; -- char *sql; -- int ret; -- sqlite3_stmt *stmt; -- -- va_start(ap, fmt); -- sql = sqlite3_vmprintf(fmt, ap); -- va_end(ap); -- -- //DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql); -- -- switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)) -- { -- case SQLITE_OK: -- break; -- default: -- DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql); -- sqlite3_free(sql); -- return -1; -- } -- -- for (counter = 0; -- ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2; -- counter++) { -- /* While SQLITE_BUSY has a built in timeout, -- * SQLITE_LOCKED does not, so sleep */ -- if (result == SQLITE_LOCKED) -- sleep(1); -- } -- -- switch (result) -- { -- case SQLITE_DONE: -- /* no rows returned */ -- ret = 0; -- break; -- case SQLITE_ROW: -- if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) -- { -- ret = 0; -- break; -- } -- ret = sqlite3_column_int(stmt, 0); -- break; -- default: -- DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql); -- ret = -1; -- break; -- } -- sqlite3_free(sql); -- sqlite3_finalize(stmt); -- -- return ret; -+ sql_get_field(int, sqlite3_column_int) - } - - int64_t - sql_get_int64_field(sqlite3 *db, const char *fmt, ...) - { -- va_list ap; -- int counter, result; -- char *sql; -- int64_t ret; -- sqlite3_stmt *stmt; -- -- va_start(ap, fmt); -- sql = sqlite3_vmprintf(fmt, ap); -- va_end(ap); -- -- //DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql); -- -- switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)) -- { -- case SQLITE_OK: -- break; -- default: -- DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql); -- sqlite3_free(sql); -- return -1; -- } -- -- for (counter = 0; -- ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2; -- counter++) { -- /* While SQLITE_BUSY has a built in timeout, -- * SQLITE_LOCKED does not, so sleep */ -- if (result == SQLITE_LOCKED) -- sleep(1); -- } -- -- switch (result) -- { -- case SQLITE_DONE: -- /* no rows returned */ -- ret = 0; -- break; -- case SQLITE_ROW: -- if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) -- { -- ret = 0; -- break; -- } -- ret = sqlite3_column_int64(stmt, 0); -- break; -- default: -- DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql); -- ret = -1; -- break; -- } -- sqlite3_free(sql); -- sqlite3_finalize(stmt); -- -- return ret; -+ sql_get_field(int64_t, sqlite3_column_int64) - } - - char * diff --git a/multimedia/minidlna/patches/010-lg.patch b/multimedia/minidlna/patches/010-lg.patch new file mode 100644 index 000000000..1fb48b13c --- /dev/null +++ b/multimedia/minidlna/patches/010-lg.patch @@ -0,0 +1,24 @@ +From eb473817d73b8740f27955f93950029fdfc9d73e Mon Sep 17 00:00:00 2001 +From: Daniel Kamil Kozar +Date: Sat, 15 Dec 2018 00:55:20 +0100 +Subject: [PATCH] LG webOS 3.5 devices require audio/flac in order to detect + FLAC + +Imported from https://sourceforge.net/p/minidlna/patches/176/ +--- + clients.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/clients.c b/clients.c +index 42f0d1c..d324eab 100644 +--- a/clients.c ++++ b/clients.c +@@ -164,7 +164,7 @@ struct client_type_s client_types[] = + + /* USER-AGENT: Linux/2.6.35 UPnP/1.0 DLNADOC/1.50 INTEL_NMPR/2.0 LGE_DLNA_SDK/1.6.0 */ + { ELGNetCastDevice, +- FLAG_DLNA | FLAG_CAPTION_RES, ++ FLAG_DLNA | FLAG_CAPTION_RES | FLAG_MIME_FLAC_FLAC, + "LG", + "LGE_DLNA_SDK/1.6.0", + EUserAgent diff --git a/multimedia/minidlna/patches/020-wrap_container_definitions_into_a_structure.patch b/multimedia/minidlna/patches/020-wrap_container_definitions_into_a_structure.patch new file mode 100644 index 000000000..4733b32fe --- /dev/null +++ b/multimedia/minidlna/patches/020-wrap_container_definitions_into_a_structure.patch @@ -0,0 +1,124 @@ +From e0065b8343bc963a89556449e00f1d20086cc1f1 Mon Sep 17 00:00:00 2001 +From: Daniel Kamil Kozar +Date: Sat, 15 Dec 2018 16:26:37 +0100 +Subject: [PATCH] Wrap container definitions into a structure + +--- + containers.c | 25 +++++++++++++++++++++++++ + containers.h | 8 ++++++++ + scanner.c | 33 ++++++--------------------------- + 3 files changed, 39 insertions(+), 27 deletions(-) + +diff --git a/containers.c b/containers.c +index f5cece1..19a0bb1 100644 +--- a/containers.c ++++ b/containers.c +@@ -23,6 +23,31 @@ + #include "containers.h" + #include "log.h" + ++const struct container_s containers[] = { ++ { "0","-1", "root" }, ++ { MUSIC_ID, "0", "Music" }, ++ { MUSIC_ALL_ID, MUSIC_ID, "All Music" }, ++ { MUSIC_GENRE_ID, MUSIC_ID, "Genre" }, ++ { MUSIC_ARTIST_ID, MUSIC_ID, "Artist" }, ++ { MUSIC_ALBUM_ID, MUSIC_ID, "Album" }, ++ { MUSIC_DIR_ID, MUSIC_ID, "Folders" }, ++ { MUSIC_PLIST_ID, MUSIC_ID, "Playlists" }, ++ ++ { VIDEO_ID, "0", "Video" }, ++ { VIDEO_ALL_ID, VIDEO_ID, "All Video" }, ++ { VIDEO_DIR_ID, VIDEO_ID, "Folders" }, ++ ++ { IMAGE_ID, "0", "Pictures" }, ++ { IMAGE_ALL_ID, IMAGE_ID, "All Pictures" }, ++ { IMAGE_DATE_ID, IMAGE_ID, "Date Taken" }, ++ { IMAGE_CAMERA_ID, IMAGE_ID, "Camera" }, ++ { IMAGE_DIR_ID, IMAGE_ID, "Folders" }, ++ ++ { BROWSEDIR_ID, "0", "Browse Folders" }, ++ ++ { 0, 0, 0 } ++}; ++ + #define NINETY_DAYS "7776000" + + const char *music_id = MUSIC_ID; +diff --git a/containers.h b/containers.h +index aef77c5..1fcf7cd 100644 +--- a/containers.h ++++ b/containers.h +@@ -16,6 +16,14 @@ + * along with MiniDLNA. If not, see . + */ + ++struct container_s { ++ const char *object_id; ++ const char *parent_id; ++ const char *name; ++}; ++ ++extern const struct container_s containers[]; ++ + struct magic_container_s { + const char *name; + const char *objectid_match; +diff --git a/scanner.c b/scanner.c +index a730567..eb26c9e 100644 +--- a/scanner.c ++++ b/scanner.c +@@ -529,30 +529,7 @@ insert_file(const char *name, const char *path, const char *parentID, int object + int + CreateDatabase(void) + { +- int ret, i; +- const char *containers[] = { "0","-1", "root", +- MUSIC_ID, "0", _("Music"), +- MUSIC_ALL_ID, MUSIC_ID, _("All Music"), +- MUSIC_GENRE_ID, MUSIC_ID, _("Genre"), +- MUSIC_ARTIST_ID, MUSIC_ID, _("Artist"), +- MUSIC_ALBUM_ID, MUSIC_ID, _("Album"), +- MUSIC_DIR_ID, MUSIC_ID, _("Folders"), +- MUSIC_PLIST_ID, MUSIC_ID, _("Playlists"), +- +- VIDEO_ID, "0", _("Video"), +- VIDEO_ALL_ID, VIDEO_ID, _("All Video"), +- VIDEO_DIR_ID, VIDEO_ID, _("Folders"), +- +- IMAGE_ID, "0", _("Pictures"), +- IMAGE_ALL_ID, IMAGE_ID, _("All Pictures"), +- IMAGE_DATE_ID, IMAGE_ID, _("Date Taken"), +- IMAGE_CAMERA_ID, IMAGE_ID, _("Camera"), +- IMAGE_DIR_ID, IMAGE_ID, _("Folders"), +- +- BROWSEDIR_ID, "0", _("Browse Folders"), +- 0 }; +- +- ret = sql_exec(db, create_objectTable_sqlite); ++ int ret = sql_exec(db, create_objectTable_sqlite); + if( ret != SQLITE_OK ) + goto sql_failed; + ret = sql_exec(db, create_detailTable_sqlite); +@@ -576,16 +553,18 @@ CreateDatabase(void) + ret = sql_exec(db, "INSERT into SETTINGS values ('UPDATE_ID', '0')"); + if( ret != SQLITE_OK ) + goto sql_failed; +- for( i=0; containers[i]; i=i+3 ) ++ for( int i=0; containers[i].name; ++i ) + { ++ const struct container_s *c = &containers[i]; ++ const char *name = _(c->name); + ret = sql_exec(db, "INSERT into OBJECTS (OBJECT_ID, PARENT_ID, DETAIL_ID, CLASS, NAME)" + " values " + "('%s', '%s', %lld, 'container.storageFolder', '%q')", +- containers[i], containers[i+1], GetFolderMetadata(containers[i+2], NULL, NULL, NULL, 0), containers[i+2]); ++ c->object_id, c->parent_id, GetFolderMetadata(name, NULL, NULL, NULL, 0), name); + if( ret != SQLITE_OK ) + goto sql_failed; + } +- for( i=0; magic_containers[i].objectid_match; i++ ) ++ for( int i=0; magic_containers[i].objectid_match; i++ ) + { + struct magic_container_s *magic = &magic_containers[i]; + if (!magic->name) diff --git a/multimedia/minidlna/patches/030-mark_all_instances_of_magic_container_s_as_const.patch b/multimedia/minidlna/patches/030-mark_all_instances_of_magic_container_s_as_const.patch new file mode 100644 index 000000000..44a27665b --- /dev/null +++ b/multimedia/minidlna/patches/030-mark_all_instances_of_magic_container_s_as_const.patch @@ -0,0 +1,125 @@ +From d297624e533d6d4274c750e3769749c3d7f121c8 Mon Sep 17 00:00:00 2001 +From: Daniel Kamil Kozar +Date: Sat, 15 Dec 2018 16:34:30 +0100 +Subject: [PATCH] Mark all instances of magic_container_s as const + +--- + containers.c | 38 +++++++++++++++++++------------------- + containers.h | 6 +++--- + scanner.c | 2 +- + upnpsoap.c | 6 +++--- + 4 files changed, 26 insertions(+), 26 deletions(-) + +--- a/containers.c ++++ b/containers.c +@@ -50,23 +50,23 @@ + + #define NINETY_DAYS "7776000" + +-const char *music_id = MUSIC_ID; +-const char *music_all_id = MUSIC_ALL_ID; +-const char *music_genre_id = MUSIC_GENRE_ID; +-const char *music_artist_id = MUSIC_ARTIST_ID; +-const char *music_album_id = MUSIC_ALBUM_ID; +-const char *music_plist_id = MUSIC_PLIST_ID; +-const char *music_dir_id = MUSIC_DIR_ID; +-const char *video_id = VIDEO_ID; +-const char *video_all_id = VIDEO_ALL_ID; +-const char *video_dir_id = VIDEO_DIR_ID; +-const char *image_id = IMAGE_ID; +-const char *image_all_id = IMAGE_ALL_ID; +-const char *image_date_id = IMAGE_DATE_ID; +-const char *image_camera_id = IMAGE_CAMERA_ID; +-const char *image_dir_id = IMAGE_DIR_ID; ++static const char *music_id = MUSIC_ID; ++static const char *music_all_id = MUSIC_ALL_ID; ++static const char *music_genre_id = MUSIC_GENRE_ID; ++static const char *music_artist_id = MUSIC_ARTIST_ID; ++static const char *music_album_id = MUSIC_ALBUM_ID; ++static const char *music_plist_id = MUSIC_PLIST_ID; ++static const char *music_dir_id = MUSIC_DIR_ID; ++static const char *video_id = VIDEO_ID; ++static const char *video_all_id = VIDEO_ALL_ID; ++static const char *video_dir_id = VIDEO_DIR_ID; ++static const char *image_id = IMAGE_ID; ++static const char *image_all_id = IMAGE_ALL_ID; ++static const char *image_date_id = IMAGE_DATE_ID; ++static const char *image_camera_id = IMAGE_CAMERA_ID; ++static const char *image_dir_id = IMAGE_DIR_ID; + +-struct magic_container_s magic_containers[] = ++const struct magic_container_s magic_containers[] = + { + /* Alternate root container */ + { NULL, +@@ -149,7 +149,7 @@ struct magic_container_s magic_container + { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0 } + }; + +-struct magic_container_s * ++const struct magic_container_s * + in_magic_container(const char *id, int flags, const char **real_id) + { + size_t len; +@@ -179,7 +179,7 @@ in_magic_container(const char *id, int f + return NULL; + } + +-struct magic_container_s * ++const struct magic_container_s * + check_magic_container(const char *id, int flags) + { + int i; +--- a/containers.h ++++ b/containers.h +@@ -38,7 +38,7 @@ struct magic_container_s { + int required_flags; + }; + +-extern struct magic_container_s magic_containers[]; ++extern const struct magic_container_s magic_containers[]; + +-struct magic_container_s *in_magic_container(const char *id, int flags, const char **real_id); +-struct magic_container_s *check_magic_container(const char *id, int flags); ++const struct magic_container_s *in_magic_container(const char *id, int flags, const char **real_id); ++const struct magic_container_s *check_magic_container(const char *id, int flags); +--- a/scanner.c ++++ b/scanner.c +@@ -566,7 +566,7 @@ CreateDatabase(void) + } + for( int i=0; magic_containers[i].objectid_match; i++ ) + { +- struct magic_container_s *magic = &magic_containers[i]; ++ const struct magic_container_s *magic = &magic_containers[i]; + if (!magic->name) + continue; + if( sql_get_int_field(db, "SELECT 1 from OBJECTS where OBJECT_ID = '%s'", magic->objectid_match) == 0 ) +--- a/upnpsoap.c ++++ b/upnpsoap.c +@@ -800,7 +800,7 @@ add_res(char *size, char *duration, char + } + + static int +-get_child_count(const char *object, struct magic_container_s *magic) ++get_child_count(const char *object, const struct magic_container_s *magic) + { + int ret; + +@@ -1297,7 +1297,7 @@ BrowseContentDirectory(struct upnphttp * + "" + "<DIDL-Lite" + CONTENT_DIRECTORY_SCHEMAS; +- struct magic_container_s *magic; ++ const struct magic_container_s *magic; + char *zErrMsg = NULL; + char *sql, *ptr; + struct Response args; +@@ -1819,7 +1819,7 @@ SearchContentDirectory(struct upnphttp * + "" + "<DIDL-Lite" + CONTENT_DIRECTORY_SCHEMAS; +- struct magic_container_s *magic; ++ const struct magic_container_s *magic; + char *zErrMsg = NULL; + char *sql, *ptr; + struct Response args; diff --git a/multimedia/minidlna/patches/040-heroes.patch b/multimedia/minidlna/patches/040-heroes.patch new file mode 100644 index 000000000..5c2d31396 --- /dev/null +++ b/multimedia/minidlna/patches/040-heroes.patch @@ -0,0 +1,27 @@ +From 972fb2bbfdb7118551da45c5828c9e74be581fc4 Mon Sep 17 00:00:00 2001 +From: Daniel Kamil Kozar +Date: Sat, 15 Dec 2018 21:55:52 +0100 +Subject: [PATCH] What about David Bowie's "Heroes"? + +--- + utils.c | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/utils.c b/utils.c +index dc936f9..dfa2b65 100644 +--- a/utils.c ++++ b/utils.c +@@ -87,13 +87,6 @@ trim(char *str) + len--; + } + +- if (str[0] == '"' && str[len-1] == '"') +- { +- str[0] = '\0'; +- str[len-1] = '\0'; +- str++; +- } +- + return str; + } + diff --git a/multimedia/minidlna/patches/050-no-cover-resizing.patch b/multimedia/minidlna/patches/050-no-cover-resizing.patch new file mode 100644 index 000000000..e05bb9c13 --- /dev/null +++ b/multimedia/minidlna/patches/050-no-cover-resizing.patch @@ -0,0 +1,80 @@ +From aae49f0f80e73d1b52f23b89b0d314e9b9f89425 Mon Sep 17 00:00:00 2001 +From: Daniel Kamil Kozar +Date: Sat, 15 Dec 2018 22:55:44 +0100 +Subject: [PATCH] Add an option to disable cover art resizing + +Imported from +https://sourceforge.net/p/minidlna/patches/_discuss/thread/9825a1a0/4c28/attachment/minidlna-1.1.2-no-cover-resize.patch +--- + albumart.c | 3 +++ + minidlna.c | 4 ++++ + options.c | 1 + + options.h | 1 + + upnpglobalvars.h | 1 + + 5 files changed, 10 insertions(+) + +diff --git a/albumart.c b/albumart.c +index de026ec..04fa8f2 100644 +--- a/albumart.c ++++ b/albumart.c +@@ -67,6 +67,9 @@ save_resized_album_art(image_s *imsrc, const char *path) + strncpyt(cache_dir, cache_file, sizeof(cache_dir)); + make_dir(dirname(cache_dir), S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); + ++ if( GETFLAG(NO_COVER_RESIZE_MASK) ) ++ return image_save_to_jpeg_file(imsrc, cache_file); ++ + if( imsrc->width > imsrc->height ) + { + dstw = 160; +diff --git a/minidlna.c b/minidlna.c +index 7cce301..a1dd08b 100644 +--- a/minidlna.c ++++ b/minidlna.c +@@ -735,6 +735,10 @@ init(int argc, char **argv) + if (strtobool(ary_options[i].value)) + SETFLAG(DLNA_STRICT_MASK); + break; ++ case RESIZE_COVER_ART: ++ if((strcmp(ary_options[i].value, "no") == 0) || !atoi(ary_options[i].value)) ++ SETFLAG(NO_COVER_RESIZE_MASK); ++ break; + case ROOT_CONTAINER: + switch (ary_options[i].value[0]) { + case '.': +diff --git a/options.c b/options.c +index cee3dff..cacbdfb 100644 +--- a/options.c ++++ b/options.c +@@ -68,6 +68,7 @@ static const struct { + { WIDE_LINKS, "wide_links" }, + { TIVO_DISCOVERY, "tivo_discovery" }, + { ENABLE_SUBTITLES, "enable_subtitles" }, ++ { RESIZE_COVER_ART, "resize_covers" }, + }; + + int +diff --git a/options.h b/options.h +index 1ff5b22..ec5ea68 100644 +--- a/options.h ++++ b/options.h +@@ -61,6 +61,7 @@ enum upnpconfigoptions { + WIDE_LINKS, /* allow following symlinks outside the defined media_dirs */ + TIVO_DISCOVERY, /* TiVo discovery protocol: bonjour or beacon. Defaults to bonjour if supported */ + ENABLE_SUBTITLES, /* Enable generic subtitle support for all clients by default */ ++ RESIZE_COVER_ART, /* resize cover art to comply with DLNA spec */ + }; + + /* readoptionsfile() +diff --git a/upnpglobalvars.h b/upnpglobalvars.h +index 1a2fb5e..7e3a1ba 100644 +--- a/upnpglobalvars.h ++++ b/upnpglobalvars.h +@@ -205,6 +205,7 @@ extern uint32_t runtime_flags; + #define RESCAN_MASK 0x0200 + #define SUBTITLES_MASK 0x0400 + #define FORCE_ALPHASORT_MASK 0x0800 ++#define NO_COVER_RESIZE_MASK 0x1000 + + #define SETFLAG(mask) runtime_flags |= mask + #define GETFLAG(mask) (runtime_flags & mask) diff --git a/multimedia/minidlna/patches/060-reduce_duplication_in_sql_c.patch b/multimedia/minidlna/patches/060-reduce_duplication_in_sql_c.patch new file mode 100644 index 000000000..c23721732 --- /dev/null +++ b/multimedia/minidlna/patches/060-reduce_duplication_in_sql_c.patch @@ -0,0 +1,192 @@ +From be9de8b2e0864b46498496af9ffdc31c0e7b764a Mon Sep 17 00:00:00 2001 +From: Daniel Kamil Kozar +Date: Sun, 16 Dec 2018 14:21:58 +0100 +Subject: [PATCH] Reduce duplication in sql.c + +--- + sql.c | 166 ++++++++++++++++++++-------------------------------------- + 1 file changed, 58 insertions(+), 108 deletions(-) + +--- a/sql.c ++++ b/sql.c +@@ -65,122 +65,72 @@ sql_get_table(sqlite3 *db, const char *s + return ret; + } + ++#define sql_get_field(type, column_get_fn) \ ++ va_list ap;\ ++ int counter, result;\ ++ char *sql;\ ++ type ret;\ ++ sqlite3_stmt *stmt;\ ++ \ ++ va_start(ap, fmt);\ ++ sql = sqlite3_vmprintf(fmt, ap);\ ++ va_end(ap);\ ++\ ++ /*DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql); */ \ ++\ ++ switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))\ ++ {\ ++ case SQLITE_OK:\ ++ break;\ ++ default:\ ++ DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql);\ ++ sqlite3_free(sql);\ ++ return -1;\ ++ }\ ++\ ++ for (counter = 0;\ ++ ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;\ ++ counter++) {\ ++ /* While SQLITE_BUSY has a built in timeout,\ ++ * SQLITE_LOCKED does not, so sleep */\ ++ if (result == SQLITE_LOCKED)\ ++ sleep(1);\ ++ }\ ++\ ++ switch (result)\ ++ {\ ++ case SQLITE_DONE:\ ++ /* no rows returned */\ ++ ret = 0;\ ++ break;\ ++ case SQLITE_ROW:\ ++ if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)\ ++ {\ ++ ret = 0;\ ++ break;\ ++ }\ ++ ret = column_get_fn(stmt, 0);\ ++ break;\ ++ default:\ ++ DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql);\ ++ ret = -1;\ ++ break;\ ++ }\ ++ sqlite3_free(sql);\ ++ sqlite3_finalize(stmt);\ ++\ ++ return ret; ++ + int + sql_get_int_field(sqlite3 *db, const char *fmt, ...) + { +- va_list ap; +- int counter, result; +- char *sql; +- int ret; +- sqlite3_stmt *stmt; +- +- va_start(ap, fmt); +- sql = sqlite3_vmprintf(fmt, ap); +- va_end(ap); +- +- //DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql); +- +- switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)) +- { +- case SQLITE_OK: +- break; +- default: +- DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql); +- sqlite3_free(sql); +- return -1; +- } +- +- for (counter = 0; +- ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2; +- counter++) { +- /* While SQLITE_BUSY has a built in timeout, +- * SQLITE_LOCKED does not, so sleep */ +- if (result == SQLITE_LOCKED) +- sleep(1); +- } +- +- switch (result) +- { +- case SQLITE_DONE: +- /* no rows returned */ +- ret = 0; +- break; +- case SQLITE_ROW: +- if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) +- { +- ret = 0; +- break; +- } +- ret = sqlite3_column_int(stmt, 0); +- break; +- default: +- DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql); +- ret = -1; +- break; +- } +- sqlite3_free(sql); +- sqlite3_finalize(stmt); +- +- return ret; ++ sql_get_field(int, sqlite3_column_int) + } + + int64_t + sql_get_int64_field(sqlite3 *db, const char *fmt, ...) + { +- va_list ap; +- int counter, result; +- char *sql; +- int64_t ret; +- sqlite3_stmt *stmt; +- +- va_start(ap, fmt); +- sql = sqlite3_vmprintf(fmt, ap); +- va_end(ap); +- +- //DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql); +- +- switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)) +- { +- case SQLITE_OK: +- break; +- default: +- DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql); +- sqlite3_free(sql); +- return -1; +- } +- +- for (counter = 0; +- ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2; +- counter++) { +- /* While SQLITE_BUSY has a built in timeout, +- * SQLITE_LOCKED does not, so sleep */ +- if (result == SQLITE_LOCKED) +- sleep(1); +- } +- +- switch (result) +- { +- case SQLITE_DONE: +- /* no rows returned */ +- ret = 0; +- break; +- case SQLITE_ROW: +- if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) +- { +- ret = 0; +- break; +- } +- ret = sqlite3_column_int64(stmt, 0); +- break; +- default: +- DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql); +- ret = -1; +- break; +- } +- sqlite3_free(sql); +- sqlite3_finalize(stmt); +- +- return ret; ++ sql_get_field(int64_t, sqlite3_column_int64) + } + + char * diff --git a/multimedia/minidlna/patches/070-return-void.patch b/multimedia/minidlna/patches/070-return-void.patch new file mode 100644 index 000000000..7109dd94e --- /dev/null +++ b/multimedia/minidlna/patches/070-return-void.patch @@ -0,0 +1,21 @@ +From ce34745bb19a649c8570ef0a3da9ffd5e941548e Mon Sep 17 00:00:00 2001 +From: Daniel Kamil Kozar +Date: Sun, 30 Dec 2018 22:49:50 +0100 +Subject: [PATCH] No return in a function returning non-void + +--- + upnpdescgen.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/upnpdescgen.c b/upnpdescgen.c +index 85ce185..78d5754 100644 +--- a/upnpdescgen.c ++++ b/upnpdescgen.c +@@ -525,6 +525,7 @@ genXML(char *str, int *len, int *tmplen, const struct XMLElt *p) + pile[top].eltname = eltname; + } + } ++ return str; + } + + /* genRootDesc() : -- cgit v1.2.3