Compare commits

...

9 Commits

Author SHA1 Message Date
Marcelo Roberto Jimenez
631259dcfc Adjust the library numbers for release. 2011-11-14 12:20:20 -02:00
Fabrice Fontaine
98e4f938d6 UPnP Low Power support
Adding two new functions (UpnpSendAdvertisementLowPower and
UpnpUnRegisterRootDeviceLowPower) which can be used to specify values
for the three SSDP headers defined by UPnP Low Power. Those headers are
Powerstate, SleepPeriod and RegistrationState.
2011-11-04 20:21:58 -02:00
Fabrice Fontaine
92c93a8010 Bug fix in IN6_IS_ADDR_GLOBAL.
Changing IN6_IS_ADDR_GLOBAL to accept all IPv6 addresses which have a
2000::/3 prefix.
2011-11-01 18:59:49 -02:00
Nick Leverton
e40e6b49d4 Summary: upnptools.h should #include upnpconfig.h - ID: 3426326
(cherry picked from commit ef7bbc4866)
2011-10-20 12:30:05 +01:00
Marcelo Roberto Jimenez
cec07d641a autoconfig.h for windows builds. 2011-07-20 06:21:32 -03:00
Fabrice Fontaine
6c6fb3707f Bug Fix on M-SEARCH.
Do not answer to M-SEARCH using HTTP version 1.0 as specified by the
UPnP Device Architecture.
2011-07-20 06:10:07 -03:00
Iain Denniston
92ea719804 Fixes for compilation under Windows (specifically MSVC). Also added MSVC supported "_inline", and fixed some WIN32 specific warnings. 2011-04-02 23:47:00 -03:00
Iain Denniston
fed316ff3e Several fixes to correctly use SOCKET (and related) types instead of non-portable variations. 2011-04-02 23:38:53 -03:00
Marcelo Roberto Jimenez
8eb7d1c1a5 Homekeeping for the next release. 2011-03-17 09:27:55 -03:00
30 changed files with 433 additions and 109 deletions

View File

@@ -1,3 +1,40 @@
*******************************************************************************
Version 1.6.14
*******************************************************************************
2011-10-31 Fabrice Fontaine <fabrice.fontaine(at)orange.com>
UPnP Low Power Support.
Adding two new functions (UpnpSendAdvertisementLowPower and
UpnpUnRegisterRootDeviceLowPower) which can be used to specify values
for the three SSDP headers defined by UPnP Low Power. Those headers are
Powerstate, SleepPeriod and RegistrationState.
2011-10-24 Fabrice Fontaine <fabrice.fontaine(at)orange.com>
Bug fix in IN6_IS_ADDR_GLOBAL.
Changing IN6_IS_ADDR_GLOBAL to accept all IPv6 addresses which have a
2000::/3 prefix.
2011-07-20 Marc Essayan <marc.essayan(at)orange-ftgroup.com>
Bug Fix on M-SEARCH.
Do not answer to M-SEARCH using HTTP version 1.0 as specified by the
UPnP Device Architecture.
2011-03-18 Iain Denniston <iain.denniston(at)gmail.com>
Fixes for compilation under Windows (specifically MSVC). Also added
MSVC supported "_inline", and fixed some WIN32 specific warnings.
2011-03-08 Iain Denniston <iain.denniston(at)gmail.com>
Several fixes to correctly use SOCKET (and related) types instead of
non-portable variations.
******************************************************************************* *******************************************************************************
Version 1.6.13 Version 1.6.13
******************************************************************************* *******************************************************************************

View File

@@ -31,7 +31,7 @@ PROJECT_NAME = libUPnP
# This could be handy for archiving the generated documentation or # This could be handy for archiving the generated documentation or
# if some version control system is used. # if some version control system is used.
PROJECT_NUMBER = 1.6.13 PROJECT_NUMBER = 1.6.14
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put. # base path where the generated documentation will be put.

View File

@@ -105,13 +105,16 @@
#define PACKAGE_NAME "libupnp" #define PACKAGE_NAME "libupnp"
/* Define to the full name and version of this package. */ /* Define to the full name and version of this package. */
#define PACKAGE_STRING "libupnp 1.6.13" #define PACKAGE_STRING "libupnp 1.6.14"
/* Define to the one symbol short name of this package. */ /* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "libupnp" #define PACKAGE_TARNAME "libupnp"
/* Define to the home page for this package. */
#define PACKAGE_URL ""
/* Define to the version of this package. */ /* Define to the version of this package. */
#define PACKAGE_VERSION "1.6.13" #define PACKAGE_VERSION "1.6.14"
/* Define to necessary symbol if this constant uses a non-standard name on /* Define to necessary symbol if this constant uses a non-standard name on
your system. */ your system. */
@@ -154,13 +157,13 @@
#define UPNP_VERSION_MINOR 6 #define UPNP_VERSION_MINOR 6
/* see upnpconfig.h */ /* see upnpconfig.h */
#define UPNP_VERSION_PATCH 13 #define UPNP_VERSION_PATCH 14
/* see upnpconfig.h */ /* see upnpconfig.h */
#define UPNP_VERSION_STRING "1.6.13" #define UPNP_VERSION_STRING "1.6.14"
/* Version number of package */ /* Version number of package */
#define VERSION "1.6.13" #define VERSION "1.6.14"
/* File Offset size */ /* File Offset size */
#define _FILE_OFFSET_BITS 64 #define _FILE_OFFSET_BITS 64

View File

@@ -40,7 +40,7 @@
***************************************************************************/ ***************************************************************************/
/** The library version (string) e.g. "1.3.0" */ /** The library version (string) e.g. "1.3.0" */
#define UPNP_VERSION_STRING "1.6.13" #define UPNP_VERSION_STRING "1.6.14"
/** Major version of the library */ /** Major version of the library */
#define UPNP_VERSION_MAJOR 1 #define UPNP_VERSION_MAJOR 1
@@ -49,7 +49,7 @@
#define UPNP_VERSION_MINOR 6 #define UPNP_VERSION_MINOR 6
/** Patch version of the library */ /** Patch version of the library */
#define UPNP_VERSION_PATCH 13 #define UPNP_VERSION_PATCH 14
/** The library version (numeric) e.g. 10300 means version 1.3.0 */ /** The library version (numeric) e.g. 10300 means version 1.3.0 */
#define UPNP_VERSION \ #define UPNP_VERSION \

View File

@@ -9,7 +9,7 @@
AC_PREREQ(2.60) AC_PREREQ(2.60)
AC_INIT([libupnp], [1.6.13], [mroberto@users.sourceforge.net]) AC_INIT([libupnp], [1.6.14], [mroberto@users.sourceforge.net])
dnl ############################################################################ dnl ############################################################################
dnl # *Independently* of the above libupnp package version, the libtool version dnl # *Independently* of the above libupnp package version, the libtool version
dnl # of the 3 libraries need to be updated whenever there is a change released: dnl # of the 3 libraries need to be updated whenever there is a change released:
@@ -255,9 +255,24 @@ dnl #AC_SUBST([LT_VERSION_THREADUTIL], [6:0:0])
dnl #AC_SUBST([LT_VERSION_UPNP], [7:0:1]) dnl #AC_SUBST([LT_VERSION_UPNP], [7:0:1])
dnl # dnl #
dnl ############################################################################ dnl ############################################################################
dnl # Release 1.6.14:
dnl # "current:revision:age"
dnl #
dnl # - Code has changed in upnp
dnl # revision: 0 -> 1
dnl # - interface added in upnp
dnl # current: 7 -> 8
dnl # revision: 1 - > 0
dnl # age: 1 -> 2
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:6:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [6:0:0])
dnl #AC_SUBST([LT_VERSION_UPNP], [8:0:2])
dnl #
dnl ############################################################################
AC_SUBST([LT_VERSION_IXML], [2:6:0]) AC_SUBST([LT_VERSION_IXML], [2:6:0])
AC_SUBST([LT_VERSION_THREADUTIL], [6:0:0]) AC_SUBST([LT_VERSION_THREADUTIL], [6:0:0])
AC_SUBST([LT_VERSION_UPNP], [7:0:1]) AC_SUBST([LT_VERSION_UPNP], [8:0:2])
dnl ############################################################################ dnl ############################################################################
dnl # Repeating the algorithm to place it closer to the modificatin place: dnl # Repeating the algorithm to place it closer to the modificatin place:
dnl # - library code modified: revision++ dnl # - library code modified: revision++

