aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/ppsocket.cc1130
-rw-r--r--lib/ppsocket.h1
-rw-r--r--lib/rfsv32.cc390
-rw-r--r--lib/rfsv32.h146
4 files changed, 796 insertions, 871 deletions
diff --git a/lib/ppsocket.cc b/lib/ppsocket.cc
index 6babcc7..9230f81 100644
--- a/lib/ppsocket.cc
+++ b/lib/ppsocket.cc
@@ -49,240 +49,236 @@
//This constructor is useful when converting a socket
//to a derived class of socket
-ppsocket::ppsocket(const ppsocket& another)
+ppsocket::ppsocket(const ppsocket & another)
{
- m_Socket = another.m_Socket;
- m_HostAddr = another.m_HostAddr;
- m_PeerAddr = another.m_PeerAddr;
- m_Bound = another.m_Bound;
- m_Timeout = another.m_Timeout;
- m_LastError = another.m_LastError;
+ m_Socket = another.m_Socket;
+ m_HostAddr = another.m_HostAddr;
+ m_PeerAddr = another.m_PeerAddr;
+ m_Bound = another.m_Bound;
+ m_Timeout = another.m_Timeout;
+ m_LastError = another.m_LastError;
- m_Timeout = INFINITE;
+ m_Timeout = INFINITE;
}
-
+
ppsocket::ppsocket()
{
- m_Socket = INVALID_SOCKET;
+ m_Socket = INVALID_SOCKET;
- memset(&m_HostAddr, 0, sizeof(m_HostAddr));
- memset(&m_PeerAddr, 0, sizeof(m_PeerAddr));
+ memset(&m_HostAddr, 0, sizeof(m_HostAddr));
+ memset(&m_PeerAddr, 0, sizeof(m_PeerAddr));
- ((struct sockaddr_in*) &m_HostAddr)->sin_family = AF_INET;
- ((struct sockaddr_in*) &m_PeerAddr)->sin_family = AF_INET;
+ ((struct sockaddr_in *) &m_HostAddr)->sin_family = AF_INET;
+ ((struct sockaddr_in *) &m_PeerAddr)->sin_family = AF_INET;
- m_Bound = false;
+ m_Bound = false;
- m_Timeout = INFINITE;
+ m_Timeout = INFINITE;
}
ppsocket::~ppsocket()
{
- if (m_Socket != INVALID_SOCKET)
- {
- close(m_Socket);
- }
+ if (m_Socket != INVALID_SOCKET) {
+ shutdown(m_Socket, 3);
+ close(m_Socket);
+ }
}
-bool ppsocket::startup(void)
-{
-#ifdef WIN32
- WSADATA wd;
- m_LastError = WSAStartup(MAKEWORD(1, 1), &wd);
+bool ppsocket::
+startup(void)
+{
+#ifdef WIN32
+ WSADATA wd;
+ m_LastError = WSAStartup(MAKEWORD(1, 1), &wd);
#else
- m_LastError = 0;
+ m_LastError = 0;
#endif
- return(m_LastError == 0 ? true : false);
+ return (m_LastError == 0 ? true : false);
}
-//pre : must be bound and peer info set
-bool ppsocket::reconnect()
+bool ppsocket::
+reconnect()
{
- printPeer();
- if (::connect(m_Socket, &m_PeerAddr, sizeof(m_PeerAddr)) != 0)
- {
- m_LastError = lastErrorCode();
- cout << "Reconnect failed : status : " << m_LastError << endl << flush;
- return(false);
- }
- return(true);
+ if (m_Socket != INVALID_SOCKET) {
+ shutdown(m_Socket, 3);
+ close(m_Socket);
+ }
+ m_Socket = INVALID_SOCKET;
+ if (!createSocket())
+ return (false);
+ m_LastError = 0;
+ m_Bound = 0;
+ if (::bind(m_Socket, &m_HostAddr, sizeof(m_HostAddr)) != 0) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ if (::connect(m_Socket, &m_PeerAddr, sizeof(m_PeerAddr)) != 0) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ return (true);
}
-void ppsocket::printPeer()
+void ppsocket::
+printPeer()
{
- char* pPeer = 0;
- int port;
+ char *pPeer = 0;
+ int port;
- pPeer = inet_ntoa(((struct sockaddr_in*) &m_PeerAddr)->sin_addr);
- if (pPeer)
- {
- port = ntohs(((struct sockaddr_in*) &m_PeerAddr)->sin_port);
- cout << "Peer : " << pPeer << " Port : " << port << endl;
- }
- else
- {
- cout << "Error getting Peer details\n";
- }
+ pPeer = inet_ntoa(((struct sockaddr_in *) &m_PeerAddr)->sin_addr);
+ if (pPeer) {
+ port = ntohs(((struct sockaddr_in *) &m_PeerAddr)->sin_port);
+ cout << "Peer : " << pPeer << " Port : " << port << endl;
+ } else
+ cerr << "Error getting Peer details\n";
}
-bool ppsocket::connect(char* Peer, int PeerPort, char* Host, int HostPort)
+bool ppsocket::
+connect(char *Peer, int PeerPort, char *Host, int HostPort)
{
- //****************************************************
- //* If we aren't already bound set the host and bind *
- //****************************************************
-
- if (!bindSocket(Host, HostPort))
- {
- if (m_LastError != 0)
- {
- return(false);
- }
- }
-
- //****************
- //* Set the peer *
- //****************
- if (!setPeer(Peer, PeerPort))
- {
- return(false);
- }
-
- //***********
- //* Connect *
- //***********
- if (::connect(m_Socket, &m_PeerAddr, sizeof(m_PeerAddr)) != 0)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
+ //****************************************************
+ //* If we aren't already bound set the host and bind *
+ //****************************************************
- return(true);
+ if (!bindSocket(Host, HostPort)) {
+ if (m_LastError != 0) {
+ return (false);
+ }
+ }
+ //****************
+ //* Set the peer *
+ //****************
+ if (!setPeer(Peer, PeerPort)) {
+ return (false);
+ }
+ //***********
+ //* Connect *
+ //***********
+ if (::connect(m_Socket, &m_PeerAddr, sizeof(m_PeerAddr)) != 0) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ return (true);
}
-bool ppsocket::listen(char* Host, int Port)
+bool ppsocket::
+listen(char *Host, int Port)
{
- //****************************************************
- //* If we aren't already bound set the host and bind *
- //****************************************************
-
- if (!bindSocket(Host, Port))
- {
- if (m_LastError != 0)
- {
- return(false);
- }
- }
-
- //**********************
- //* Listen on the port *
- //**********************
+ //****************************************************
+ //* If we aren't already bound set the host and bind *
+ //****************************************************
- if (::listen(m_Socket, 5) != 0)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
+ if (!bindSocket(Host, Port)) {
+ if (m_LastError != 0) {
+ return (false);
+ }
+ }
+ //**********************
+ //* Listen on the port *
+ //**********************
- return(true);
+ if (::listen(m_Socket, 5) != 0) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ return (true);
}
-ppsocket* ppsocket::accept(char* Peer, int MaxLen)
-{
- unsigned int len;
- ppsocket* accepted;
- char* peer;
-
- //*****************************************************
- //* Allocate a new object to hold the accepted socket *
- //*****************************************************
-
- accepted = new ppsocket;
-
- if (!accepted)
- {
- m_LastError = lastErrorCode();
- return(NULL);
- }
-
- //***********************
- //* Accept a connection *
- //***********************
-
- len = sizeof(struct sockaddr);
- fcntl(m_Socket, F_SETFL, O_NONBLOCK);
- accepted->m_Socket = ::accept(m_Socket, &accepted->m_PeerAddr, &len);
-
- if (accepted->m_Socket == INVALID_SOCKET)
- {
- m_LastError = lastErrorCode();
- delete accepted;
- return (NULL);
- }
+ppsocket *ppsocket::
+accept(char *Peer, int MaxLen)
+{
+ unsigned int len;
+ ppsocket *accepted;
+ char *peer;
- //****************************************************
- //* Got a connection so fill in the other attributes *
- //****************************************************
+ //*****************************************************
+ //* Allocate a new object to hold the accepted socket *
+ //*****************************************************
- accepted->m_HostAddr = m_HostAddr;
- accepted->m_Bound = true;
-
- //****************************************************
- //* If required get the name of the connected client *
- //****************************************************
-
- if (Peer)
- {
- peer = inet_ntoa(((struct sockaddr_in*) &accepted->m_PeerAddr)->sin_addr);
- if (peer)
- {
- strncpy(Peer, peer, MaxLen);
- Peer[MaxLen] = '\0';
- }
- }
- else
- {
- strcpy(Peer, "");
- }
+ accepted = new ppsocket;
- return(accepted);
+ if (!accepted) {
+ m_LastError = lastErrorCode();
+ return (NULL);
+ }
+ //***********************
+ //* Accept a connection *
+ //***********************
+
+ len = sizeof(struct sockaddr);
+ fcntl(m_Socket, F_SETFL, O_NONBLOCK);
+ accepted->m_Socket =::accept(m_Socket, &accepted->m_PeerAddr, &len);
+
+ if (accepted->m_Socket == INVALID_SOCKET) {
+ m_LastError = lastErrorCode();
+ delete accepted;
+ return (NULL);
+ }
+ //****************************************************
+ //* Got a connection so fill in the other attributes *
+ //****************************************************
+
+ accepted->m_HostAddr = m_HostAddr;
+ accepted->m_Bound = true;
+
+ //****************************************************
+ //* If required get the name of the connected client *
+ //****************************************************
+
+ if (Peer) {
+ peer = inet_ntoa(((struct sockaddr_in *) &accepted->m_PeerAddr)->sin_addr);
+ if (peer) {
+ strncpy(Peer, peer, MaxLen);
+ Peer[MaxLen] = '\0';
+ }
+ } else {
+ strcpy(Peer, "");
+ }
+ return (accepted);
}
-int ppsocket::printf(const char* Format, ...)
-{ int i;
-va_list ap;
-char s[512];
+int ppsocket::
+printf(const char *Format,...)
+{
+ int i;
+ va_list ap;
+ char s[512];
+
+ va_start(ap, Format);
+ vsprintf(s, Format, ap);
+ va_end(ap);
-va_start(ap, Format);
-vsprintf(s, Format, ap);
-va_end(ap);
+ i = writeTimeout(s, strlen(s), 0);
-i = writeTimeout(s, strlen(s), 0);
+ return (i);
+}
-return(i);
-}
-
-bool ppsocket::dataToGet() const {
- fd_set io;
- FD_ZERO(&io);
- FD_SET(m_Socket, &io);
- struct timeval t;
- t.tv_usec = 0;
- t.tv_sec = 0;
- return (select(m_Socket+1, &io, NULL, NULL, &t) != 0) ? true : false;
+bool ppsocket::
+dataToGet() const
+{
+ fd_set io;
+ FD_ZERO(&io);
+ FD_SET(m_Socket, &io);
+ struct timeval t;
+ t.tv_usec = 0;
+ t.tv_sec = 0;
+ return (select(m_Socket + 1, &io, NULL, NULL, &t) != 0) ? true : false;
}
-int ppsocket::getBufferStore(bufferStore &a, bool wait) {
+int ppsocket::
+getBufferStore(bufferStore & a, bool wait)
+{
/* Returns a 0 for for no message,
* 1 for message OK, and -1 for socket problem
*/
@@ -291,17 +287,18 @@ int ppsocket::getBufferStore(bufferStore &a, bool wait) {
long count = 0;
unsigned char *buff;
unsigned char *bp;
- if (!wait && !dataToGet()) return 0;
+ if (!wait && !dataToGet())
+ return 0;
a.init();
- if (readTimeout((char *)&l, sizeof(l), 0) != sizeof(l))
+ if (readTimeout((char *) &l, sizeof(l), 0) != sizeof(l))
return -1;
l = ntohl(l);
bp = buff = new unsigned char[l];
while (l > 0) {
- int j = readTimeout((char *)bp, l, 0);
+ int j = readTimeout((char *) bp, l, 0);
if (j == SOCKET_ERROR || j == 0) {
- delete [] buff;
+ delete[]buff;
return -1;
}
count += j;
@@ -309,545 +306,450 @@ int ppsocket::getBufferStore(bufferStore &a, bool wait) {
bp += j;
};
a.init(buff, count);
- delete [] buff;
-#ifdef SOCKET_DIAGNOSTICS
- cout << "ppsocket got " << a << endl;
-#endif
+ delete[]buff;
return (a.getLen() == 0) ? 0 : 1;
}
-bool ppsocket::sendBufferStore(const bufferStore &a) {
-#ifdef SOCKET_DIAGNOSTICS
- cout << "ppsocket sending " << a << endl;
-#endif
+bool ppsocket::
+sendBufferStore(const bufferStore & a)
+{
long l = a.getLen();
long hl = htonl(l);
long sent = 0;
- int retries = 0;
+ int retries = 0;
int i;
- i = writeTimeout((char *)&hl, sizeof(hl), 0);
+ i = writeTimeout((char *) &hl, sizeof(hl), 0);
if (i != sizeof(hl))
return false;
- while (l > 0) {
+ while (l > 0) {
i = writeTimeout(a.getString(sent), l, 0);
if (i == SOCKET_ERROR || i == 0)
- return(false);
+ return (false);
sent += i;
l -= i;
- if (++retries > 5) {
+ if (++retries > 5) {
m_LastError = 0;
- return(false);
+ return (false);
}
}
return true;
}
-int ppsocket::readEx(char* Data, int cTerm, int MaxLen)
-{
- int i, j;
+int ppsocket::
+readEx(char *Data, int cTerm, int MaxLen)
+{
+ int i, j;
- for (i = 0; i < MaxLen; i++)
- {
- j = readTimeout(Data + i, 1, 0);
-
- if (j == SOCKET_ERROR || j == 0)
- {
- Data[i] = '\0';
- return(i > 0 ? i : 0);
- }
+ for (i = 0; i < MaxLen; i++) {
+ j = readTimeout(Data + i, 1, 0);
- if (Data[i] == cTerm)
- break;
- }
+ if (j == SOCKET_ERROR || j == 0) {
+ Data[i] = '\0';
+ return (i > 0 ? i : 0);
+ }
+ if (Data[i] == cTerm)
+ break;
+ }
- return(i+1);
+ return (i + 1);
}
-bool ppsocket::puts(const char* Data)
-{
- int tosend, sent, retries, i;
-
- tosend = strlen(Data);
- sent = retries = 0;
-
- while (tosend > 0)
- {
- i = writeTimeout(Data + sent, tosend, 0);
-
- if (i == SOCKET_ERROR || i == 0)
- return(sent > 0 ? true : false);
-
- sent += i;
- tosend -= i;
+bool ppsocket::
+puts(const char *Data)
+{
+ int tosend, sent, retries, i;
- if (++retries > 5)
- {
- m_LastError = 0;
- return(false);
- }
- }
+ tosend = strlen(Data);
+ sent = retries = 0;
- return(true);
-}
+ while (tosend > 0) {
+ i = writeTimeout(Data + sent, tosend, 0);
+ if (i == SOCKET_ERROR || i == 0)
+ return (sent > 0 ? true : false);
+ sent += i;
+ tosend -= i;
-char ppsocket::sgetc(void)
-{
- int i;
- char c;
+ if (++retries > 5) {
+ m_LastError = 0;
+ return (false);
+ }
+ }
- i = readTimeout(&c, 1, 0);
- if (i == SOCKET_ERROR || i == 0)
- {
- return(0);
- }
- return(c);
+ return (true);
}
-bool ppsocket::sputc(char c)
-{
- int i;
- cout << hex << (int)c << endl;
-
- i = writeTimeout(&c, 1, 0);
-
- if (i == SOCKET_ERROR || i == 0)
- {
- return(false);
- }
+char ppsocket::
+sgetc(void)
+{
+ int i;
+ char c;
- return(true);
+ i = readTimeout(&c, 1, 0);
+ if (i == SOCKET_ERROR || i == 0) {
+ return (0);
+ }
+ return (c);
}
-int ppsocket::read(void* Data, size_t Size, size_t NumObj)
-{
- int i = readTimeout((char*) Data, Size*NumObj, 0);
+bool ppsocket::
+sputc(char c)
+{
+ int i;
- return(i);
+ cout << hex << (int) c << endl;
+ i = writeTimeout(&c, 1, 0);
+ if (i == SOCKET_ERROR || i == 0)
+ return (false);
+ return (true);
}
-int ppsocket::write(const void* Data, size_t Size, size_t NumObj)
-{
- int i = writeTimeout((char*) Data, Size*NumObj, 0);
-
- return(i);
-}
-
+int ppsocket::
+read(void *Data, size_t Size, size_t NumObj)
+{
+ int i = readTimeout((char *) Data, Size * NumObj, 0);
-int ppsocket::recv(char* buf, int len, int flags)
-{
- int i = ::recv(m_Socket, buf, len, flags);
-
- if (i < 0)
- m_LastError = lastErrorCode();
-
- return(i);
+ return (i);
}
-int ppsocket::send(const char* buf, int len, int flags)
-{
- int i = ::send(m_Socket, buf, len, flags);
-
- if (i < 0)
- m_LastError = lastErrorCode();
+int ppsocket::
+write(const void *Data, size_t Size, size_t NumObj)
+{
+ int i = writeTimeout((char *) Data, Size * NumObj, 0);
- return(i);
+ return (i);
}
-int ppsocket::readTimeout(char* buf, int len, int flags)
-{
- int i;
-
- //*********************************************************
- //* If there is no timeout use the Berkeley recv function *
- //*********************************************************
-
- if (m_Timeout == INFINITE)
- {
- i = ::recv(m_Socket, buf, len, flags);
-
- if (i == SOCKET_ERROR)
- {
- m_LastError = lastErrorCode();
- }
- }
-
- //********************************************
- //* If there is a timeout use overlapped i/o *
- //********************************************
-
- else
- {
- i = SOCKET_ERROR;
- }
+int ppsocket::
+recv(char *buf, int len, int flags)
+{
+ int i =::recv(m_Socket, buf, len, flags);
+ if (i < 0)
+ m_LastError = lastErrorCode();
- return(i);
+ return (i);
}
-int ppsocket::writeTimeout(const char* buf, int len, int flags)
-{
- int i;
- // If there is no timeout use the Berkeley send function
-
- if (m_Timeout == INFINITE)
- {
- i = ::send(m_Socket, buf, len, flags);
-
- if (i == SOCKET_ERROR)
- {
- m_LastError = lastErrorCode();
- }
- }
- else
- {
- // If there is a timeout use overlapped i/o
- i = SOCKET_ERROR;
- }
-
- return(i);
-}
-
-bool ppsocket::closeSocket(void)
+int ppsocket::
+send(const char *buf, int len, int flags)
{
- if (close(m_Socket) != 0)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
+ int i =::send(m_Socket, buf, len, flags);
- m_Socket = INVALID_SOCKET;
+ if (i < 0)
+ m_LastError = lastErrorCode();
- return(true);
+ return (i);
}
-bool ppsocket::bindSocket(char* Host, int Port)
+int ppsocket::
+readTimeout(char *buf, int len, int flags)
{
+ int i;
- // If we are already bound return FALSE but with no last error
-
- m_LastError = 0;
-
- if (m_Bound)
- {
- return(false);
- }
-
- // If the socket hasn't been created create it now
+ //*********************************************************
+ //* If there is no timeout use the Berkeley recv function *
+ //*********************************************************
- if (m_Socket == INVALID_SOCKET)
- {
- if (!createSocket())
- {
- return(false);
- }
- }
+ if (m_Timeout == INFINITE) {
+ i =::recv(m_Socket, buf, len, flags);
- // If a host name was supplied then use it
- if (!setHost(Host, Port))
- {
- return(false);
- }
+ if (i == SOCKET_ERROR) {
+ m_LastError = lastErrorCode();
+ }
+ }
+ //********************************************
+ //* If there is a timeout use overlapped i/o *
+ //********************************************
- // Now bind the socket
- if (::bind(m_Socket, &m_HostAddr, sizeof(m_HostAddr)) != 0)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
+ else {
+ i = SOCKET_ERROR;
+ }
- m_Bound = true;
- return(true);
+ return (i);
}
-bool ppsocket::bindInRange(char* Host, int Low, int High, int Retries)
-{
- int port, i;
-
- // If we are already bound return FALSE but with no last error
-
- m_LastError = 0;
-
- if (m_Bound)
- {
- return(false);
- }
-
- // If the socket hasn't been created create it now
+int ppsocket::
+writeTimeout(const char *buf, int len, int flags)
+{
+ int i;
+ // If there is no timeout use the Berkeley send function
- if (m_Socket == INVALID_SOCKET)
- {
- if (!createSocket())
- {
- return(false);
- }
- }
- // If the number of retries is greater than the range then work through the
- // range sequentially.
+ if (m_Timeout == INFINITE) {
+ i =::send(m_Socket, buf, len, flags);
- if (Retries > High - Low)
- {
- for (port = Low; port <= High; port++)
- {
- if (!setHost(Host, port))
- return(false);
+ if (i == SOCKET_ERROR) {
+ m_LastError = lastErrorCode();
+ }
+ } else {
+ // If there is a timeout use overlapped i/o
+ i = SOCKET_ERROR;
+ }
- if (::bind(m_Socket, &m_HostAddr, sizeof(m_HostAddr)) == 0)
- break;
- }
+ return (i);
+}
- if (port > High)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
- }
+bool ppsocket::
+closeSocket(void)
+{
+ shutdown(m_Socket, 3);
+ if (close(m_Socket) != 0) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ m_Socket = INVALID_SOCKET;
- // Else select numbers within the range at random
+ return (true);
+}
- else
- {
- for (i = 0; i < Retries; i++)
- {
- port = Low + (rand() % (High - Low));
- if (!setHost(Host, port))
- return(false);
+bool ppsocket::
+bindSocket(char *Host, int Port)
+{
- if (::bind(m_Socket, &m_HostAddr, sizeof(m_HostAddr)) == 0)
- break;
- }
+ // If we are already bound return FALSE but with no last error
- if (i >= Retries)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
- }
-
- m_Bound = true;
-
- return(true);
-}
-
-bool ppsocket::linger(bool LingerOn, int LingerTime)
-{
- int i;
- struct linger l;
-
- // If the socket hasn't been created create it now
+ m_LastError = 0;
- if (m_Socket == INVALID_SOCKET)
- {
- if (!createSocket())
- {
- return(false);
- }
- }
- // Set the lingering
+ if (m_Bound) {
+ return (false);
+ }
+ // If the socket hasn't been created create it now
- if (LingerOn)
- {
- l.l_onoff = 1;
- l.l_linger = LingerTime;
- }
- else
- {
- l.l_onoff = 0;
- l.l_linger = 0;
- }
- i = setsockopt(m_Socket, SOL_SOCKET, SO_LINGER, (const char*) &l, sizeof(l));
-
- // Check for errors
-
- if (i != 0)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
-
- // Return indicating success
-
- return(true);
-}
-
-
-bool ppsocket::createSocket(void)
-{
- // If the socket has already been created just return true
- if (m_Socket != INVALID_SOCKET)
- {
- return(true);
- }
-
- // Create the socket
- m_Socket = ::socket(PF_INET, SOCK_STREAM, 0);
-
- if (m_Socket == INVALID_SOCKET)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
-
- // By default set no lingering
-
- linger(FALSE, 0);
-
- // Return indicating success
-
- return(true);
-}
-
-bool ppsocket::setPeer(char* Peer, int Port)
-{
- struct hostent* he;
-
- // If a peer name was supplied then use it
- if (Peer)
- {
- he = gethostbyname(Peer);
- if (!he)
- {
- unsigned long ipaddress = inet_addr(Peer);
- if (ipaddress == INADDR_NONE)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
-
- he = gethostbyaddr((const char*) &ipaddress, 4, PF_INET);
- if (!he)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
- }
- memcpy((void*) &((struct sockaddr_in*) &m_PeerAddr)->sin_addr, (void*) he->h_addr_list[0], 4);
- }
+ if (m_Socket == INVALID_SOCKET) {
+ if (!createSocket()) {
+ return (false);
+ }
+ }
+ // If a host name was supplied then use it
+ if (!setHost(Host, Port)) {
+ return (false);
+ }
+ // Now bind the socket
+ if (::bind(m_Socket, &m_HostAddr, sizeof(m_HostAddr)) != 0) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ m_Bound = true;
- // If a port name was supplied use it
-
- if (Port > 0)
- {
- ((struct sockaddr_in*) &m_PeerAddr)->sin_port = htons((SHORT) Port);
- }
-
- return(true);
+ return (true);
}
-bool ppsocket::getPeer(char* Peer, int MaxLen, int* Port)
-{
- char* peer;
-
- if (Peer)
- {
- peer = inet_ntoa(((struct sockaddr_in*) &m_PeerAddr)->sin_addr);
-
- if (!peer)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
-
- strncpy(Peer, peer, MaxLen);
- Peer[MaxLen] = '\0';
- }
-
- if (Port)
- {
- *Port = ntohs(((struct sockaddr_in*) &m_PeerAddr)->sin_port);
- }
+bool ppsocket::
+bindInRange(char *Host, int Low, int High, int Retries)
+{
+ int port, i;
- return(false);
+ // If we are already bound return FALSE but with no last error
+ m_LastError = 0;
+ if (m_Bound) {
+ return (false);
+ }
+ // If the socket hasn't been created create it now
+ if (m_Socket == INVALID_SOCKET) {
+ if (!createSocket()) {
+ return (false);
+ }
+ }
+ // If the number of retries is greater than the range then work
+ // through the range sequentially.
+ if (Retries > High - Low) {
+ for (port = Low; port <= High; port++) {
+ if (!setHost(Host, port))
+ return (false);
+
+ if (::bind(m_Socket, &m_HostAddr, sizeof(m_HostAddr)) == 0)
+ break;
+ }
+ if (port > High) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ } else {
+ for (i = 0; i < Retries; i++) {
+ port = Low + (rand() % (High - Low));
+ if (!setHost(Host, port))
+ return (false);
+ if (::bind(m_Socket, &m_HostAddr, sizeof(m_HostAddr)) == 0)
+ break;
+ }
+ if (i >= Retries) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ }
+ m_Bound = true;
+ return (true);
}
+bool ppsocket::
+linger(bool LingerOn, int LingerTime)
+{
+ int i;
+ struct linger l;
-bool ppsocket::setHost(char* Host, int Port)
-{
- struct hostent* he;
+ // If the socket hasn't been created create it now
+ if (m_Socket == INVALID_SOCKET) {
+ if (!createSocket()) {
+ return (false);
+ }
+ }
+ // Set the lingering
+ if (LingerOn) {
+ l.l_onoff = 1;
+ l.l_linger = LingerTime;
+ } else {
+ l.l_onoff = 0;
+ l.l_linger = 0;
+ }
+ i = setsockopt(m_Socket, SOL_SOCKET, SO_LINGER, (const char *) &l, sizeof(l));
+ // Check for errors
+ if (i != 0) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ // Return indicating success
+ return (true);
+}
- // If a host name was supplied then use it
- if (Host)
- {
- he = gethostbyname(Host);
-
- if (!he)
- {
- unsigned long ipaddress = inet_addr(Host);
- if (ipaddress == INADDR_NONE)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
- he = gethostbyaddr((const char*) &ipaddress, 4, PF_INET);
-
- if (!he)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
- }
+bool ppsocket::
+createSocket(void)
+{
+ // If the socket has already been created just return true
+ if (m_Socket != INVALID_SOCKET)
+ return (true);
+ // Create the socket
+ m_Socket =::socket(PF_INET, SOCK_STREAM, 0);
+ if (m_Socket == INVALID_SOCKET) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ // By default set no lingering
+ linger(FALSE, 0);
+ // Return indicating success
+ return (true);
+}
- memcpy((void*) &((struct sockaddr_in*) &m_HostAddr)->sin_addr, (void*) he->h_addr_list[0], 4);
- }
+bool ppsocket::
+setPeer(char *Peer, int Port)
+{
+ struct hostent *he;
+
+ // If a peer name was supplied then use it
+ if (Peer) {
+ he = gethostbyname(Peer);
+ if (!he) {
+ unsigned long ipaddress = inet_addr(Peer);
+ if (ipaddress == INADDR_NONE) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ he = gethostbyaddr((const char *) &ipaddress, 4, PF_INET);
+ if (!he) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ }
+ memcpy((void *) &((struct sockaddr_in *) &m_PeerAddr)->sin_addr, (void *) he->h_addr_list[0], 4);
+ }
+ // If a port name was supplied use it
+ if (Port > 0)
+ ((struct sockaddr_in *) &m_PeerAddr)->sin_port = htons((SHORT) Port);
+ return (true);
+}
- // If a port name was supplied use it
+bool ppsocket::
+getPeer(char *Peer, int MaxLen, int *Port)
+{
+ char *peer;
- if (Port > 0)
- {
- ((struct sockaddr_in*) &m_HostAddr)->sin_port = htons((SHORT) Port);
- }
+ if (Peer) {
+ peer = inet_ntoa(((struct sockaddr_in *) &m_PeerAddr)->sin_addr);
+ if (!peer) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ strncpy(Peer, peer, MaxLen);
+ Peer[MaxLen] = '\0';
+ }
+ if (Port)
+ *Port = ntohs(((struct sockaddr_in *) &m_PeerAddr)->sin_port);
+ return (false);
+}
- return(true);
-}
+bool ppsocket::
+setHost(char *Host, int Port)
+{
+ struct hostent *he;
+
+ // If a host name was supplied then use it
+ if (Host) {
+ he = gethostbyname(Host);
+ if (!he) {
+ unsigned long ipaddress = inet_addr(Host);
+ if (ipaddress == INADDR_NONE) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ he = gethostbyaddr((const char *) &ipaddress, 4, PF_INET);
+ if (!he) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ }
+ memcpy((void *) &((struct sockaddr_in *) &m_HostAddr)->sin_addr, (void *) he->h_addr_list[0], 4);
+ }
+ // If a port name was supplied use it
-bool ppsocket::getHost(char* Host, int MaxLen, int* Port)
-{
- char* host;
+ if (Port > 0)
+ ((struct sockaddr_in *) &m_HostAddr)->sin_port = htons((SHORT) Port);
+ return (true);
+}
- if (Host)
- {
- host = inet_ntoa(((struct sockaddr_in*) &m_HostAddr)->sin_addr);
-
- if (!host)
- {
- m_LastError = lastErrorCode();
- return(false);
- }
- strncpy(Host, host, MaxLen);
- Host[MaxLen] = '\0';
- }
+bool ppsocket::
+getHost(char *Host, int MaxLen, int *Port)
+{
+ char *host;
- if (Port)
- {
- *Port = ntohs(((struct sockaddr_in*) &m_HostAddr)->sin_port);
- }
- return(false);
+ if (Host) {
+ host = inet_ntoa(((struct sockaddr_in *) &m_HostAddr)->sin_addr);
+ if (!host) {
+ m_LastError = lastErrorCode();
+ return (false);
+ }
+ strncpy(Host, host, MaxLen);
+ Host[MaxLen] = '\0';
+ }
+ if (Port)
+ *Port = ntohs(((struct sockaddr_in *) &m_HostAddr)->sin_port);
+ return (false);
}
-DWORD ppsocket::lastErrorCode()
+DWORD ppsocket::
+lastErrorCode()
{
- return errno;
+ return errno;
}
-void ppsocket::setSocketInvalid()
+void ppsocket::
+setSocketInvalid()
{
- m_Socket = INVALID_SOCKET;
+ m_Socket = INVALID_SOCKET;
}
diff --git a/lib/ppsocket.h b/lib/ppsocket.h
index b93ee25..2bd43f9 100644
--- a/lib/ppsocket.h
+++ b/lib/ppsocket.h
@@ -106,6 +106,7 @@ protected:
private:
SOCKET m_Socket;
struct sockaddr m_HostAddr, m_PeerAddr;
+ int m_Port;
bool m_Bound;
#ifdef WIN32
OVERLAPPED m_ReadOverlapped, m_WriteOverlapped;
diff --git a/lib/rfsv32.cc b/lib/rfsv32.cc
index 945a18e..d38ce66 100644
--- a/lib/rfsv32.cc
+++ b/lib/rfsv32.cc
@@ -38,28 +38,41 @@
rfsv32::rfsv32(ppsocket * _skt) : serNum(0)
{
skt = _skt;
- bufferStore a;
- status = DISCONNECTED;
- a.addStringT(getConnectName());
- if (skt->sendBufferStore(a)) {
- if (skt->getBufferStore(a) == 1) {
- if (strcmp(a.getString(0), "Ok"))
- cerr << "Not got ok over socket\n";
- else
- status = NONE;
- }
- }
+ reset();
}
rfsv32::~rfsv32()
{
bufferStore a;
a.addStringT("Close");
- if (status == NONE)
+ if (status == PSI_ERR_NONE)
skt->sendBufferStore(a);
skt->closeSocket();
}
+void rfsv32::
+reconnect()
+{
+ skt->closeSocket();
+ skt->reconnect();
+ serNum = 0;
+ reset();
+}
+
+void rfsv32::
+reset()
+{
+ bufferStore a;
+ status = PSI_ERR_DISCONNECTED;
+ a.addStringT(getConnectName());
+ if (skt->sendBufferStore(a)) {
+ if (skt->getBufferStore(a) == 1) {
+ if (!strcmp(a.getString(0), "Ok"))
+ status = PSI_ERR_NONE;
+ }
+ }
+}
+
long rfsv32::
getStatus()
{
@@ -88,8 +101,8 @@ fopen(long attr, const char *name, long &handle)
convertSlash(name);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(OPEN_FILE, a);
-
+ if (!sendCommand(OPEN_FILE, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (!res && a.getLen() == 4) {
handle = a.getDWord(0);
@@ -102,7 +115,8 @@ long rfsv32::
mktemp(long *handle, char *tmpname)
{
bufferStore a;
- sendCommand(TEMP_FILE, a);
+ if (!sendCommand(TEMP_FILE, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (res == 0) {
*handle = a.getDWord(0);
@@ -119,7 +133,8 @@ fcreatefile(long attr, const char *name, long &handle)
convertSlash(name);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(CREATE_FILE, a);
+ if (!sendCommand(CREATE_FILE, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (!res && a.getLen() == 4)
handle = a.getDWord(0);
@@ -134,7 +149,8 @@ freplacefile(long attr, const char *name, long &handle)
a.addDWord(attr);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(REPLACE_FILE, a);
+ if (!sendCommand(REPLACE_FILE, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (!res && a.getLen() == 4)
handle = a.getDWord(0);
@@ -149,7 +165,8 @@ fopendir(long attr, const char *name, long &handle)
a.addDWord(attr);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(OPEN_DIR, a);
+ if (!sendCommand(OPEN_DIR, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (!res && a.getLen() == 4)
handle = a.getDWord(0);
@@ -161,7 +178,8 @@ fclose(long handle)
{
bufferStore a;
a.addDWord(handle);
- sendCommand(CLOSE_HANDLE, a);
+ if (!sendCommand(CLOSE_HANDLE, a))
+ return PSI_ERR_DISCONNECTED;
return getResponse(a);
}
@@ -204,14 +222,15 @@ long rfsv32::
dir(const char *name, bufferArray * files)
{
long handle;
- long res = fopendir(HIDDEN | SYSTEM | DIRECTORY, name, handle);
+ long res = fopendir(PSI_ATTR_HIDDEN | PSI_ATTR_SYSTEM | PSI_ATTR_DIRECTORY, name, handle);
if (res != 0)
return res;
while (1) {
bufferStore a;
a.addDWord(handle);
- sendCommand(READ_DIR, a);
+ if (!sendCommand(READ_DIR, a))
+ return PSI_ERR_DISCONNECTED;
res = getResponse(a);
if (res)
break;
@@ -229,44 +248,23 @@ dir(const char *name, bufferArray * files)
long date = micro2time(modHi, modLow);
bufferStore s;
- if (!files) {
- char dateBuff[100];
- struct tm *t;
- t = localtime(&date);
- strftime(dateBuff, 100, "%c", t);
- cout << ((attributes & DIRECTORY) ? "d" : "-");
- cout << ((attributes & READ_ONLY) ? "-" : "w");
- cout << ((attributes & HIDDEN) ? "h" : "-");
- cout << ((attributes & SYSTEM) ? "s" : "-");
- cout << ((attributes & ARCHIVE) ? "a" : "-");
- cout << ((attributes & VOLUME) ? "v" : "-");
- cout << ((attributes & NORMAL) ? "n" : "-");
- cout << ((attributes & TEMPORARY) ? "t" : "-");
- cout << ((attributes & COMPRESSED) ? "c" : "-");
- cout << " " << dec << setw(10) << setfill(' ') << size;
- cout << " " << dateBuff;
- } else {
- s.addDWord(date);
- s.addDWord(size);
- s.addDWord(attributes);
- }
+ s.addDWord(date);
+ s.addDWord(size);
+ s.addDWord(attributes);
int d = 36;
for (int i = 0; i < longLen; i++, d++)
s.addByte(a.getByte(d));
s.addByte(0);
while (d % 4)
d++;
- if (!files)
- cout << " " << s.getString() << endl;
- else /* if ((attributes & DIRECTORY) == 0) */
- files->pushBuffer(s);
+ files->pushBuffer(s);
d += shortLen;
while (d % 4)
d++;
a.discardFirstBytes(d);
}
}
- if (res == EoF)
+ if (res == PSI_ERR_EoF)
res = 0;
fclose(handle);
return res;
@@ -279,7 +277,8 @@ fgetmtime(const char *name, long *mtime)
convertSlash(name);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(MODIFIED, a);
+ if (!sendCommand(MODIFIED, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (res != 0)
return res;
@@ -298,7 +297,8 @@ fsetmtime(const char *name, long mtime)
a.addDWord(microHi);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(SET_MODIFIED, a);
+ if (!sendCommand(SET_MODIFIED, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (res != 0)
return res;
@@ -312,7 +312,8 @@ fgetattr(const char *name, long *attr)
convertSlash(name);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(ATT, a);
+ if (!sendCommand(ATT, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (res != 0)
return res;
@@ -327,7 +328,8 @@ fgeteattr(const char *name, long *attr, long *size, long *time)
convertSlash(name);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(REMOTE_ENTRY, a);
+ if (!sendCommand(REMOTE_ENTRY, a))
+ return PSI_ERR_DISCONNECTED;
long res = getResponse(a);
if (res != 0)
return res;
@@ -353,7 +355,8 @@ fsetattr(const char *name, long seta, long unseta)
a.addDWord(unseta);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(SET_ATT, a);
+ if (!sendCommand(SET_ATT, a))
+ return PSI_ERR_DISCONNECTED;
return getResponse(a);
}
@@ -362,7 +365,7 @@ dircount(const char *name, long *count)
{
long handle;
convertSlash(name);
- long res = fopendir(HIDDEN | SYSTEM | DIRECTORY, name, handle);
+ long res = fopendir(PSI_ATTR_HIDDEN | PSI_ATTR_SYSTEM | PSI_ATTR_DIRECTORY, name, handle);
*count = 0;
if (res != 0)
return res;
@@ -370,7 +373,8 @@ dircount(const char *name, long *count)
while (1) {
bufferStore a;
a.addDWord(handle);
- sendCommand(READ_DIR, a);
+ if (!sendCommand(READ_DIR, a))
+ return PSI_ERR_DISCONNECTED;
res = getResponse(a);
if (res)
break;
@@ -386,7 +390,7 @@ dircount(const char *name, long *count)
}
}
fclose(handle);
- if (res == EoF)
+ if (res == PSI_ERR_EoF)
res = 0;
return res;
}
@@ -397,7 +401,8 @@ devlist(long *devbits)
bufferStore a;
long res;
- sendCommand(GET_DRIVE_LIST, a);
+ if (!sendCommand(GET_DRIVE_LIST, a))
+ return PSI_ERR_DISCONNECTED;
res = getResponse(a);
*devbits = 0;
if ((res == 0) && (a.getLen() == 26)) {
@@ -418,7 +423,8 @@ devinfo(int devnum, long *vfree, long *vtotal, long *vattr,
long res;
a.addDWord(devnum);
- sendCommand(DRIVE_INFO, a);
+ if (!sendCommand(DRIVE_INFO, a))
+ return NULL;
res = getResponse(a);
if (res == 0) {
*vattr = a.getDWord(0);
@@ -435,6 +441,12 @@ devinfo(int devnum, long *vfree, long *vtotal, long *vattr,
bool rfsv32::
sendCommand(enum commands cc, bufferStore & data)
{
+ if (status == PSI_ERR_DISCONNECTED) {
+ reconnect();
+ if (status == PSI_ERR_DISCONNECTED)
+ return false;
+ }
+ bool result;
bufferStore a;
a.addWord(cc);
a.addWord(serNum);
@@ -443,7 +455,10 @@ sendCommand(enum commands cc, bufferStore & data)
else
serNum = 0;
a.addBuff(data);
- return skt->sendBufferStore(a);
+ result = skt->sendBufferStore(a);
+ if (!result)
+ status = PSI_ERR_DISCONNECTED;
+ return result;
}
long rfsv32::
@@ -455,8 +470,8 @@ getResponse(bufferStore & data)
data.discardFirstBytes(8);
return ret;
} else
- status = DISCONNECTED;
- return (enum errs) GENERAL;
+ status = PSI_ERR_DISCONNECTED;
+ return status;
}
char * rfsv32::
@@ -464,135 +479,135 @@ opErr(long status)
{
enum errs e = (enum errs) status;
switch (e) {
- case NONE:
+ case PSI_ERR_NONE:
return "";
- case NOT_FOUND:
- return "NOT_FOUND";
- case GENERAL:
- return "GENERAL";
+ case PSI_ERR_NOT_FOUND:
+ return "not found";
+ case PSI_ERR_GENERAL:
+ return "general";
break;
- case CANCEL:
- return "CANCEL";
+ case PSI_ERR_CANCEL:
+ return "cancelled";
break;
- case NO_MEMORY:
- return "NO_MEMORY";
+ case PSI_ERR_NO_MEMORY:
+ return "out of memory";
break;
- case NOT_SUPPORTED:
- return "NOT_SUPPORTED";
+ case PSI_ERR_NOT_SUPPORTED:
+ return "unsupported";
break;
- case ARGUMENT:
- return "ARGUMENT";
+ case PSI_ERR_ARGUMENT:
+ return "bad argument";
break;
- case TOTAL_LOSS_OF_PRECISION:
- return "TOTAL_LOSS_OF_PRECISION";
+ case PSI_ERR_TOTAL_LOSS_OF_PRECISION:
+ return "total loss of precision";
break;
- case BAD_HANDLE:
- return "BAD_HANDLE";
+ case PSI_ERR_BAD_HANDLE:
+ return "bad handle";
break;
- case OVERFLOW:
- return "OVERFLOW";
+ case PSI_ERR_OVERFLOW:
+ return "overflow";
break;
- case UNDERFLOW:
- return "UNDERFLOW";
+ case PSI_ERR_UNDERFLOW:
+ return "underflow";
break;
- case ALREADY_EXISTS:
- return "ALREADY_EXISTS";
+ case PSI_ERR_ALREADY_EXISTS:
+ return "file already exists";
break;
- case PATH_NOT_FOUND:
- return "PATH_NOT_FOUND";
+ case PSI_ERR_PATH_NOT_FOUND:
+ return "path not found";
break;
- case DIED:
+ case PSI_ERR_DIED:
return "DIED";
break;
- case IN_USE:
- return "IN_USE";
+ case PSI_ERR_IN_USE:
+ return "resource in use";
break;
- case SERVER_TERMINATED:
- return "SERVER_TERMINATED";
+ case PSI_ERR_SERVER_TERMINATED:
+ return "server terminated";
break;
- case SERVER_BUSY:
- return "SERVER_BUSY";
+ case PSI_ERR_SERVER_BUSY:
+ return "server busy";
break;
- case COMPLETION:
- return "COMPLETION";
+ case PSI_ERR_COMPLETION:
+ return "completed";
break;
- case NOT_READY:
- return "NOT_READY";
+ case PSI_ERR_NOT_READY:
+ return "not ready";
break;
- case UNKNOWN:
- return "UNKNOWN";
+ case PSI_ERR_UNKNOWN:
+ return "unknown";
break;
- case CORRUPT:
- return "CORRUPT";
+ case PSI_ERR_CORRUPT:
+ return "corrupt";
break;
- case ACCESS_DENIED:
- return "ACCESS_DENIED";
+ case PSI_ERR_ACCESS_DENIED:
+ return "permission denied";
break;
- case LOCKED:
- return "LOCKED";
+ case PSI_ERR_LOCKED:
+ return "resource locked";
break;
- case WRITE:
- return "WRITE";
+ case PSI_ERR_WRITE:
+ return "write";
break;
- case DISMOUNTED:
- return "DISMOUNTED";
+ case PSI_ERR_DISMOUNTED:
+ return "dismounted";
break;
- case EoF:
- return "EOF";
+ case PSI_ERR_EoF:
+ return "end of file";
break;
- case DISK_FULL:
- return "DISK_FULL";
+ case PSI_ERR_DISK_FULL:
+ return "disk full";
break;
- case BAD_DRIVER:
- return "BAD_DRIVER";
+ case PSI_ERR_BAD_DRIVER:
+ return "bad driver";
break;
- case BAD_NAME:
- return "BAD_NAME";
+ case PSI_ERR_BAD_NAME:
+ return "bad name";
break;
- case COMMS_LINE_FAIL:
- return "COMMS_LINE_FAIL";
+ case PSI_ERR_COMMS_LINE_FAIL:
+ return "comms line failed";
break;
- case COMMS_FRAME:
- return "COMMS_FRAME";
+ case PSI_ERR_COMMS_FRAME:
+ return "comms framing error";
break;
- case COMMS_OVERRUN:
- return "COMMS_OVERRUN";
+ case PSI_ERR_COMMS_OVERRUN:
+ return "comms overrun";
break;
- case COMMS_PARITY:
- return "COMMS_PARITY";
+ case PSI_ERR_COMMS_PARITY:
+ return "comms parity error";
break;
- case PSI_TIMEOUT:
- return "TIMEOUT";
+ case PSI_ERR_TIMEOUT:
+ return "timed out";
break;
- case COULD_NOT_CONNECT:
- return "COULD_NOT_CONNECT";
+ case PSI_ERR_COULD_NOT_CONNECT:
+ return "could not connect";
break;
- case COULD_NOT_DISCONNECT:
- return "COULD_NOT_DISCONNECT";
+ case PSI_ERR_COULD_NOT_DISCONNECT:
+ return "could not disconnect";
break;
- case DISCONNECTED:
- return "DISCONNECTED";
+ case PSI_ERR_DISCONNECTED:
+ return "unit disconnected";
break;
- case BAD_LIBRARY_ENTRY_POINT:
- return "BAD_LIBRARY_ENTRY_POINT";
+ case PSI_ERR_BAD_LIBRARY_ENTRY_POINT:
+ return "bad library entry point";
break;
- case BAD_DESCRIPTOR:
- return "BAD_DESCRIPTOR";
+ case PSI_ERR_BAD_DESCRIPTOR:
+ return "bad descriptor";
break;
- case ABORT:
- return "ABORT";
+ case PSI_ERR_ABORT:
+ return "abort";
break;
- case TOO_BIG:
- return "TOO_BIG";
+ case PSI_ERR_TOO_BIG:
+ return "too big";
break;
- case DIVIDE_BY_ZERO:
- return "DIVIDE_BY_ZERO";
+ case PSI_ERR_DIVIDE_BY_ZERO:
+ return "division by zero";
break;
- case BAD_POWER:
- return "BAD_POWER";
+ case PSI_ERR_BAD_POWER:
+ return "bad power";
break;
- case DIR_FULL:
- return "DIR_FULL";
+ case PSI_ERR_DIR_FULL:
+ return "directory full";
break;
default:
return "Unknown error";
@@ -610,7 +625,8 @@ fread(long handle, char *buf, long len)
bufferStore a;
a.addDWord(handle);
a.addDWord(((len-count) > 2000)?2000:(len-count));
- sendCommand(READ_FILE, a);
+ if (!sendCommand(READ_FILE, a))
+ return PSI_ERR_DISCONNECTED;
if ((res = getResponse(a)) != 0)
return res;
res = a.getLen();
@@ -636,7 +652,8 @@ fwrite(long handle, char *buf, long len)
bufferStore tmp((unsigned char *)buf, count);
a.addDWord(handle);
a.addBuff(tmp);
- sendCommand(WRITE_FILE, a);
+ if (!sendCommand(WRITE_FILE, a))
+ return PSI_ERR_DISCONNECTED;
if ((res = getResponse(a)) != 0)
return res;
total += count;
@@ -652,7 +669,7 @@ copyFromPsion(const char *from, const char *to)
long res;
long len;
- if ((res = fopen(SHARE_READERS | BINARY, from, handle)) != 0)
+ if ((res = fopen(PSI_OMODE_SHARE_READERS | PSI_OMODE_BINARY, from, handle)) != 0)
return res;
ofstream op(to);
if (!op) {
@@ -678,15 +695,12 @@ copyToPsion(const char *from, const char *to)
ifstream ip(from);
if (!ip)
- return NOT_FOUND;
- res = fcreatefile(BINARY | SHARE_EXCLUSIVE | READ_WRITE, to, handle);
+ return PSI_ERR_NOT_FOUND;
+ res = fcreatefile(PSI_OMODE_BINARY | PSI_OMODE_SHARE_EXCLUSIVE | PSI_OMODE_READ_WRITE, to, handle);
if (res != 0) {
- res = freplacefile(BINARY | SHARE_EXCLUSIVE | READ_WRITE, to, handle);
- if (res != 0) {
- opErr(res);
- cerr << endl;
+ res = freplacefile(PSI_OMODE_BINARY | PSI_OMODE_SHARE_EXCLUSIVE | PSI_OMODE_READ_WRITE, to, handle);
+ if (res != 0)
return res;
- }
}
unsigned char *buff = new unsigned char[RFSV_SENDLEN];
int total = 0;
@@ -699,12 +713,10 @@ copyToPsion(const char *from, const char *to)
bufferStore a;
a.addDWord(handle);
a.addBuff(tmp);
- sendCommand(WRITE_FILE, a);
+ if (!sendCommand(WRITE_FILE, a))
+ return PSI_ERR_DISCONNECTED;
res = getResponse(a);
if (res) {
- cerr << "Unknown response to fwrite - ";
- opErr(res);
- cerr << " " << a << endl;
fclose(handle);
return res;
}
@@ -721,7 +733,8 @@ fsetsize(long handle, long size)
bufferStore a;
a.addDWord(handle);
a.addDWord(size);
- sendCommand(SET_SIZE, a);
+ if (!sendCommand(SET_SIZE, a))
+ return PSI_ERR_DISCONNECTED;
return getResponse(a);
}
@@ -752,15 +765,16 @@ fseek(long handle, long pos, long mode)
??no more?? 6 = text-rewind
*/
- if ((mode < PSEEK_SET) || (mode > PSEEK_END))
- return ARGUMENT;
+ if ((mode < PSI_SEEK_SET) || (mode > PSI_SEEK_END))
+ return PSI_ERR_ARGUMENT;
- if ((mode == PSEEK_CUR) && (pos >= 0)) {
+ if ((mode == PSI_SEEK_CUR) && (pos >= 0)) {
/* get and save current position */
a.addDWord(0);
a.addDWord(handle);
- a.addDWord(PSEEK_CUR);
- sendCommand(SEEK_FILE, a);
+ a.addDWord(PSI_SEEK_CUR);
+ if (!sendCommand(SEEK_FILE, a))
+ return PSI_ERR_DISCONNECTED;
if ((res = getResponse(a)) != 0)
return res;
savpos = a.getDWord(0);
@@ -768,12 +782,13 @@ fseek(long handle, long pos, long mode)
return savpos;
a.init();
}
- if ((mode == PSEEK_END) && (pos >= 0)) {
+ if ((mode == PSI_SEEK_END) && (pos >= 0)) {
/* get and save end position */
a.addDWord(0);
a.addDWord(handle);
- a.addDWord(PSEEK_END);
- sendCommand(SEEK_FILE, a);
+ a.addDWord(PSI_SEEK_END);
+ if (!sendCommand(SEEK_FILE, a))
+ return PSI_ERR_DISCONNECTED;
if ((res = getResponse(a)) != 0)
return res;
savpos = a.getDWord(0);
@@ -783,7 +798,8 @@ fseek(long handle, long pos, long mode)
a.init();
a.addDWord(handle);
a.addDWord(savpos + pos);
- sendCommand(SET_SIZE, a);
+ if (!sendCommand(SET_SIZE, a))
+ return PSI_ERR_DISCONNECTED;
if ((res = getResponse(a)) != 0)
return res;
pos = 0;
@@ -793,21 +809,19 @@ fseek(long handle, long pos, long mode)
a.addDWord(pos);
a.addDWord(handle);
a.addDWord(mode);
- sendCommand(SEEK_FILE, a);
- if ((res = getResponse(a)) != 0) {
-cout << "seekRES(" << handle << ")=" << res << endl;
+ if (!sendCommand(SEEK_FILE, a))
+ return PSI_ERR_DISCONNECTED;
+ if ((res = getResponse(a)) != 0)
return res;
-}
realpos = a.getDWord(0);
-cout << "seekPOS=" << realpos << endl;
switch (mode) {
- case PSEEK_SET:
+ case PSI_SEEK_SET:
calcpos = pos;
break;
- case PSEEK_CUR:
+ case PSI_SEEK_CUR:
calcpos = savpos + pos;
break;
- case PSEEK_END:
+ case PSI_SEEK_END:
return realpos;
break;
}
@@ -816,13 +830,15 @@ cout << "seekPOS=" << realpos << endl;
a.init();
a.addDWord(handle);
a.addDWord(calcpos);
- sendCommand(SET_SIZE, a);
+ if (!sendCommand(SET_SIZE, a))
+ return PSI_ERR_DISCONNECTED;
if ((res = getResponse(a)) != 0)
return res;
a.addDWord(calcpos);
a.addDWord(handle);
- a.addDWord(PSEEK_SET);
- sendCommand(SEEK_FILE, a);
+ a.addDWord(PSI_SEEK_SET);
+ if (!sendCommand(SEEK_FILE, a))
+ return PSI_ERR_DISCONNECTED;
if ((res = getResponse(a)) != 0)
return res;
realpos = a.getDWord(0);
@@ -843,7 +859,8 @@ mkdir(const char *name)
a.addWord(strlen(name));
a.addString(name);
}
- sendCommand(MK_DIR_ALL, a);
+ if (!sendCommand(MK_DIR_ALL, a))
+ return PSI_ERR_DISCONNECTED;
return getResponse(a);
}
@@ -860,7 +877,8 @@ rmdir(const char *name)
a.addWord(strlen(name));
a.addString(name);
}
- sendCommand(RM_DIR, a);
+ if (!sendCommand(RM_DIR, a))
+ return PSI_ERR_DISCONNECTED;
return getResponse(a);
}
@@ -874,7 +892,8 @@ rename(const char *oldname, const char *newname)
a.addString(oldname);
a.addWord(strlen(newname));
a.addString(newname);
- sendCommand(RENAME, a);
+ if (!sendCommand(RENAME, a))
+ return PSI_ERR_DISCONNECTED;
return getResponse(a);
}
@@ -885,6 +904,7 @@ remove(const char *name)
convertSlash(name);
a.addWord(strlen(name));
a.addString(name);
- sendCommand(DELETE, a);
+ if (!sendCommand(DELETE, a))
+ return PSI_ERR_DISCONNECTED;
return getResponse(a);
}
diff --git a/lib/rfsv32.h b/lib/rfsv32.h
index 083bd3d..f6aeceb 100644
--- a/lib/rfsv32.h
+++ b/lib/rfsv32.h
@@ -9,6 +9,8 @@ class rfsv32 {
public:
rfsv32(ppsocket * skt);
~rfsv32();
+ void reset();
+ void reconnect();
long dir(const char *name, bufferArray * files);
long dircount(const char *name, long *count);
@@ -40,12 +42,80 @@ class rfsv32 {
char *opErr(long status);
enum seek_mode {
- PSEEK_SET = 1,
- PSEEK_CUR = 2,
- PSEEK_END = 3
+ PSI_SEEK_SET = 1,
+ PSI_SEEK_CUR = 2,
+ PSI_SEEK_END = 3
};
- private:
+ enum file_attrib {
+ PSI_ATTR_RONLY = 0x0001,
+ PSI_ATTR_HIDDEN = 0x0002,
+ PSI_ATTR_SYSTEM = 0x0004,
+ PSI_ATTR_DIRECTORY = 0x0010,
+ PSI_ATTR_ARCHIVE = 0x0020,
+ PSI_ATTR_VOLUME = 0x0040,
+ PSI_ATTR_NORMAL = 0x0080,
+ PSI_ATTR_TEMPORARY = 0x0100,
+ PSI_ATTR_COMPRESSED = 0x0800
+ };
+
+ enum open_mode {
+ PSI_OMODE_SHARE_EXCLUSIVE = 0x0000,
+ PSI_OMODE_SHARE_READERS = 0x0001,
+ PSI_OMODE_SHARE_ANY = 0x0002,
+ PSI_OMODE_BINARY = 0x0000,
+ PSI_OMODE_TEXT = 0x0020,
+ PSI_OMODE_READ_WRITE = 0x0200
+ };
+
+ enum errs {
+ PSI_ERR_NONE = 0,
+ PSI_ERR_NOT_FOUND = -1,
+ PSI_ERR_GENERAL = -2,
+ PSI_ERR_CANCEL = -3,
+ PSI_ERR_NO_MEMORY = -4,
+ PSI_ERR_NOT_SUPPORTED = -5,
+ PSI_ERR_ARGUMENT = -6,
+ PSI_ERR_TOTAL_LOSS_OF_PRECISION = -7,
+ PSI_ERR_BAD_HANDLE = -8,
+ PSI_ERR_OVERFLOW = -9,
+ PSI_ERR_UNDERFLOW = -10,
+ PSI_ERR_ALREADY_EXISTS = -11,
+ PSI_ERR_PATH_NOT_FOUND = -12,
+ PSI_ERR_DIED = -13,
+ PSI_ERR_IN_USE = -14,
+ PSI_ERR_SERVER_TERMINATED = -15,
+ PSI_ERR_SERVER_BUSY = -16,
+ PSI_ERR_COMPLETION = -17,
+ PSI_ERR_NOT_READY = -18,
+ PSI_ERR_UNKNOWN = -19,
+ PSI_ERR_CORRUPT = -20,
+ PSI_ERR_ACCESS_DENIED = -21,
+ PSI_ERR_LOCKED = -22,
+ PSI_ERR_WRITE = -23,
+ PSI_ERR_DISMOUNTED = -24,
+ PSI_ERR_EoF = -25,
+ PSI_ERR_DISK_FULL = -26,
+ PSI_ERR_BAD_DRIVER = -27,
+ PSI_ERR_BAD_NAME = -28,
+ PSI_ERR_COMMS_LINE_FAIL = -29,
+ PSI_ERR_COMMS_FRAME = -30,
+ PSI_ERR_COMMS_OVERRUN = -31,
+ PSI_ERR_COMMS_PARITY = -32,
+ PSI_ERR_TIMEOUT = -33,
+ PSI_ERR_COULD_NOT_CONNECT = -34,
+ PSI_ERR_COULD_NOT_DISCONNECT = -35,
+ PSI_ERR_DISCONNECTED = -36,
+ PSI_ERR_BAD_LIBRARY_ENTRY_POINT = -37,
+ PSI_ERR_BAD_DESCRIPTOR = -38,
+ PSI_ERR_ABORT = -39,
+ PSI_ERR_TOO_BIG = -40,
+ PSI_ERR_DIVIDE_BY_ZERO = -41,
+ PSI_ERR_BAD_POWER = -42,
+ PSI_ERR_DIR_FULL = -43
+ };
+
+ private:
enum commands {
CLOSE_HANDLE = 0x01,
OPEN_DIR = 0x10,
@@ -83,74 +153,6 @@ class rfsv32 {
REPLACE = 0x32
};
- enum file_attrib {
- READ_ONLY = 0x0001,
- HIDDEN = 0x0002,
- SYSTEM = 0x0004,
- DIRECTORY = 0x0010,
- ARCHIVE = 0x0020,
- VOLUME = 0x0040,
- NORMAL = 0x0080,
- TEMPORARY = 0x0100,
- COMPRESSED = 0x0800
- };
-
- enum open_mode {
- SHARE_EXCLUSIVE = 0x0000,
- SHARE_READERS = 0x0001,
- SHARE_ANY = 0x0002,
- BINARY = 0x0000,
- TEXT = 0x0020,
- READ_WRITE = 0x0200
- };
-
- enum errs {
- NONE = 0,
- NOT_FOUND = -1,
- GENERAL = -2,
- CANCEL = -3,
- NO_MEMORY = -4,
- NOT_SUPPORTED = -5,
- ARGUMENT = -6,
- TOTAL_LOSS_OF_PRECISION = -7,
- BAD_HANDLE = -8,
- OVERFLOW = -9,
- UNDERFLOW = -10,
- ALREADY_EXISTS = -11,
- PATH_NOT_FOUND = -12,
- DIED = -13,
- IN_USE = -14,
- SERVER_TERMINATED = -15,
- SERVER_BUSY = -16,
- COMPLETION = -17,
- NOT_READY = -18,
- UNKNOWN = -19,
- CORRUPT = -20,
- ACCESS_DENIED = -21,
- LOCKED = -22,
- WRITE = -23,
- DISMOUNTED = -24,
- EoF = -25,
- DISK_FULL = -26,
- BAD_DRIVER = -27,
- BAD_NAME = -28,
- COMMS_LINE_FAIL = -29,
- COMMS_FRAME = -30,
- COMMS_OVERRUN = -31,
- COMMS_PARITY = -32,
- PSI_TIMEOUT = -33,
- COULD_NOT_CONNECT = -34,
- COULD_NOT_DISCONNECT = -35,
- DISCONNECTED = -36,
- BAD_LIBRARY_ENTRY_POINT = -37,
- BAD_DESCRIPTOR = -38,
- ABORT = -39,
- TOO_BIG = -40,
- DIVIDE_BY_ZERO = -41,
- BAD_POWER = -42,
- DIR_FULL = -43
- };
-
const char *getConnectName();
// Communication