* (OS_open_tcp_stream_socket): Change `host' argument to be `char *',
authorChris Hanson <org/chris-hanson/cph>
Thu, 8 Nov 1990 11:11:57 +0000 (11:11 +0000)
committerChris Hanson <org/chris-hanson/cph>
Thu, 8 Nov 1990 11:11:57 +0000 (11:11 +0000)
  and don't assume that it is the same length as a `long'.

* (OS_get_host_by_name): Change interface to return `char **', and
  eliminate `struct host_addresses'.  Assume that all addresses are
  `sizeof (struct in_addr)' in length.

* (OS_open_server_socket, OS_server_connection_accept): New procedures
  support server sockets.

v7/src/microcode/uxsock.c
v7/src/microcode/uxsock.h

index 16351549a2f3d0521ef3fb9283dfb791b92a3473..92bcd918345fc56e47eedc1db34598bfb875b092 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxsock.c,v 1.1 1990/06/20 19:37:32 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxsock.c,v 1.2 1990/11/08 11:11:38 cph Rel $
 
 Copyright (c) 1990 Massachusetts Institute of Technology
 
@@ -46,15 +46,20 @@ MIT in each case. */
 #include "uxio.h"
 \f
 Tchannel
-DEFUN (OS_open_tcp_stream_socket, (host, port), PTR host AND int port)
+DEFUN (OS_open_tcp_stream_socket, (host, port), char * host AND int port)
 {
   int s;
   STD_UINT_SYSTEM_CALL ("socket", s, (UX_socket (AF_INET, SOCK_STREAM, 0)));
   {
     struct sockaddr_in address;
     (address . sin_family) = AF_INET;
+    {
+      char * scan = ((char*) (& (address . sin_addr)));
+      char * end = (scan + (sizeof (address . sin_addr)));
+      while (scan < end)
+       (*scan++) = (*host++);
+    }
     (address . sin_port) = port;
-    (address . sin_addr . s_addr) = (* ((unsigned long *) host));
     STD_VOID_SYSTEM_CALL
       ("connect", (UX_connect (s, (&address), (sizeof (address)))));
   }
@@ -70,25 +75,28 @@ DEFUN (OS_get_service_by_name, (service_name, protocol_name),
   return ((entry == 0) ? (-1) : (entry -> s_port));
 }
 
-struct host_addresses *
+unsigned int
+DEFUN_VOID (OS_host_address_length)
+{
+  return (sizeof (struct in_addr));
+}
+
+char **
 DEFUN (OS_get_host_by_name, (host_name), CONST char * host_name)
 {
-  static struct host_addresses result;
   struct hostent * entry = (UX_gethostbyname (host_name));
   if (entry == 0)
     return (0);
-  (result . address_length) = (entry -> h_length);
 #ifndef USE_HOSTENT_ADDR
-  (result . addresses) = (entry -> h_addr_list);
+  return (entry -> h_addr_list);
 #else
   {
     static char * addresses [2];
     (addresses[0]) = (entry -> h_addr);
     (addresses[1]) = 0;
-    (result . addresses) = addresses;
+    return (addresses);
   }
 #endif
-  return (&result);
 }
 
 #ifdef HAVE_UNIX_SOCKETS
@@ -109,5 +117,61 @@ DEFUN (OS_open_unix_stream_socket, (filename), CONST char * filename)
 }
 
 #endif /* HAVE_UNIX_SOCKETS */
+\f
+#ifndef SOCKET_LISTEN_BACKLOG
+#define SOCKET_LISTEN_BACKLOG 5
+#endif
+
+Tchannel
+DEFUN (OS_open_server_socket, (port), int port)
+{
+  int s;
+  STD_UINT_SYSTEM_CALL ("socket", s, (UX_socket (AF_INET, SOCK_STREAM, 0)));
+  {
+    struct sockaddr_in address;
+    (address . sin_family) = AF_INET;
+    (address . sin_addr . s_addr) = INADDR_ANY;
+    (address . sin_port) = port;
+    STD_VOID_SYSTEM_CALL
+      ("bind", (UX_bind (s, (&address), (sizeof (struct sockaddr_in)))));
+  }
+  STD_VOID_SYSTEM_CALL ("listen", (UX_listen (s, SOCKET_LISTEN_BACKLOG)));
+  MAKE_CHANNEL (s, channel_type_tcp_server_socket, return);
+}
+
+Tchannel
+DEFUN (OS_server_connection_accept, (channel, peer_host, peer_port),
+       Tchannel channel AND
+       char * peer_host AND
+       int * peer_port)
+{
+  static struct sockaddr_in address;
+  int address_length = (sizeof (struct sockaddr_in));
+  int s =
+    (UX_accept
+     ((CHANNEL_DESCRIPTOR (channel)), (&address), (&address_length)));
+  if (s == (-1))
+    {
+#ifdef EAGAIN
+      if (errno == EAGAIN)
+       return (NO_CHANNEL);
+#endif
+#ifdef EWOULDBLOCK
+      if (errno == EWOULDBLOCK)
+       return (NO_CHANNEL);
+#endif
+      error_system_call (errno, "accept");
+    }
+  if (peer_host != 0)
+    {
+      char * scan = ((char *) (& (address . sin_addr)));
+      char * end = (scan + (sizeof (address . sin_addr)));
+      while (scan < end)
+       (*peer_host++) = (*scan++);
+    }
+  if (peer_port != 0)
+    (*peer_port) = (address . sin_port);
+  MAKE_CHANNEL (s, channel_type_tcp_stream_socket, return);
+}
 
 #endif /* HAVE_SOCKETS */
index 0b44c947a1fd3dc0eefcf7da23bc31ead2a6b94e..f62639aa6cfb5d33f3517b7159e6b46ae958c6b7 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxsock.h,v 1.1 1990/06/20 19:37:35 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxsock.h,v 1.2 1990/11/08 11:11:57 cph Rel $
 
 Copyright (c) 1990 Massachusetts Institute of Technology
 
@@ -37,21 +37,20 @@ MIT in each case. */
 
 #include "os.h"
 
-struct host_addresses
-{
-  int address_length;
-  char ** addresses;
-};
-
-extern Tchannel EXFUN (OS_open_tcp_stream_socket, (PTR host, int port));
+extern Tchannel EXFUN (OS_open_tcp_stream_socket, (char * host, int port));
 extern int EXFUN
   (OS_get_service_by_name,
    (CONST char * service_name, CONST char * protocol_name));
-extern struct host_addresses * EXFUN
-  (OS_get_host_by_name, (CONST char * host_name));
+extern unsigned int EXFUN (OS_host_address_length, (void));
+extern char ** EXFUN (OS_get_host_by_name, (CONST char * host_name));
 
 #ifdef HAVE_UNIX_SOCKETS
 extern Tchannel EXFUN (OS_open_unix_stream_socket, (CONST char * filename));
 #endif
 
+extern Tchannel EXFUN (OS_open_server_socket, (int port));
+extern Tchannel EXFUN
+  (OS_server_connection_accept,
+   (Tchannel channel, char * peer_host, int * peer_port));
+
 #endif /* SCM_UXSOCK_H */