about summary refs log tree commit diff stats
path: root/091socket.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-10-07 13:55:47 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-10-07 13:55:47 -0700
commitd3d301766f1ac7c600151becdae42e822c781142 (patch)
tree28b7f22f8ad67fe1f4e21b2f24ba8e0938d8ac91 /091socket.cc
parent347510c0a2d8820e2ad5450dd34d03e2e5d073a1 (diff)
downloadmu-d3d301766f1ac7c600151becdae42e822c781142.tar.gz
3471
Diffstat (limited to '091socket.cc')
-rw-r--r--091socket.cc27
1 files changed, 17 insertions, 10 deletions
diff --git a/091socket.cc b/091socket.cc
index 22000c16..a6f0bc6a 100644
--- a/091socket.cc
+++ b/091socket.cc
@@ -97,20 +97,27 @@ case _ACCEPT: {
 }
 :(before "End Primitive Recipe Implementations")
 case _ACCEPT: {
-  long long int x = static_cast<long long int>(ingredients.at(0).at(0));
-  socket_t* socket = reinterpret_cast<socket_t*>(x);
-  socket_t* session = new socket_t();
-  session_socket(socket->fd, session);
   products.resize(2);
-  long long int result = reinterpret_cast<long long int>(session);
-  products.at(0).push_back(static_cast<double>(result));
-  products.at(1).push_back(ingredients.at(0).at(0));
+  products.at(1).push_back(ingredients.at(0).at(0));  // indicate it modifies its ingredient
+  long long int x = static_cast<long long int>(ingredients.at(0).at(0));
+  socket_t* server = reinterpret_cast<socket_t*>(x);
+  if (server) {
+    socket_t* session = accept(server);
+    long long int result = reinterpret_cast<long long int>(session);
+    products.at(0).push_back(static_cast<double>(result));
+  }
+  else {
+    products.at(0).push_back(0);
+  }
   break;
 }
 :(code)
-void session_socket(int serverfd, socket_t* session) {
-  socklen_t dummy = sizeof(session->addr);
-  session->fd = accept(serverfd, (struct sockaddr*)&session->addr, &dummy);
+socket_t* accept(socket_t* server) {
+  if (server->fd == 0) return NULL;
+  socket_t* result = new socket_t;
+  socklen_t dummy = sizeof(result->addr);
+  result->fd = accept(server->fd, (struct sockaddr*)&result->addr, &dummy);
+  return result;
 }
 
 :(before "End Primitive Recipe Declarations")