From 0ab3bb388f5edc4dc21883142e7144338bfa2d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Thu, 21 May 2015 06:17:47 +0000 Subject: [PATCH] QNX and BLACKBERRY support UDP Multicast for QNX git-svn-id: svn://db.shs.com.ru/pip@133 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- src/core/pichar.cpp | 4 +++- src/core/piinit.cpp | 6 ++++- src/core/pitime.h | 3 +++ src/io/pidir.cpp | 2 +- src/io/piethernet.cpp | 51 +++++++++++++++++++++++++++++++++------- src/io/pifile.cpp | 17 +++++++++----- src/math/picrypt.cpp | 5 +++- src/math/pimathbase.h | 6 ++++- src/piplatform.h | 3 +++ src/system/pisignals.cpp | 6 ++++- src/thread/pimutex.h | 3 +++ src/thread/pithread.h | 3 +++ 12 files changed, 89 insertions(+), 20 deletions(-) diff --git a/src/core/pichar.cpp b/src/core/pichar.cpp index 5ae89804..da80ad72 100644 --- a/src/core/pichar.cpp +++ b/src/core/pichar.cpp @@ -27,7 +27,9 @@ char * __syslocname__ = 0; char * __sysoemname__ = 0; #endif - +#ifdef BLACKBERRY +# include +#endif /*! \class PIChar * \brief Unicode char diff --git a/src/core/piinit.cpp b/src/core/piinit.cpp index db53988a..2c13ec72 100644 --- a/src/core/piinit.cpp +++ b/src/core/piinit.cpp @@ -31,7 +31,11 @@ # include # include # include -# include +# ifdef BLACKBERRY +# include +# else +# include +# endif #endif #ifdef MAC_OS # include diff --git a/src/core/pitime.h b/src/core/pitime.h index 270a24e5..24f0ada7 100755 --- a/src/core/pitime.h +++ b/src/core/pitime.h @@ -25,6 +25,9 @@ #include #include "pistring.h" +#ifdef QNX +# include +#endif #ifdef DOXYGEN //! \brief Sleep for "msecs" milliseconds diff --git a/src/io/pidir.cpp b/src/io/pidir.cpp index 3184bd9d..990a5235 100755 --- a/src/io/pidir.cpp +++ b/src/io/pidir.cpp @@ -267,7 +267,7 @@ PIVector PIDir::entries() { const_cast(p.data()), 0 # endif , 0, -# if defined(MAC_OS) || defined(ANDROID) +# if defined(MAC_OS) || defined(ANDROID) || defined(BLACKBERRY) alphasort); # else versionsort); diff --git a/src/io/piethernet.cpp b/src/io/piethernet.cpp index 74bf3dac..5bc095a6 100755 --- a/src/io/piethernet.cpp +++ b/src/io/piethernet.cpp @@ -23,7 +23,11 @@ #ifdef QNX # include # include -# include +# ifdef BLACKBERRY +# include +# else +# include +# endif #endif #ifdef WINDOWS # include @@ -333,11 +337,15 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) { return true; } PIFlags params = parameters(); -#ifndef QNX +//#ifndef QNX if (!params[Broadcast]) ;//piCoutObj << "Warning: \"Broadcast\" parameter not set, \"joinMulticastGroup(\"" << group << "\")\" may be useless!"; parseAddress(path(), &ip_, &port_); +#ifndef QNX struct ip_mreqn mreq; +#else + struct ip_mreq mreq; +#endif memset(&mreq, 0, sizeof(mreq)); #ifdef LINUX //mreq.imr_address.s_addr = INADDR_ANY; @@ -345,8 +353,13 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) { const PIEthernet::Interface * ci = il.getByAddress(ip_); if (ci != 0) mreq.imr_ifindex = ci->index;*/ #endif +#ifndef QNX if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY; else mreq.imr_address.s_addr = inet_addr(ip_.dataAscii()); +#else + if (params[PIEthernet::Broadcast]) mreq.imr_interface.s_addr = INADDR_ANY; + else mreq.imr_interface.s_addr = inet_addr(ip_.dataAscii()); +#endif /*#ifndef WINDOWS PIEthernet::InterfaceList il = interfaces(); const PIEthernet::Interface * ci = il.getByAddress(ip_); @@ -361,7 +374,20 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) { if (params[PIEthernet::MulticastLoop]) ethSetsockoptInt(sock, IPPROTO_IP, IP_MULTICAST_LOOP); applyOptInt(IPPROTO_IP, IP_MULTICAST_TTL, multicastTTL()); if (!mcast_groups.contains(group)) mcast_groups << group; -#endif +//#else +// parseAddress(path(), &ip_, &port_); +// struct ip_mreq mreq; +// memset(&mreq, 0, sizeof(mreq)); +// mreq.imr_interface.s_addr = inet_addr(ip_.dataAscii()); +// mreq.imr_multiaddr.s_addr = inet_addr(group.dataAscii()); +// if (ethSetsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) { +// piCoutObj << "Can`t join multicast group " << group << ", " << ethErrorString(); +// return false; +// } +// if (params[PIEthernet::MulticastLoop]) ethSetsockoptInt(sock, IPPROTO_IP, IP_MULTICAST_LOOP); +// applyOptInt(IPPROTO_IP, IP_MULTICAST_TTL, multicastTTL()); +// if (!mcast_groups.contains(group)) mcast_groups << group; +//#endif return true; } @@ -374,20 +400,27 @@ bool PIEthernet::leaveMulticastGroup(const PIString & group) { return false; } PIFlags params = parameters(); -#ifndef QNX /// TODO windows parseAddress(path(), &ip_, &port_); +#ifndef QNX struct ip_mreqn mreq; +#else + struct ip_mreq mreq; +#endif memset(&mreq, 0, sizeof(mreq)); +#ifndef QNX if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY; else mreq.imr_address.s_addr = inet_addr(ip_.dataAscii()); +#else + if (params[PIEthernet::Broadcast]) mreq.imr_interface.s_addr = INADDR_ANY; + else mreq.imr_interface.s_addr = inet_addr(ip_.dataAscii()); +#endif mreq.imr_multiaddr.s_addr = inet_addr(group.dataAscii()); if (ethSetsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) { piCoutObj << "Can`t leave multicast group " << group << ", " << ethErrorString(); return false; } mcast_groups.removeAll(group); -#endif return true; } @@ -436,7 +469,7 @@ bool PIEthernet::listen(bool threaded) { PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii()); PRIVATE->addr_.sin_family = AF_INET; #ifdef QNX - PRIVATE->addr_.sin_len = sizeof(*addr_); + PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_); #endif opened_ = false; int tries = 0; @@ -577,7 +610,7 @@ int PIEthernet::write(const void * data, int max_size) { PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_s.dataAscii()); PRIVATE->addr_.sin_family = AF_INET; #ifdef QNX - PRIVATE->addr_.sin_len = sizeof(*addr_); + PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_); #endif //piCoutObj << "connect SingleTCP" << ip_s << ":" << port_s << "..."; if (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) != 0) { @@ -607,7 +640,7 @@ int PIEthernet::write(const void * data, int max_size) { PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii()); PRIVATE->addr_.sin_family = AF_INET; #ifdef QNX - PRIVATE->addr_.sin_len = sizeof(*addr_); + PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_); #endif //piCoutObj << "connect to " << ip << ":" << port_; connected_ = (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) == 0); @@ -872,6 +905,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() { ci.netmask = getSockAddr(ret->ifa_netmask); ci.mac.clear(); # ifdef QNX +# ifndef BLACKBERRY int fd = ::open((PIString("/dev/io-net/") + ci.name).dataAscii(), O_RDONLY); if (fd != 0) { nic_config_t nic; @@ -879,6 +913,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() { ::close(fd); ci.mac = macFromBytes(PIByteArray(nic.permanent_address, 6)); } +# endif # else # ifdef MAC_OS PIString req = PISystemInfo::instance()->ifconfigPath + " " + ci.name + " | grep ether"; diff --git a/src/io/pifile.cpp b/src/io/pifile.cpp index 17b8411a..8253f986 100755 --- a/src/io/pifile.cpp +++ b/src/io/pifile.cpp @@ -452,15 +452,20 @@ PIFile::FileInfo PIFile::fileInfo(const PIString & path) { ret.time_access = PIDateTime::fromSystemTime(PISystemTime(fs.st_atime, fs.st_atime_nsec)); ret.time_modification = PIDateTime::fromSystemTime(PISystemTime(fs.st_mtime, fs.st_mtime_nsec)); #else -# ifdef MAC_OS -# define ATIME st_atimespec -# define MTIME st_ctimespec +# ifdef QNX + ret.time_access = PIDateTime::fromSecondSinceEpoch(fs.st_atime); + ret.time_modification = PIDateTime::fromSecondSinceEpoch(fs.st_mtime); # else -# define ATIME st_atim -# define MTIME st_mtim -# endif +# ifdef MAC_OS +# define ATIME st_atimespec +# define MTIME st_ctimespec +# else +# define ATIME st_atim +# define MTIME st_mtim +# endif ret.time_access = PIDateTime::fromSystemTime(PISystemTime(fs.ATIME.tv_sec, fs.ATIME.tv_nsec)); ret.time_modification = PIDateTime::fromSystemTime(PISystemTime(fs.MTIME.tv_sec, fs.MTIME.tv_nsec)); +# endif #endif ret.perm_user = FileInfo::Permissions((mode & S_IRUSR) == S_IRUSR, (mode & S_IWUSR) == S_IWUSR, (mode & S_IXUSR) == S_IXUSR); ret.perm_group = FileInfo::Permissions((mode & S_IRGRP) == S_IRGRP, (mode & S_IWGRP) == S_IWGRP, (mode & S_IXGRP) == S_IXGRP); diff --git a/src/math/picrypt.cpp b/src/math/picrypt.cpp index fc8cf76b..95951238 100644 --- a/src/math/picrypt.cpp +++ b/src/math/picrypt.cpp @@ -136,15 +136,18 @@ PIByteArray PICrypt::decrypt(const PIByteArray & crypt_data, PIByteArray key, bo return ret; } - +#include PIByteArray PICrypt::hash(const PIString & secret) { PIByteArray hash; + qDebug() << "hash start"; #ifdef PIP_CRYPT sodium_init(); + qDebug() << "sodium_init ok"; hash.resize(crypto_generichash_BYTES); PIByteArray s(secret.data(), secret.size()); crypto_generichash(hash.data(), hash.size(), s.data(), s.size(), (const uchar*)hash_def_key, sizeof(hash_def_key) - 1); #endif + qDebug() << "hash end"; return hash; } diff --git a/src/math/pimathbase.h b/src/math/pimathbase.h index 96826658..203ac62f 100644 --- a/src/math/pimathbase.h +++ b/src/math/pimathbase.h @@ -32,8 +32,12 @@ # undef PIP_MATH_Y0 # undef PIP_MATH_Y1 # undef PIP_MATH_YN -# include # include +# ifdef BLACKBERRY +# include +# else +# include +# endif #else # include # include diff --git a/src/piplatform.h b/src/piplatform.h index 2e24e2f0..f570af4c 100644 --- a/src/piplatform.h +++ b/src/piplatform.h @@ -30,6 +30,9 @@ #endif #if defined(__QNX__) || defined(__QNXNTO__) # define QNX +# ifdef Q_OS_BLACKBERRY +# define BLACKBERRY +# endif #endif #ifdef __FreeBSD__ # define FREE_BSD diff --git a/src/system/pisignals.cpp b/src/system/pisignals.cpp index 6e969115..3bbe233f 100755 --- a/src/system/pisignals.cpp +++ b/src/system/pisignals.cpp @@ -18,7 +18,11 @@ */ #include "pisignals.h" -#include +#ifdef BLACKBERRY +# include +#else +# include +#endif #ifdef WINDOWS # define SIGUSR1 10 # define SIGUSR2 12 diff --git a/src/thread/pimutex.h b/src/thread/pimutex.h index f540ef3d..2d9c22cc 100755 --- a/src/thread/pimutex.h +++ b/src/thread/pimutex.h @@ -24,6 +24,9 @@ #define PIMUTEX_H #include "piinit.h" +#ifdef BLACKBERRY +# include +#endif class PIP_EXPORT PIMutex { diff --git a/src/thread/pithread.h b/src/thread/pithread.h index 8c8fd680..ed122d4b 100755 --- a/src/thread/pithread.h +++ b/src/thread/pithread.h @@ -28,6 +28,9 @@ #include "piinit.h" #include "pimutex.h" #include "piobject.h" +#ifdef BLACKBERRY +# include +#endif #ifdef WINDOWS # define __THREAD_FUNC__ uint __stdcall #else