Merge pull request 'Bugfixes 2' (#208) from bugfixes2 into master

Reviewed-on: #208
This commit was merged in pull request #208.
This commit is contained in:
2026-08-05 23:26:37 +03:00
13 changed files with 53 additions and 19 deletions
@@ -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);
+3 -3
View File
@@ -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
} }
+1 -1
View File
@@ -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,
+18 -3
View File
@@ -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 << ")!";
+1 -1
View File
@@ -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;
}; };
+1 -1
View File
@@ -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);
+1 -2
View File
@@ -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;
} }
+4 -1
View File
@@ -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);
+4 -1
View File
@@ -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);
+6
View File
@@ -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;
+7
View File
@@ -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()) {
+2 -2
View File
@@ -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;
} }
+1 -1
View File
@@ -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;