diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/ppsocket.cc | 1130 | ||||
| -rw-r--r-- | lib/ppsocket.h | 1 | ||||
| -rw-r--r-- | lib/rfsv32.cc | 390 | ||||
| -rw-r--r-- | lib/rfsv32.h | 146 | 
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 | 
