X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fio%2Fsg_socket.cxx;h=4ca13150170e6bfba5eb052c8115ce6e85b1f668;hb=598b64fa9569c16878c904e344e2e2775e210c42;hp=433415dcfe1b42d98d8fd9aaf52bbede9124863e;hpb=dcb95d131bc6aef1abe25d1f415e309f06e52436;p=simgear.git diff --git a/simgear/io/sg_socket.cxx b/simgear/io/sg_socket.cxx index 433415dc..4ca13150 100644 --- a/simgear/io/sg_socket.cxx +++ b/simgear/io/sg_socket.cxx @@ -27,17 +27,16 @@ #include -#if defined( sgi ) -#include -#endif - -#include STL_IOSTREAM +#include +#include +#include // for atoi #include #include "sg_socket.hxx" bool SGSocket::init = false; +using std::string; SGSocket::SGSocket( const string& host, const string& port_, const string& style ) : @@ -52,8 +51,8 @@ SGSocket::SGSocket( const string& host, const string& port_, { if (!init) { - netInit(NULL, NULL); // plib-1.4.2 compatible - init = true; + simgear::Socket::initSockets(); + init = true; } if ( style == "tcp" ) @@ -86,7 +85,7 @@ SGSocket::make_server_socket() return false; } - if (sock.bind( "", port ) < 0) + if (sock.bind( hostname.c_str(), port ) < 0) { SG_LOG( SG_IO, SG_ALERT, "Error: bind() failed in make_server_socket()" ); @@ -298,7 +297,7 @@ SGSocket::readline( char *buf, int length ) int i; for ( i = 0; i < save_len && save_buf[i] != '\n'; ++i ) ; - if ( save_buf[i] == '\n' ) { + if (( i < save_len ) && ( save_buf[i] == '\n' )) { result = i + 1; } else { // no end of line yet @@ -307,9 +306,16 @@ SGSocket::readline( char *buf, int length ) // we found an end of line + // check buffer size + int copy_length = result; + if (copy_length >= length) { + SG_LOG( SG_IO, SG_ALERT, + "Alert: readline() has line exceeding the buffer size." ); + copy_length = length-1; + } // copy to external buffer - strncpy( buf, save_buf, result ); - buf[result] = '\0'; + strncpy( buf, save_buf, copy_length ); + buf[copy_length] = '\0'; // shift save buffer //memmove( save_buf+, save_buf+, ? ); @@ -326,7 +332,7 @@ SGSocket::readline( char *buf, int length ) int SGSocket::write( const char *buf, const int length ) { - netSocket* s = client == 0 ? &sock : client; + simgear::Socket* s = client == 0 ? &sock : client; if (s->getHandle() == -1) { return 0; @@ -384,24 +390,24 @@ SGSocket::nonblock() int SGSocket::poll() { - netSocket* readers[2]; + simgear::Socket* readers[2]; readers[0] = client != 0 ? client : &sock; readers[1] = 0; - netSocket* writers[1]; + simgear::Socket* writers[1]; writers[0] = 0; - int result = netSocket::select( readers, writers, timeout ); + int result = simgear::Socket::select( readers, writers, timeout ); if (result > 0 && is_server && client == 0) { // Accept a new client connection - netAddress addr; + simgear::IPAddress addr; int new_fd = sock.accept( &addr ); SG_LOG( SG_IO, SG_INFO, "Accepted connection from " << addr.getHost() << ":" << addr.getPort() ); - client = new netSocket(); + client = new simgear::Socket(); client->setHandle( new_fd ); return 0; }