/* -*-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
#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)))));
}
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
}
#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 */
/* -*-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
#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 */