guile/libguile/socket.c

1773 lines
52 KiB
C
Raw Normal View History

/* Copyright (C) 1996-1998, 2000-2007, 2009, 2011-2015
* Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 3 of
* the License, or (at your option) any later version.
1996-08-30 03:35:46 +00:00
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
1996-08-30 03:35:46 +00:00
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <errno.h>
#include <verify.h>
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
#include <sys/un.h>
#endif
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <gmp.h>
#include "libguile/_scm.h"
#include "libguile/arrays.h"
#include "libguile/feature.h"
#include "libguile/fports.h"
#include "libguile/strings.h"
#include "libguile/vectors.h"
#include "libguile/dynwind.h"
#include "libguile/srfi-13.h"
#include "libguile/validate.h"
#include "libguile/socket.h"
#if defined (HAVE_UNIX_DOMAIN_SOCKETS) && !defined (SUN_LEN)
#define SUN_LEN(ptr) (offsetof (struct sockaddr_un, sun_path) \
+ strlen ((ptr)->sun_path))
#endif
2007-09-02 22:56:56 +00:00
/* The largest possible socket address. Wrapping it in a union guarantees
that the compiler will make it suitably aligned. */
typedef union
{
struct sockaddr sockaddr;
struct sockaddr_in sockaddr_in;
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
struct sockaddr_un sockaddr_un;
#endif
#ifdef HAVE_IPV6
struct sockaddr_in6 sockaddr_in6;
#endif
} scm_t_max_sockaddr;
/* Maximum size of a socket address. */
#define MAX_ADDR_SIZE (sizeof (scm_t_max_sockaddr))
#ifdef HAVE_INET_NETOF
SCM_DEFINE (scm_inet_netof, "inet-netof", 1, 0, 0,
(SCM address),
"Return the network number part of the given IPv4\n"
"Internet address. E.g.,\n\n"
"@lisp\n"
"(inet-netof 2130706433) @result{} 127\n"
"@end lisp")
#define FUNC_NAME s_scm_inet_netof
{
struct in_addr addr;
addr.s_addr = htonl (SCM_NUM2ULONG (1, address));
return scm_from_ulong (inet_netof (addr));
}
#undef FUNC_NAME
#endif
#ifdef HAVE_INET_LNAOF
SCM_DEFINE (scm_lnaof, "inet-lnaof", 1, 0, 0,
(SCM address),
"Return the local-address-with-network part of the given\n"
"IPv4 Internet address, using the obsolete class A/B/C system.\n"
"E.g.,\n\n"
"@lisp\n"
"(inet-lnaof 2130706433) @result{} 1\n"
"@end lisp")
#define FUNC_NAME s_scm_lnaof
{
struct in_addr addr;
addr.s_addr = htonl (SCM_NUM2ULONG (1, address));
return scm_from_ulong (inet_lnaof (addr));
}
#undef FUNC_NAME
#endif
#ifdef HAVE_INET_MAKEADDR
SCM_DEFINE (scm_inet_makeaddr, "inet-makeaddr", 2, 0, 0,
(SCM net, SCM lna),
"Make an IPv4 Internet address by combining the network number\n"
"@var{net} with the local-address-within-network number\n"
"@var{lna}. E.g.,\n\n"
"@lisp\n"
"(inet-makeaddr 127 1) @result{} 2130706433\n"
"@end lisp")
#define FUNC_NAME s_scm_inet_makeaddr
{
struct in_addr addr;
unsigned long netnum;
unsigned long lnanum;
netnum = SCM_NUM2ULONG (1, net);
lnanum = SCM_NUM2ULONG (2, lna);
addr = inet_makeaddr (netnum, lnanum);
return scm_from_ulong (ntohl (addr.s_addr));
}
#undef FUNC_NAME
#endif
#ifdef HAVE_IPV6
/* flip a 128 bit IPv6 address between host and network order. */
#ifdef WORDS_BIGENDIAN
#define FLIP_NET_HOST_128(addr)
#else
#define FLIP_NET_HOST_128(addr)\
{\
int i;\
\
for (i = 0; i < 8; i++)\
{\
scm_t_uint8 c = (addr)[i];\
\
(addr)[i] = (addr)[15 - i];\
(addr)[15 - i] = c;\
}\
}
#endif
#ifdef WORDS_BIGENDIAN
#define FLIPCPY_NET_HOST_128(dest, src) memcpy (dest, src, 16)
#else
#define FLIPCPY_NET_HOST_128(dest, src) \
{ \
const scm_t_uint8 *tmp_srcp = (src) + 15; \
scm_t_uint8 *tmp_destp = (dest); \
\
do { \
*tmp_destp++ = *tmp_srcp--; \
} while (tmp_srcp != (src)); \
}
#endif
2003-04-16 19:45:01 +00:00
#if (SIZEOF_SCM_T_BITS * SCM_CHAR_BIT) > 128
#error "Assumption that scm_t_bits <= 128 bits has been violated."
#endif
2003-04-16 19:45:01 +00:00
#if (SIZEOF_UNSIGNED_LONG * SCM_CHAR_BIT) > 128
#error "Assumption that unsigned long <= 128 bits has been violated."
#endif
2003-04-16 19:45:01 +00:00
#if (SIZEOF_UNSIGNED_LONG_LONG * SCM_CHAR_BIT) > 128
#error "Assumption that unsigned long long <= 128 bits has been violated."
#endif
/* convert a 128 bit IPv6 address in network order to a host ordered
SCM integer. */
static SCM
scm_from_ipv6 (const scm_t_uint8 *src)
{
SCM result = scm_i_mkbig ();
mpz_import (SCM_I_BIG_MPZ (result),
1, /* chunk */
1, /* big-endian chunk ordering */
16, /* chunks are 16 bytes long */
1, /* big-endian byte ordering */
0, /* "nails" -- leading unused bits per chunk */
src);
return scm_i_normbig (result);
}
/* convert a host ordered SCM integer to a 128 bit IPv6 address in
network order. */
static void
scm_to_ipv6 (scm_t_uint8 dst[16], SCM src)
{
if (SCM_I_INUMP (src))
{
scm_t_signed_bits n = SCM_I_INUM (src);
if (n < 0)
scm_out_of_range (NULL, src);
#ifdef WORDS_BIGENDIAN
memset (dst, 0, 16 - sizeof (scm_t_signed_bits));
memcpy (dst + (16 - sizeof (scm_t_signed_bits)),
&n,
sizeof (scm_t_signed_bits));
#else
memset (dst + sizeof (scm_t_signed_bits),
0,
16 - sizeof (scm_t_signed_bits));
/* FIXME: this pair of ops is kinda wasteful -- should rewrite as
a single loop perhaps, similar to the handling of bignums. */
memcpy (dst, &n, sizeof (scm_t_signed_bits));
FLIP_NET_HOST_128 (dst);
#endif
}
else if (SCM_BIGP (src))
{
size_t count;
if ((mpz_sgn (SCM_I_BIG_MPZ (src)) < 0)
|| mpz_sizeinbase (SCM_I_BIG_MPZ (src), 2) > 128)
scm_out_of_range (NULL, src);
memset (dst, 0, 16);
mpz_export (dst,
&count,
1, /* big-endian chunk ordering */
16, /* chunks are 16 bytes long */
1, /* big-endian byte ordering */
0, /* "nails" -- leading unused bits per chunk */
SCM_I_BIG_MPZ (src));
scm_remember_upto_here_1 (src);
}
else
scm_wrong_type_arg_msg ("scm_to_ipv6", 0, src, "integer");
}
#endif /* HAVE_IPV6 */
SCM_DEFINE (scm_inet_ntop, "inet-ntop", 2, 0, 0,
(SCM family, SCM address),
"Convert a network address into a printable string.\n"
"Note that unlike the C version of this function,\n"
"the input is an integer with normal host byte ordering.\n"
"@var{family} can be @code{AF_INET} or @code{AF_INET6}. E.g.,\n\n"
"@lisp\n"
"(inet-ntop AF_INET 2130706433) @result{} \"127.0.0.1\"\n"
"(inet-ntop AF_INET6 (- (expt 2 128) 1))\n"
" @result{} \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\"\n"
"@end lisp")
#define FUNC_NAME s_scm_inet_ntop
{
int af;
#ifdef INET6_ADDRSTRLEN
char dst[INET6_ADDRSTRLEN];
#else
char dst[46];
#endif
2007-06-12 21:55:11 +00:00
const char *result;
af = scm_to_int (family);
SCM_ASSERT_RANGE (1, family,
af == AF_INET
#ifdef HAVE_IPV6
|| af == AF_INET6
#endif
);
if (af == AF_INET)
2007-06-12 21:55:11 +00:00
{
scm_t_uint32 addr4;
addr4 = htonl (SCM_NUM2ULONG (2, address));
result = inet_ntop (af, &addr4, dst, sizeof (dst));
}
#ifdef HAVE_IPV6
else if (af == AF_INET6)
2007-06-12 21:55:11 +00:00
{
char addr6[16];
scm_to_ipv6 ((scm_t_uint8 *) addr6, address);
result = inet_ntop (af, &addr6, dst, sizeof (dst));
}
#endif
else
SCM_MISC_ERROR ("unsupported address family", family);
2007-06-12 21:55:11 +00:00
if (result == NULL)
SCM_SYSERROR;
2007-06-12 21:55:11 +00:00
return scm_from_locale_string (dst);
}
#undef FUNC_NAME
SCM_DEFINE (scm_inet_pton, "inet-pton", 2, 0, 0,
(SCM family, SCM address),
"Convert a string containing a printable network address to\n"
"an integer address. Note that unlike the C version of this\n"
"function,\n"
"the result is an integer with normal host byte ordering.\n"
"@var{family} can be @code{AF_INET} or @code{AF_INET6}. E.g.,\n\n"
"@lisp\n"
"(inet-pton AF_INET \"127.0.0.1\") @result{} 2130706433\n"
"(inet-pton AF_INET6 \"::1\") @result{} 1\n"
"@end lisp")
#define FUNC_NAME s_scm_inet_pton
{
int af;
char *src;
scm_t_uint32 dst[4];
int rv, eno;
af = scm_to_int (family);
SCM_ASSERT_RANGE (1, family,
af == AF_INET
#ifdef HAVE_IPV6
|| af == AF_INET6
#endif
);
src = scm_to_locale_string (address);
rv = inet_pton (af, src, dst);
eno = errno;
free (src);
errno = eno;
if (rv == -1)
SCM_SYSERROR;
else if (rv == 0)
SCM_MISC_ERROR ("Bad address", SCM_EOL);
if (af == AF_INET)
return scm_from_ulong (ntohl (*dst));
#ifdef HAVE_IPV6
else if (af == AF_INET6)
return scm_from_ipv6 ((scm_t_uint8 *) dst);
#endif
else
SCM_MISC_ERROR ("unsupported address family", family);
}
#undef FUNC_NAME
SCM_SYMBOL (sym_socket, "socket");
static SCM
scm_socket_fd_to_port (int fd)
{
return scm_i_fdes_to_port (fd, scm_mode_bits ("r+0"), sym_socket,
SCM_FPORT_OPTION_NOT_SEEKABLE);
}
SCM_DEFINE (scm_socket, "socket", 3, 0, 0,
(SCM family, SCM style, SCM proto),
"Return a new socket port of the type specified by @var{family},\n"
"@var{style} and @var{proto}. All three parameters are\n"
"integers. Supported values for @var{family} are\n"
"@code{AF_UNIX}, @code{AF_INET} and @code{AF_INET6}.\n"
"Typical values for @var{style} are @code{SOCK_STREAM},\n"
"@code{SOCK_DGRAM} and @code{SOCK_RAW}.\n\n"
"@var{proto} can be obtained from a protocol name using\n"
"@code{getprotobyname}. A value of zero specifies the default\n"
"protocol, which is usually right.\n\n"
"A single socket port cannot by used for communication until it\n"
"has been connected to another socket.")
#define FUNC_NAME s_scm_socket
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fd;
fd = socket (scm_to_int (family),
scm_to_int (style),
scm_to_int (proto));
if (fd == -1)
SCM_SYSERROR;
return scm_socket_fd_to_port (fd);
}
#undef FUNC_NAME
#ifdef HAVE_SOCKETPAIR
SCM_DEFINE (scm_socketpair, "socketpair", 3, 0, 0,
(SCM family, SCM style, SCM proto),
"Return a pair of connected (but unnamed) socket ports of the\n"
"type specified by @var{family}, @var{style} and @var{proto}.\n"
"Many systems support only socket pairs of the @code{AF_UNIX}\n"
"family. Zero is likely to be the only meaningful value for\n"
"@var{proto}.")
#define FUNC_NAME s_scm_socketpair
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fam;
int fd[2];
fam = scm_to_int (family);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
if (socketpair (fam, scm_to_int (style), scm_to_int (proto), fd) == -1)
SCM_SYSERROR;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
return scm_cons (scm_socket_fd_to_port (fd[0]),
scm_socket_fd_to_port (fd[1]));
}
#undef FUNC_NAME
#endif
2007-09-02 22:56:56 +00:00
/* Possible results for `getsockopt ()'. Wrapping it into a union guarantees
suitable alignment. */
typedef union
{
#ifdef HAVE_STRUCT_LINGER
struct linger linger;
#endif
size_t size;
int integer;
} scm_t_getsockopt_result;
SCM_DEFINE (scm_getsockopt, "getsockopt", 3, 0, 0,
(SCM sock, SCM level, SCM optname),
"Return an option value from socket port @var{sock}.\n"
"\n"
"@var{level} is an integer specifying a protocol layer, either\n"
"@code{SOL_SOCKET} for socket level options, or a protocol\n"
"number from the @code{IPPROTO} constants or @code{getprotoent}\n"
"(@pxref{Network Databases}).\n"
"\n"
"@defvar SOL_SOCKET\n"
"@defvarx IPPROTO_IP\n"
"@defvarx IPPROTO_TCP\n"
"@defvarx IPPROTO_UDP\n"
"@end defvar\n"
"\n"
"@var{optname} is an integer specifying an option within the\n"
"protocol layer.\n"
"\n"
"For @code{SOL_SOCKET} level the following @var{optname}s are\n"
"defined (when provided by the system). For their meaning see\n"
"@ref{Socket-Level Options,,, libc, The GNU C Library Reference\n"
"Manual}, or @command{man 7 socket}.\n"
"\n"
"@defvar SO_DEBUG\n"
"@defvarx SO_REUSEADDR\n"
"@defvarx SO_STYLE\n"
"@defvarx SO_TYPE\n"
"@defvarx SO_ERROR\n"
"@defvarx SO_DONTROUTE\n"
"@defvarx SO_BROADCAST\n"
"@defvarx SO_SNDBUF\n"
"@defvarx SO_RCVBUF\n"
"@defvarx SO_KEEPALIVE\n"
"@defvarx SO_OOBINLINE\n"
"@defvarx SO_NO_CHECK\n"
"@defvarx SO_PRIORITY\n"
"@defvarx SO_REUSEPORT\n"
"The value returned is an integer.\n"
"@end defvar\n"
"\n"
"@defvar SO_LINGER\n"
"The value returned is a pair of integers\n"
"@code{(@var{enable} . @var{timeout})}. On old systems without\n"
"timeout support (ie.@: without @code{struct linger}), only\n"
"@var{enable} has an effect but the value in Guile is always a\n"
"pair.\n"
"@end defvar")
#define FUNC_NAME s_scm_getsockopt
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fd;
/* size of optval is the largest supported option. */
2007-09-02 22:56:56 +00:00
scm_t_getsockopt_result optval;
socklen_t optlen = sizeof (optval);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int ilevel;
int ioptname;
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
ilevel = scm_to_int (level);
ioptname = scm_to_int (optname);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
2007-09-02 22:56:56 +00:00
if (getsockopt (fd, ilevel, ioptname, (void *) &optval, &optlen) == -1)
SCM_SYSERROR;
if (ilevel == SOL_SOCKET)
{
#ifdef SO_LINGER
if (ioptname == SO_LINGER)
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#ifdef HAVE_STRUCT_LINGER
2007-09-02 22:56:56 +00:00
struct linger *ling = (struct linger *) &optval;
return scm_cons (scm_from_long (ling->l_onoff),
scm_from_long (ling->l_linger));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#else
2007-09-02 22:56:56 +00:00
return scm_cons (scm_from_long (*(int *) &optval),
scm_from_int (0));
#endif
}
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
}
2007-09-02 22:56:56 +00:00
return scm_from_int (*(int *) &optval);
}
#undef FUNC_NAME
SCM_DEFINE (scm_setsockopt, "setsockopt", 4, 0, 0,
(SCM sock, SCM level, SCM optname, SCM value),
"Set an option on socket port @var{sock}. The return value is\n"
"unspecified.\n"
"\n"
"@var{level} is an integer specifying a protocol layer, either\n"
"@code{SOL_SOCKET} for socket level options, or a protocol\n"
"number from the @code{IPPROTO} constants or @code{getprotoent}\n"
"(@pxref{Network Databases}).\n"
"\n"
"@defvar SOL_SOCKET\n"
"@defvarx IPPROTO_IP\n"
"@defvarx IPPROTO_TCP\n"
"@defvarx IPPROTO_UDP\n"
"@end defvar\n"
"\n"
"@var{optname} is an integer specifying an option within the\n"
"protocol layer.\n"
"\n"
"For @code{SOL_SOCKET} level the following @var{optname}s are\n"
"defined (when provided by the system). For their meaning see\n"
"@ref{Socket-Level Options,,, libc, The GNU C Library Reference\n"
"Manual}, or @command{man 7 socket}.\n"
"\n"
"@defvar SO_DEBUG\n"
"@defvarx SO_REUSEADDR\n"
"@defvarx SO_STYLE\n"
"@defvarx SO_TYPE\n"
"@defvarx SO_ERROR\n"
"@defvarx SO_DONTROUTE\n"
"@defvarx SO_BROADCAST\n"
"@defvarx SO_SNDBUF\n"
"@defvarx SO_RCVBUF\n"
"@defvarx SO_KEEPALIVE\n"
"@defvarx SO_OOBINLINE\n"
"@defvarx SO_NO_CHECK\n"
"@defvarx SO_PRIORITY\n"
"@defvarx SO_REUSEPORT\n"
"@var{value} is an integer.\n"
"@end defvar\n"
"\n"
"@defvar SO_LINGER\n"
"@var{value} is a pair of integers @code{(@var{ENABLE}\n"
". @var{TIMEOUT})}. On old systems without timeout support\n"
"(ie.@: without @code{struct linger}), only @var{ENABLE} has an\n"
"effect but the value in Guile is always a pair.\n"
"@end defvar\n"
"\n"
"@c Note that we refer only to ``man ip'' here. On GNU/Linux it's\n"
"@c ``man 7 ip'' but on NetBSD it's ``man 4 ip''.\n"
"@c \n"
"For IP level (@code{IPPROTO_IP}) the following @var{optname}s\n"
"are defined (when provided by the system). See @command{man\n"
"ip} for what they mean.\n"
"\n"
"@defvar IP_MULTICAST_IF\n"
"This sets the source interface used by multicast traffic.\n"
"@end defvar\n"
"\n"
"@defvar IP_MULTICAST_TTL\n"
"This sets the default TTL for multicast traffic. This defaults \n"
"to 1 and should be increased to allow traffic to pass beyond the\n"
"local network.\n"
"@end defvar\n"
"\n"
"@defvar IP_ADD_MEMBERSHIP\n"
"@defvarx IP_DROP_MEMBERSHIP\n"
"These can be used only with @code{setsockopt}, not\n"
"@code{getsockopt}. @var{value} is a pair\n"
"@code{(@var{MULTIADDR} . @var{INTERFACEADDR})} of IPv4\n"
"addresses (@pxref{Network Address Conversion}).\n"
"@var{MULTIADDR} is a multicast address to be added to or\n"
"dropped from the interface @var{INTERFACEADDR}.\n"
"@var{INTERFACEADDR} can be @code{INADDR_ANY} to have the system\n"
"select the interface. @var{INTERFACEADDR} can also be an\n"
"interface index number, on systems supporting that.\n"
"@end defvar")
#define FUNC_NAME s_scm_setsockopt
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fd;
int opt_int;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#ifdef HAVE_STRUCT_LINGER
struct linger opt_linger;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef HAVE_STRUCT_IP_MREQ
struct ip_mreq opt_mreq;
#endif
const void *optval = NULL;
socklen_t optlen = 0;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int ilevel, ioptname;
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
ilevel = scm_to_int (level);
ioptname = scm_to_int (optname);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
if (ilevel == SOL_SOCKET)
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
{
#ifdef SO_LINGER
if (ioptname == SO_LINGER)
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#ifdef HAVE_STRUCT_LINGER
2004-09-22 17:41:37 +00:00
SCM_ASSERT (scm_is_pair (value), value, SCM_ARG4, FUNC_NAME);
opt_linger.l_onoff = scm_to_int (SCM_CAR (value));
opt_linger.l_linger = scm_to_int (SCM_CDR (value));
optlen = sizeof (struct linger);
optval = &opt_linger;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#else
2004-09-22 17:41:37 +00:00
SCM_ASSERT (scm_is_pair (value), value, SCM_ARG4, FUNC_NAME);
opt_int = scm_to_int (SCM_CAR (value));
/* timeout is ignored, but may as well validate it. */
scm_to_int (SCM_CDR (value));
optlen = sizeof (int);
optval = &opt_int;
#endif
}
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
}
#ifdef HAVE_STRUCT_IP_MREQ
if (ilevel == IPPROTO_IP &&
(ioptname == IP_ADD_MEMBERSHIP || ioptname == IP_DROP_MEMBERSHIP))
{
/* Fourth argument must be a pair of addresses. */
SCM_ASSERT (scm_is_pair (value), value, SCM_ARG4, FUNC_NAME);
opt_mreq.imr_multiaddr.s_addr = htonl (scm_to_ulong (SCM_CAR (value)));
opt_mreq.imr_interface.s_addr = htonl (scm_to_ulong (SCM_CDR (value)));
optlen = sizeof (opt_mreq);
optval = &opt_mreq;
}
#endif
if (optval == NULL)
{
/* Most options take an int. */
opt_int = scm_to_int (value);
optlen = sizeof (int);
optval = &opt_int;
}
if (setsockopt (fd, ilevel, ioptname, optval, optlen) == -1)
SCM_SYSERROR;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
/* Our documentation hard-codes this mapping, so make sure it holds. */
verify (SHUT_RD == 0);
verify (SHUT_WR == 1);
verify (SHUT_RDWR == 2);
SCM_DEFINE (scm_shutdown, "shutdown", 2, 0, 0,
(SCM sock, SCM how),
"Sockets can be closed simply by using @code{close-port}. The\n"
2002-03-15 10:37:40 +00:00
"@code{shutdown} procedure allows reception or transmission on a\n"
"connection to be shut down individually, according to the parameter\n"
"@var{how}:\n\n"
"@table @asis\n"
"@item 0\n"
"Stop receiving data for this socket. If further data arrives, reject it.\n"
"@item 1\n"
"Stop trying to transmit data from this socket. Discard any\n"
"data waiting to be sent. Stop looking for acknowledgement of\n"
"data already sent; don't retransmit it if it is lost.\n"
"@item 2\n"
"Stop both reception and transmission.\n"
"@end table\n\n"
"The return value is unspecified.")
#define FUNC_NAME s_scm_shutdown
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fd;
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
if (shutdown (fd, scm_to_signed_integer (how, 0, 2)) == -1)
SCM_SYSERROR;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
/* convert fam/address/args into a sockaddr of the appropriate type.
args is modified by removing the arguments actually used.
which_arg and proc are used when reporting errors:
which_arg is the position of address in the original argument list.
proc is the name of the original procedure.
size returns the size of the structure allocated. */
static struct sockaddr *
scm_fill_sockaddr (int fam, SCM address, SCM *args, int which_arg,
const char *proc, size_t *size)
#define FUNC_NAME proc
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
{
switch (fam)
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
case AF_INET:
{
struct sockaddr_in *soka;
unsigned long addr;
int port;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM_VALIDATE_ULONG_COPY (which_arg, address, addr);
SCM_VALIDATE_CONS (which_arg + 1, *args);
port = scm_to_int (SCM_CAR (*args));
*args = SCM_CDR (*args);
soka = (struct sockaddr_in *) scm_malloc (sizeof (struct sockaddr_in));
memset (soka, '\0', sizeof (struct sockaddr_in));
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
soka->sin_len = sizeof (struct sockaddr_in);
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
soka->sin_family = AF_INET;
soka->sin_addr.s_addr = htonl (addr);
soka->sin_port = htons (port);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
*size = sizeof (struct sockaddr_in);
return (struct sockaddr *) soka;
}
#ifdef HAVE_IPV6
case AF_INET6:
{
/* see RFC2553. */
int port;
struct sockaddr_in6 *soka;
unsigned long flowinfo = 0;
unsigned long scope_id = 0;
SCM_VALIDATE_CONS (which_arg + 1, *args);
port = scm_to_int (SCM_CAR (*args));
*args = SCM_CDR (*args);
2004-09-22 17:41:37 +00:00
if (scm_is_pair (*args))
{
SCM_VALIDATE_ULONG_COPY (which_arg + 2, SCM_CAR (*args), flowinfo);
*args = SCM_CDR (*args);
2004-09-22 17:41:37 +00:00
if (scm_is_pair (*args))
{
SCM_VALIDATE_ULONG_COPY (which_arg + 3, SCM_CAR (*args),
scope_id);
*args = SCM_CDR (*args);
}
}
soka = (struct sockaddr_in6 *) scm_malloc (sizeof (struct sockaddr_in6));
#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
soka->sin6_len = sizeof (struct sockaddr_in6);
#endif
soka->sin6_family = AF_INET6;
scm_to_ipv6 (soka->sin6_addr.s6_addr, address);
soka->sin6_port = htons (port);
soka->sin6_flowinfo = flowinfo;
#ifdef HAVE_SIN6_SCOPE_ID
soka->sin6_scope_id = scope_id;
#endif
*size = sizeof (struct sockaddr_in6);
return (struct sockaddr *) soka;
}
#endif
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
case AF_UNIX:
{
struct sockaddr_un *soka;
int addr_size;
char *c_address;
scm_dynwind_begin (0);
c_address = scm_to_locale_string (address);
scm_dynwind_free (c_address);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
/* the static buffer size in sockaddr_un seems to be arbitrary
and not necessarily a hard limit. e.g., the glibc manual
suggests it may be possible to declare it size 0. let's
ignore it. if the O/S doesn't like the size it will cause
connect/bind etc., to fail. sun_path is always the last
member of the structure. */
addr_size = sizeof (struct sockaddr_un)
+ max (0, strlen (c_address) + 1 - (sizeof soka->sun_path));
soka = (struct sockaddr_un *) scm_malloc (addr_size);
memset (soka, 0, addr_size); /* for sun_len: see sin_len above. */
soka->sun_family = AF_UNIX;
strcpy (soka->sun_path, c_address);
*size = SUN_LEN (soka);
scm_dynwind_end ();
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
return (struct sockaddr *) soka;
}
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
default:
scm_out_of_range (proc, scm_from_int (fam));
}
}
#undef FUNC_NAME
SCM_DEFINE (scm_connect, "connect", 2, 1, 1,
(SCM sock, SCM fam_or_sockaddr, SCM address, SCM args),
"Initiate a connection from a socket using a specified address\n"
"family to the address\n"
"specified by @var{address} and possibly @var{args}.\n"
"The format required for @var{address}\n"
"and @var{args} depends on the family of the socket.\n\n"
"For a socket of family @code{AF_UNIX},\n"
"only @var{address} is specified and must be a string with the\n"
"filename where the socket is to be created.\n\n"
"For a socket of family @code{AF_INET},\n"
"@var{address} must be an integer IPv4 host address and\n"
"@var{args} must be a single integer port number.\n\n"
"For a socket of family @code{AF_INET6},\n"
"@var{address} must be an integer IPv6 host address and\n"
"@var{args} may be up to three integers:\n"
"port [flowinfo] [scope_id],\n"
"where flowinfo and scope_id default to zero.\n\n"
"Alternatively, the second argument can be a socket address object "
"as returned by @code{make-socket-address}, in which case the "
"no additional arguments should be passed.\n\n"
"Return true, unless the socket was configured to be non-blocking\n"
"and the operation has not finished yet.\n")
#define FUNC_NAME s_scm_connect
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fd;
struct sockaddr *soka;
size_t size;
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
if (scm_is_eq (address, SCM_UNDEFINED))
/* No third argument was passed to FAM_OR_SOCKADDR must actually be a
`socket address' object. */
soka = scm_to_sockaddr (fam_or_sockaddr, &size);
else
soka = scm_fill_sockaddr (scm_to_int (fam_or_sockaddr), address,
&args, 3, FUNC_NAME, &size);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
if (connect (fd, soka, size) == -1)
{
int save_errno = errno;
free (soka);
errno = save_errno;
if (errno == EINPROGRESS)
return SCM_BOOL_F;
SCM_SYSERROR;
}
free (soka);
return SCM_BOOL_T;
}
#undef FUNC_NAME
SCM_DEFINE (scm_bind, "bind", 2, 1, 1,
(SCM sock, SCM fam_or_sockaddr, SCM address, SCM args),
"Assign an address to the socket port @var{sock}.\n"
"Generally this only needs to be done for server sockets,\n"
"so they know where to look for incoming connections. A socket\n"
"without an address will be assigned one automatically when it\n"
"starts communicating.\n\n"
"The format of @var{address} and @var{args} depends\n"
"on the family of the socket.\n\n"
"For a socket of family @code{AF_UNIX}, only @var{address}\n"
"is specified and must be a string with the filename where\n"
"the socket is to be created.\n\n"
"For a socket of family @code{AF_INET}, @var{address}\n"
"must be an integer IPv4 address and @var{args}\n"
"must be a single integer port number.\n\n"
"The values of the following variables can also be used for\n"
"@var{address}:\n\n"
"@defvar INADDR_ANY\n"
"Allow connections from any address.\n"
"@end defvar\n\n"
"@defvar INADDR_LOOPBACK\n"
"The address of the local host using the loopback device.\n"
"@end defvar\n\n"
"@defvar INADDR_BROADCAST\n"
"The broadcast address on the local network.\n"
"@end defvar\n\n"
"@defvar INADDR_NONE\n"
"No address.\n"
"@end defvar\n\n"
"For a socket of family @code{AF_INET6}, @var{address}\n"
"must be an integer IPv6 address and @var{args}\n"
"may be up to three integers:\n"
"port [flowinfo] [scope_id],\n"
"where flowinfo and scope_id default to zero.\n\n"
"Alternatively, the second argument can be a socket address object "
"as returned by @code{make-socket-address}, in which case the "
"no additional arguments should be passed.\n\n"
"The return value is unspecified.")
#define FUNC_NAME s_scm_bind
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
{
struct sockaddr *soka;
size_t size;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fd;
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
if (scm_is_eq (address, SCM_UNDEFINED))
/* No third argument was passed to FAM_OR_SOCKADDR must actually be a
`socket address' object. */
soka = scm_to_sockaddr (fam_or_sockaddr, &size);
else
soka = scm_fill_sockaddr (scm_to_int (fam_or_sockaddr), address,
&args, 3, FUNC_NAME, &size);
if (bind (fd, soka, size) == -1)
{
int save_errno = errno;
free (soka);
errno = save_errno;
SCM_SYSERROR;
}
free (soka);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM_DEFINE (scm_listen, "listen", 2, 0, 0,
(SCM sock, SCM backlog),
"Enable @var{sock} to accept connection\n"
"requests. @var{backlog} is an integer specifying\n"
"the maximum length of the queue for pending connections.\n"
"If the queue fills, new clients will fail to connect until\n"
"the server calls @code{accept} to accept a connection from\n"
"the queue.\n\n"
"The return value is unspecified.")
#define FUNC_NAME s_scm_listen
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
{
int fd;
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
if (listen (fd, scm_to_int (backlog)) == -1)
SCM_SYSERROR;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
/* Put the components of a sockaddr into a new SCM vector. */
static SCM_C_INLINE_KEYWORD SCM
2007-09-02 22:56:56 +00:00
_scm_from_sockaddr (const scm_t_max_sockaddr *address, unsigned addr_size,
const char *proc)
{
2007-09-02 22:56:56 +00:00
SCM result = SCM_EOL;
short int fam = ((struct sockaddr *) address)->sa_family;
switch (fam)
{
case AF_INET:
{
const struct sockaddr_in *nad = (struct sockaddr_in *) address;
result = scm_c_make_vector (3, SCM_UNSPECIFIED);
SCM_SIMPLE_VECTOR_SET(result, 0,
scm_from_short (fam));
SCM_SIMPLE_VECTOR_SET(result, 1,
scm_from_ulong (ntohl (nad->sin_addr.s_addr)));
SCM_SIMPLE_VECTOR_SET(result, 2,
scm_from_ushort (ntohs (nad->sin_port)));
}
break;
#ifdef HAVE_IPV6
case AF_INET6:
{
const struct sockaddr_in6 *nad = (struct sockaddr_in6 *) address;
result = scm_c_make_vector (5, SCM_UNSPECIFIED);
SCM_SIMPLE_VECTOR_SET(result, 0, scm_from_short (fam));
SCM_SIMPLE_VECTOR_SET(result, 1, scm_from_ipv6 (nad->sin6_addr.s6_addr));
SCM_SIMPLE_VECTOR_SET(result, 2, scm_from_ushort (ntohs (nad->sin6_port)));
SCM_SIMPLE_VECTOR_SET(result, 3, scm_from_uint32 (nad->sin6_flowinfo));
#ifdef HAVE_SIN6_SCOPE_ID
SCM_SIMPLE_VECTOR_SET(result, 4, scm_from_ulong (nad->sin6_scope_id));
#else
SCM_SIMPLE_VECTOR_SET(result, 4, SCM_INUM0);
#endif
}
break;
#endif
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
case AF_UNIX:
{
const struct sockaddr_un *nad = (struct sockaddr_un *) address;
result = scm_c_make_vector (2, SCM_UNSPECIFIED);
SCM_SIMPLE_VECTOR_SET(result, 0, scm_from_short (fam));
/* When addr_size is not enough to cover sun_path, do not try
to access it. */
if (addr_size <= offsetof (struct sockaddr_un, sun_path))
SCM_SIMPLE_VECTOR_SET(result, 1, SCM_BOOL_F);
else
SCM_SIMPLE_VECTOR_SET(result, 1, scm_from_locale_string (nad->sun_path));
}
break;
#endif
default:
result = SCM_UNSPECIFIED;
scm_misc_error (proc, "unrecognised address family: ~A",
scm_list_1 (scm_from_int (fam)));
}
return result;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
}
/* The publicly-visible function. Return a Scheme object representing
ADDRESS, an address of ADDR_SIZE bytes. */
SCM
scm_from_sockaddr (const struct sockaddr *address, unsigned addr_size)
{
2007-09-02 22:56:56 +00:00
return (_scm_from_sockaddr ((scm_t_max_sockaddr *) address,
addr_size, "scm_from_sockaddr"));
}
/* Convert ADDRESS, an address object returned by either
`scm_from_sockaddr ()' or `scm_make_socket_address ()', into its C
representation. On success, a non-NULL pointer is returned and
ADDRESS_SIZE is updated to the actual size (in bytes) of the returned
address. The result must eventually be freed using `free ()'. */
struct sockaddr *
scm_to_sockaddr (SCM address, size_t *address_size)
#define FUNC_NAME "scm_to_sockaddr"
{
short int family;
struct sockaddr *c_address = NULL;
SCM_VALIDATE_VECTOR (1, address);
*address_size = 0;
family = scm_to_short (SCM_SIMPLE_VECTOR_REF (address, 0));
switch (family)
{
case AF_INET:
{
if (SCM_SIMPLE_VECTOR_LENGTH (address) != 3)
scm_misc_error (FUNC_NAME,
"invalid inet address representation: ~A",
scm_list_1 (address));
else
{
struct sockaddr_in c_inet;
memset (&c_inet, '\0', sizeof (struct sockaddr_in));
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
c_inet.sin_len = sizeof (struct sockaddr_in);
#endif
c_inet.sin_addr.s_addr =
htonl (scm_to_ulong (SCM_SIMPLE_VECTOR_REF (address, 1)));
c_inet.sin_port =
htons (scm_to_ushort (SCM_SIMPLE_VECTOR_REF (address, 2)));
c_inet.sin_family = AF_INET;
*address_size = sizeof (c_inet);
c_address = scm_malloc (sizeof (c_inet));
memcpy (c_address, &c_inet, sizeof (c_inet));
}
break;
}
#ifdef HAVE_IPV6
case AF_INET6:
{
if (SCM_SIMPLE_VECTOR_LENGTH (address) != 5)
scm_misc_error (FUNC_NAME, "invalid inet6 address representation: ~A",
scm_list_1 (address));
else
{
struct sockaddr_in6 c_inet6;
scm_to_ipv6 (c_inet6.sin6_addr.s6_addr,
SCM_SIMPLE_VECTOR_REF (address, 1));
c_inet6.sin6_port =
htons (scm_to_ushort (SCM_SIMPLE_VECTOR_REF (address, 2)));
c_inet6.sin6_flowinfo =
scm_to_uint32 (SCM_SIMPLE_VECTOR_REF (address, 3));
#ifdef HAVE_SIN6_SCOPE_ID
c_inet6.sin6_scope_id =
scm_to_ulong (SCM_SIMPLE_VECTOR_REF (address, 4));
#endif
c_inet6.sin6_family = AF_INET6;
*address_size = sizeof (c_inet6);
c_address = scm_malloc (sizeof (c_inet6));
memcpy (c_address, &c_inet6, sizeof (c_inet6));
}
break;
}
#endif
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
case AF_UNIX:
{
if (SCM_SIMPLE_VECTOR_LENGTH (address) != 2)
scm_misc_error (FUNC_NAME, "invalid unix address representation: ~A",
scm_list_1 (address));
else
{
SCM path;
size_t path_len = 0;
path = SCM_SIMPLE_VECTOR_REF (address, 1);
if (!scm_is_string (path) && !scm_is_false (path))
scm_misc_error (FUNC_NAME, "invalid unix address "
"path: ~A", scm_list_1 (path));
else
{
struct sockaddr_un c_unix;
if (scm_is_false (path))
path_len = 0;
else
path_len = scm_c_string_length (path);
#ifdef UNIX_PATH_MAX
if (path_len >= UNIX_PATH_MAX)
#else
/* We can hope that this limit will eventually vanish, at least on GNU.
However, currently, while glibc doesn't define `UNIX_PATH_MAX', it
documents it has being limited to 108 bytes. */
if (path_len >= sizeof (c_unix.sun_path))
#endif
scm_misc_error (FUNC_NAME, "unix address path "
"too long: ~A", scm_list_1 (path));
else
{
if (path_len)
{
scm_to_locale_stringbuf (path, c_unix.sun_path,
#ifdef UNIX_PATH_MAX
UNIX_PATH_MAX);
#else
sizeof (c_unix.sun_path));
#endif
c_unix.sun_path[path_len] = '\0';
/* Sanity check. */
if (strlen (c_unix.sun_path) != path_len)
scm_misc_error (FUNC_NAME, "unix address path "
"contains nul characters: ~A",
scm_list_1 (path));
}
else
c_unix.sun_path[0] = '\0';
c_unix.sun_family = AF_UNIX;
*address_size = SUN_LEN (&c_unix);
c_address = scm_malloc (sizeof (c_unix));
memcpy (c_address, &c_unix, sizeof (c_unix));
}
}
}
break;
}
#endif
default:
scm_misc_error (FUNC_NAME, "unrecognised address family: ~A",
scm_list_1 (scm_from_ushort (family)));
}
return c_address;
}
#undef FUNC_NAME
/* Return a newly-allocated `sockaddr' structure that reflects ADDRESS, being
an address of family FAMILY, with the family-specific parameters ARGS (see
the description of `connect' for details). The returned structure may be
freed using `free ()'. */
struct sockaddr *
scm_c_make_socket_address (SCM family, SCM address, SCM args,
size_t *address_size)
{
struct sockaddr *soka;
soka = scm_fill_sockaddr (scm_to_ushort (family), address, &args, 1,
"scm_c_make_socket_address", address_size);
return soka;
}
SCM_DEFINE (scm_make_socket_address, "make-socket-address", 2, 0, 1,
(SCM family, SCM address, SCM args),
"Return a Scheme address object that reflects @var{address}, "
"being an address of family @var{family}, with the "
"family-specific parameters @var{args} (see the description of "
"@code{connect} for details).")
#define FUNC_NAME s_scm_make_socket_address
{
2007-09-02 10:55:58 +00:00
SCM result = SCM_BOOL_F;
struct sockaddr *c_address;
size_t c_address_size;
c_address = scm_c_make_socket_address (family, address, args,
&c_address_size);
2007-09-02 10:55:58 +00:00
if (c_address != NULL)
{
result = scm_from_sockaddr (c_address, c_address_size);
free (c_address);
}
2007-09-02 10:55:58 +00:00
return result;
}
#undef FUNC_NAME
SCM_DEFINE (scm_accept4, "accept", 1, 1, 0,
(SCM sock, SCM flags),
"Accept a connection on a bound, listening socket. If there\n"
"are no pending connections in the queue, there are two\n"
"possibilities: if the socket has been configured as\n"
"non-blocking, return @code{#f} directly. Otherwise wait\n"
"until a connection is available. When a connection comes,\n"
"the return value is a pair in which the @emph{car} is a new\n"
"socket port for the connection and the @emph{cdr} is an\n"
"object with address information about the client which\n"
"initiated the connection.\n\n"
"@var{sock} does not become part of the\n"
"connection and will continue to accept new requests.")
#define FUNC_NAME s_scm_accept4
{
int fd;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int newfd;
int c_flags;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM address;
SCM newsock;
socklen_t addr_size = MAX_ADDR_SIZE;
2007-09-02 22:56:56 +00:00
scm_t_max_sockaddr addr;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
c_flags = SCM_UNBNDP (flags) ? 0 : scm_to_int (flags);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
SCM_SYSCALL (newfd = accept4 (fd, (struct sockaddr *) &addr, &addr_size,
c_flags));
if (newfd == -1)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)
return SCM_BOOL_F;
SCM_SYSERROR;
}
newsock = scm_socket_fd_to_port (newfd);
address = _scm_from_sockaddr (&addr, addr_size, FUNC_NAME);
2007-09-02 22:56:56 +00:00
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
return scm_cons (newsock, address);
}
#undef FUNC_NAME
SCM
scm_accept (SCM sock)
{
return scm_accept4 (sock, SCM_UNDEFINED);
}
SCM_DEFINE (scm_getsockname, "getsockname", 1, 0, 0,
(SCM sock),
"Return the address of @var{sock}, in the same form as the\n"
"object returned by @code{accept}. On many systems the address\n"
"of a socket in the @code{AF_FILE} namespace cannot be read.")
#define FUNC_NAME s_scm_getsockname
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fd;
socklen_t addr_size = MAX_ADDR_SIZE;
2007-09-02 22:56:56 +00:00
scm_t_max_sockaddr addr;
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
2007-09-02 22:56:56 +00:00
if (getsockname (fd, (struct sockaddr *) &addr, &addr_size) == -1)
SCM_SYSERROR;
2007-09-02 22:56:56 +00:00
return _scm_from_sockaddr (&addr, addr_size, FUNC_NAME);
}
#undef FUNC_NAME
SCM_DEFINE (scm_getpeername, "getpeername", 1, 0, 0,
(SCM sock),
"Return the address that @var{sock}\n"
"is connected to, in the same form as the object returned by\n"
"@code{accept}. On many systems the address of a socket in the\n"
"@code{AF_FILE} namespace cannot be read.")
#define FUNC_NAME s_scm_getpeername
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
int fd;
socklen_t addr_size = MAX_ADDR_SIZE;
2007-09-02 22:56:56 +00:00
scm_t_max_sockaddr addr;
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
2007-09-02 22:56:56 +00:00
if (getpeername (fd, (struct sockaddr *) &addr, &addr_size) == -1)
SCM_SYSERROR;
2007-09-02 22:56:56 +00:00
return _scm_from_sockaddr (&addr, addr_size, FUNC_NAME);
}
#undef FUNC_NAME
SCM_DEFINE (scm_recv, "recv!", 2, 1, 0,
(SCM sock, SCM buf, SCM flags),
"Receive data from a socket port.\n"
"@var{sock} must already\n"
"be bound to the address from which data is to be received.\n"
"@var{buf} is a bytevector into which\n"
"the data will be written. The size of @var{buf} limits\n"
"the amount of\n"
"data which can be received: in the case of packet\n"
"protocols, if a packet larger than this limit is encountered\n"
"then some data\n"
"will be irrevocably lost.\n\n"
"The optional @var{flags} argument is a value or\n"
"bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.\n\n"
"The value returned is the number of bytes read from the\n"
"socket.\n\n"
"Note that the data is read directly from the socket file\n"
"descriptor:\n"
2000-09-02 23:20:40 +00:00
"any unread buffered port data is ignored.")
#define FUNC_NAME s_scm_recv
{
int rv, fd, flg;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM_VALIDATE_OPFPORT (1, sock);
if (SCM_UNBNDP (flags))
flg = 0;
else
flg = scm_to_int (flags);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM_VALIDATE_BYTEVECTOR (1, buf);
SCM_SYSCALL (rv = recv (fd,
SCM_BYTEVECTOR_CONTENTS (buf),
SCM_BYTEVECTOR_LENGTH (buf),
flg));
if (SCM_UNLIKELY (rv == -1))
SCM_SYSERROR;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
scm_remember_upto_here (buf);
return scm_from_int (rv);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
}
#undef FUNC_NAME
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM_DEFINE (scm_send, "send", 2, 1, 0,
(SCM sock, SCM message, SCM flags),
"Transmit bytevector @var{message} on socket port @var{sock}.\n"
"@var{sock} must already be bound to a destination address. The\n"
"value returned is the number of bytes transmitted --\n"
"it's possible for\n"
"this to be less than the length of @var{message}\n"
"if the socket is\n"
"set to be non-blocking. The optional @var{flags} argument\n"
"is a value or\n"
"bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.\n\n"
"Note that the data is written directly to the socket\n"
"file descriptor:\n"
"any unflushed buffered port data is ignored.\n\n"
"This operation is defined only for strings containing codepoints\n"
"zero to 255.")
#define FUNC_NAME s_scm_send
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
{
int rv, fd, flg;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_OPFPORT (1, sock);
if (SCM_UNBNDP (flags))
flg = 0;
else
flg = scm_to_int (flags);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM_VALIDATE_BYTEVECTOR (1, message);
SCM_SYSCALL (rv = send (fd,
SCM_BYTEVECTOR_CONTENTS (message),
SCM_BYTEVECTOR_LENGTH (message),
flg));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
if (rv == -1)
SCM_SYSERROR;
scm_remember_upto_here_1 (message);
return scm_from_int (rv);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
}
#undef FUNC_NAME
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM_DEFINE (scm_recvfrom, "recvfrom!", 2, 3, 0,
(SCM sock, SCM buf, SCM flags, SCM start, SCM end),
2006-10-09 23:40:48 +00:00
"Receive data from socket port @var{sock} (which must be already\n"
"bound), returning the originating address as well as the data.\n"
"This is usually for use on datagram sockets, but can be used on\n"
"stream-oriented sockets too.\n"
"\n"
"The data received is stored in bytevector @var{buf}, using\n"
"either the whole bytevector or just the region between the optional\n"
"@var{start} and @var{end} positions. The size of @var{buf}\n"
"limits the amount of data that can be received. For datagram\n"
2006-10-09 23:40:48 +00:00
"protocols, if a packet larger than this is received then excess\n"
"bytes are irrevocably lost.\n"
"\n"
"The return value is a pair. The @code{car} is the number of\n"
"bytes read. The @code{cdr} is a socket address object which is\n"
"where the data came from, or @code{#f} if the origin is\n"
2006-10-09 23:40:48 +00:00
"unknown.\n"
"\n"
"The optional @var{flags} argument is a or bitwise OR\n"
"(@code{logior}) of @code{MSG_OOB}, @code{MSG_PEEK},\n"
"@code{MSG_DONTROUTE} etc.\n"
"\n"
"Data is read directly from the socket file descriptor, any\n"
"buffered port data is ignored.\n"
"\n"
"On a GNU/Linux system @code{recvfrom!} is not multi-threading,\n"
"all threads stop while a @code{recvfrom!} call is in progress.\n"
"An application may need to use @code{select}, @code{O_NONBLOCK}\n"
"or @code{MSG_DONTWAIT} to avoid this.")
#define FUNC_NAME s_scm_recvfrom
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
{
int rv, fd, flg;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM address;
size_t offset, cend;
socklen_t addr_size = MAX_ADDR_SIZE;
2007-09-02 22:56:56 +00:00
scm_t_max_sockaddr addr;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
SCM_VALIDATE_OPFPORT (1, sock);
fd = SCM_FPORT_FDES (sock);
* ports.c: add SCM_PROC declarations for pt-size and pt-member. * Makefile.am: remove AWK=@AWK@. Add a rule for generating errnos.list. (CLEANFILES): put errnos.list here instead of in DISTCLEANFILES. * configure.in: add AC_SUBST(AWK) and AC_SUBST(ERRNO_EXTRACT). don't extract errnos, just set a variable (avoids the need to recompile error.c just because configure is run.) * unif.h: update prototypes. * unif.c (scm_uniform_array_read,write): change the offset and length arguments to start and end, for consistency. * __scm.h: uncomment SCM_ARG6 and SCM_ARG7, I needed SCM_ARG6. * ioext.h: update prototypes. * * ioext.c (scm_read_delimited_x): replaces scm_read_line and scm_read_line_x, it's a more general procedure using an interface from scsh. read-line and read-line! are now defined in boot-9.scm. * Note that the new read-line trims the terminator by default, previously it was appended to the returned string. An optional argument specifies how to process the terminator (scsh compatible). For the old behaviour: (read-line port 'concat). scm_read_line, scm_read_line_x: deleted. (read-line port 'split) returns a pair, but is converted to multiple values if the scsh module is loaded. socket.h: update prototypes. * socket.c (scm_recvfrom): for consistency with other procedures, take start and end as separate optional arguments. * (scm_recv, scm_recvfrom): don't allow the second argument to be a size, only a buffer. Change the scheme names to recv! and recvfrom!. Don't return the buffer. * ioext.h, posix.h: move prototypes too. * ioext.c, posix.c (scm_read_line, scm_read_line_x, scm_write_line: moved back from posix.c to ioext.c. Also move #includes of "genio.h" "read.h" and "unif.h". * ioext.c: include "chars.h"
1997-01-25 18:23:49 +00:00
if (SCM_UNBNDP (flags))
flg = 0;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
else
SCM_VALIDATE_ULONG_COPY (3, flags, flg);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
2007-09-02 22:56:56 +00:00
((struct sockaddr *) &addr)->sa_family = AF_UNSPEC;
SCM_VALIDATE_BYTEVECTOR (1, buf);
if (SCM_UNBNDP (start))
offset = 0;
else
offset = scm_to_size_t (start);
if (SCM_UNBNDP (end))
cend = SCM_BYTEVECTOR_LENGTH (buf);
else
{
cend = scm_to_size_t (end);
if (SCM_UNLIKELY (cend >= SCM_BYTEVECTOR_LENGTH (buf)
|| cend < offset))
scm_out_of_range (FUNC_NAME, end);
}
SCM_SYSCALL (rv = recvfrom (fd,
SCM_BYTEVECTOR_CONTENTS (buf) + offset,
cend - offset, flg,
(struct sockaddr *) &addr, &addr_size));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
if (rv == -1)
SCM_SYSERROR;
/* `recvfrom' does not necessarily return an address. Usually nothing
is returned for stream sockets. */
2007-09-02 22:56:56 +00:00
if (((struct sockaddr *) &addr)->sa_family != AF_UNSPEC)
address = _scm_from_sockaddr (&addr, addr_size, FUNC_NAME);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
else
address = SCM_BOOL_F;
scm_remember_upto_here_1 (buf);
2007-09-02 22:56:56 +00:00
return scm_cons (scm_from_int (rv), address);
}
#undef FUNC_NAME
SCM_DEFINE (scm_sendto, "sendto", 3, 1, 1,
(SCM sock, SCM message, SCM fam_or_sockaddr, SCM address, SCM args_and_flags),
"Transmit bytevector @var{message} on socket port\n"
"@var{sock}. The\n"
"destination address is specified using the @var{fam_or_sockaddr},\n"
"@var{address} and\n"
"@var{args_and_flags} arguments, or just a socket address object "
"returned by @code{make-socket-address}, in a similar way to the\n"
"@code{connect} procedure. @var{args_and_flags} contains\n"
"the usual connection arguments optionally followed by\n"
"a flags argument, which is a value or\n"
"bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.\n\n"
"The value returned is the number of bytes transmitted --\n"
"it's possible for\n"
"this to be less than the length of @var{message} if the\n"
"socket is\n"
"set to be non-blocking.\n"
"Note that the data is written directly to the socket\n"
"file descriptor:\n"
"any unflushed buffered port data is ignored.\n"
"This operation is defined only for strings containing codepoints\n"
"zero to 255.")
#define FUNC_NAME s_scm_sendto
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
{
int rv, fd, flg;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
struct sockaddr *soka;
size_t size;
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
sock = SCM_COERCE_OUTPORT (sock);
SCM_VALIDATE_FPORT (1, sock);
* ioext.c (scm_do_read_line): Rewritten to use memchr to find the newline. A bit faster, and definitely hairier. (scm_read_line): Count newlines here instead. * strings.c (scm_take_str): New function. (scm_take0str): Reimplement in terms of scm_take_str. * strings.h (scm_take_str): New declaration. * ioext.c (scm_read_line): Use scm_take_str, to avoid copying the string. Add some simple-minded support for line buffered ports. * ports.h (SCM_BUFLINE): New flag for ports. * init.c (scm_init_standard_ports): Request line-buffering on the standard output port. * * ports.c (scm_mode_bits): Recognize 'l' as a request for line buffering. (scm_putc, scm_puts, scm_lfwrite): If the port is line-buffered, and there's a newline to be written, flush the port. * ports.c: (scm_lseek): clear buffers even if just reading current position. * fports.c (local_fclose): call local_fflush unconditionally. (various): don't use the scm_must... memory procs. * ports.h (scm_port): make read_pos a pointer to const. strports.c: take care of rw_active and rw_randow. fports.c: scm_fport_drain_input: removed. do it all in ports.c. strports.c (scm_mkstrport): check that pos is reasonable. ioext.c (scm_ftell, scm_fseek): use lseek. (SCM_CLEAR_BUFFERS): macro deleted. ioext.c (redirect_port: use ptob fflush, read_flush. ports.h (scm_ptobfuns): add ftruncate. ports.c (scm_newptob): set ftruncate. adjust ptob tables. * ports.c (scm_ftruncate): new procedure. fports.c (local_ftrunate), strports.c (str_ftruncate): new procs. strports.c (st_seek, st_grow_port): new procs. fports.h (scm_port): change size types from int to off_t. ports.c (scm_init_ports): initialise the seek symbols here instead of in ioext.c. strports.c (scm_call_with_output_string): start with an empty string, so seek and ftruncate can be used. * ports.h (scm_ptobfuns): add a read_flush procedure which is the equivalent to fflush for the read buffer. * ports.c (scm_newptob): set read_flush. ports.c (void_port_ptob): set read_flush. fports.c (local_read_flush): new proc. add to ptob. strport.c (st_read_flush): likewise. vport.c (sf_read_flush): likewise. fports.h (struct scm_fport): remove random member. there's nothing left but fdes. leaving it as a struct to allow for future changes. fports.c: replace usage of scm_fport::random with scm_port::rw_random. ports.c: (scm_putc, scm_puts, scm_lfwrite): call the read_flush ptob proc if the read buffer is filled. * ports.h (scm_port): add a rw_random member and replace reading and writing members with rw_active member. SCM_PORT_READ/SCM_PORT_WRITE: new values. * ports.h (struct scm_port_table): add writing and reading members to replace write_needs_seek: it isn't good enough for non-fports. ports.c, ioext.c, fports.c: corresponding changes. (struct scm_port_table): give it a typedef and rename to scm_port. ports.c, fports.c, strports.c, vports.c, ioext.c, ports.h: corresponding changes. * ports.c (scm_newptob): bugfix: set seek member. * * (scm_lseek): new procedure, using code from ioext.c:scm_fseek and generalised to all port types. * scmsigs.c (scm_init_scmsigs): set the SA_RESTART flag for all signals (it was only being done for handlers installed from Scheme). Otherwise (for example) SIGSTOP followed by SIGCONT on an interpreter waiting for input caused an EINTR error from read. * ports.h (struct scm_port_table): make all the char members unsigned, so they convert to int without becoming negative if large. * fports.c (scm_fdes_wait_for_input): forgot to check compilation with threads enabled. rename this procedure to fport_wait_for_input and take a port instead of a fdes. use scm_fport_input_waiting_p instead of scm_fdes_waiting_p. * readline.c (scm_readline): Applied a patch from Greg Harvey to get readline support working again: use fdopen to get FILE objects. * gc.c (scm_init_storage): install an atexit proc to flush the ports. (cleanup): the new proc. it sets a global variable which can be checked by the ptob flush procs to avoid trying to throw exceptions during exit. not very pleasant but it seems more reliable. * fports.c (local_fflush): check terminating variable and if set don't throw exception. * CHECKME: that the atexit proc is installed if unexec used. * throw.c (scm_handle_by_message): don't flush all ports here. it still causes bus errors. * fports.h (SCM_FPORT_CLEAR_BUFFERS): rename to SCM_CLEAR_BUFFERS and move to ioext.c. * fports.c (scm_fdes_waiting_p): merged into fport_input_waiting_p. * ports.c (scm_char_ready_p): check the port buffer and call the ptob entry if needed. * ports.h (scm_ptobfuns): input_waiting_p added. change all the ptob initialisers. use it in char-ready * ioext.c (scm_do_read_line): moved from ports.c. make it static. * vports.c (sfflush): modified to write a char (since softports currently use shortbuf.) * fports.c (scm_standard_stream_to_port): moved to init.c and made static. * init.c (scm_init_standard_ports): make stdout and stderr unbuffered if connected to a terminal. with stdio they were line-buffered by default. * ports.h (scm_ptobfuns): change fflush return to void. change flush proc definitions. * strports.c (scm_call_with_output_string): get size from buffer instead of port stream. (scm_strprint_obj): likewise. (st_flush): new proc. * ports.h (struct scm_port_table): added write_end member, as an optimisation. set it where write_buf_size is set. * ports.h (struct scm_port_table): change stream from void * back to SCM. SCM presumably must be large enough to hold a pointer (and probably vice versa but who knows.) (SCM_SSTREAM): deleted. change users back to SCM_STREAM. (scm_puts): rewritten * fports.c (local_ffwrite, local_fputs): removed. * strports.c (stputc, stputs, stwrite): dyked out (FIXME) * vports.c (sfputc, sfputs, sfwrite) likewise. * ports.c (write_void_port, puts_void_port): removed. (putc_void_port, getc_void_port, fgets_void_port): likewise. * ports.c (scm_lfwrite): rewritten using fport.c version. * fports.c (local_fputc): deleted. * ports.c (scm_add_to_port_table): initialise write_needs_seek. * ports.h (scm_ptobfuns): add seek function pointer. * fports.c: set it to local_seek, new procedure. * fports.h (SCM_MAYBE_DRAIN_INPUT): moved to ports.c. use ptob for seek. take ptob instead of fport arg. * ports.h (struct scm_port_table): new member write_needs_seek, replaces reading member in fport struct. * vports.c (sfgetc): store the getted char into the buffer. rename to sf_fill_buffer and install it for fill-buffer in ptob. the Scheme interface is still a procedure that gets a char. (scm_make_soft_port): set up the port buffer (shortbuf). * fports.c (local_fgetc, local_fgets): deleted. * strports.c (stgetc): likewise. * ports.c: scm_generic_fgets: likewise. * ports.h (scm_ptobfuns): add fill_buffer. * ports.c (scm_newptob): assign it. * strports.c (scm_mkstrport): set up the buffer. put just the string into the stream, not cons (pos stream). (stfill_buffer): new proc. * ports.h: fport buffer moved into port table: to be used for all port types. * throw.c (scm_handle_by_message): flush ports at exit. * socket.c (scm_sock_fd_to_port): use scm_fdes_to_port. (scm_getsockopt, scm_setsockopt, scm_shutdown, scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname, scm_getpeername, scm_recv, scm_send, scm_recvfrom, scm_sendto, use SCM_FPORT_FDES. use SCM_OPFPORTP not SCM_FPORTP. * posix.c (scm_getgroups): use SCM_ALLOW/DEFER_INTS. (scm_ttyname): use SCM_FPORT_FDES. (scm_tcgetpgrp, scm_tcsetpgrp): likewise. * ioext.c (scm_isatty_p): use SCM_FPORT_FDES. (scm_fdes_to_ports): modified. (scm_fdopen): use scm_fdes_to_port. * ports.c (scm_init_ports): don't try to flush ports using atexit(). it's too late, errors will cause SEGV. * fports.c (scm_fport_buffer_add): new procedure. * fports.h (SCM_FDES_RANDOM_P): new macro. use it in scm_fdes_to_port and scm_redirect_port. * ioext.c (scm_redirect_port): use setvbuf to set buffers in the new port. reset fp->random. * fports.c (scm_fdes_to_port), ports.c (scm_void_port), filesys.c (scm_opendir): restore defer interrupts while the port is constructed. * (scm_setvbuf): if mode is _IOFBF and size is not supplied, derive buffer size from fdes or use a default. (scm_fdes_to_port): use setvbuf instead of creating the buffers directly. vports.c (various places): use SCM_SSTREAM. strports.c: likewise. * gdbint.c: likewise. * ports.h (SCM_SSTREAM): new macro. * fports.c (scm_input_waiting_p): use scm_return_first, since port may be removed from the stack by the tail call to scm_fdes_waiting_p. * fports.h (SCM_CLEAR_BUFFERS): new macro. * ports.c (scm_force_output): call scm_fflush. * print.c (scm_newline): don't check errno for EPIPE (it wouldn't * reach this point.) don't flush port (if scm_cur_outp). * fports.h (SCM_FPORT_FDES): new macro. * vports.c (sfflush): don't need to set errno. * ports.c: install scm_flush_all_ports to be run on exit. ports.c fports.c ioext.c posix.c socket.c net_db.c filesys.c: removed all uses of SCM_DEFER/ALLOW ints for now. they were mainly just protecting errno. some may need to be put back. * scmsigs.c (take_signal): save and restore errno while this proc runs. *fports.c (print_pipe_port, local_pclose, scm_pipob): deleted. * open-pipe, close-pipe are emulated in (ice-9 popen) ports.c (scm_ports_prehistory): don't init scm_pipob. ports.h (scm_tc16_pipe): deleted. posix.c (scm_open_pipe, scm_close_pipe): deleted. * ioext.c (scm_primitive_move_to_fdes): use fport. * fport.c (scm_fport_fill_buffer): flush write buffer if needed. change arg type from scm_fport to SCM port. fport.h (SCM_SETFDES): removed. (SCM_MAYBE_DRAIN_INPUT): new macro. * ioext.c (scm_dup_to_fdes): use SCM_FSTREAM. (scm_ftell): always use lseek and account for the buffer. (scm_fileno): use fport buffer. (scm_fseek): clear fport buffers. always use lseek. * posix.c (scm_pipe): use fport buffer. * unif.c: include fports.h instead of genio.h. * fports.c (scm_fdes_wait_for_input, scm_fport_fill_buffer): new procedures. (local_fgetc): use them. (local_ffwrite): use buffer. (local_fgets): use buffer. (scm_setbuf0): deleted. (scm_setvbuf): set the buffer. (scm_setfileno): deleted. (scm_evict_ports): set fdes directly. * (scm_freopen): deleted. doesn't seem useful in Guile. (scm_stdio_to_port): deleted. fports.h (struct scm_fport): add shortbuf member to avoid separate code for unbuffered ports. (SCM_FPORTP, SCM_OPFPORTP, SCM_OPINFPORTP, SCM_OPOUTFPORTP): moved from ports.h. * genio.c, genio.h: move contents into ports.c, ports.h. The division wasn't useful. * fports.c, fports.h (scm_fport_drain_input): new procedure. * ports.c (scm_drain_input): call scm_fport_drain_input. * scm_fdes_waiting_p: new procedure. * fports.c (scm_fdes_to_port): allocate read and/or write buffers. (scm_input_waiting_p): check the buffer. (local_fgetc, local_fflush, local_fputc): likewise. * fports.h (scm_fport): read/write_buf,_pos,_buf_end,,_buf_size: new members. * init.c (scm_init_standard_ports): pass fdes instead of FILE *. * * ports.c (scm_drain_input): new procedure. ports.h: prototype. * fports.c (FPORT_READ_SAFE, FPORT_WRITE_SAFE, FPORT_ALL_OKAY, pre_read, pre_write): removed. (local_fputc, local_fputs, local_ffwrite): use write, not stdio. (scm_standard_stream_to_port): change first arg from FILE * to int fdes. (local_fflush): flush fdes, not FILE *. * fports.h (SCM_NOFTELL): removed. * genio.c, ports.c: don't include filesys.h. * genio.c (scm_getc): don't use scm_internal_select if FPORT. do it in fports.c:local_fgetc. * genio.c: don't use SCM_SYSCALL when calling ptob procedures. do it where it's needed in the port smobs. * filesys.c (scm_input_waiting_p): moved to fports.c, stdio buffer support removed. take SCM arg, not FILE *. * filesys.h: prototype moved too. * fports.c (scm_fdes_to_port): new procedure. (local_fgetc): use read not fgetc. (local_fclose): use close, not fclose. (local_fgets): use read, not fgets * fports.h: prototype for scm_fdes_to_port. * fports.h (scm_fport): new struct. * fports.c (scm_open_file): use open, not fopen. #include fcntl.h * ports.h (struct scm_port_table): change stream from SCM to void *. * ports.c (scm_add_to_port_table): check for memory allocation error. (scm_prinport): remove MSDOS hair. (scm_void_port): set stream to 0 instead of SCM_BOOL_F. (scm_close_port): don't throw errors: do it in fports.c.
1999-06-09 12:19:58 +00:00
fd = SCM_FPORT_FDES (sock);
if (!scm_is_number (fam_or_sockaddr))
{
/* FAM_OR_SOCKADDR must actually be a `socket address' object. This
means that the following arguments, i.e. ADDRESS and those listed in
ARGS_AND_FLAGS, are the `MSG_' flags. */
soka = scm_to_sockaddr (fam_or_sockaddr, &size);
if (!scm_is_eq (address, SCM_UNDEFINED))
args_and_flags = scm_cons (address, args_and_flags);
}
else
soka = scm_fill_sockaddr (scm_to_int (fam_or_sockaddr), address,
&args_and_flags, 3, FUNC_NAME, &size);
2004-09-22 17:41:37 +00:00
if (scm_is_null (args_and_flags))
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
flg = 0;
else
{
SCM_VALIDATE_CONS (5, args_and_flags);
flg = SCM_NUM2ULONG (5, SCM_CAR (args_and_flags));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
}
SCM_VALIDATE_BYTEVECTOR (1, message);
SCM_SYSCALL (rv = sendto (fd,
SCM_BYTEVECTOR_CONTENTS (message),
SCM_BYTEVECTOR_LENGTH (message),
flg, soka, size));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
if (rv == -1)
{
int save_errno = errno;
free (soka);
errno = save_errno;
SCM_SYSERROR;
}
free (soka);
scm_remember_upto_here_1 (message);
return scm_from_int (rv);
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
}
#undef FUNC_NAME
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
void
scm_init_socket ()
{
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
/* protocol families. */
#ifdef AF_UNSPEC
scm_c_define ("AF_UNSPEC", scm_from_int (AF_UNSPEC));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#if defined HAVE_UNIX_DOMAIN_SOCKETS && defined AF_UNIX
scm_c_define ("AF_UNIX", scm_from_int (AF_UNIX));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef AF_INET
scm_c_define ("AF_INET", scm_from_int (AF_INET));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef AF_INET6
scm_c_define ("AF_INET6", scm_from_int (AF_INET6));
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#ifdef PF_UNSPEC
scm_c_define ("PF_UNSPEC", scm_from_int (PF_UNSPEC));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef PF_UNIX
scm_c_define ("PF_UNIX", scm_from_int (PF_UNIX));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef PF_INET
scm_c_define ("PF_INET", scm_from_int (PF_INET));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef PF_INET6
scm_c_define ("PF_INET6", scm_from_int (PF_INET6));
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
/* standard addresses. */
#ifdef INADDR_ANY
scm_c_define ("INADDR_ANY", scm_from_ulong (INADDR_ANY));
#endif
#ifdef INADDR_BROADCAST
scm_c_define ("INADDR_BROADCAST", scm_from_ulong (INADDR_BROADCAST));
#endif
#ifdef INADDR_NONE
scm_c_define ("INADDR_NONE", scm_from_ulong (INADDR_NONE));
#endif
#ifdef INADDR_LOOPBACK
scm_c_define ("INADDR_LOOPBACK", scm_from_ulong (INADDR_LOOPBACK));
#endif
/* socket types.
SOCK_PACKET is deliberately omitted, the GNU/Linux socket(2) and
packet(7) advise that it's obsolete and strongly deprecated. */
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#ifdef SOCK_STREAM
scm_c_define ("SOCK_STREAM", scm_from_int (SOCK_STREAM));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SOCK_DGRAM
scm_c_define ("SOCK_DGRAM", scm_from_int (SOCK_DGRAM));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SOCK_SEQPACKET
scm_c_define ("SOCK_SEQPACKET", scm_from_int (SOCK_SEQPACKET));
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#ifdef SOCK_RAW
scm_c_define ("SOCK_RAW", scm_from_int (SOCK_RAW));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SOCK_RDM
scm_c_define ("SOCK_RDM", scm_from_int (SOCK_RDM));
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
/* accept4 flags. */
#ifdef SOCK_CLOEXEC
scm_c_define ("SOCK_CLOEXEC", scm_from_int (SOCK_CLOEXEC));
#endif
#ifdef SOCK_NONBLOCK
scm_c_define ("SOCK_NONBLOCK", scm_from_int (SOCK_NONBLOCK));
#endif
/* setsockopt level.
SOL_IP, SOL_TCP and SOL_UDP are defined on gnu/linux, but not on for
instance NetBSD. We define IPPROTOs because that's what the posix spec
shows in its example at
http://www.opengroup.org/onlinepubs/007904975/functions/getsockopt.html
*/
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#ifdef SOL_SOCKET
scm_c_define ("SOL_SOCKET", scm_from_int (SOL_SOCKET));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef IPPROTO_IP
scm_c_define ("IPPROTO_IP", scm_from_int (IPPROTO_IP));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef IPPROTO_TCP
scm_c_define ("IPPROTO_TCP", scm_from_int (IPPROTO_TCP));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef IPPROTO_UDP
scm_c_define ("IPPROTO_UDP", scm_from_int (IPPROTO_UDP));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
/* setsockopt names. */
#ifdef SO_DEBUG
scm_c_define ("SO_DEBUG", scm_from_int (SO_DEBUG));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_REUSEADDR
scm_c_define ("SO_REUSEADDR", scm_from_int (SO_REUSEADDR));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_STYLE
scm_c_define ("SO_STYLE", scm_from_int (SO_STYLE));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_TYPE
scm_c_define ("SO_TYPE", scm_from_int (SO_TYPE));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_ERROR
scm_c_define ("SO_ERROR", scm_from_int (SO_ERROR));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_DONTROUTE
scm_c_define ("SO_DONTROUTE", scm_from_int (SO_DONTROUTE));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_BROADCAST
scm_c_define ("SO_BROADCAST", scm_from_int (SO_BROADCAST));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_SNDBUF
scm_c_define ("SO_SNDBUF", scm_from_int (SO_SNDBUF));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_RCVBUF
scm_c_define ("SO_RCVBUF", scm_from_int (SO_RCVBUF));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_KEEPALIVE
scm_c_define ("SO_KEEPALIVE", scm_from_int (SO_KEEPALIVE));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_OOBINLINE
scm_c_define ("SO_OOBINLINE", scm_from_int (SO_OOBINLINE));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_NO_CHECK
scm_c_define ("SO_NO_CHECK", scm_from_int (SO_NO_CHECK));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_PRIORITY
scm_c_define ("SO_PRIORITY", scm_from_int (SO_PRIORITY));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_LINGER
scm_c_define ("SO_LINGER", scm_from_int (SO_LINGER));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef SO_REUSEPORT /* new in Linux 3.9 */
scm_c_define ("SO_REUSEPORT", scm_from_int (SO_REUSEPORT));
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
/* recv/send options. */
2006-10-09 23:40:48 +00:00
#ifdef MSG_DONTWAIT
scm_c_define ("MSG_DONTWAIT", scm_from_int (MSG_DONTWAIT));
#endif
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#ifdef MSG_OOB
scm_c_define ("MSG_OOB", scm_from_int (MSG_OOB));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef MSG_PEEK
scm_c_define ("MSG_PEEK", scm_from_int (MSG_PEEK));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
#ifdef MSG_DONTROUTE
scm_c_define ("MSG_DONTROUTE", scm_from_int (MSG_DONTROUTE));
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#endif
/* TCP options. */
#ifdef TCP_NODELAY
scm_c_define ("TCP_NODELAY", scm_from_int (TCP_NODELAY));
#endif
#ifdef TCP_CORK
scm_c_define ("TCP_CORK", scm_from_int (TCP_CORK));
#endif
#ifdef IP_ADD_MEMBERSHIP
scm_c_define ("IP_ADD_MEMBERSHIP", scm_from_int (IP_ADD_MEMBERSHIP));
scm_c_define ("IP_DROP_MEMBERSHIP", scm_from_int (IP_DROP_MEMBERSHIP));
#endif
#ifdef IP_MULTICAST_TTL
scm_c_define ("IP_MULTICAST_TTL", scm_from_int ( IP_MULTICAST_TTL));
#endif
#ifdef IP_MULTICAST_IF
scm_c_define ("IP_MULTICAST_IF", scm_from_int ( IP_MULTICAST_IF));
#endif
scm_add_feature ("socket");
* filesys.c (scm_input_waiting_p): use select in preference to FIONREAD, since the latter doesn't detect EOF. Throw error if neither select nor FIONREAD available. * socket.c (scm_connect): take a port, not a fd object. (scm_fill_sockaddr): throw an error if fam is not recognised. (scm_bind): use scm_fill_sockaddr. (scm_listen): take a port, not a fd object. (scm_accept): take and return a port. return CDR in the car if address can't be got (scm_sock_fd_to_port): new procedure. (scm_socket): use scm_sock_fd_to_port. (scm_addr_vector): throw error if unrecognised address type. take an extra argument with the calling procedure name. (scm_getsockname): take a port. return #f if address can't be got. (scm_getpeername): take a port. return #f if address can't be got. (scm_recvfrom): take a port. return #f for address component if can't be got. (scm_sendto, scm_socketpair, scm_getsockopt scm_shutdown, scm_setsockopt, scm_recv, scm_send): take a port not a fd object. * socket.h (SCM_P): update bind prototype. * socket.c (scm_init_socket): intern PF_UNSPEC, PF_UNIX, PF_INET. include "feature.h". (scm_socket): return a port, not a file descriptor object. include "fports.h" and <unistd.h> (scm_bind): take a port, not a file descriptor object. take an extra argument for address args. * net_db.c (scm_init_net_db): intern INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, INADDR_LOOPBACK. * init.c: include net_db.h and not fdsocket.h. (scm_boot_guile_1): call scm_init_net_db and not scm_init_fdsocket. * Makefile.am: corresponding changes. * socket.h: renamed from fdsocket.h, fix names. * net_db.h: renamed from socket.h, fix names. * socket.c: renamed from fdsocket.c. remove _sys from procedure names. (scm_init_socket): rename from scm_init_fdsocket. include socket.x. add "socket" to features list. * net_db.c: renamed from socket.c. remove _sys from procedure names. (scm_init_net_db): rename from scm_init_socket. include net_db.x. add "net-db" to features list. include "net_db.h". don't include <sys/socket.h> or <sys/un.h>.
1996-12-21 04:13:54 +00:00
#include "libguile/socket.x"
}
/*
Local Variables:
c-file-style: "gnu"
End:
*/