]> git.mxchange.org Git - simgear.git/blobdiff - simgear/io/sg_socket.cxx
Linux test_HTTP fixes.
[simgear.git] / simgear / io / sg_socket.cxx
index 4ee0eba2e8a3ac863987cd80de4d18c5e776b01e..4ca13150170e6bfba5eb052c8115ce6e85b1f668 100644 (file)
@@ -3,7 +3,7 @@
 // Written by Curtis Olson, started November 1999.
 // Modified by Bernie Bright <bbright@bigpond.net.au>, May 2002.
 //
-// Copyright (C) 1999  Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 1999  Curtis L. Olson - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
 
 #include <simgear/compiler.h>
 
-#if defined( sgi )
-#include <strings.h>
-#endif
+#include <iostream>
+#include <cstring>
+#include <cstdlib> // for atoi
 
 #include <simgear/debug/logstream.hxx>
 
 #include "sg_socket.hxx"
 
 bool SGSocket::init = false;
+using std::string;
 
 SGSocket::SGSocket( const string& host, const string& port_, 
                    const string& style ) :
@@ -42,12 +46,13 @@ SGSocket::SGSocket( const string& host, const string& port_,
     client(0),
     is_tcp(false),
     is_server(false),
-    first_read(false)
+    first_read(false),
+    timeout(0)
 {
     if (!init)
     {
-       netInit(NULL, NULL);    // plib-1.4.2 compatible
-       init = true;
+      simgear::Socket::initSockets();
+      init = true;
     }
 
     if ( style == "tcp" )
@@ -80,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()" );
@@ -218,7 +223,7 @@ SGSocket::read( char *buf, int length )
 
     if (result > 0)
     {
-       if (is_tcp)
+       if (is_tcp && is_server)
        {
             result = client->recv( buf, length );
         }
@@ -257,7 +262,7 @@ SGSocket::readline( char *buf, int length )
        // read a chunk, keep in the save buffer until we have the
        // requested amount read
 
-       if (is_tcp)
+       if (is_tcp && is_server)
        {
            char *buf_ptr = save_buf + save_len;
            result = client->recv( buf_ptr, SG_IO_MAX_MSG_SIZE - save_len );
@@ -292,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
@@ -301,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+, ? );
@@ -320,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;
@@ -330,7 +342,7 @@ SGSocket::write( const char *buf, const int length )
 
     if ( s->send( buf, length ) < 0 )
     {
-       SG_LOG( SG_IO, SG_ALERT, "Error writing to socket: " << port );
+       SG_LOG( SG_IO, SG_WARN, "Error writing to socket: " << port );
        error_condition = true;
     }
 
@@ -378,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, 0 );
+    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;
     }