Restart PacketSock on error

pull/14/head
Tom Early 6 years ago
parent 442a37da73
commit eeb806ffc5

@ -17,6 +17,7 @@
*/ */
#include <iostream> #include <iostream>
#include <string>
#include <thread> #include <thread>
#include <chrono> #include <chrono>
#include <unistd.h> #include <unistd.h>
@ -27,21 +28,45 @@
CUnixPacket::CUnixPacket() : m_fd(-1) {} CUnixPacket::CUnixPacket() : m_fd(-1) {}
ssize_t CUnixPacket::Read(void *data, const ssize_t size) ssize_t CUnixPacket::Read(void *buffer, const ssize_t size)
{ {
return read(m_fd, data, size); ssize_t len = read(m_fd, buffer, size);
if (len < 1) {
if (-1 == len) {
std::cerr << "Read error on '" << m_name << "': " << strerror(errno) << std::endl;
} else if (0 == len) {
std::cerr << "Read error on '" << m_name << "': EOF" << std::endl;
}
if (Restart())
return -1;
else
return 0;
}
return len;
} }
bool CUnixPacket::Write(const void *data, const ssize_t size) const bool CUnixPacket::Write(const void *buffer, const ssize_t size)
{ {
ssize_t written = write(m_fd, data, size); ssize_t written = write(m_fd, buffer, size);
if (written != size) { if (written != size) {
std::cout << "CUnixPacketServer::Write ERROR: only wrote " << written << " of " << size << " bytes" << std::endl; if (-1 == written) {
return true; std::cerr << "Write error on '" << m_name << "': " << strerror(errno) << std::endl;
} else {
std::cout << "Write error on '" << m_name << "': Only wrote " << written << " of " << size << " bytes" << std::endl;
}
return Restart();
} }
return false; return false;
} }
bool CUnixPacket::Restart()
{
std::cout << "Restarting '" << m_name << "'... " << std::endl;
Close();
std::string name(m_name);
return Open(name.c_str());
}
int CUnixPacket::GetFD() int CUnixPacket::GetFD()
{ {
return m_fd; return m_fd;
@ -58,7 +83,7 @@ bool CUnixPacketServer::Open(const char *name)
{ {
m_server = socket(AF_UNIX, SOCK_SEQPACKET, 0); m_server = socket(AF_UNIX, SOCK_SEQPACKET, 0);
if (m_server < 0) { if (m_server < 0) {
std::cerr << "Cannot open " << name << " unix server socket!" << std::endl; std::cerr << "Cannot open '" << name << "' socket: " << strerror(errno) << std::endl;
return true; return true;
} }
@ -67,23 +92,25 @@ bool CUnixPacketServer::Open(const char *name)
addr.sun_family = AF_UNIX; addr.sun_family = AF_UNIX;
memcpy(addr.sun_path+1, name, strlen(name)); memcpy(addr.sun_path+1, name, strlen(name));
if (-1 == bind(m_server, (struct sockaddr *)&addr, sizeof(addr))) { if (-1 == bind(m_server, (struct sockaddr *)&addr, sizeof(addr))) {
std::cerr << "Cannot bind unix server socket " << name << std::endl; std::cerr << "Cannot bind '" << name << "' socket: " << strerror(errno) << std::endl;
Close(); Close();
return true; return true;
} }
if (-1 == listen(m_server, 1)) { if (-1 == listen(m_server, 1)) {
std::cerr << "Cannot listen on unix server socket " << name << std::endl; std::cerr << "Cannot listen on '" << name << "' socket: " << strerror(errno) << std::endl;
Close(); Close();
return true; return true;
} }
m_fd = accept(m_server, nullptr, 0); m_fd = accept(m_server, nullptr, 0);
if (m_fd < 0) { if (m_fd < 0) {
std::cerr << "Cannot accept on unix server socket " << name << std::endl; std::cerr << "Cannot accept on '" << name << "' socket: " << strerror(errno) << std::endl;
Close(); Close();
return true; return true;
} }
strncpy(m_name, name, 108);
return false; return false;
} }
@ -126,13 +153,14 @@ bool CUnixPacketClient::Open(const char *name)
std::cout << "Waiting for " << name << " server to start..." << std::endl; std::cout << "Waiting for " << name << " server to start..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(250)); std::this_thread::sleep_for(std::chrono::milliseconds(250));
} else { } else {
std::cerr << "Cannot connect unix client socket " << name << std::endl; std::cerr << "Cannot connect '" << name << "' socket: " << strerror(errno) << std::endl;
Close(); Close();
return true; return true;
} }
} }
} }
strncpy(m_name, name, 108);
return false; return false;
} }

@ -25,11 +25,13 @@ public:
CUnixPacket(); CUnixPacket();
virtual bool Open(const char *name) = 0; virtual bool Open(const char *name) = 0;
virtual void Close() = 0; virtual void Close() = 0;
bool Write(const void *buffer, const ssize_t size) const; bool Write(const void *buffer, const ssize_t size);
ssize_t Read(void *buffer, const ssize_t size); ssize_t Read(void *buffer, const ssize_t size);
int GetFD(); int GetFD();
protected: protected:
bool Restart();
int m_fd; int m_fd;
char m_name[108];
}; };
class CUnixPacketServer : public CUnixPacket { class CUnixPacketServer : public CUnixPacket {

Loading…
Cancel
Save

Powered by TurnKey Linux.