View File

@@ -1,4 +1,4 @@
Version: 1.6.13 Version: 1.6.14
Summary: Universal Plug and Play (UPnP) SDK Summary: Universal Plug and Play (UPnP) SDK
Name: libupnp Name: libupnp
Release: 1%{?dist} Release: 1%{?dist}

View File

@@ -922,7 +922,8 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
#endif #endif
#if !defined(PTHREAD_MUTEX_RECURSIVE) && !defined(__DragonFly__) #if !defined(PTHREAD_MUTEX_RECURSIVE) && !defined(__DragonFly__) && !defined(UPNP_USE_MSVCPP)
/* !defined(UPNP_USE_MSVCPP) should probably also have pthreads version check - but it's not clear if that is possible */
/* NK: Added for satisfying the gcc compiler */ /* NK: Added for satisfying the gcc compiler */
EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind); EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
#endif #endif

View File

@@ -292,8 +292,8 @@ static int SetPriority(
/*! . */ /*! . */
ThreadPriority priority) ThreadPriority priority)
{ {
int retVal = 0;
#if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0 #if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
int retVal = 0;
int currentPolicy; int currentPolicy;
int minPriority = 0; int minPriority = 0;
int maxPriority = 0; int maxPriority = 0;
@@ -325,11 +325,12 @@ static int SetPriority(
sched_result = pthread_setschedparam(ithread_self(), currentPolicy, &newPriority); sched_result = pthread_setschedparam(ithread_self(), currentPolicy, &newPriority);
retVal = (sched_result == 0 || errno == EPERM) ? 0 : sched_result; retVal = (sched_result == 0 || errno == EPERM) ? 0 : sched_result;
#else
retVal = 0;
#endif
exit_function: exit_function:
return retVal; return retVal;
#else
return 0;
priority = priority;
#endif
} }
/*! /*!

View File

@@ -40,7 +40,7 @@
*/ */
#ifdef UPNP_USE_MSVCPP #ifdef UPNP_USE_MSVCPP
/* define some things the M$ VC++ doesn't know */ /* define some things the M$ VC++ doesn't know */
#define UPNP_INLINE #define UPNP_INLINE _inline
typedef __int64 int64_t; typedef __int64 int64_t;
#define PRId64 "I64d" #define PRId64 "I64d"
#define PRIzd "ld" #define PRIzd "ld"

View File

@@ -15,8 +15,11 @@
#ifdef WIN32 #ifdef WIN32
#include <stdarg.h> #include <stdarg.h>
#include <windef.h> #ifndef UPNP_USE_MSVCPP
#include <winbase.h> /* Removed: not required (and cause compilation issues) */
#include <winbase.h>
#include <windef.h>
#endif
#include <winsock2.h> #include <winsock2.h>
#include <iphlpapi.h> #include <iphlpapi.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>

View File

@@ -1,11 +1,11 @@
#ifndef UPNPINTTYPES_H #ifndef UPNPINTTYPES_H
#define UPNPINTTYPES_H #define UPNPINTTYPES_H
#if !defined(UPNP_USE_BCBPP) && !defined(UPNP_USE_MSVCPP) #if !defined(UPNP_USE_BCBPP)
/* Printf format for integers. */ /* Printf format for integers. */
#include <inttypes.h> #include <inttypes.h>
#endif /* !defined(UPNP_USE_BCBPP) && !defined(UPNP_USE_MSVCPP) */ #endif /* !defined(UPNP_USE_BCBPP) */
#endif /* UPNPINTTYPES_H */ #endif /* UPNPINTTYPES_H */

View File

@@ -1,11 +1,20 @@
#ifndef UPNPSTDINT_H #ifndef UPNPSTDINT_H
#define UPNPSTDINT_H #define UPNPSTDINT_H
#if !defined(UPNP_USE_BCBPP) && !defined(UPNP_USE_MSVCPP) #if !defined(UPNP_USE_BCBPP)
/* Sized integer types. */ /* Sized integer types. */
#include <stdint.h> #include <stdint.h>
#endif /* !defined(UPNP_USE_BCBPP) && !defined(UPNP_USE_MSVCPP) */ #ifdef UPNP_USE_MSVCPP
/* no ssize_t defined for VC */
#ifdef _WIN64
typedef int64_t ssize_t;
#else
typedef int32_t ssize_t;
#endif
#endif
#endif /* !defined(UPNP_USE_BCBPP) */
#endif /* UPNPSTDINT_H */ #endif /* UPNPSTDINT_H */

View File

@@ -5,6 +5,7 @@
* *
* Copyright (c) 2000-2003 Intel Corporation * Copyright (c) 2000-2003 Intel Corporation
* All rights reserved. * All rights reserved.
* Copyright (C) 2011 France Telecom All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -51,6 +52,9 @@
*/ */
#ifdef WIN32 #ifdef WIN32
#include <time.h> #include <time.h>
#ifdef UPNP_USE_MSVCPP
#include <sys/types.h> /* needed for off_t */
#endif
#elif (defined(BSD) && BSD >= 199306) #elif (defined(BSD) && BSD >= 199306)
#include <time.h> #include <time.h>
#else #else
@@ -1284,6 +1288,35 @@ EXPORT_SPEC int UpnpUnRegisterRootDevice(
/*! [in] The handle of the root device instance to unregister. */ /*! [in] The handle of the root device instance to unregister. */
UpnpDevice_Handle Hnd); UpnpDevice_Handle Hnd);
/*!
* \brief Unregisters a root device registered with \b UpnpRegisterRootDevice,
* \b UpnpRegisterRootDevice2, \b UpnpRegisterRootDevice3 or
* \b UpnpRegisterRootDevice4.
*
* After this call, the \b UpnpDevice_Handle is no longer valid. For all
* advertisements that have not yet expired, the SDK sends a device unavailable
* message automatically.
*
* This is a synchronous call and generates no callbacks. Once this call
* returns, the SDK will no longer generate callbacks to the application.
*
* This function allow a device to specify the SSDP extensions defined by UPnP
* Low Power.
*
* \return An integer representing one of the following:
* \li \c UPNP_E_SUCCESS: The operation completed successfully.
* \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.
*/
EXPORT_SPEC int UpnpUnRegisterRootDeviceLowPower(
/*! [in] The handle of the root device instance to unregister. */
UpnpDevice_Handle Hnd,
/*! PowerState as defined by UPnP Low Power. */
int PowerState,
/*! SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/*! RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/*! /*!
* \brief Registers a control point application with the UPnP Library. * \brief Registers a control point application with the UPnP Library.
* *
@@ -1438,6 +1471,36 @@ EXPORT_SPEC int UpnpSendAdvertisement(
/*! The expiration age, in seconds, of the announcements. */ /*! The expiration age, in seconds, of the announcements. */
int Exp); int Exp);
/*!
* \brief Sends out the discovery announcements for all devices and services
* for a device.
*
* Each announcement is made with the same expiration time.
*
* This is a synchronous call.
*
* This function allow a device to specify the SSDP extensions defined by UPnP
* Low Power.
*
* \return An integer representing one of the following:
* \li \c UPNP_E_SUCCESS: The operation completed successfully.
* \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid
* device handle.
* \li \c UPNP_E_OUTOF_MEMORY: There are insufficient resources to
* send future advertisements.
*/
EXPORT_SPEC int UpnpSendAdvertisementLowPower(
/*! The device handle for which to send out the announcements. */
UpnpDevice_Handle Hnd,
/*! The expiration age, in seconds, of the announcements. */
int Exp,
/*! PowerState as defined by UPnP Low Power. */
int PowerState,
/*! SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/*! RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/* @} Discovery */ /* @} Discovery */
/****************************************************************************** /******************************************************************************

View File

@@ -50,6 +50,7 @@
#include "ixml.h" /* for IXML_Document */ #include "ixml.h" /* for IXML_Document */
#include "upnpconfig.h" /* for UPNP_HAVE_TOOLS */
/* Function declarations only if tools compiled into the library */ /* Function declarations only if tools compiled into the library */

View File

@@ -28,16 +28,19 @@
/* Other systems have strncasecmp */ /* Other systems have strncasecmp */
#endif #endif
/* strnlen() is a GNU extension. */ #ifndef UPNP_USE_MSVCPP
#if HAVE_STRNLEN /* VC has strnlen which is already included but with (potentially) different linkage */
extern size_t strnlen(const char *s, size_t maxlen); /* strnlen() is a GNU extension. */
#else /* HAVE_STRNLEN */ #if HAVE_STRNLEN
static size_t strnlen(const char *s, size_t n) extern size_t strnlen(const char *s, size_t maxlen);
{ #else /* HAVE_STRNLEN */
const char *p = (const char *)memchr(s, 0, n); static size_t strnlen(const char *s, size_t n)
return p ? p - s : n; {
} const char *p = (const char *)memchr(s, 0, n);
#endif /* HAVE_STRNLEN */ return p ? p - s : n;
}
#endif /* HAVE_STRNLEN */
#endif /* WIN32 */
/* strndup() is a GNU extension. */ /* strndup() is a GNU extension. */
#if HAVE_STRNDUP && !defined(WIN32) #if HAVE_STRNDUP && !defined(WIN32)

View File

@@ -2,6 +2,7 @@
* *
* Copyright (c) 2000-2003 Intel Corporation * Copyright (c) 2000-2003 Intel Corporation
* All rights reserved. * All rights reserved.
* Copyright (C) 2011 France Telecom All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -79,8 +80,8 @@
#ifndef IN6_IS_ADDR_GLOBAL #ifndef IN6_IS_ADDR_GLOBAL
#define IN6_IS_ADDR_GLOBAL(a) \ #define IN6_IS_ADDR_GLOBAL(a) \
(((((__const uint8_t *) (a))[0] & htonl(0xff000000)) <= htonl(0x3f000000) \ ((((__const uint32_t *) (a))[0] & htonl(0x70000000)) \
&& (((__const uint8_t *) (a))[0] & htonl(0xff000000)) >= htonl(0x20000000))) == htonl (0x20000000))
#endif /* IS ADDR GLOBAL */ #endif /* IS ADDR GLOBAL */
#ifndef IN6_IS_ADDR_ULA #ifndef IN6_IS_ADDR_ULA
@@ -1205,6 +1206,14 @@ exit_function:
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd) int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd)
{
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"Inside UpnpUnRegisterRootDevice\n");
return UpnpUnRegisterRootDeviceLowPower(Hnd, -1, -1, -1);
}
int UpnpUnRegisterRootDeviceLowPower(UpnpDevice_Handle Hnd, int PowerState,
int SleepPeriod, int RegistrationState)
{ {
int retVal = 0; int retVal = 0;
struct Handle_Info *HInfo = NULL; struct Handle_Info *HInfo = NULL;
@@ -1212,7 +1221,7 @@ int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd)
if (UpnpSdkInit != 1) if (UpnpSdkInit != 1)
return UPNP_E_FINISH; return UPNP_E_FINISH;
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"Inside UpnpUnRegisterRootDevice\n"); "Inside UpnpUnRegisterRootDeviceLowPower\n");
#if EXCLUDE_GENA == 0 #if EXCLUDE_GENA == 0
if (genaUnregisterDevice(Hnd) != UPNP_E_SUCCESS) if (genaUnregisterDevice(Hnd) != UPNP_E_SUCCESS)
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -1223,6 +1232,11 @@ int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd)
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
} }
HInfo->PowerState = PowerState;
if( SleepPeriod < 0 )
SleepPeriod = -1;
HInfo->SleepPeriod = SleepPeriod;
HInfo->RegistrationState = RegistrationState;
HandleUnlock(); HandleUnlock();
#if EXCLUDE_SSDP == 0 #if EXCLUDE_SSDP == 0
@@ -1254,7 +1268,7 @@ int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd)
HandleUnlock(); HandleUnlock();
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"Exiting UpnpUnRegisterRootDevice\n"); "Exiting UpnpUnRegisterRootDeviceLowPower\n");
return retVal; return retVal;
} }
@@ -1583,6 +1597,14 @@ static int GetDescDocumentAndURL(
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
#if EXCLUDE_SSDP == 0 #if EXCLUDE_SSDP == 0
int UpnpSendAdvertisement(UpnpDevice_Handle Hnd, int Exp) int UpnpSendAdvertisement(UpnpDevice_Handle Hnd, int Exp)
{
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSendAdvertisement \n");
return UpnpSendAdvertisementLowPower (Hnd, Exp, -1, -1, -1);
}
int UpnpSendAdvertisementLowPower(UpnpDevice_Handle Hnd, int Exp,
int PowerState, int SleepPeriod, int RegistrationState)
{ {
struct Handle_Info *SInfo = NULL; struct Handle_Info *SInfo = NULL;
int retVal = 0, int retVal = 0,
@@ -1595,7 +1617,7 @@ int UpnpSendAdvertisement(UpnpDevice_Handle Hnd, int Exp)
} }
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSendAdvertisement \n" ); "Inside UpnpSendAdvertisementLowPower \n" );
HandleLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
@@ -1605,6 +1627,11 @@ int UpnpSendAdvertisement(UpnpDevice_Handle Hnd, int Exp)
if( Exp < 1 ) if( Exp < 1 )
Exp = DEFAULT_MAXAGE; Exp = DEFAULT_MAXAGE;
SInfo->MaxAge = Exp; SInfo->MaxAge = Exp;
SInfo->PowerState = PowerState;
if( SleepPeriod < 0 )
SleepPeriod = -1;
SInfo->SleepPeriod = SleepPeriod;
SInfo->RegistrationState = RegistrationState;
HandleUnlock(); HandleUnlock();
retVal = AdvertiseAndReply( 1, Hnd, 0, ( struct sockaddr * )NULL, retVal = AdvertiseAndReply( 1, Hnd, 0, ( struct sockaddr * )NULL,
( char * )NULL, ( char * )NULL, ( char * )NULL, ( char * )NULL,
@@ -1665,7 +1692,7 @@ int UpnpSendAdvertisement(UpnpDevice_Handle Hnd, int Exp)
HandleUnlock(); HandleUnlock();
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting UpnpSendAdvertisement \n" ); "Exiting UpnpSendAdvertisementLowPower \n" );
return retVal; return retVal;
@@ -3242,7 +3269,7 @@ int UpnpGetIfInfo(const char *IfName)
ifname_found = 1; ifname_found = 1;
} }
/* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */ /* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */
if ((LocalSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { if ((LocalSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
"Can't create addrlist socket\n"); "Can't create addrlist socket\n");
return UPNP_E_INIT; return UPNP_E_INIT;
@@ -3660,7 +3687,7 @@ int getlocalhostname(char *out, size_t out_len)
/* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */ /* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */
LocalSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); LocalSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (LocalSock < 0) { if (LocalSock == INVALID_SOCKET) {
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
"Can't create addrlist socket\n"); "Can't create addrlist socket\n");
return UPNP_E_INIT; return UPNP_E_INIT;

View File

@@ -118,6 +118,7 @@ int DebugAtThisLevel(Upnp_LogLevel DLevel, Dbg_Module Module)
(Module == DOM && DEBUG_DOM) || (Module == HTTP && DEBUG_HTTP); (Module == DOM && DEBUG_DOM) || (Module == HTTP && DEBUG_HTTP);
return ret; return ret;
Module = Module; /* VC complains about this being unreferenced */
} }
void UpnpPrintf(Upnp_LogLevel DLevel, void UpnpPrintf(Upnp_LogLevel DLevel,

View File

@@ -1310,7 +1310,12 @@ parser_parse_requestline( INOUT http_parser_t * parser )
&hmsg->major_version, &hmsg->minor_version ); &hmsg->major_version, &hmsg->minor_version );
version_str.buf[version_str.length] = save_char; /* restore */ version_str.buf[version_str.length] = save_char; /* restore */
if( num_scanned != 2 || if( num_scanned != 2 ||
hmsg->major_version < 0 || hmsg->minor_version < 0 ) { /* HTTP version equals to 1.0 should fail for MSEARCH as required by the
* UPnP certification tool */
hmsg->major_version < 0 || ( ( hmsg->major_version == 1 )
&& ( hmsg->minor_version < 1 )
&& ( Http_Method_Table[index].id == HTTPMETHOD_MSEARCH ) ) ) {
parser->http_error_code = HTTP_HTTP_VERSION_NOT_SUPPORTED;
/* error; bad http version */ /* error; bad http version */
return PARSE_FAILURE; return PARSE_FAILURE;
} }

View File

@@ -222,8 +222,8 @@ SOCKET http_Connect(
http_FixUrl(destination_url, url); http_FixUrl(destination_url, url);
connfd = socket(url->hostport.IPaddress.ss_family, SOCK_STREAM, 0); connfd = socket(url->hostport.IPaddress.ss_family, SOCK_STREAM, 0);
if (connfd == -1) { if (connfd == INVALID_SOCKET) {
return UPNP_E_OUTOF_SOCKET; return (SOCKET)(UPNP_E_OUTOF_SOCKET);
} }
sockaddr_len = (socklen_t)(url->hostport.IPaddress.ss_family == AF_INET6 ? sockaddr_len = (socklen_t)(url->hostport.IPaddress.ss_family == AF_INET6 ?
sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in));
@@ -236,7 +236,7 @@ SOCKET http_Connect(
#endif #endif
shutdown(connfd, SD_BOTH); shutdown(connfd, SD_BOTH);
UpnpCloseSocket(connfd); UpnpCloseSocket(connfd);
return UPNP_E_SOCKET_CONNECT; return (SOCKET)(UPNP_E_SOCKET_CONNECT);
} }
return connfd; return connfd;
@@ -493,7 +493,8 @@ Cleanup_File:
num_written = (size_t)nw; num_written = (size_t)nw;
UpnpPrintf(UPNP_INFO, HTTP, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n" ">>> (SENT) >>>\n"
"%.*s\nbuf_length=%zd, num_written=%zd\n""------------\n", "%.*s\nbuf_length=%" PRIzd ", num_written=%" PRIzd "\n"
"------------\n",
(int)buf_length, buf, buf_length, num_written); (int)buf_length, buf, buf_length, num_written);
if (num_written != buf_length) { if (num_written != buf_length) {
RetVal = 0; RetVal = 0;
@@ -548,7 +549,7 @@ int http_RequestAndResponse(
tcp_connection = socket( tcp_connection = socket(
destination->hostport.IPaddress.ss_family, SOCK_STREAM, 0); destination->hostport.IPaddress.ss_family, SOCK_STREAM, 0);
if (tcp_connection == -1) { if (tcp_connection == INVALID_SOCKET) {
parser_response_init(response, req_method); parser_response_init(response, req_method);
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }
@@ -969,7 +970,7 @@ int http_OpenHttpPost(
handle->contentLength = contentLength; handle->contentLength = contentLength;
tcp_connection = socket(url.hostport.IPaddress.ss_family, tcp_connection = socket(url.hostport.IPaddress.ss_family,
SOCK_STREAM, 0); SOCK_STREAM, 0);
if (tcp_connection == -1) { if (tcp_connection == INVALID_SOCKET) {
ret_code = UPNP_E_SOCKET_ERROR; ret_code = UPNP_E_SOCKET_ERROR;
goto errorHandler; goto errorHandler;
} }
@@ -1446,7 +1447,7 @@ int http_OpenHttpGetProxy(const char *url_str, const char *proxy_str,
parser_response_init(&handle->response, HTTPMETHOD_GET); parser_response_init(&handle->response, HTTPMETHOD_GET);
tcp_connection = tcp_connection =
socket(peer->hostport.IPaddress.ss_family, SOCK_STREAM, 0); socket(peer->hostport.IPaddress.ss_family, SOCK_STREAM, 0);
if (tcp_connection == -1) { if (tcp_connection == INVALID_SOCKET) {
ret_code = UPNP_E_SOCKET_ERROR; ret_code = UPNP_E_SOCKET_ERROR;
goto errorHandler; goto errorHandler;
} }
@@ -1965,7 +1966,7 @@ int http_OpenHttpGetEx(
memset(handle, 0, sizeof(*handle)); memset(handle, 0, sizeof(*handle));
parser_response_init(&handle->response, HTTPMETHOD_GET); parser_response_init(&handle->response, HTTPMETHOD_GET);
tcp_connection = socket(url.hostport.IPaddress.ss_family, SOCK_STREAM, 0); tcp_connection = socket(url.hostport.IPaddress.ss_family, SOCK_STREAM, 0);
if (tcp_connection == -1) { if (tcp_connection == INVALID_SOCKET) {
errCode = UPNP_E_SOCKET_ERROR; errCode = UPNP_E_SOCKET_ERROR;
free(handle); free(handle);
break; break;

View File

@@ -86,12 +86,12 @@ int sock_destroy(SOCKINFO *info, int ShutdownMethod)
{ {
int ret = UPNP_E_SUCCESS; int ret = UPNP_E_SUCCESS;
if (info->socket != -1) { if (info->socket != INVALID_SOCKET) {
shutdown(info->socket, ShutdownMethod); shutdown(info->socket, ShutdownMethod);
if (sock_close(info->socket) == -1) { if (sock_close(info->socket) == -1) {
ret = UPNP_E_SOCKET_ERROR; ret = UPNP_E_SOCKET_ERROR;
} }
info->socket = -1; info->socket = INVALID_SOCKET;
} }
return ret; return ret;

View File

@@ -74,7 +74,7 @@ static UPNP_INLINE int sock_close(
{ {
int ret = -1; int ret = -1;
if (sock != -1) if (sock != INVALID_SOCKET)
ret = UpnpCloseSocket(sock); ret = UpnpCloseSocket(sock);
return ret; return ret;

View File

@@ -5,6 +5,7 @@
* *
* Copyright (c) 2000-2003 Intel Corporation * Copyright (c) 2000-2003 Intel Corporation
* All rights reserved. * All rights reserved.
* Copyright (C) 2011 France Telecom All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -353,7 +354,13 @@ int DeviceAdvertisement(
/* [in] Service duration in sec. */ /* [in] Service duration in sec. */
int Duration, int Duration,
/* [in] Device address family. */ /* [in] Device address family. */
int AddressFamily); int AddressFamily,
/* [in] PowerState as defined by UPnP Low Power. */
int PowerState,
/* [in] SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/* [in] RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/*! /*!
* \brief Creates the reply packet based on the input parameter, and send it * \brief Creates the reply packet based on the input parameter, and send it
@@ -375,7 +382,13 @@ int SendReply(
/* [in] Life time of this device. */ /* [in] Life time of this device. */
int Duration, int Duration,
/* [in] . */ /* [in] . */
int ByType ); int ByType,
/* [in] PowerState as defined by UPnP Low Power. */
int PowerState,
/* [in] SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/* [in] RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/*! /*!
* \brief Creates the reply packet based on the input parameter, and send it * \brief Creates the reply packet based on the input parameter, and send it
@@ -395,7 +408,13 @@ int DeviceReply(
/* [in] Location of Device description document. */ /* [in] Location of Device description document. */
char *Location, char *Location,
/* [in] Life time of this device. */ /* [in] Life time of this device. */
int Duration); int Duration,
/* [in] PowerState as defined by UPnP Low Power. */
int PowerState,
/* [in] SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/* [in] RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/*! /*!
* \brief Creates the advertisement packet based on the input parameter, * \brief Creates the advertisement packet based on the input parameter,
@@ -413,7 +432,13 @@ int ServiceAdvertisement(
/* [in] Life time of this device. */ /* [in] Life time of this device. */
int Duration, int Duration,
/* [in] Device address family. */ /* [in] Device address family. */
int AddressFamily); int AddressFamily,
/* [in] PowerState as defined by UPnP Low Power. */
int PowerState,
/* [in] SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/* [in] RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/*! /*!
* \brief Creates the advertisement packet based on the input parameter, * \brief Creates the advertisement packet based on the input parameter,
@@ -431,7 +456,13 @@ int ServiceReply(
/* [in] Location of Device description document. */ /* [in] Location of Device description document. */
char *Location, char *Location,
/* [in] Life time of this device. */ /* [in] Life time of this device. */
int Duration); int Duration,
/* [in] PowerState as defined by UPnP Low Power. */
int PowerState,
/* [in] SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/* [in] RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/*! /*!
* \brief Creates a HTTP service shutdown request packet and sends it to the * \brief Creates a HTTP service shutdown request packet and sends it to the
@@ -449,7 +480,13 @@ int ServiceShutdown(
/* [in] Service duration in sec. */ /* [in] Service duration in sec. */
int Duration, int Duration,
/* [in] Device address family. */ /* [in] Device address family. */
int AddressFamily); int AddressFamily,
/* [in] PowerState as defined by UPnP Low Power. */
int PowerState,
/* [in] SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/* [in] RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/*! /*!
* \brief Creates a HTTP device shutdown request packet and send it to the * \brief Creates a HTTP device shutdown request packet and send it to the
@@ -471,7 +508,13 @@ int DeviceShutdown(
/* [in] Device duration in sec. */ /* [in] Device duration in sec. */
int Duration, int Duration,
/* [in] Device address family. */ /* [in] Device address family. */
int AddressFamily); int AddressFamily,
/* [in] PowerState as defined by UPnP Low Power. */
int PowerState,
/* [in] SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/* [in] RegistrationState as defined by UPnP Low Power. */
int RegistrationState);
/* @} SSDP Device Functions */ /* @} SSDP Device Functions */

View File

@@ -2,6 +2,7 @@
* *
* Copyright (c) 2000-2003 Intel Corporation * Copyright (c) 2000-2003 Intel Corporation
* All rights reserved. * All rights reserved.
* Copyright (C) 2011 France Telecom All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -87,6 +88,12 @@ struct Handle_Info
char DescXML[LINE_SIZE]; char DescXML[LINE_SIZE];
/* Advertisement timeout */ /* Advertisement timeout */
int MaxAge; int MaxAge;
/* Power State as defined by UPnP Low Power. */
int PowerState;
/* Sleep Period as defined by UPnP Low Power. */
int SleepPeriod;
/* Registration State as defined by UPnP Low Power. */
int RegistrationState;
/*! Description parsed in terms of DOM document. */ /*! Description parsed in terms of DOM document. */
IXML_Document *DescDocument; IXML_Document *DescDocument;
/*! List of devices in the description document. */ /*! List of devices in the description document. */

View File

@@ -112,7 +112,8 @@ void linecopylen(
#define ERROR_BUFFER_LEN 256 #define ERROR_BUFFER_LEN 256
/* C specific */ /* C specific */
#ifndef __cplusplus /* VC needs these in C++ mode too (do other compilers?) */
#if !defined(__cplusplus) || defined(UPNP_USE_MSVCPP)
#ifdef WIN32 #ifdef WIN32
#ifndef S_ISREG #ifndef S_ISREG
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
@@ -130,7 +131,7 @@ void linecopylen(
#define max(a, b) (((a)>(b))? (a):(b)) #define max(a, b) (((a)>(b))? (a):(b))
#define min(a, b) (((a)<(b))? (a):(b)) #define min(a, b) (((a)<(b))? (a):(b))
#endif /* WIN32 */ #endif /* WIN32 */
#endif /* __cplusplus */ #endif /* !defined(__cplusplus) || defined(UPNP_USE_MSVCPP) */
#endif /* UTIL_H */ #endif /* UTIL_H */

View File

@@ -52,7 +52,10 @@
#include <time.h> #include <time.h>
#ifdef WIN32 #ifdef WIN32
#include "inet_pton.h" #ifndef UPNP_USE_MSVCPP
/* VC Winsocks2 includes these functions */
#include "inet_pton.h"
#endif
#else #else
#include <netdb.h> /* for struct addrinfo */ #include <netdb.h> /* for struct addrinfo */
#endif #endif

View File

@@ -379,7 +379,7 @@ get_response_value( IN http_message_t * hmsg,
char *node_str = NULL; char *node_str = NULL;
const char *temp_str = NULL; const char *temp_str = NULL;
DOMString error_node_str = NULL; DOMString error_node_str = NULL;
int err_code = UPNP_E_BAD_RESPONSE; /* default error */ ; int err_code = UPNP_E_BAD_RESPONSE; /* default error */
int done = FALSE; int done = FALSE;
const char *names[5]; const char *names[5];
const DOMString nodeValue; const DOMString nodeValue;

View File

@@ -441,7 +441,7 @@ int SearchByTarget(int Mx, char *St, void *Cookie)
struct Handle_Info *ctrlpt_info = NULL; struct Handle_Info *ctrlpt_info = NULL;
enum SsdpSearchType requestType; enum SsdpSearchType requestType;
unsigned long addrv4 = inet_addr(gIF_IPV4); unsigned long addrv4 = inet_addr(gIF_IPV4);
int max_fd = 0; SOCKET max_fd = 0;
/*ThreadData *ThData; */ /*ThreadData *ThData; */
ThreadPoolJob job; ThreadPoolJob job;

View File

@@ -2,6 +2,7 @@
* *
* Copyright (c) 2000-2003 Intel Corporation * Copyright (c) 2000-2003 Intel Corporation
* All rights reserved. * All rights reserved.
* Copyright (C) 2011 France Telecom All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -181,7 +182,7 @@ static int NewRequestHandler(
int ret = UPNP_E_SUCCESS; int ret = UPNP_E_SUCCESS;
ReplySock = socket(DestAddr->sa_family, SOCK_DGRAM, 0); ReplySock = socket(DestAddr->sa_family, SOCK_DGRAM, 0);
if (ReplySock == -1) { if (ReplySock == INVALID_SOCKET) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB: New Request Handler:" "SSDP_LIB: New Request Handler:"
@@ -313,7 +314,13 @@ static void CreateServicePacket(
/*! [out] Output buffer filled with HTTP statement. */ /*! [out] Output buffer filled with HTTP statement. */
char **packet, char **packet,
/*! [in] Address family of the HTTP request. */ /*! [in] Address family of the HTTP request. */
int AddressFamily) int AddressFamily,
/*! [in] PowerState as defined by UPnP Low Power. */
int PowerState,
/*! [in] SleepPeriod as defined by UPnP Low Power. */
int SleepPeriod,
/*! [in] RegistrationState as defined by UPnP Low Power. */
int RegistrationState)
{ {
int ret_code; int ret_code;
const char *nts; const char *nts;
@@ -326,7 +333,23 @@ static void CreateServicePacket(
buf.size_inc = 30; buf.size_inc = 30;
*packet = NULL; *packet = NULL;
if (msg_type == MSGTYPE_REPLY) { if (msg_type == MSGTYPE_REPLY) {
ret_code = http_MakeMessage(&buf, 1, 1, if (PowerState > 0) {
ret_code = http_MakeMessage(&buf, 1, 1,
"R" "sdc" "D" "sc" "ssc" "ssc" "ssc"
"S" "Xc" "ssc" "ssc"
"sdc" "sdc" "sdcc", HTTP_OK,
"CACHE-CONTROL: max-age=", duration,
"EXT:", "LOCATION: ", location,
"OPT: ",
"\"http://schemas.upnp.org/upnp/1/0/\"; ns=01",
"01-NLS: ", gUpnpSdkNLSuuid,
X_USER_AGENT, "ST: ", nt, "USN: ",
usn, "Powerstate: ", PowerState,
"SleepPeriod: ", SleepPeriod,
"RegistrationState: ",
RegistrationState);
} else {
ret_code = http_MakeMessage(&buf, 1, 1,
"R" "sdc" "D" "sc" "ssc" "ssc" "ssc" "R" "sdc" "D" "sc" "ssc" "ssc" "ssc"
"S" "Xc" "ssc" "sscc", HTTP_OK, "S" "Xc" "ssc" "sscc", HTTP_OK,
"CACHE-CONTROL: max-age=", duration, "CACHE-CONTROL: max-age=", duration,
@@ -336,6 +359,7 @@ static void CreateServicePacket(
"01-NLS: ", gUpnpSdkNLSuuid, "01-NLS: ", gUpnpSdkNLSuuid,
X_USER_AGENT, "ST: ", nt, "USN: ", X_USER_AGENT, "ST: ", nt, "USN: ",
usn); usn);
}
if (ret_code != 0) { if (ret_code != 0) {
return; return;
} }
@@ -358,7 +382,24 @@ static void CreateServicePacket(
else else
host = "[" SSDP_IPV6_LINKLOCAL "]"; host = "[" SSDP_IPV6_LINKLOCAL "]";
} }
ret_code = http_MakeMessage(&buf, 1, 1, if (PowerState > 0) {
ret_code = http_MakeMessage(&buf, 1, 1,
"Q" "sssdc" "sdc" "ssc" "ssc" "ssc"
"ssc" "ssc" "S" "Xc" "ssc"
"sdc" "sdc" "sdcc",
HTTPMETHOD_NOTIFY, "*", (size_t) 1,
"HOST: ", host, ":", SSDP_PORT,
"CACHE-CONTROL: max-age=", duration,
"LOCATION: ", location, "OPT: ",
"\"http://schemas.upnp.org/upnp/1/0/\"; ns=01",
"01-NLS: ", gUpnpSdkNLSuuid, "NT: ",
nt, "NTS: ", nts, X_USER_AGENT,
"USN: ", usn, "Powerstate: ",
PowerState, "SleepPeriod: ",
SleepPeriod, "RegistrationState: ",
RegistrationState);
} else {
ret_code = http_MakeMessage(&buf, 1, 1,
"Q" "sssdc" "sdc" "ssc" "ssc" "ssc" "Q" "sssdc" "sdc" "ssc" "ssc" "ssc"
"ssc" "ssc" "S" "Xc" "sscc", "ssc" "ssc" "S" "Xc" "sscc",
HTTPMETHOD_NOTIFY, "*", (size_t) 1, HTTPMETHOD_NOTIFY, "*", (size_t) 1,
@@ -369,6 +410,7 @@ static void CreateServicePacket(
"01-NLS: ", gUpnpSdkNLSuuid, "NT: ", "01-NLS: ", gUpnpSdkNLSuuid, "NT: ",
nt, "NTS: ", nts, X_USER_AGENT, nt, "NTS: ", nts, X_USER_AGENT,
"USN: ", usn); "USN: ", usn);
}
if (ret_code) if (ret_code)
return; return;
} else } else
@@ -382,7 +424,8 @@ static void CreateServicePacket(
} }
int DeviceAdvertisement(char *DevType, int RootDev, char *Udn, char *Location, int DeviceAdvertisement(char *DevType, int RootDev, char *Udn, char *Location,
int Duration, int AddressFamily) int Duration, int AddressFamily, int PowerState,
int SleepPeriod, int RegistrationState)
{ {
struct sockaddr_storage __ss; struct sockaddr_storage __ss;
struct sockaddr_in *DestAddr4 = (struct sockaddr_in *)&__ss; struct sockaddr_in *DestAddr4 = (struct sockaddr_in *)&__ss;
@@ -419,14 +462,17 @@ int DeviceAdvertisement(char *DevType, int RootDev, char *Udn, char *Location,
sprintf(Mil_Usn, "%s::upnp:rootdevice", Udn); sprintf(Mil_Usn, "%s::upnp:rootdevice", Udn);
CreateServicePacket(MSGTYPE_ADVERTISEMENT, "upnp:rootdevice", CreateServicePacket(MSGTYPE_ADVERTISEMENT, "upnp:rootdevice",
Mil_Usn, Location, Duration, &msgs[0], Mil_Usn, Location, Duration, &msgs[0],
AddressFamily); AddressFamily, PowerState, SleepPeriod,
RegistrationState);
} }
/* both root and sub-devices need to send these two messages */ /* both root and sub-devices need to send these two messages */
CreateServicePacket(MSGTYPE_ADVERTISEMENT, Udn, Udn, CreateServicePacket(MSGTYPE_ADVERTISEMENT, Udn, Udn,
Location, Duration, &msgs[1], AddressFamily); Location, Duration, &msgs[1], AddressFamily,
PowerState, SleepPeriod, RegistrationState);
sprintf(Mil_Usn, "%s::%s", Udn, DevType); sprintf(Mil_Usn, "%s::%s", Udn, DevType);
CreateServicePacket(MSGTYPE_ADVERTISEMENT, DevType, Mil_Usn, CreateServicePacket(MSGTYPE_ADVERTISEMENT, DevType, Mil_Usn,
Location, Duration, &msgs[2], AddressFamily); Location, Duration, &msgs[2], AddressFamily,
PowerState, SleepPeriod, RegistrationState);
/* check error */ /* check error */
if ((RootDev && msgs[0] == NULL) || msgs[1] == NULL || msgs[2] == NULL) { if ((RootDev && msgs[0] == NULL) || msgs[1] == NULL || msgs[2] == NULL) {
free(msgs[0]); free(msgs[0]);
@@ -454,7 +500,8 @@ int DeviceAdvertisement(char *DevType, int RootDev, char *Udn, char *Location,
} }
int SendReply(struct sockaddr *DestAddr, char *DevType, int RootDev, int SendReply(struct sockaddr *DestAddr, char *DevType, int RootDev,
char *Udn, char *Location, int Duration, int ByType) char *Udn, char *Location, int Duration, int ByType,
int PowerState, int SleepPeriod, int RegistrationState)
{ {
int ret_code; int ret_code;
char *msgs[2]; char *msgs[2];
@@ -471,7 +518,8 @@ int SendReply(struct sockaddr *DestAddr, char *DevType, int RootDev,
sprintf(Mil_Usn, "%s::upnp:rootdevice", Udn); sprintf(Mil_Usn, "%s::upnp:rootdevice", Udn);
CreateServicePacket(MSGTYPE_REPLY, "upnp:rootdevice", CreateServicePacket(MSGTYPE_REPLY, "upnp:rootdevice",
Mil_Usn, Location, Duration, &msgs[0], Mil_Usn, Location, Duration, &msgs[0],
DestAddr->sa_family); DestAddr->sa_family, PowerState,
SleepPeriod, RegistrationState);
} else { } else {
/* two msgs for embedded devices */ /* two msgs for embedded devices */
num_msgs = 1; num_msgs = 1;
@@ -480,12 +528,14 @@ int SendReply(struct sockaddr *DestAddr, char *DevType, int RootDev,
if (!ByType) { if (!ByType) {
CreateServicePacket(MSGTYPE_REPLY, Udn, Udn, Location, CreateServicePacket(MSGTYPE_REPLY, Udn, Udn, Location,
Duration, &msgs[0], Duration, &msgs[0],
DestAddr->sa_family); DestAddr->sa_family, PowerState,
SleepPeriod, RegistrationState);
} else { } else {
sprintf(Mil_Usn, "%s::%s", Udn, DevType); sprintf(Mil_Usn, "%s::%s", Udn, DevType);
CreateServicePacket(MSGTYPE_REPLY, DevType, Mil_Usn, CreateServicePacket(MSGTYPE_REPLY, DevType, Mil_Usn,
Location, Duration, &msgs[0], Location, Duration, &msgs[0],
DestAddr->sa_family); DestAddr->sa_family, PowerState,
SleepPeriod, RegistrationState);
} }
} }
/* check error */ /* check error */
@@ -506,7 +556,8 @@ int SendReply(struct sockaddr *DestAddr, char *DevType, int RootDev,
} }
int DeviceReply(struct sockaddr *DestAddr, char *DevType, int RootDev, int DeviceReply(struct sockaddr *DestAddr, char *DevType, int RootDev,
char *Udn, char *Location, int Duration) char *Udn, char *Location, int Duration, int PowerState,
int SleepPeriod, int RegistrationState)
{ {
char *szReq[3], Mil_Nt[LINE_SIZE], Mil_Usn[LINE_SIZE]; char *szReq[3], Mil_Nt[LINE_SIZE], Mil_Usn[LINE_SIZE];
int RetVal; int RetVal;
@@ -521,16 +572,19 @@ int DeviceReply(struct sockaddr *DestAddr, char *DevType, int RootDev,
sprintf(Mil_Usn, "%s::upnp:rootdevice", Udn); sprintf(Mil_Usn, "%s::upnp:rootdevice", Udn);
CreateServicePacket(MSGTYPE_REPLY, Mil_Nt, Mil_Usn, CreateServicePacket(MSGTYPE_REPLY, Mil_Nt, Mil_Usn,
Location, Duration, &szReq[0], Location, Duration, &szReq[0],
DestAddr->sa_family); DestAddr->sa_family, PowerState,
SleepPeriod, RegistrationState);
} }
sprintf(Mil_Nt, "%s", Udn); sprintf(Mil_Nt, "%s", Udn);
sprintf(Mil_Usn, "%s", Udn); sprintf(Mil_Usn, "%s", Udn);
CreateServicePacket(MSGTYPE_REPLY, Mil_Nt, Mil_Usn, CreateServicePacket(MSGTYPE_REPLY, Mil_Nt, Mil_Usn,
Location, Duration, &szReq[1], DestAddr->sa_family); Location, Duration, &szReq[1], DestAddr->sa_family,
PowerState, SleepPeriod, RegistrationState);
sprintf(Mil_Nt, "%s", DevType); sprintf(Mil_Nt, "%s", DevType);
sprintf(Mil_Usn, "%s::%s", Udn, DevType); sprintf(Mil_Usn, "%s::%s", Udn, DevType);
CreateServicePacket(MSGTYPE_REPLY, Mil_Nt, Mil_Usn, CreateServicePacket(MSGTYPE_REPLY, Mil_Nt, Mil_Usn,
Location, Duration, &szReq[2], DestAddr->sa_family); Location, Duration, &szReq[2], DestAddr->sa_family,
PowerState, SleepPeriod, RegistrationState);
/* check error */ /* check error */
if ((RootDev && szReq[0] == NULL) || if ((RootDev && szReq[0] == NULL) ||
szReq[1] == NULL || szReq[2] == NULL) { szReq[1] == NULL || szReq[2] == NULL) {
@@ -554,7 +608,8 @@ int DeviceReply(struct sockaddr *DestAddr, char *DevType, int RootDev,
} }
int ServiceAdvertisement(char *Udn, char *ServType, char *Location, int ServiceAdvertisement(char *Udn, char *ServType, char *Location,
int Duration, int AddressFamily) int Duration, int AddressFamily, int PowerState,
int SleepPeriod, int RegistrationState)
{ {
char Mil_Usn[LINE_SIZE]; char Mil_Usn[LINE_SIZE];
char *szReq[1]; char *szReq[1];
@@ -583,7 +638,8 @@ int ServiceAdvertisement(char *Udn, char *ServType, char *Location,
/* CreateServiceRequestPacket(1,szReq[0],Mil_Nt,Mil_Usn, /* CreateServiceRequestPacket(1,szReq[0],Mil_Nt,Mil_Usn,
* Server,Location,Duration); */ * Server,Location,Duration); */
CreateServicePacket(MSGTYPE_ADVERTISEMENT, ServType, Mil_Usn, CreateServicePacket(MSGTYPE_ADVERTISEMENT, ServType, Mil_Usn,
Location, Duration, &szReq[0], AddressFamily); Location, Duration, &szReq[0], AddressFamily,
PowerState, SleepPeriod, RegistrationState);
if (szReq[0] == NULL) { if (szReq[0] == NULL) {
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
} }
@@ -594,7 +650,8 @@ int ServiceAdvertisement(char *Udn, char *ServType, char *Location,
} }
int ServiceReply(struct sockaddr *DestAddr, char *ServType, char *Udn, int ServiceReply(struct sockaddr *DestAddr, char *ServType, char *Udn,
char *Location, int Duration) char *Location, int Duration, int PowerState, int SleepPeriod,
int RegistrationState)
{ {
char Mil_Usn[LINE_SIZE]; char Mil_Usn[LINE_SIZE];
char *szReq[1]; char *szReq[1];
@@ -603,7 +660,8 @@ int ServiceReply(struct sockaddr *DestAddr, char *ServType, char *Udn,
szReq[0] = NULL; szReq[0] = NULL;
sprintf(Mil_Usn, "%s::%s", Udn, ServType); sprintf(Mil_Usn, "%s::%s", Udn, ServType);
CreateServicePacket(MSGTYPE_REPLY, ServType, Mil_Usn, CreateServicePacket(MSGTYPE_REPLY, ServType, Mil_Usn,
Location, Duration, &szReq[0], DestAddr->sa_family); Location, Duration, &szReq[0], DestAddr->sa_family,
PowerState, SleepPeriod, RegistrationState);
if (szReq[0] == NULL) if (szReq[0] == NULL)
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
RetVal = NewRequestHandler(DestAddr, 1, szReq); RetVal = NewRequestHandler(DestAddr, 1, szReq);
@@ -613,7 +671,8 @@ int ServiceReply(struct sockaddr *DestAddr, char *ServType, char *Udn,
} }
int ServiceShutdown(char *Udn, char *ServType, char *Location, int Duration, int ServiceShutdown(char *Udn, char *ServType, char *Location, int Duration,
int AddressFamily) int AddressFamily, int PowerState, int SleepPeriod,
int RegistrationState)
{ {
char Mil_Usn[LINE_SIZE]; char Mil_Usn[LINE_SIZE];
char *szReq[1]; char *szReq[1];
@@ -643,7 +702,8 @@ int ServiceShutdown(char *Udn, char *ServType, char *Location, int Duration,
/* CreateServiceRequestPacket(0,szReq[0],Mil_Nt,Mil_Usn, /* CreateServiceRequestPacket(0,szReq[0],Mil_Nt,Mil_Usn,
* Server,Location,Duration); */ * Server,Location,Duration); */
CreateServicePacket(MSGTYPE_SHUTDOWN, ServType, Mil_Usn, CreateServicePacket(MSGTYPE_SHUTDOWN, ServType, Mil_Usn,
Location, Duration, &szReq[0], AddressFamily); Location, Duration, &szReq[0], AddressFamily,
PowerState, SleepPeriod, RegistrationState);
if (szReq[0] == NULL) if (szReq[0] == NULL)
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
RetVal = NewRequestHandler((struct sockaddr *)&__ss, 1, szReq); RetVal = NewRequestHandler((struct sockaddr *)&__ss, 1, szReq);
@@ -653,7 +713,8 @@ int ServiceShutdown(char *Udn, char *ServType, char *Location, int Duration,
} }
int DeviceShutdown(char *DevType, int RootDev, char *Udn, char *_Server, int DeviceShutdown(char *DevType, int RootDev, char *Udn, char *_Server,
char *Location, int Duration, int AddressFamily) char *Location, int Duration, int AddressFamily,
int PowerState, int SleepPeriod, int RegistrationState)
{ {
struct sockaddr_storage __ss; struct sockaddr_storage __ss;
struct sockaddr_in *DestAddr4 = (struct sockaddr_in *)&__ss; struct sockaddr_in *DestAddr4 = (struct sockaddr_in *)&__ss;
@@ -686,16 +747,19 @@ int DeviceShutdown(char *DevType, int RootDev, char *Udn, char *_Server,
sprintf(Mil_Usn, "%s::upnp:rootdevice", Udn); sprintf(Mil_Usn, "%s::upnp:rootdevice", Udn);
CreateServicePacket(MSGTYPE_SHUTDOWN, "upnp:rootdevice", CreateServicePacket(MSGTYPE_SHUTDOWN, "upnp:rootdevice",
Mil_Usn, Location, Duration, &msgs[0], Mil_Usn, Location, Duration, &msgs[0],
AddressFamily); AddressFamily, PowerState, SleepPeriod,
RegistrationState);
} }
UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function DeviceShutdown\n"); "In function DeviceShutdown\n");
/* both root and sub-devices need to send these two messages */ /* both root and sub-devices need to send these two messages */
CreateServicePacket(MSGTYPE_SHUTDOWN, Udn, Udn, CreateServicePacket(MSGTYPE_SHUTDOWN, Udn, Udn,
Location, Duration, &msgs[1], AddressFamily); Location, Duration, &msgs[1], AddressFamily,
PowerState, SleepPeriod, RegistrationState);
sprintf(Mil_Usn, "%s::%s", Udn, DevType); sprintf(Mil_Usn, "%s::%s", Udn, DevType);
CreateServicePacket(MSGTYPE_SHUTDOWN, DevType, Mil_Usn, CreateServicePacket(MSGTYPE_SHUTDOWN, DevType, Mil_Usn,
Location, Duration, &msgs[2], AddressFamily); Location, Duration, &msgs[2], AddressFamily,
PowerState, SleepPeriod, RegistrationState);
/* check error */ /* check error */
if ((RootDev && msgs[0] == NULL) || msgs[1] == NULL || msgs[2] == NULL) { if ((RootDev && msgs[0] == NULL) || msgs[1] == NULL || msgs[2] == NULL) {
free(msgs[0]); free(msgs[0]);

View File

@@ -2,6 +2,7 @@
* *
* Copyright (c) 2000-2003 Intel Corporation * Copyright (c) 2000-2003 Intel Corporation
* All rights reserved. * All rights reserved.
* Copyright (C) 2011 France Telecom All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -205,26 +206,37 @@ int AdvertiseAndReply(int AdFlag, UpnpDevice_Handle Hnd,
DeviceAdvertisement(devType, i == 0, DeviceAdvertisement(devType, i == 0,
UDNstr, UDNstr,
SInfo->DescURL, Exp, SInfo->DescURL, Exp,
SInfo->DeviceAf); SInfo->DeviceAf,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} else { } else {
/* AdFlag == -1 */ /* AdFlag == -1 */
DeviceShutdown(devType, i == 0, UDNstr, DeviceShutdown(devType, i == 0, UDNstr,
SERVER, SInfo->DescURL, SERVER, SInfo->DescURL,
Exp, SInfo->DeviceAf); Exp, SInfo->DeviceAf,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} }
} else { } else {
switch (SearchType) { switch (SearchType) {
case SSDP_ALL: case SSDP_ALL:
DeviceReply(DestAddr, devType, i == 0, DeviceReply(DestAddr, devType, i == 0,
UDNstr, SInfo->DescURL, UDNstr, SInfo->DescURL,
defaultExp); defaultExp, SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
break; break;
case SSDP_ROOTDEVICE: case SSDP_ROOTDEVICE:
if (i == 0) { if (i == 0) {
SendReply(DestAddr, devType, 1, SendReply(DestAddr, devType, 1,
UDNstr, UDNstr,
SInfo->DescURL, SInfo->DescURL,
defaultExp, 0); defaultExp, 0,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} }
break; break;
case SSDP_DEVICEUDN: { case SSDP_DEVICEUDN: {
@@ -238,7 +250,10 @@ int AdvertiseAndReply(int AdFlag, UpnpDevice_Handle Hnd,
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"DeviceUDN=%s and search UDN=%s MATCH\n", "DeviceUDN=%s and search UDN=%s MATCH\n",
UDNstr, DeviceUDN); UDNstr, DeviceUDN);
SendReply(DestAddr, devType, 0, UDNstr, SInfo->DescURL, defaultExp, 0); SendReply(DestAddr, devType, 0, UDNstr, SInfo->DescURL, defaultExp, 0,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
break; break;
} }
} }
@@ -254,14 +269,20 @@ int AdvertiseAndReply(int AdFlag, UpnpDevice_Handle Hnd,
"DeviceType=%s and search devType=%s MATCH\n", "DeviceType=%s and search devType=%s MATCH\n",
devType, DeviceType); devType, DeviceType);
SendReply(DestAddr, DeviceType, 0, UDNstr, SInfo->LowerDescURL, SendReply(DestAddr, DeviceType, 0, UDNstr, SInfo->LowerDescURL,
defaultExp, 1); defaultExp, 1,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} else if (atoi(strrchr(DeviceType, ':') + 1) } else if (atoi(strrchr(DeviceType, ':') + 1)
== atoi(&devType[strlen(devType) - 1])) { == atoi(&devType[strlen(devType) - 1])) {
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"DeviceType=%s and search devType=%s MATCH\n", "DeviceType=%s and search devType=%s MATCH\n",
devType, DeviceType); devType, DeviceType);
SendReply(DestAddr, DeviceType, 0, UDNstr, SInfo->DescURL, SendReply(DestAddr, DeviceType, 0, UDNstr, SInfo->DescURL,
defaultExp, 1); defaultExp, 1,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} else { } else {
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"DeviceType=%s and search devType=%s DID NOT MATCH\n", "DeviceType=%s and search devType=%s DID NOT MATCH\n",
@@ -337,12 +358,18 @@ int AdvertiseAndReply(int AdFlag, UpnpDevice_Handle Hnd,
if (AdFlag == 1) { if (AdFlag == 1) {
ServiceAdvertisement(UDNstr, ServiceAdvertisement(UDNstr,
servType, SInfo->DescURL, servType, SInfo->DescURL,
Exp, SInfo->DeviceAf); Exp, SInfo->DeviceAf,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} else { } else {
/* AdFlag == -1 */ /* AdFlag == -1 */
ServiceShutdown(UDNstr, ServiceShutdown(UDNstr,
servType, SInfo->DescURL, servType, SInfo->DescURL,
Exp, SInfo->DeviceAf); Exp, SInfo->DeviceAf,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} }
} else { } else {
switch (SearchType) { switch (SearchType) {
@@ -350,7 +377,10 @@ int AdvertiseAndReply(int AdFlag, UpnpDevice_Handle Hnd,
ServiceReply(DestAddr, servType, ServiceReply(DestAddr, servType,
UDNstr, UDNstr,
SInfo->DescURL, SInfo->DescURL,
defaultExp); defaultExp,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
break; break;
case SSDP_SERVICE: case SSDP_SERVICE:
if (ServiceType) { if (ServiceType) {
@@ -364,14 +394,20 @@ int AdvertiseAndReply(int AdFlag, UpnpDevice_Handle Hnd,
"ServiceType=%s and search servType=%s MATCH\n", "ServiceType=%s and search servType=%s MATCH\n",
ServiceType, servType); ServiceType, servType);
SendReply(DestAddr, ServiceType, 0, UDNstr, SInfo->LowerDescURL, SendReply(DestAddr, ServiceType, 0, UDNstr, SInfo->LowerDescURL,
defaultExp, 1); defaultExp, 1,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} else if (atoi(strrchr (ServiceType, ':') + 1) == } else if (atoi(strrchr (ServiceType, ':') + 1) ==
atoi(&servType[strlen(servType) - 1])) { atoi(&servType[strlen(servType) - 1])) {
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"ServiceType=%s and search servType=%s MATCH\n", "ServiceType=%s and search servType=%s MATCH\n",
ServiceType, servType); ServiceType, servType);
SendReply(DestAddr, ServiceType, 0, UDNstr, SInfo->DescURL, SendReply(DestAddr, ServiceType, 0, UDNstr, SInfo->DescURL,
defaultExp, 1); defaultExp, 1,
SInfo->PowerState,
SInfo->SleepPeriod,
SInfo->RegistrationState);
} else { } else {
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"ServiceType=%s and search servType=%s DID NOT MATCH\n", "ServiceType=%s and search servType=%s DID NOT MATCH\n",
@@ -736,7 +772,7 @@ static int create_ssdp_sock_v4(
struct in_addr addr; struct in_addr addr;
*ssdpSock = socket(AF_INET, SOCK_DGRAM, 0); *ssdpSock = socket(AF_INET, SOCK_DGRAM, 0);
if (*ssdpSock == -1) { if (*ssdpSock == INVALID_SOCKET) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__, UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in socket(): %s\n", errorBuffer); "Error in socket(): %s\n", errorBuffer);
@@ -847,7 +883,7 @@ static int create_ssdp_sock_reqv4(
u_char ttl = 4; u_char ttl = 4;
*ssdpReqSock = socket(AF_INET, SOCK_DGRAM, 0); *ssdpReqSock = socket(AF_INET, SOCK_DGRAM, 0);
if (*ssdpReqSock == -1) { if (*ssdpReqSock == INVALID_SOCKET) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__, UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in socket(): %s\n", errorBuffer); "Error in socket(): %s\n", errorBuffer);
@@ -877,7 +913,7 @@ static int create_ssdp_sock_v6(
int ret = 0; int ret = 0;
*ssdpSock = socket(AF_INET6, SOCK_DGRAM, 0); *ssdpSock = socket(AF_INET6, SOCK_DGRAM, 0);
if (*ssdpSock == -1) { if (*ssdpSock == INVALID_SOCKET) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__, UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in socket(): %s\n", errorBuffer); "Error in socket(): %s\n", errorBuffer);
@@ -978,7 +1014,7 @@ static int create_ssdp_sock_v6_ula_gua(
int ret = 0; int ret = 0;
*ssdpSock = socket(AF_INET6, SOCK_DGRAM, 0); *ssdpSock = socket(AF_INET6, SOCK_DGRAM, 0);
if (*ssdpSock == -1) { if (*ssdpSock == INVALID_SOCKET) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__, UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in socket(): %s\n", errorBuffer); "Error in socket(): %s\n", errorBuffer);
@@ -1076,7 +1112,7 @@ static int create_ssdp_sock_reqv6(
char hops = 1; char hops = 1;
*ssdpReqSock = socket(AF_INET6, SOCK_DGRAM, 0); *ssdpReqSock = socket(AF_INET6, SOCK_DGRAM, 0);
if (*ssdpReqSock == -1) { if (*ssdpReqSock == INVALID_SOCKET) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__, UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in socket(): %s\n", errorBuffer); "Error in socket(): %s\n", errorBuffer);

View File

@@ -106,7 +106,7 @@ void get_random_info(unsigned char seed[16])
GetComputerName( r.hostname, &r.l ); GetComputerName( r.hostname, &r.l );
/* MD5 it */ /* MD5 it */
MD5Init(&c); MD5Init(&c);
MD5Update(&c, &r, sizeof r); MD5Update(&c, (unsigned char *)(&r), sizeof r);
MD5Final(seed, &c); MD5Final(seed, &c);
}; };