commit changes to build
[libt2n] / src / socket_handler.cpp
index 582cb0c..ed14895 100644 (file)
@@ -97,11 +97,11 @@ bool socket_handler::is_closed()
 }
 
 /** @brief check if new data is waiting on the raw socket
-    @param usec_timeout wait until new data is found, max timeout usecs.
+    @param[in,out] usec_timeout wait until new data is found, max timeout usecs.
             -1: wait endless
-            NULL: no timeout
+            0: return instantly
 */
-bool socket_handler::data_waiting(long long usec_timeout)
+bool socket_handler::data_waiting(long long usec_timeout,long long* usec_timeout_remaining)
 {
     // just our socket
     fd_set active_fd_set;
@@ -118,12 +118,19 @@ bool socket_handler::data_waiting(long long usec_timeout)
     {
         timeout_ptr = &tval;
 
-        // timeout von long long usec in int sec + int usec umrechnen
+        // convert timeout from long long usec to int sec + int usec
         tval.tv_sec = usec_timeout / 1000000;
         tval.tv_usec = usec_timeout % 1000000;
     }
 
-    if(select (FD_SETSIZE, &active_fd_set, NULL, NULL, timeout_ptr) > 0)
+    int ret=select (FD_SETSIZE, &active_fd_set, NULL, NULL, timeout_ptr);
+
+    // return the timeout we did not use
+    // todo: this is linux specific according to man 2 select
+    if (usec_timeout > 0 && usec_timeout_remaining != NULL)
+        *usec_timeout_remaining=(tval.tv_sec*1000000)+tval.tv_usec;
+
+    if (ret > 0)
         return true;
     else
         return false;
@@ -131,14 +138,14 @@ bool socket_handler::data_waiting(long long usec_timeout)
 
 /** @brief read data from the raw socket and copy it into the provided buffer
     @param buffer the buffer where to append the new data
-    @param usec_timeout wait until new data is found, max timeout usecs.
+    @param[in,out] usec_timeout wait until new data is found, max timeout usecs.
             -1: wait endless
-            NULL: no timeout
+            0: return instantly
 */
-bool socket_handler::fill_buffer(std::string& buffer, long long usec_timeout)
+bool socket_handler::fill_buffer(std::string& buffer, long long usec_timeout, long long *timeout_remaining)
 {
     // fast path for timeout==0
-    if (usec_timeout==0 || data_waiting(usec_timeout))
+    if (usec_timeout==0 || data_waiting(usec_timeout,timeout_remaining))
         return fill_buffer(buffer);
     else
         return false;
@@ -184,8 +191,8 @@ bool socket_handler::fill_buffer(std::string& buffer)
     // Data read -> store it
     if (nbytes > 0)
     {
-        buffer.assign(socket_buffer,nbytes);
-        LOGSTREAM(debug,nbytes << " read");
+        buffer.append(socket_buffer,nbytes);
+        LOGSTREAM(debug,nbytes << " bytes read");
     }
 
     // more data waiting -> recurse