From: Chris Hanson Date: Thu, 8 Nov 1990 11:11:57 +0000 (+0000) Subject: * (OS_open_tcp_stream_socket): Change `host' argument to be `char *', X-Git-Tag: 20090517-FFI~11096 X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=5a8970f6668c67870aa88d3d6acb665fdd0bd199;p=mit-scheme.git * (OS_open_tcp_stream_socket): Change `host' argument to be `char *', 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. --- diff --git a/v7/src/microcode/uxsock.c b/v7/src/microcode/uxsock.c index 16351549a..92bcd9183 100644 --- a/v7/src/microcode/uxsock.c +++ b/v7/src/microcode/uxsock.c @@ -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" 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 */ + +#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 */ diff --git a/v7/src/microcode/uxsock.h b/v7/src/microcode/uxsock.h index 0b44c947a..f62639aa6 100644 --- a/v7/src/microcode/uxsock.h +++ b/v7/src/microcode/uxsock.h @@ -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 */