Bugfixes 2 #208
@@ -37,6 +37,7 @@ PIClientServer::Server::Server() {
|
|||||||
auto sc = client_factory();
|
auto sc = client_factory();
|
||||||
if (!sc) {
|
if (!sc) {
|
||||||
piCout << "ClientFactory returns nullptr!"_tr("PIClientServer");
|
piCout << "ClientFactory returns nullptr!"_tr("PIClientServer");
|
||||||
|
delete c;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sc->createForServer(this, c);
|
sc->createForServer(this, c);
|
||||||
|
|||||||
@@ -65,9 +65,9 @@ void PIWaitEvent::destroy() {
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
for (int i = 0; i < 2; ++i) {
|
for (int i = 0; i < 2; ++i) {
|
||||||
if (pipe_fd[i] != 0) {
|
if (pipe_fd[i] != -1) {
|
||||||
::close(pipe_fd[i]);
|
::close(pipe_fd[i]);
|
||||||
pipe_fd[i] = 0;
|
pipe_fd[i] = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -140,7 +140,7 @@ bool PIWaitEvent::isCreate() const {
|
|||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
return event;
|
return event;
|
||||||
#else
|
#else
|
||||||
return pipe_fd[ReadEnd] != 0;
|
return pipe_fd[ReadEnd] != -1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ private:
|
|||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
void * event = nullptr;
|
void * event = nullptr;
|
||||||
#else
|
#else
|
||||||
int pipe_fd[2] = {0, 0};
|
int pipe_fd[2] = {-1, -1};
|
||||||
fd_set fds[3];
|
fd_set fds[3];
|
||||||
enum {
|
enum {
|
||||||
ReadEnd = 0,
|
ReadEnd = 0,
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
# define PIP_CAN
|
# define PIP_CAN
|
||||||
#endif
|
#endif
|
||||||
#ifdef PIP_CAN
|
#ifdef PIP_CAN
|
||||||
|
# include <fcntl.h>
|
||||||
# include <linux/can.h>
|
# include <linux/can.h>
|
||||||
# include <linux/can/raw.h>
|
# include <linux/can/raw.h>
|
||||||
# include <net/if.h>
|
# include <net/if.h>
|
||||||
@@ -49,7 +50,7 @@ PICAN::PICAN(const PIString & path, PIIODevice::DeviceMode mode): PIIODevice(pat
|
|||||||
setThreadedReadBufferSize(256);
|
setThreadedReadBufferSize(256);
|
||||||
setPath(path);
|
setPath(path);
|
||||||
can_id = 0;
|
can_id = 0;
|
||||||
sock = 0;
|
sock = -1;
|
||||||
PRIVATE->event.create();
|
PRIVATE->event.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,19 +68,25 @@ bool PICAN::openDevice() {
|
|||||||
sock = socket(PF_CAN, SOCK_RAW, CAN_RAW);
|
sock = socket(PF_CAN, SOCK_RAW, CAN_RAW);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
piCoutObj << "Error! while opening socket";
|
piCoutObj << "Error! while opening socket";
|
||||||
|
sock = -1;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
fcntl(sock, F_SETFL, fcntl(sock, F_GETFL) | O_NONBLOCK);
|
||||||
ifreq ifr;
|
ifreq ifr;
|
||||||
strcpy(ifr.ifr_name, path().dataAscii());
|
strcpy(ifr.ifr_name, path().dataAscii());
|
||||||
piCout << "PICAN try to get interface index...";
|
piCout << "PICAN try to get interface index...";
|
||||||
if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
|
if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
|
||||||
piCoutObj << "Error! while determin the interface ioctl";
|
piCoutObj << "Error! while determin the interface ioctl";
|
||||||
|
::close(sock);
|
||||||
|
sock = -1;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
tv.tv_sec = 1;
|
tv.tv_sec = 1;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, sizeof tv);
|
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, sizeof tv) < 0) {
|
||||||
|
piCoutObj << "Error! while setting socket receive timeout";
|
||||||
|
}
|
||||||
// bind socket to all CAN interface
|
// bind socket to all CAN interface
|
||||||
sockaddr_can addr;
|
sockaddr_can addr;
|
||||||
addr.can_family = AF_CAN;
|
addr.can_family = AF_CAN;
|
||||||
@@ -87,6 +94,8 @@ bool PICAN::openDevice() {
|
|||||||
piCout << "PICAN try to bind socket to interface" << ifr.ifr_ifindex;
|
piCout << "PICAN try to bind socket to interface" << ifr.ifr_ifindex;
|
||||||
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
piCoutObj << "Error! while binding socket";
|
piCoutObj << "Error! while binding socket";
|
||||||
|
::close(sock);
|
||||||
|
sock = -1;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
piCout << "PICAN Open OK!";
|
piCout << "PICAN Open OK!";
|
||||||
@@ -101,7 +110,11 @@ bool PICAN::openDevice() {
|
|||||||
bool PICAN::closeDevice() {
|
bool PICAN::closeDevice() {
|
||||||
#ifdef PIP_CAN
|
#ifdef PIP_CAN
|
||||||
interrupt();
|
interrupt();
|
||||||
if (sock > 0) ::close(sock);
|
if (sock != -1) {
|
||||||
|
::shutdown(sock, SHUT_RDWR);
|
||||||
|
::close(sock);
|
||||||
|
sock = -1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -109,6 +122,7 @@ bool PICAN::closeDevice() {
|
|||||||
|
|
||||||
ssize_t PICAN::readDevice(void * read_to, ssize_t max_size) {
|
ssize_t PICAN::readDevice(void * read_to, ssize_t max_size) {
|
||||||
#ifdef PIP_CAN
|
#ifdef PIP_CAN
|
||||||
|
if (sock == -1) return -1;
|
||||||
// piCout << "PICAN read";
|
// piCout << "PICAN read";
|
||||||
can_frame frame;
|
can_frame frame;
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
@@ -127,6 +141,7 @@ ssize_t PICAN::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
|
|
||||||
ssize_t PICAN::writeDevice(const void * data, ssize_t max_size) {
|
ssize_t PICAN::writeDevice(const void * data, ssize_t max_size) {
|
||||||
#ifdef PIP_CAN
|
#ifdef PIP_CAN
|
||||||
|
if (sock == -1) return -1;
|
||||||
// piCout << "PICAN write" << can_id << max_size;
|
// piCout << "PICAN write" << can_id << max_size;
|
||||||
if (max_size > 8) {
|
if (max_size > 8) {
|
||||||
piCoutObj << "Can't send CAN frame bigger than 8 bytes (requested " << max_size << ")!";
|
piCoutObj << "Can't send CAN frame bigger than 8 bytes (requested " << max_size << ")!";
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
PRIVATE_DECLARATION(PIP_EXPORT)
|
PRIVATE_DECLARATION(PIP_EXPORT)
|
||||||
int sock;
|
int sock = -1;
|
||||||
int can_id, readed_id;
|
int can_id, readed_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1234,7 +1234,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() {
|
|||||||
# ifdef QNX
|
# ifdef QNX
|
||||||
# ifndef BLACKBERRY
|
# 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;
|
||||||
devctl(fd, DCMD_IO_NET_GET_CONFIG, &nic, sizeof(nic), 0);
|
devctl(fd, DCMD_IO_NET_GET_CONFIG, &nic, sizeof(nic), 0);
|
||||||
::close(fd);
|
::close(fd);
|
||||||
|
|||||||
@@ -62,8 +62,7 @@ ssize_t PIIOByteArray::readDevice(void * read_to, ssize_t size) {
|
|||||||
if (ret <= 0) return -1;
|
if (ret <= 0) return -1;
|
||||||
memcpy(read_to, data_->data(pos), ret);
|
memcpy(read_to, data_->data(pos), ret);
|
||||||
// piCout << "readed" << ret;
|
// piCout << "readed" << ret;
|
||||||
pos += size;
|
pos += ret;
|
||||||
if (pos > data_->size_s()) pos = data_->size_s();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -623,7 +623,10 @@ bool PIPeer::dataRead(const uchar * readed, ssize_t size) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
cnt++;
|
cnt++;
|
||||||
if (cnt > _PIPEER_MSG_TTL || from == dp->name) return true;
|
if (cnt > _PIPEER_MSG_TTL || from == dp->name) {
|
||||||
|
eth_mutex.unlock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
sba << type << from << to << cnt << pba;
|
sba << type << from << to << cnt << pba;
|
||||||
// piCout << "translate packet" << from << "->" << to << ", ttl =" << cnt;
|
// piCout << "translate packet" << from << "->" << to << ", ttl =" << cnt;
|
||||||
sendToNeighbour(dp, sba);
|
sendToNeighbour(dp, sba);
|
||||||
|
|||||||
@@ -513,7 +513,10 @@ bool PISerial::read(void * data, int size, double timeout_ms) {
|
|||||||
all = readDevice(data, 1);
|
all = readDevice(data, 1);
|
||||||
while (all < size) {
|
while (all < size) {
|
||||||
ret = readDevice(&((uchar *)data)[all], size - all);
|
ret = readDevice(&((uchar *)data)[all], size - all);
|
||||||
if (ret > 0) all += ret;
|
if (ret > 0)
|
||||||
|
all += ret;
|
||||||
|
else
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
setOption(BlockingRead, br);
|
setOption(BlockingRead, br);
|
||||||
received(data, all);
|
received(data, all);
|
||||||
|
|||||||
@@ -131,6 +131,12 @@ bool PIFileTransfer::sendFiles(const PIVector<PFTFileInfo> & files) {
|
|||||||
|
|
||||||
void PIFileTransfer::processFile(int id, ullong start, PIByteArray & data) {
|
void PIFileTransfer::processFile(int id, ullong start, PIByteArray & data) {
|
||||||
// piCout << "processFile" << id << files_.size();
|
// piCout << "processFile" << id << files_.size();
|
||||||
|
if (id <= 0 || id > files_.size_s()) {
|
||||||
|
cur_file_string = "Error: Invalid file id " + PIString::fromNumber(id);
|
||||||
|
piCoutObj << cur_file_string;
|
||||||
|
stopReceive();
|
||||||
|
return;
|
||||||
|
}
|
||||||
PFTFileInfo fi = files_[id - 1];
|
PFTFileInfo fi = files_[id - 1];
|
||||||
bytes_file_all = fi.size;
|
bytes_file_all = fi.size;
|
||||||
bytes_file_cur = start;
|
bytes_file_cur = start;
|
||||||
|
|||||||
@@ -319,6 +319,13 @@ void PIProcess::startProc(bool detached) {
|
|||||||
auto largs = convertToCharArrays(args);
|
auto largs = convertToCharArrays(args);
|
||||||
auto lenv = convertToCharArrays(env);
|
auto lenv = convertToCharArrays(env);
|
||||||
int pid_ = fork();
|
int pid_ = fork();
|
||||||
|
if (pid_ < 0) {
|
||||||
|
piCoutObj << "\"fork\" error: " << errorString();
|
||||||
|
PRIVATE->closeAllPipes();
|
||||||
|
delete[] largs;
|
||||||
|
delete[] lenv;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!detached) PRIVATE->pid = pid_;
|
if (!detached) PRIVATE->pid = pid_;
|
||||||
if (pid_ == 0) {
|
if (pid_ == 0) {
|
||||||
if (!wd.isEmpty()) {
|
if (!wd.isEmpty()) {
|
||||||
|
|||||||
@@ -671,7 +671,7 @@ PIString & PIString::operator+=(const PIConstChars & str) {
|
|||||||
if (!str.isEmpty()) {
|
if (!str.isEmpty()) {
|
||||||
size_t os = d.size();
|
size_t os = d.size();
|
||||||
d.enlarge(str.size());
|
d.enlarge(str.size());
|
||||||
for (size_t l = 0; l < d.size(); ++l) {
|
for (size_t l = 0; l < str.size(); ++l) {
|
||||||
d[os + l] = str[l];
|
d[os + l] = str[l];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1763,7 +1763,7 @@ PIString PIString::toLowerCase() const {
|
|||||||
|
|
||||||
|
|
||||||
char PIString::toChar() const {
|
char PIString::toChar() const {
|
||||||
char v;
|
char v = 0;
|
||||||
sscanf(dataAscii(), "%c", &v);
|
sscanf(dataAscii(), "%c", &v);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ STATIC_INITIALIZER_END
|
|||||||
|
|
||||||
PRIVATE_DEFINITION_START(PIMQTT::Client)
|
PRIVATE_DEFINITION_START(PIMQTT::Client)
|
||||||
MQTTClient client = nullptr;
|
MQTTClient client = nullptr;
|
||||||
bool connected = false;
|
std::atomic<bool> connected{false};
|
||||||
|
|
||||||
PIProtectedVariable<EndpointsStorage> endpoints;
|
PIProtectedVariable<EndpointsStorage> endpoints;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user