diff options
author | dos-reis <gdr@axiomatics.org> | 2008-09-06 20:47:14 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2008-09-06 20:47:14 +0000 |
commit | 95440288d1c686ceda247fcf606576deb8367d0a (patch) | |
tree | 48b3b2b3c64cd2400db5826bf4f5617ec9572eee | |
parent | c8bfb04b762ad0e33272fd082457aa524d542fca (diff) | |
download | open-axiom-95440288d1c686ceda247fcf606576deb8367d0a.tar.gz |
* interp/sys-os.boot (openIP4ClientStreamSocket): New.
(readFromStreamSocket): Likewise.
(writeToStreamSocket): Likewise.
(closeSocket): Likewise.
* include/sockio.h: Include <arpa/inet.h>
(oa_open_ip4_client_stream_socket): Declare.
(oa_socket_write): Likewise.
(oa_socket_read): Likewise.
* lib/sockio-c.c (openaxiom_unload_socket_module): New.
(openaxiom_load_socket_module): Tidy.
(openaxiom_socket_is_invalid): New.
(is_invalid_socket): Use it.
(oa_open_ip4_client_stream_socket): Define.
(oa_socket_read): Likewise.
(oa_socket_write): Likewise.
-rwxr-xr-x | configure | 18 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | configure.ac.pamphlet | 2 | ||||
-rw-r--r-- | src/ChangeLog | 18 | ||||
-rw-r--r-- | src/include/sockio.h | 13 | ||||
-rw-r--r-- | src/interp/sys-os.boot | 20 | ||||
-rw-r--r-- | src/lib/sockio-c.c | 128 |
7 files changed, 144 insertions, 57 deletions
@@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.60 for OpenAxiom 1.3.0-2008-09-04. +# Generated by GNU Autoconf 2.60 for OpenAxiom 1.3.0-2008-09-05. # # Report bugs to <open-axiom-bugs@lists.sf.net>. # @@ -713,8 +713,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='OpenAxiom' PACKAGE_TARNAME='openaxiom' -PACKAGE_VERSION='1.3.0-2008-09-04' -PACKAGE_STRING='OpenAxiom 1.3.0-2008-09-04' +PACKAGE_VERSION='1.3.0-2008-09-05' +PACKAGE_STRING='OpenAxiom 1.3.0-2008-09-05' PACKAGE_BUGREPORT='open-axiom-bugs@lists.sf.net' ac_unique_file="src/Makefile.pamphlet" @@ -1405,7 +1405,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures OpenAxiom 1.3.0-2008-09-04 to adapt to many kinds of systems. +\`configure' configures OpenAxiom 1.3.0-2008-09-05 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1475,7 +1475,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of OpenAxiom 1.3.0-2008-09-04:";; + short | recursive ) echo "Configuration of OpenAxiom 1.3.0-2008-09-05:";; esac cat <<\_ACEOF @@ -1579,7 +1579,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -OpenAxiom configure 1.3.0-2008-09-04 +OpenAxiom configure 1.3.0-2008-09-05 generated by GNU Autoconf 2.60 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1593,7 +1593,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by OpenAxiom $as_me 1.3.0-2008-09-04, which was +It was created by OpenAxiom $as_me 1.3.0-2008-09-05, which was generated by GNU Autoconf 2.60. Invocation command line was $ $0 $@ @@ -26103,7 +26103,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by OpenAxiom $as_me 1.3.0-2008-09-04, which was +This file was extended by OpenAxiom $as_me 1.3.0-2008-09-05, which was generated by GNU Autoconf 2.60. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -26152,7 +26152,7 @@ Report bugs to <bug-autoconf@gnu.org>." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -OpenAxiom config.status 1.3.0-2008-09-04 +OpenAxiom config.status 1.3.0-2008-09-05 configured by $0, generated by GNU Autoconf 2.60, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index 66de3ae2..ec14de71 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ sinclude(config/open-axiom.m4) sinclude(config/aclocal.m4) -AC_INIT([OpenAxiom], [1.3.0-2008-09-04], +AC_INIT([OpenAxiom], [1.3.0-2008-09-05], [open-axiom-bugs@lists.sf.net]) AC_CONFIG_AUX_DIR(config) diff --git a/configure.ac.pamphlet b/configure.ac.pamphlet index 2407441b..20279c76 100644 --- a/configure.ac.pamphlet +++ b/configure.ac.pamphlet @@ -1131,7 +1131,7 @@ information: <<Autoconf init>>= sinclude(config/open-axiom.m4) sinclude(config/aclocal.m4) -AC_INIT([OpenAxiom], [1.3.0-2008-09-04], +AC_INIT([OpenAxiom], [1.3.0-2008-09-05], [open-axiom-bugs@lists.sf.net]) @ diff --git a/src/ChangeLog b/src/ChangeLog index 2ac47896..dc93a3c5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,23 @@ 2008-09-06 Gabriel Dos Reis <gdr@cs.tamu.edu> + * interp/sys-os.boot (openIP4ClientStreamSocket): New. + (readFromStreamSocket): Likewise. + (writeToStreamSocket): Likewise. + (closeSocket): Likewise. + * include/sockio.h: Include <arpa/inet.h> + (oa_open_ip4_client_stream_socket): Declare. + (oa_socket_write): Likewise. + (oa_socket_read): Likewise. + * lib/sockio-c.c (openaxiom_unload_socket_module): New. + (openaxiom_load_socket_module): Tidy. + (openaxiom_socket_is_invalid): New. + (is_invalid_socket): Use it. + (oa_open_ip4_client_stream_socket): Define. + (oa_socket_read): Likewise. + (oa_socket_write): Likewise. + +2008-09-06 Gabriel Dos Reis <gdr@cs.tamu.edu> + * lib/cfuns-c.c (oa_unlink): Tidy. 2008-09-05 Gabriel Dos Reis <gdr@cs.tamu.edu> diff --git a/src/include/sockio.h b/src/include/sockio.h index 50fe3287..15202d93 100644 --- a/src/include/sockio.h +++ b/src/include/sockio.h @@ -40,11 +40,14 @@ #ifdef __MINGW32__ # include <winsock2.h> +# define OPENAXIOM_INVALID_SOCKET INVALID_SOCKET #else # include <sys/types.h> # include <sys/socket.h> # include <netinet/in.h> +# include <arpa/inet.h> # include <sys/un.h> +# define OPENAXIOM_INVALID_SOCKET (-1) #endif #include "openaxiom-c-macros.h" @@ -61,7 +64,7 @@ typedef SOCKET openaxiom_socket; #else typedef int openaxiom_socket; #endif - +typedef int openaxiom_port; typedef struct openaxiom_sio { openaxiom_socket socket; /* descriptor of this socket I/O endpoint. */ @@ -82,6 +85,13 @@ typedef struct openaxiom_sio { OPENAXIOM_EXPORT int oa_open_local_client_stream_socket(const char*); OPENAXIOM_EXPORT int oa_open_local_server_stream_socket(const char*); +OPENAXIOM_EXPORT openaxiom_socket +oa_open_ip4_client_stream_socket(const char*, openaxiom_port); +OPENAXIOM_EXPORT int oa_socket_write(openaxiom_socket, + const openaxiom_byte*, int); +OPENAXIOM_EXPORT int oa_socket_read(openaxiom_socket, + openaxiom_byte*, int); +OPENAXIOM_EXPORT void oa_close_socket(openaxiom_socket); OPENAXIOM_EXPORT int oa_filedesc_write(int, const openaxiom_byte*, int); OPENAXIOM_EXPORT int oa_filedesc_read(int, openaxiom_byte*, int); @@ -104,7 +114,6 @@ OPENAXIOM_EXPORT int open_server(const char*); OPENAXIOM_EXPORT int accept_connection(openaxiom_sio*); OPENAXIOM_EXPORT int sselect(int, fd_set*, fd_set*, fd_set*, void*); OPENAXIOM_EXPORT void close_socket(openaxiom_socket, const char*); -OPENAXIOM_EXPORT void axiom_close_socket(openaxiom_socket); OPENAXIOM_EXPORT int get_int(openaxiom_sio*); OPENAXIOM_EXPORT double get_float(openaxiom_sio*); diff --git a/src/interp/sys-os.boot b/src/interp/sys-os.boot index 85e9523d..9f22adf0 100644 --- a/src/interp/sys-os.boot +++ b/src/interp/sys-os.boot @@ -72,15 +72,29 @@ import writeToFileHandle for import closeFileHandle for oa__filedesc__close: int -> int -- -1: failure; otherwise 0. +import getEnv for + oa__getenv: string -> string + --% Local IPC socket support import openLocalClientStreamSocket for oa__open__local__client__stream__socket: string -> int -- -1: failure ---% OpenAxiom subsystem socket support +--% INET socket stream support -import getEnv for - oa__getenv: string -> string +import openIP4ClientStreamSocket for + oa__open__ip4__client__stream__socket: (string,int) -> int + +import readFromStreamSocket for + oa__socket__read: (int,string,int) -> int + +import writeToStreamSocket for + oa__socket__write: (int,string,int) -> int + +import closeSocket for + oa__close__socket: int -> int + +--% OpenAxiom subsystem socket support ++ socket interface import openServer for diff --git a/src/lib/sockio-c.c b/src/lib/sockio-c.c index 9fcd8cca..2f93b254 100644 --- a/src/lib/sockio-c.c +++ b/src/lib/sockio-c.c @@ -48,6 +48,7 @@ #include <string.h> #include <signal.h> +#include "cfuns.h" #include "sockio.h" #include "com.h" #include "bsdsignal.h" @@ -109,11 +110,24 @@ openaxiom_sleep(int n) #endif } +/* Non zero if the host system module support for socket is activated. + This is needed only for MS platforms. */ +static int openaxiom_socket_module_loaded = 0; + /* Windows require some handshaking with the WinSock DLL before we can even think about talking about sockets. */ static void -openaxiom_load_socket_module() +openaxiom_unload_socket_module(void) +{ +#ifdef __WIN32__ + WSACleanup(); + openaxiom_socket_moduler_loaded = 0; +#endif +} + +static void +openaxiom_load_socket_module(void) { #ifdef __WIN32__ WSADATA wsaData; @@ -123,22 +137,25 @@ openaxiom_load_socket_module() perror("could not find suitable WinSock DLL."); exit(WSAGetLastError()); } + + atexit(&openaxiom_unload_socket_module); if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) { perror("could not find suitable WinSock DLL."); - WSACleanup(); exit(WSAGetLastError()); } #endif + openaxiom_socket_module_loaded = 1; } /* Get a socket identifier to a local server. We take whatever protocol is the default for the address family in the SOCK_STREAM type. */ static inline openaxiom_socket -openaxiom_communication_link(int family) +openaxiom_socket_stream_link(int family) { - openaxiom_load_socket_module(); + if (!openaxiom_socket_module_loaded) + openaxiom_load_socket_module(); return socket(family, SOCK_STREAM, 0); } @@ -146,15 +163,21 @@ openaxiom_communication_link(int family) /* Returns 1 if SOCKET is an invalid socket. Otherwise return 0. */ static inline int -is_invalid_socket(const openaxiom_sio* s) +openaxiom_socket_is_invalid(openaxiom_socket sock) { #ifdef __WIN32__ - return s->socket == INVALID_SOCKET; + return sock == INVALID_SOCKET; #else - return s->socket < 0; + return sock < 0; #endif } +static inline int +is_invalid_socket(const openaxiom_sio* s) +{ + return openaxiom_socket_is_invalid(s->socket); +} + /* Returns 1 if SOCKET is a valid socket. Otherwise return 0. */ static inline int @@ -174,36 +197,17 @@ is_valid_socket(const openaxiom_sio* s) any other file descriptor function. Furthermore, Windows requires cleanup. */ -void -openaxiom_close_socket(openaxiom_socket s) +OPENAXIOM_EXPORT void +oa_close_socket(openaxiom_socket s) { #ifdef __WIN32__ shutdown(s, SD_BOTH); closesocket(s); - WSACleanup(); #else close(s); #endif } -/* It is idiomatic in the Unix/POSIX world to use the standard - read() and write() functions on sockets. However, in the Windows - world, that is invalid. Consequently, portability suggests that - we restrict ourselves to the POSIX standard functions recv() and - send(). */ - -static inline int -openaxiom_write(openaxiom_sio* s, const openaxiom_byte* buf, size_t n) -{ - return send(s->socket, buf, n, 0); -} - -static inline int -openaxiom_read(openaxiom_sio* s, openaxiom_byte* buf, size_t n) -{ - return recv(s->socket, buf, n, 0); -} - /* Local IPC Socket: On POSIX systems, this is just the Local IPC Socket. On Windows, we Windows Named Pipes. @@ -304,6 +308,50 @@ oa_filedesc_close(int desc) #endif } +/* IP sockets. +*/ + +OPENAXIOM_EXPORT openaxiom_socket +oa_open_ip4_client_stream_socket(const char* addr, openaxiom_port port) +{ + struct sockaddr_in server; + openaxiom_socket sock = openaxiom_socket_stream_link(AF_INET); + if (openaxiom_socket_is_invalid(sock)) + return OPENAXIOM_INVALID_SOCKET; + memset(&server, 0, sizeof server); + server.sin_family = AF_INET; + if (inet_pton(AF_INET, addr, &server.sin_addr) <= 0) { + fflush(stderr); + oa_close_socket(sock); + return OPENAXIOM_INVALID_SOCKET; + } + server.sin_port = htons(port); + if (connect(sock, (struct sockaddr*)&server, sizeof server) < 0) { + fflush(stderr); + oa_close_socket(sock); + return OPENAXIOM_INVALID_SOCKET; + } + return sock; +} + +/* It is idiomatic in the Unix/POSIX world to use the standard + read() and write() functions on sockets. However, in the Windows + world, that is invalid. Consequently, portability suggests that + we restrict ourselves to the POSIX standard functions recv() and + send(). */ + +OPENAXIOM_EXPORT int +oa_socket_read(openaxiom_socket sock, openaxiom_byte* buf, int size) +{ + return recv(sock, buf, size, 0); +} + +OPENAXIOM_EXPORT int +oa_socket_write(openaxiom_socket sock, const openaxiom_byte* buf, int size) +{ + return send(sock, buf, size, 0); +} + /* Return 1 is the last call was cancelled. */ @@ -379,12 +427,12 @@ sread(openaxiom_sio* sock, openaxiom_byte* buf, int buf_size, const char *msg) char err_msg[256]; errno = 0; do { - ret_val = openaxiom_read(sock, buf, buf_size); + ret_val = oa_socket_read(sock->socket, buf, buf_size); } while (ret_val == -1 && openaxiom_syscall_was_cancelled()); if (ret_val == 0) { FD_CLR(sock->socket, &socket_mask); purpose_table[sock->purpose] = NULL; - openaxiom_close_socket(sock->socket); + oa_close_socket(sock->socket); return wait_for_client_read(sock, buf, buf_size, msg); } if (ret_val == -1) { @@ -405,13 +453,13 @@ swrite(openaxiom_sio* sock, const openaxiom_byte* buf, int buf_size, char err_msg[256]; errno = 0; socket_closed = 0; - ret_val = openaxiom_write(sock, buf, buf_size); + ret_val = oa_socket_write(sock->socket, buf, buf_size); if (ret_val == -1) { if (socket_closed) { FD_CLR(sock->socket, &socket_mask); purpose_table[sock->purpose] = NULL; /* printf(" closing socket %d\n", sock->socket); */ - openaxiom_close_socket(sock->socket); + oa_close_socket(sock->socket); return wait_for_client_write(sock, buf, buf_size, msg); } else { if (msg) { @@ -820,7 +868,7 @@ send_signal(openaxiom_sio *sock, int sig) FD_CLR(sock->socket, &socket_mask); purpose_table[sock->purpose] = NULL; /* printf(" closing socket %d\n", sock->socket); */ - openaxiom_close_socket(sock->socket); + oa_close_socket(sock->socket); return wait_for_client_kill(sock, sig); } return ret_val; @@ -866,7 +914,7 @@ connect_to_local_server_new(char *server_name, int purpose, int time_out) return NULL; } - sock->socket = openaxiom_communication_link(OPENAXIOM_AF_LOCAL); + sock->socket = openaxiom_socket_stream_link(OPENAXIOM_AF_LOCAL); if (is_invalid_socket(sock)) { perror("opening client socket"); free(sock); @@ -920,7 +968,7 @@ connect_to_local_server(char *server_name, int purpose, int time_out) sock->purpose = purpose; /* create the socket */ - sock->socket = openaxiom_communication_link(OPENAXIOM_AF_LOCAL); + sock->socket = openaxiom_socket_stream_link(OPENAXIOM_AF_LOCAL); if (is_invalid_socket(sock)) { perror("opening client socket"); free(sock); @@ -1013,10 +1061,8 @@ make_server_number(void) OPENAXIOM_EXPORT void close_socket(openaxiom_socket socket_num, const char *name) { - openaxiom_close_socket(socket_num); -#ifndef RTplatform - unlink(name); -#endif + oa_close_socket(socket_num); + oa_unlink(name); } OPENAXIOM_EXPORT int @@ -1053,7 +1099,7 @@ open_server(const char* server_name) return -2; /* create the socket internet socket */ server[0].socket = 0; -/* server[0].socket = openaxiom_communication_link(AF_INET); +/* server[0].socket = openaxiom_socket_stream_link(AF_INET); if (is_invalid_socket(&server[0])) { server[0].socket = 0; } else { @@ -1078,7 +1124,7 @@ open_server(const char* server_name) listen(server[0].socket,5); } */ /* Next create the local domain socket */ - server[1].socket = openaxiom_communication_link(OPENAXIOM_AF_LOCAL); + server[1].socket = openaxiom_socket_stream_link(OPENAXIOM_AF_LOCAL); if (is_invalid_socket(&server[1])) { perror("opening local server socket"); server[1].socket = 0; |