QNX and BLACKBERRY support

UDP Multicast for QNX

git-svn-id: svn://db.shs.com.ru/pip@133 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
2015-05-21 06:17:47 +00:00
parent 7d506588e6
commit 0ab3bb388f
12 changed files with 89 additions and 20 deletions

View File

@@ -27,7 +27,9 @@
char * __syslocname__ = 0; char * __syslocname__ = 0;
char * __sysoemname__ = 0; char * __sysoemname__ = 0;
#endif #endif
#ifdef BLACKBERRY
# include <ctype.h>
#endif
/*! \class PIChar /*! \class PIChar
* \brief Unicode char * \brief Unicode char

View File

@@ -31,7 +31,11 @@
# include <pwd.h> # include <pwd.h>
# include <sys/utsname.h> # include <sys/utsname.h>
# include <pthread.h> # include <pthread.h>
# include <csignal> # ifdef BLACKBERRY
# include <signal.h>
# else
# include <csignal>
# endif
#endif #endif
#ifdef MAC_OS #ifdef MAC_OS
# include <mach/mach_traps.h> # include <mach/mach_traps.h>

View File

@@ -25,6 +25,9 @@
#include <ctime> #include <ctime>
#include "pistring.h" #include "pistring.h"
#ifdef QNX
# include <time.h>
#endif
#ifdef DOXYGEN #ifdef DOXYGEN
//! \brief Sleep for "msecs" milliseconds //! \brief Sleep for "msecs" milliseconds

View File

@@ -267,7 +267,7 @@ PIVector<PIFile::FileInfo> PIDir::entries() {
const_cast<char*>(p.data()), 0 const_cast<char*>(p.data()), 0
# endif # endif
, 0, , 0,
# if defined(MAC_OS) || defined(ANDROID) # if defined(MAC_OS) || defined(ANDROID) || defined(BLACKBERRY)
alphasort); alphasort);
# else # else
versionsort); versionsort);

View File

@@ -23,7 +23,11 @@
#ifdef QNX #ifdef QNX
# include <net/if_dl.h> # include <net/if_dl.h>
# include <hw/nicinfo.h> # include <hw/nicinfo.h>
# include <sys/dcmd_io-net.h> # ifdef BLACKBERRY
# include <netinet/in.h>
# else
# include <sys/dcmd_io-net.h>
# endif
#endif #endif
#ifdef WINDOWS #ifdef WINDOWS
# include <io.h> # include <io.h>
@@ -333,11 +337,15 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) {
return true; return true;
} }
PIFlags<Parameters> params = parameters(); PIFlags<Parameters> params = parameters();
#ifndef QNX //#ifndef QNX
if (!params[Broadcast]) if (!params[Broadcast])
;//piCoutObj << "Warning: \"Broadcast\" parameter not set, \"joinMulticastGroup(\"" << group << "\")\" may be useless!"; ;//piCoutObj << "Warning: \"Broadcast\" parameter not set, \"joinMulticastGroup(\"" << group << "\")\" may be useless!";
parseAddress(path(), &ip_, &port_); parseAddress(path(), &ip_, &port_);
#ifndef QNX
struct ip_mreqn mreq; struct ip_mreqn mreq;
#else
struct ip_mreq mreq;
#endif
memset(&mreq, 0, sizeof(mreq)); memset(&mreq, 0, sizeof(mreq));
#ifdef LINUX #ifdef LINUX
//mreq.imr_address.s_addr = INADDR_ANY; //mreq.imr_address.s_addr = INADDR_ANY;
@@ -345,8 +353,13 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) {
const PIEthernet::Interface * ci = il.getByAddress(ip_); const PIEthernet::Interface * ci = il.getByAddress(ip_);
if (ci != 0) mreq.imr_ifindex = ci->index;*/ if (ci != 0) mreq.imr_ifindex = ci->index;*/
#endif #endif
#ifndef QNX
if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY; if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY;
else mreq.imr_address.s_addr = inet_addr(ip_.dataAscii()); 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 /*#ifndef WINDOWS
PIEthernet::InterfaceList il = interfaces(); PIEthernet::InterfaceList il = interfaces();
const PIEthernet::Interface * ci = il.getByAddress(ip_); 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); if (params[PIEthernet::MulticastLoop]) ethSetsockoptInt(sock, IPPROTO_IP, IP_MULTICAST_LOOP);
applyOptInt(IPPROTO_IP, IP_MULTICAST_TTL, multicastTTL()); applyOptInt(IPPROTO_IP, IP_MULTICAST_TTL, multicastTTL());
if (!mcast_groups.contains(group)) mcast_groups << group; 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; return true;
} }
@@ -374,20 +400,27 @@ bool PIEthernet::leaveMulticastGroup(const PIString & group) {
return false; return false;
} }
PIFlags<Parameters> params = parameters(); PIFlags<Parameters> params = parameters();
#ifndef QNX
/// TODO windows /// TODO windows
parseAddress(path(), &ip_, &port_); parseAddress(path(), &ip_, &port_);
#ifndef QNX
struct ip_mreqn mreq; struct ip_mreqn mreq;
#else
struct ip_mreq mreq;
#endif
memset(&mreq, 0, sizeof(mreq)); memset(&mreq, 0, sizeof(mreq));
#ifndef QNX
if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY; if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY;
else mreq.imr_address.s_addr = inet_addr(ip_.dataAscii()); 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()); mreq.imr_multiaddr.s_addr = inet_addr(group.dataAscii());
if (ethSetsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) { if (ethSetsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) {
piCoutObj << "Can`t leave multicast group " << group << ", " << ethErrorString(); piCoutObj << "Can`t leave multicast group " << group << ", " << ethErrorString();
return false; return false;
} }
mcast_groups.removeAll(group); mcast_groups.removeAll(group);
#endif
return true; return true;
} }
@@ -436,7 +469,7 @@ bool PIEthernet::listen(bool threaded) {
PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii()); PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii());
PRIVATE->addr_.sin_family = AF_INET; PRIVATE->addr_.sin_family = AF_INET;
#ifdef QNX #ifdef QNX
PRIVATE->addr_.sin_len = sizeof(*addr_); PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
#endif #endif
opened_ = false; opened_ = false;
int tries = 0; 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_addr.s_addr = inet_addr(ip_s.dataAscii());
PRIVATE->addr_.sin_family = AF_INET; PRIVATE->addr_.sin_family = AF_INET;
#ifdef QNX #ifdef QNX
PRIVATE->addr_.sin_len = sizeof(*addr_); PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
#endif #endif
//piCoutObj << "connect SingleTCP" << ip_s << ":" << port_s << "..."; //piCoutObj << "connect SingleTCP" << ip_s << ":" << port_s << "...";
if (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) != 0) { 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_addr.s_addr = inet_addr(ip_.dataAscii());
PRIVATE->addr_.sin_family = AF_INET; PRIVATE->addr_.sin_family = AF_INET;
#ifdef QNX #ifdef QNX
PRIVATE->addr_.sin_len = sizeof(*addr_); PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
#endif #endif
//piCoutObj << "connect to " << ip << ":" << port_; //piCoutObj << "connect to " << ip << ":" << port_;
connected_ = (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) == 0); 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.netmask = getSockAddr(ret->ifa_netmask);
ci.mac.clear(); ci.mac.clear();
# ifdef QNX # ifdef QNX
# ifndef BLACKBERRY
int fd = ::open((PIString("/dev/io-net/") + ci.name).dataAscii(), O_RDONLY); int fd = ::open((PIString("/dev/io-net/") + ci.name).dataAscii(), O_RDONLY);
if (fd != 0) { if (fd != 0) {
nic_config_t nic; nic_config_t nic;
@@ -879,6 +913,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() {
::close(fd); ::close(fd);
ci.mac = macFromBytes(PIByteArray(nic.permanent_address, 6)); ci.mac = macFromBytes(PIByteArray(nic.permanent_address, 6));
} }
# endif
# else # else
# ifdef MAC_OS # ifdef MAC_OS
PIString req = PISystemInfo::instance()->ifconfigPath + " " + ci.name + " | grep ether"; PIString req = PISystemInfo::instance()->ifconfigPath + " " + ci.name + " | grep ether";

View File

@@ -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_access = PIDateTime::fromSystemTime(PISystemTime(fs.st_atime, fs.st_atime_nsec));
ret.time_modification = PIDateTime::fromSystemTime(PISystemTime(fs.st_mtime, fs.st_mtime_nsec)); ret.time_modification = PIDateTime::fromSystemTime(PISystemTime(fs.st_mtime, fs.st_mtime_nsec));
#else #else
# ifdef MAC_OS # ifdef QNX
# define ATIME st_atimespec ret.time_access = PIDateTime::fromSecondSinceEpoch(fs.st_atime);
# define MTIME st_ctimespec ret.time_modification = PIDateTime::fromSecondSinceEpoch(fs.st_mtime);
# else # else
# define ATIME st_atim # ifdef MAC_OS
# define MTIME st_mtim # define ATIME st_atimespec
# endif # 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_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)); ret.time_modification = PIDateTime::fromSystemTime(PISystemTime(fs.MTIME.tv_sec, fs.MTIME.tv_nsec));
# endif
#endif #endif
ret.perm_user = FileInfo::Permissions((mode & S_IRUSR) == S_IRUSR, (mode & S_IWUSR) == S_IWUSR, (mode & S_IXUSR) == S_IXUSR); 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); ret.perm_group = FileInfo::Permissions((mode & S_IRGRP) == S_IRGRP, (mode & S_IWGRP) == S_IWGRP, (mode & S_IXGRP) == S_IXGRP);

View File

@@ -136,15 +136,18 @@ PIByteArray PICrypt::decrypt(const PIByteArray & crypt_data, PIByteArray key, bo
return ret; return ret;
} }
#include <QDebug>
PIByteArray PICrypt::hash(const PIString & secret) { PIByteArray PICrypt::hash(const PIString & secret) {
PIByteArray hash; PIByteArray hash;
qDebug() << "hash start";
#ifdef PIP_CRYPT #ifdef PIP_CRYPT
sodium_init(); sodium_init();
qDebug() << "sodium_init ok";
hash.resize(crypto_generichash_BYTES); hash.resize(crypto_generichash_BYTES);
PIByteArray s(secret.data(), secret.size()); 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); crypto_generichash(hash.data(), hash.size(), s.data(), s.size(), (const uchar*)hash_def_key, sizeof(hash_def_key) - 1);
#endif #endif
qDebug() << "hash end";
return hash; return hash;
} }

View File

@@ -32,8 +32,12 @@
# undef PIP_MATH_Y0 # undef PIP_MATH_Y0
# undef PIP_MATH_Y1 # undef PIP_MATH_Y1
# undef PIP_MATH_YN # undef PIP_MATH_YN
# include <complex.h>
# include <math.h> # include <math.h>
# ifdef BLACKBERRY
# include <complex>
# else
# include <complex.h>
# endif
#else #else
# include <complex> # include <complex>
# include <cmath> # include <cmath>

View File

@@ -30,6 +30,9 @@
#endif #endif
#if defined(__QNX__) || defined(__QNXNTO__) #if defined(__QNX__) || defined(__QNXNTO__)
# define QNX # define QNX
# ifdef Q_OS_BLACKBERRY
# define BLACKBERRY
# endif
#endif #endif
#ifdef __FreeBSD__ #ifdef __FreeBSD__
# define FREE_BSD # define FREE_BSD

View File

@@ -18,7 +18,11 @@
*/ */
#include "pisignals.h" #include "pisignals.h"
#include <csignal> #ifdef BLACKBERRY
# include <signal.h>
#else
# include <csignal>
#endif
#ifdef WINDOWS #ifdef WINDOWS
# define SIGUSR1 10 # define SIGUSR1 10
# define SIGUSR2 12 # define SIGUSR2 12

View File

@@ -24,6 +24,9 @@
#define PIMUTEX_H #define PIMUTEX_H
#include "piinit.h" #include "piinit.h"
#ifdef BLACKBERRY
# include <pthread.h>
#endif
class PIP_EXPORT PIMutex class PIP_EXPORT PIMutex
{ {

View File

@@ -28,6 +28,9 @@
#include "piinit.h" #include "piinit.h"
#include "pimutex.h" #include "pimutex.h"
#include "piobject.h" #include "piobject.h"
#ifdef BLACKBERRY
# include <pthread.h>
#endif
#ifdef WINDOWS #ifdef WINDOWS
# define __THREAD_FUNC__ uint __stdcall # define __THREAD_FUNC__ uint __stdcall
#else #else