From 8c29602b21efacced9d7ff4cd1f3c4101dda5f65 Mon Sep 17 00:00:00 2001 From: Fritz Elfert Date: Thu, 1 Jul 1999 20:42:30 +0000 Subject: proper error handling and auto-reconnect modified rfsv enums. --- lib/ppsocket.cc | 1130 +++++++++++++++++++++++++------------------------------ lib/ppsocket.h | 1 + lib/rfsv32.cc | 390 ++++++++++--------- lib/rfsv32.h | 146 +++---- 4 files changed, 796 insertions(+), 871 deletions(-) (limited to 'lib') 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 -- cgit v1.2.3