commit
d1d22ad2d8
@ -0,0 +1,192 @@
|
||||
From 34060b0c0cb13eed323577becf72a13b43654c00 Mon Sep 17 00:00:00 2001
|
||||
From: Amit <chauhanamit067@users.sourceforge.net>
|
||||
Date: Thu, 19 Nov 2015 13:35:30 +0100
|
||||
Subject: [PATCH 2/8] Add a new testfiledownload.c example
|
||||
|
||||
New test code which connects to a mms url and downloads this as a file
|
||||
to the local machine using mmsx_connect and mmsx_get_length().
|
||||
---
|
||||
src/Makefile.am | 4 +-
|
||||
src/testdownload.c | 29 ----------
|
||||
src/testfiledownload.c | 114 +++++++++++++++++++++++++++++++++++++++
|
||||
src/teststreamdownload.c | 29 ++++++++++
|
||||
4 files changed, 145 insertions(+), 31 deletions(-)
|
||||
delete mode 100644 src/testdownload.c
|
||||
create mode 100644 src/testfiledownload.c
|
||||
create mode 100644 src/teststreamdownload.c
|
||||
|
||||
diff --git a/src/Makefile.am b/src/Makefile.am
|
||||
index 4fbb5c0..295cc34 100644
|
||||
--- a/src/Makefile.am
|
||||
+++ b/src/Makefile.am
|
||||
@@ -1,4 +1,4 @@
|
||||
-# noinst_PROGRAMS = testconnect testdownload testswap
|
||||
+# noinst_PROGRAMS = testconnect testfiledownload teststreamdownload testswap
|
||||
|
||||
lib_LTLIBRARIES = libmms.la
|
||||
|
||||
@@ -46,5 +46,5 @@ INCLUDES = \
|
||||
DEPS = $(top_builddir)/src/libmms.la
|
||||
LDADD = $(top_builddir)/src/libmms.la
|
||||
|
||||
-# libmms_test_SOURCES = testconnect.c testdownload.c testswap.c
|
||||
+# libmms_test_SOURCES = testconnect.c testfiledownload.c teststreamdownload.c testswap.c
|
||||
# libmms_test_LDADD = $(LDADD)
|
||||
diff --git a/src/testfiledownload.c b/src/testfiledownload.c
|
||||
new file mode 100644
|
||||
index 0000000..cfef631
|
||||
--- /dev/null
|
||||
+++ b/src/testfiledownload.c
|
||||
@@ -0,0 +1,114 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2002-2004 the xine project
|
||||
+ * Copyright (C) 2004-2012 the libmms project
|
||||
+ *
|
||||
+ * This file is part of LibMMS, an MMS protocol handling library.
|
||||
+ * This file was originally a part of xine, a free video player.
|
||||
+ *
|
||||
+ * Libmms is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU Library General Public License as
|
||||
+ * published by the Free Software Foundation; either version 2 of the
|
||||
+ * License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * Libmms is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU Library General Public
|
||||
+ * License along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
+ * 02111-1307, USA
|
||||
+ * This file is created by : Amit Kumar (amit3.kumar@samsung.com)
|
||||
+*/
|
||||
+
|
||||
+/* Sample program: Connect a mms URL and download media file on local machine. */
|
||||
+
|
||||
+
|
||||
+
|
||||
+
|
||||
+
|
||||
+#include<stdio.h>
|
||||
+
|
||||
+#include "mms.h"
|
||||
+#include "mmsx.h"
|
||||
+
|
||||
+#define ERROR 1
|
||||
+
|
||||
+// Working MMS URL
|
||||
+
|
||||
+const char *url = "mms://a1014.v1252931.c125293.g.vm.akamaistream.net/7/1014/125293/v0001/wm.od.origin.zdf.de.gl-systemhaus.de/none/zdf/09/09/090925_hinweis_geo_de_vh.wmv";
|
||||
+
|
||||
+int main()
|
||||
+{
|
||||
+ mmsx_t * pMMSX = NULL;
|
||||
+ FILE* localFileHandle;
|
||||
+ int loop, readMediaResult;
|
||||
+ const char *localMediaName = "/tmp/mmsdownload.wmv";
|
||||
+ char buf[1024];
|
||||
+
|
||||
+ //Here we make a connection to the passed URL.
|
||||
+
|
||||
+ if(pMMSX = mmsx_connect(NULL, NULL, url, 1024))
|
||||
+ {
|
||||
+ printf("Connect OK\n");
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ printf("Not connected\n");
|
||||
+
|
||||
+ return ERROR;
|
||||
+ }
|
||||
+
|
||||
+ //Open file handler for local media file.
|
||||
+
|
||||
+ localFileHandle = fopen(localMediaName, "w");
|
||||
+
|
||||
+ if(!localFileHandle)
|
||||
+ {
|
||||
+ printf("Cannot open file to write\n");
|
||||
+ return ERROR;
|
||||
+ }
|
||||
+ /*
|
||||
+ **
|
||||
+ * mmsx_get_time_length() function will calculate the time
|
||||
+ * duration of media file.
|
||||
+ **
|
||||
+ */
|
||||
+
|
||||
+ printf("Time duration of media file = %lf\n",mmsx_get_time_length(pMMSX));
|
||||
+
|
||||
+ /*
|
||||
+ **
|
||||
+ * This loop will iterate total media length i.e. media size
|
||||
+ * divided by buffer size. In our case buffer size is 1024.
|
||||
+ **
|
||||
+ */
|
||||
+
|
||||
+ for(loop = 0; loop < mmsx_get_length(pMMSX)/1024; loop++)
|
||||
+ {
|
||||
+ readMediaResult = mmsx_read (NULL, pMMSX, buf,1024);
|
||||
+ if(!readMediaResult)
|
||||
+ break;
|
||||
+
|
||||
+ //Finally, writing local media file.
|
||||
+
|
||||
+ fwrite(buf, 1, readMediaResult, localFileHandle);
|
||||
+ }
|
||||
+
|
||||
+ // For print only
|
||||
+
|
||||
+ if(loop > 0)
|
||||
+ {
|
||||
+ printf("Reading file successfully and reading the file %d times\n", loop);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ printf("Failed to read from stream\n");
|
||||
+ }
|
||||
+
|
||||
+ //closed opend handler here.
|
||||
+
|
||||
+ fclose(localFileHandle);
|
||||
+ mmsx_close(pMMSX);
|
||||
+}
|
||||
diff --git a/src/teststreamdownload.c b/src/teststreamdownload.c
|
||||
new file mode 100644
|
||||
index 0000000..21d2d56
|
||||
--- /dev/null
|
||||
+++ b/src/teststreamdownload.c
|
||||
@@ -0,0 +1,29 @@
|
||||
+#include <stdio.h>
|
||||
+#include "mms.h"
|
||||
+
|
||||
+const char *url = "mms://od-msn.msn.com/3/mbr/apprentice_bts.wmv";
|
||||
+
|
||||
+int main(int argc, char *argv[])
|
||||
+{
|
||||
+ mms_t *this = NULL;
|
||||
+ char buf[1024];
|
||||
+ int i, res;
|
||||
+ FILE* f;
|
||||
+
|
||||
+ if((this = mms_connect(NULL, NULL, url, 1)))
|
||||
+ printf("Connect OK\n");
|
||||
+ f = fopen("/tmp/mmsdownload.test", "w");
|
||||
+ for(i = 0; i < 10000; i++)
|
||||
+ {
|
||||
+ res = mms_read(NULL, this, buf, 1024);
|
||||
+ if(!res)
|
||||
+ break;
|
||||
+ fwrite(buf, 1, res, f);
|
||||
+ }
|
||||
+ if(i > 0)
|
||||
+ printf("OK, read %d times\n", i);
|
||||
+ else
|
||||
+ printf("Failed to read from stream\n");
|
||||
+
|
||||
+
|
||||
+}
|
||||
--
|
||||
2.39.2
|
||||
|
@ -0,0 +1,70 @@
|
||||
From 67d54003b8075b8ea8102bc4a808df4543ab113a Mon Sep 17 00:00:00 2001
|
||||
From: John Lindgren <john.lindgren@tds.net>
|
||||
Date: Thu, 19 Nov 2015 13:39:27 +0100
|
||||
Subject: [PATCH 3/8] Fix build if strndup() is missing
|
||||
|
||||
---
|
||||
configure.in | 1 +
|
||||
src/uri.c | 27 +++++++++++++++++++++++++++
|
||||
2 files changed, 28 insertions(+)
|
||||
|
||||
diff --git a/configure.in b/configure.in
|
||||
index 86b0e08..9209523 100755
|
||||
--- a/configure.in
|
||||
+++ b/configure.in
|
||||
@@ -14,6 +14,7 @@ AC_PROG_INSTALL
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_CHECK_HEADERS([sys/socket.h netinet/in.h netdb.h windows.h winsock2.h])
|
||||
+AC_CHECK_FUNCS([strndup])
|
||||
|
||||
case $host in
|
||||
*beos*)
|
||||
diff --git a/src/uri.c b/src/uri.c
|
||||
index a96b900..ec28f3c 100644
|
||||
--- a/src/uri.c
|
||||
+++ b/src/uri.c
|
||||
@@ -17,6 +17,10 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
+#ifdef HAVE_CONFIG_H
|
||||
+#include "config.h"
|
||||
+#endif
|
||||
+
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
@@ -125,6 +129,29 @@ for ($i = 0; $i < 32; $i++)
|
||||
#define ISSPACE(C) (((C) >= 9 && (C) <= 13) || (C) == ' ')
|
||||
|
||||
|
||||
+/* Implement the strndup function.
|
||||
+ Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
+ Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>. */
|
||||
+#ifndef HAVE_STRNDUP
|
||||
+char *
|
||||
+strndup (const char *s, size_t n)
|
||||
+{
|
||||
+ char *result;
|
||||
+ size_t len = strlen (s);
|
||||
+
|
||||
+ if (n < len)
|
||||
+ len = n;
|
||||
+
|
||||
+ result = (char *) malloc (len + 1);
|
||||
+ if (!result)
|
||||
+ return 0;
|
||||
+
|
||||
+ result[len] = '\0';
|
||||
+ return (char *) memcpy (result, s, len);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
static int split_user_passwd(const char* in, char** user, char** passwd)
|
||||
{
|
||||
char *pass, *tmp = g_strdup(in);
|
||||
--
|
||||
2.39.2
|
||||
|
@ -0,0 +1,33 @@
|
||||
From 5cface3df0e0213d8bc593d82a9a7c1e648dd71a Mon Sep 17 00:00:00 2001
|
||||
From: Mahendra Narvariya <mahendra84@users.sourceforge.net>
|
||||
Date: Thu, 19 Nov 2015 13:42:30 +0100
|
||||
Subject: [PATCH 4/8] Patch to remove redundant comparison in file mmsh.c
|
||||
|
||||
Variable uri can not be NULL at line no 665 as NULL check is already
|
||||
applied at line no 625.
|
||||
---
|
||||
src/mmsh.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/mmsh.c b/src/mmsh.c
|
||||
index a019f05..dc17c9d 100755
|
||||
--- a/src/mmsh.c
|
||||
+++ b/src/mmsh.c
|
||||
@@ -662,10 +662,10 @@ mmsh_t *mmsh_connect (mms_io_t *io, void *data, const char *url, int bandwidth)
|
||||
gnet_uri_delete(proxy_uri);
|
||||
proxy_uri = NULL;
|
||||
}
|
||||
- if (uri) {
|
||||
- gnet_uri_delete(uri);
|
||||
- uri = NULL;
|
||||
- }
|
||||
+
|
||||
+ gnet_uri_delete(uri);
|
||||
+ uri = NULL;
|
||||
+
|
||||
if (!mms_valid_proto(this->proto)) {
|
||||
lprintf("unsupported protocol\n");
|
||||
goto fail;
|
||||
--
|
||||
2.39.2
|
||||
|
@ -0,0 +1,28 @@
|
||||
From 8b5e303fc1f01521c727e351270dd68c4f15190b Mon Sep 17 00:00:00 2001
|
||||
From: Mahendra Narvariya <mahendra84@users.sourceforge.net>
|
||||
Date: Thu, 19 Nov 2015 13:45:52 +0100
|
||||
Subject: [PATCH 5/8] Avoid possible overflow in sprintf
|
||||
|
||||
Avoid possible overflow in sprintf, better to use snprintf.
|
||||
---
|
||||
src/mms.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/mms.c b/src/mms.c
|
||||
index c1dbc29..579c3f0 100644
|
||||
--- a/src/mms.c
|
||||
+++ b/src/mms.c
|
||||
@@ -772,8 +772,8 @@ mms_t *mms_connect (mms_io_t *io, void *data, const char *url, int bandwidth) {
|
||||
mms_buffer_init(&command_buffer, this->scmd_body);
|
||||
mms_buffer_put_32 (&command_buffer, 0x0003001C);
|
||||
mms_gen_guid(this->guid);
|
||||
- sprintf(this->str, "NSPlayer/7.0.0.1956; {%s}; Host: %s", this->guid,
|
||||
- this->connect_host);
|
||||
+ snprintf(this->str, sizeof(this->str), "NSPlayer/7.0.0.1956; {%s}; Host: %s",
|
||||
+ this->guid, this->connect_host);
|
||||
res = mms_utf8_to_utf16le(this->scmd_body + command_buffer.pos,
|
||||
CMD_BODY_LEN - command_buffer.pos,
|
||||
this->str);
|
||||
--
|
||||
2.39.2
|
||||
|
@ -0,0 +1,28 @@
|
||||
From 03fa0e92467f56028944e04478b19845c03daafd Mon Sep 17 00:00:00 2001
|
||||
From: Mahendra Narvariya <mahendra84@users.sourceforge.net>
|
||||
Date: Thu, 19 Nov 2015 14:03:40 +0100
|
||||
Subject: [PATCH 6/8] Fix possible NULL Pointer deref in mmsh.c
|
||||
|
||||
---
|
||||
src/mmsh.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/src/mmsh.c b/src/mmsh.c
|
||||
index dc17c9d..918e0a3 100755
|
||||
--- a/src/mmsh.c
|
||||
+++ b/src/mmsh.c
|
||||
@@ -603,6 +603,11 @@ mmsh_t *mmsh_connect (mms_io_t *io, void *data, const char *url, int bandwidth)
|
||||
*/
|
||||
this = calloc(1, sizeof(mmsh_t));
|
||||
|
||||
+ if (!this) {
|
||||
+ lprintf("error, calloc failed\n");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
this->url = strdup(url);
|
||||
if ((proxy_env = getenv("http_proxy")) != NULL)
|
||||
this->proxy_url = strdup(proxy_env);
|
||||
--
|
||||
2.39.2
|
||||
|
@ -0,0 +1,56 @@
|
||||
From 5d39f692d55c04839be78e470820f49d53e40bcb Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= <revol@free.fr>
|
||||
Date: Wed, 27 Mar 2019 02:14:03 +0100
|
||||
Subject: [PATCH 7/8] Add check for <sys/select.h> and use it
|
||||
|
||||
POSIX says it's required for 'fd_set', and Haiku needs it.
|
||||
---
|
||||
configure.in | 2 +-
|
||||
src/mms.c | 3 +++
|
||||
src/mmsh.c | 3 +++
|
||||
3 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.in b/configure.in
|
||||
index 9209523..7434885 100755
|
||||
--- a/configure.in
|
||||
+++ b/configure.in
|
||||
@@ -13,7 +13,7 @@ AC_PROG_LIBTOOL
|
||||
AC_PROG_INSTALL
|
||||
|
||||
dnl Checks for header files.
|
||||
-AC_CHECK_HEADERS([sys/socket.h netinet/in.h netdb.h windows.h winsock2.h])
|
||||
+AC_CHECK_HEADERS([sys/select.h sys/socket.h netinet/in.h netdb.h windows.h winsock2.h])
|
||||
AC_CHECK_FUNCS([strndup])
|
||||
|
||||
case $host in
|
||||
diff --git a/src/mms.c b/src/mms.c
|
||||
index 579c3f0..bbeeb68 100644
|
||||
--- a/src/mms.c
|
||||
+++ b/src/mms.c
|
||||
@@ -52,6 +52,9 @@
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
+#ifdef HAVE_SYS_SELECT_H
|
||||
+#include <sys/select.h>
|
||||
+#endif
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
diff --git a/src/mmsh.c b/src/mmsh.c
|
||||
index 918e0a3..cfaad94 100755
|
||||
--- a/src/mmsh.c
|
||||
+++ b/src/mmsh.c
|
||||
@@ -55,6 +55,9 @@
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
+#ifdef HAVE_SYS_SELECT_H
|
||||
+#include <sys/select.h>
|
||||
+#endif
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
--
|
||||
2.39.2
|
||||
|
@ -0,0 +1,55 @@
|
||||
From a9f692323e597324e6f01263c12b6f4290d5b56f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= <revol@free.fr>
|
||||
Date: Wed, 27 Mar 2019 02:14:37 +0100
|
||||
Subject: [PATCH 8/8] C89 fixes for Haiku
|
||||
|
||||
---
|
||||
src/mms-common-funcs.h | 14 +++++++++-----
|
||||
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/mms-common-funcs.h b/src/mms-common-funcs.h
|
||||
index 9e3c21d..f273756 100644
|
||||
--- a/src/mms-common-funcs.h
|
||||
+++ b/src/mms-common-funcs.h
|
||||
@@ -205,12 +205,14 @@ static void interp_asf_header(TYPE *this)
|
||||
|
||||
case GUID_ASF_HEADER_EXTENSION:
|
||||
{
|
||||
+ int size;
|
||||
+ int j = 24 + 18 + 4;
|
||||
+ int l;
|
||||
+
|
||||
if ((24 + 18 + 4) > length)
|
||||
break;
|
||||
|
||||
- int size = LE_32(this->asf_header + i + 24 + 18);
|
||||
- int j = 24 + 18 + 4;
|
||||
- int l;
|
||||
+ size = LE_32(this->asf_header + i + 24 + 18);
|
||||
lprintf("Extension header data size: %d\n", size);
|
||||
|
||||
while ((j + 24) <= length) {
|
||||
@@ -249,16 +251,18 @@ static void interp_asf_header(TYPE *this)
|
||||
|
||||
// Loop through the number of extension system info
|
||||
for (x = 0; x < ext_count && (ext_j + 22) <= l; x++) {
|
||||
+ int len;
|
||||
ext_j += 18;
|
||||
- int len = LE_16(this->asf_header + i + j + ext_j);
|
||||
+ len = LE_16(this->asf_header + i + j + ext_j);
|
||||
ext_j += 4 + len;
|
||||
}
|
||||
|
||||
lprintf("ext_j: %d\n", ext_j);
|
||||
// Finally, we arrive at the interesting point: The optional Stream Property Object
|
||||
if ((ext_j + 24) <= l) {
|
||||
+ int len;
|
||||
guid = get_guid(this->asf_header, i + j + ext_j);
|
||||
- int len = LE_64(this->asf_header + i + j + ext_j + 16);
|
||||
+ len = LE_64(this->asf_header + i + j + ext_j + 16);
|
||||
if (guid == GUID_ASF_STREAM_PROPERTIES &&
|
||||
(ext_j + len) <= l) {
|
||||
interp_stream_properties(this, i + j + ext_j + 24);
|
||||
--
|
||||
2.39.2
|
||||
|
Loading…
Reference in new issue