2004-04-24 21:30:35 +00:00
|
|
|
|
/* Copyright (C) 1996,1997,1998,2000,2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
1996-08-30 03:35:46 +00:00
|
|
|
|
*
|
2003-04-05 19:15:35 +00:00
|
|
|
|
* 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 2.1 of the License, or (at your option) any later version.
|
1996-08-30 03:35:46 +00:00
|
|
|
|
*
|
2003-04-05 19:15:35 +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
|
|
|
|
*
|
2003-04-05 19:15:35 +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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
|
*/
|
1999-12-12 02:36:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
2003-03-25 23:59:59 +00:00
|
|
|
|
#if HAVE_CONFIG_H
|
|
|
|
|
|
# include <config.h>
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
* _scm.h: Removed #include <errno.h>.
* error.c, net_db.c, putenv.c, stime.c: Removed declaration of
errno variable (can be a macro on some systems, for example when
using linux libc with threads).
* error.c, filesys.c, gc.c, ioext.c, iselect.c, net_db.c, ports.c,
posix.c, print.c, putenv.c, scmsigs.c, script.c, simpos.c, smob.c,
socket.c, srcprop.c, stime.c, strop.c, unif.c, vports.c: Added
#include <errno.h> in these 20 out of 100 files.
2001-03-10 16:56:09 +00:00
|
|
|
|
#include <errno.h>
|
2003-04-07 01:52:00 +00:00
|
|
|
|
#include <gmp.h>
|
* _scm.h: Removed #include <errno.h>.
* error.c, net_db.c, putenv.c, stime.c: Removed declaration of
errno variable (can be a macro on some systems, for example when
using linux libc with threads).
* error.c, filesys.c, gc.c, ioext.c, iselect.c, net_db.c, ports.c,
posix.c, print.c, putenv.c, scmsigs.c, script.c, simpos.c, smob.c,
socket.c, srcprop.c, stime.c, strop.c, unif.c, vports.c: Added
#include <errno.h> in these 20 out of 100 files.
2001-03-10 16:56:09 +00:00
|
|
|
|
|
2000-04-21 14:16:44 +00:00
|
|
|
|
#include "libguile/_scm.h"
|
|
|
|
|
|
#include "libguile/unif.h"
|
|
|
|
|
|
#include "libguile/feature.h"
|
|
|
|
|
|
#include "libguile/fports.h"
|
|
|
|
|
|
#include "libguile/strings.h"
|
|
|
|
|
|
#include "libguile/vectors.h"
|
C files should #include only the header files they need, not
libguile.h (which #includes all the header files); the pointless
recompilation was wasting my time.
* Makefile.in (all .o dependency lists): Regenerated.
* libguile.h: Don't try to get a definition for size_t here...
* __scm.h: Do it here.
* _scm.h: Since this is the internal libguile header, put things
here that all (or a majority) of the libguile files will want.
Don't #include <libguile.h> here; that generates dependencies on
way too much. Instead, get "__scm.h", "error.h", "pairs.h",
"list.h", "gc.h", "gsubr.h", "procs.h", "numbers.h", "symbols.h",
"boolean.h", "strings.h", "vectors.h", "root.h", "ports.h", and
"async.h".
* alist.c: Get "eq.h", "list.h", "alist.h".
* append.c: Get "append.h", "list.h".
* arbiters.c: Get "arbiters.h", "smob.h".
* async.c: Get "async.h", "smob.h", "throw.h", "eval.h".
* boolean.c: Get "boolean.h".
* chars.c: Get "chars.h".
* continuations.c: Get "continuations.h", "dynwind.h", "debug.h",
"stackchk.h".
* debug.c: Get "debug.h", "feature.h", "read.h", "strports.h",
"continuations.h", "alist.h", "srcprop.h", "procprop.h", "smob.h",
"genio.h", "throw.h", "eval.h".
* dynwind.c: Get "dynwind.h", "alist.h", "eval.h".
* eq.c: Get "eq.h", "unif.h", "smob.h", "strorder.h",
"stackchk.h".
* error.c: Get "error.h", "throw.h", "genio.h", "pairs.h".
* eval.c: Get "eval.h", "stackchk.h", "srcprop.h", "debug.h",
"hashtab.h", "procprop.h", "markers.h", "smob.h", "throw.h",
"continuations.h", "eq.h", "sequences.h", "alist.h", "append.h",
"debug.h".
* fdsocket.c: Get "fdsocket.h", "unif.h", "filesys.h".
* feature.c: Get "feature.h".
* files.c: Get "files.h".
* filesys.c: Get "filesys.h", "smob.h", "genio.h".
* fports.c: Get "fports.h", "markers.h".
* gc.c: Get "async.h", "unif.h", "smob.h", "weaks.h",
"genio.h", "struct.h", "stackchk.h", "stime.h".
* gdbint.c: Get "gdbint.h", "chars.h", "eval.h", "print.h",
"read.h", "strports.h", "tag.h".
* genio.c: Get "genio.h", "chars.h".
* gsubr.c: Get "gsubr.h", "genio.h".
* hash.c: Get "hash.h", "chars.h".
* hashtab.c: Get "hashtab.h", "eval.h", "hash.h", "alist.h".
* init.c: Get everyone who has an scm_init_mumble function:
"weaks.h", "vports.h", "version.h", "vectors.h", "variable.h",
"unif.h", "throw.h", "tag.h", "symbols.h", "struct.h",
"strports.h", "strorder.h", "strop.h", "strings.h", "stime.h",
"stackchk.h", "srcprop.h", "socket.h", "simpos.h", "sequences.h",
"scmsigs.h", "read.h", "ramap.h", "procs.h", "procprop.h",
"print.h", "posix.h", "ports.h", "pairs.h", "options.h",
"objprop.h", "numbers.h", "mbstrings.h", "mallocs.h", "load.h",
"list.h", "kw.h", "ioext.h", "hashtab.h", "hash.h", "gsubr.h",
"gdbint.h", "gc.h", "fports.h", "filesys.h", "files.h",
"feature.h", "fdsocket.h", "eval.h", "error.h", "eq.h",
"dynwind.h", "debug.h", "continuations.h", "chars.h", "boolean.h",
"async.h", "arbiters.h", "append.h", "alist.h".
* ioext.c: Get "ioext.h", "fports.h".
* kw.c: Get "kw.h", "smob.h", "mbstrings.h", "genio.h".
* list.c: Get "list.h", "eq.h".
* load.c: Get "load.h", "eval.h", "read.h", "fports.h".
* mallocs.c: Get "smob.h", "genio.h".
* markers.c: Get "markers.h".
* mbstrings.c: Get "mbstrings.h", "read.h", "genio.h", "unif.h",
"chars.h".
* numbers.c: Get "unif.h", "genio.h".
* objprop.c: Get "objprop.h", "weaks.h", "alist.h", "hashtab.h".
* options.c: Get "options.h".
* ports.c: Get "ports.h", "vports.h", "strports.h", "fports.h",
"markers.h", "chars.h", "genio.h".
* posix.c: Get "posix.h", "sequences.h", "feature.h", "unif.h",
"read.h", "scmsigs.h", "genio.h", "fports.h".
* print.c: Get "print.h", "unif.h", "weaks.h", "read.h",
"procprop.h", "eval.h", "smob.h", "mbstrings.h", "genio.h",
"chars.h".
* procprop.c: Get "procprop.h", "eval.h", "alist.h".
* procs.c: Get "procs.h".
* ramap.c: Get "ramap.h", "feature.h", "eval.h", "eq.h",
"chars.h", "smob.h", "unif.h".
* read.c: Get "alist.h", "kw.h", "mbstrings.h", "unif.h",
"eval.h", "genio.h", "chars.h".
* root.c: Get "root.h", "stackchk.h".
* scmsigs.c: Get "scmsigs.h".
* sequences.c: Get "sequences.h".
* simpos.c: Get "simpos.h", "scmsigs.h".
* smob.c: Get "smob.h".
* socket.c: Get "socket.h", "feature.h".
* srcprop.c: Get "srcprop.h", "weaks.h", "hashtab.h", "debug.h",
"alist.h", "smob.h".
* stackchk.c: Get "stackchk.h", "genio.h".
* stime.c: Get "stime.h"."libguile/continuations.h".
* strings.c: Get "strings.h", "chars.h".
* strop.c: Get "strop.h", "chars.h".
* strorder.c: Get "strorder.h", "chars.h".
* strports.c: Get "strports.h", "print.h", "eval.h", "unif.h".
* struct.c: Get "struct.h", "chars.h".
* symbols.c: Get "symbols.h", "mbstrings.h", "alist.h",
"variable.h", "eval.h", "chars.h".
* tag.c: Get "tag.h", "struct.h", "chars.h".
* throw.c: Get "throw.h", "continuations.h", "debug.h",
"dynwind.h", "eval.h", "alist.h", "smob.h", "genio.h".
* unif.c: Get "unif.h", "feature.h", "strop.h", "sequences.h",
"smob.h", "genio.h", "eval.h", "chars.h".
* variable.c: Get "variable.h", "smob.h", "genio.h".
* vectors.c: Get "vectors.h", "eq.h".
* version.c: Get "version.h".
* vports.c: Get "vports.h", "fports.h", "chars.h", "eval.h".
* weaks.c: Get "weaks.h".
1996-09-10 02:26:07 +00:00
|
|
|
|
|
2000-04-21 14:16:44 +00:00
|
|
|
|
#include "libguile/validate.h"
|
|
|
|
|
|
#include "libguile/socket.h"
|
1996-08-07 09:46:41 +00:00
|
|
|
|
|
2001-11-07 15:08:45 +00:00
|
|
|
|
#ifdef __MINGW32__
|
|
|
|
|
|
#include "win32-socket.h"
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2002-01-28 21:15:55 +00:00
|
|
|
|
#ifdef HAVE_STDINT_H
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
#endif
|
1996-08-07 09:46:41 +00:00
|
|
|
|
#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
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
#endif
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#include <sys/types.h>
|
2002-07-10 19:40:43 +00:00
|
|
|
|
#ifdef HAVE_WINSOCK2_H
|
2001-06-26 17:53:09 +00:00
|
|
|
|
#include <winsock2.h>
|
|
|
|
|
|
#else
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#include <sys/socket.h>
|
1998-04-12 16:27:48 +00:00
|
|
|
|
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#include <sys/un.h>
|
Changes to compile under gnu-win32, from Marcus Daniels:
* stime.c (tzset): If tzset isn't provided, make it a NOP.
(scm_localtime): Change SCM_EOF to SCM_EOL.
(scm_mktime): Likewise.
* socket.c: Don't include sys/un.h unless autoconf tells
us Unix domain sockets are available.
(scm_fill_sockaddr): Ignore Unix domain code.
(scm_addr_vector): Likewise.
(scm_init_addr_buffer): Likewise.
(scm_socketpair): Don't include unless socketpair was
found during autoconf.
* simpos.c (SYSTNAME): Treat cygwin like Unix.
* scmsigs.c (scm_pause): Don't include unless pause was found
during autoconf.
* posix.c (scm_getgroups): Don't include unless support function
was found during autoconf (in this case, getgroups).
(scm_setpwent): For setpwent.
(scm_setegid): For setegid.
* net_db.c (scm_inet_netof): Don't include unless support
function was found during autoconf (in this case, inet_netof).
(scm_lnaof): For inet_lnaof.
(scm_inet_makeaddr): For inet_makeaddr.
(scm_getnet): For getnetent, getnetbyname, getnetbyaddr.
(scm_getproto): For getprotoent.
(scm_getserv): For getservent.
(scm_sethost): For sethostent, endhostent.
(scm_setnet): For setnetent, endnetent.
(scm_setproto): For setprotoent, endprotoent.
(scm_setserv): For setservent, endservent.
* scmconfig.h.in: Regenerated.
1997-07-11 05:43:36 +00:00
|
|
|
|
#endif
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#include <netinet/in.h>
|
|
|
|
|
|
#include <netdb.h>
|
|
|
|
|
|
#include <arpa/inet.h>
|
2001-06-26 17:53:09 +00:00
|
|
|
|
#endif
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2001-03-10 10:30:16 +00:00
|
|
|
|
#if defined (HAVE_UNIX_DOMAIN_SOCKETS) && !defined (SUN_LEN)
|
|
|
|
|
|
#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
|
|
|
|
|
|
+ strlen ((ptr)->sun_path))
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
/* we are not currently using socklen_t. it's not defined on all systems,
|
|
|
|
|
|
so would need to be checked by configure. in the meantime, plain
|
|
|
|
|
|
int is the best alternative. */
|
|
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_htons, "htons", 1, 0, 0,
|
2001-04-22 19:52:41 +00:00
|
|
|
|
(SCM value),
|
|
|
|
|
|
"Convert a 16 bit quantity from host to network byte ordering.\n"
|
|
|
|
|
|
"@var{value} is packed into 2 bytes, which are then converted\n"
|
|
|
|
|
|
"and returned as a new integer.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_htons
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
{
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
return scm_from_ushort (htons (scm_to_ushort (value)));
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_ntohs, "ntohs", 1, 0, 0,
|
2001-04-22 19:52:41 +00:00
|
|
|
|
(SCM value),
|
|
|
|
|
|
"Convert a 16 bit quantity from network to host byte ordering.\n"
|
|
|
|
|
|
"@var{value} is packed into 2 bytes, which are then converted\n"
|
|
|
|
|
|
"and returned as a new integer.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_ntohs
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
{
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
return scm_from_ushort (ntohs (scm_to_ushort (value)));
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_htonl, "htonl", 1, 0, 0,
|
2001-04-22 19:52:41 +00:00
|
|
|
|
(SCM value),
|
|
|
|
|
|
"Convert a 32 bit quantity from host to network byte ordering.\n"
|
|
|
|
|
|
"@var{value} is packed into 4 bytes, which are then converted\n"
|
|
|
|
|
|
"and returned as a new integer.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_htonl
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
{
|
2003-03-25 23:59:59 +00:00
|
|
|
|
scm_t_uint32 c_in = SCM_NUM2ULONG (1, value);
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
return scm_ulong2num (htonl (c_in));
|
|
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_ntohl, "ntohl", 1, 0, 0,
|
2001-04-22 19:52:41 +00:00
|
|
|
|
(SCM value),
|
|
|
|
|
|
"Convert a 32 bit quantity from network to host byte ordering.\n"
|
|
|
|
|
|
"@var{value} is packed into 4 bytes, which are then converted\n"
|
|
|
|
|
|
"and returned as a new integer.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_ntohl
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
{
|
2003-03-25 23:59:59 +00:00
|
|
|
|
scm_t_uint32 c_in = SCM_NUM2ULONG (1, value);
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
return scm_ulong2num (ntohl (c_in));
|
|
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
* configure.in: check for hstrerror.
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.
* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.
* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.
* numbers.c (scm_num2ulong): check more consistently that the
input is not negative. if it is, throw out-of-range instead of
wrong-type-arg.
* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.
* __scm.h: add another long to the definition of long_long and
ulong_long.
* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect. read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.
* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.
* __scm.h: don't mention LONGLONGS.
* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error. inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.
* error.c: (various): use scm_cons instead of scm_listify
to build short lists.
* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.
* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN. default is #f.
* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in .inputrc.
1999-11-18 22:36:28 +00:00
|
|
|
|
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
#ifndef HAVE_INET_ATON
|
|
|
|
|
|
/* for our definition in inet_aton.c, not usually needed. */
|
|
|
|
|
|
extern int inet_aton ();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
SCM_DEFINE (scm_inet_aton, "inet-aton", 1, 0, 0,
|
|
|
|
|
|
(SCM address),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Convert an IPv4 Internet address from printable string\n"
|
|
|
|
|
|
"(dotted decimal notation) to an integer. E.g.,\n\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@lisp\n"
|
|
|
|
|
|
"(inet-aton \"127.0.0.1\") @result{} 2130706433\n"
|
|
|
|
|
|
"@end lisp")
|
|
|
|
|
|
#define FUNC_NAME s_scm_inet_aton
|
|
|
|
|
|
{
|
|
|
|
|
|
struct in_addr soka;
|
|
|
|
|
|
|
|
|
|
|
|
SCM_VALIDATE_STRING (1, address);
|
|
|
|
|
|
if (inet_aton (SCM_STRING_CHARS (address), &soka) == 0)
|
|
|
|
|
|
SCM_MISC_ERROR ("bad address", SCM_EOL);
|
|
|
|
|
|
return scm_ulong2num (ntohl (soka.s_addr));
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SCM_DEFINE (scm_inet_ntoa, "inet-ntoa", 1, 0, 0,
|
|
|
|
|
|
(SCM inetid),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Convert an IPv4 Internet address to a printable\n"
|
|
|
|
|
|
"(dotted decimal notation) string. E.g.,\n\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@lisp\n"
|
|
|
|
|
|
"(inet-ntoa 2130706433) @result{} \"127.0.0.1\"\n"
|
|
|
|
|
|
"@end lisp")
|
|
|
|
|
|
#define FUNC_NAME s_scm_inet_ntoa
|
|
|
|
|
|
{
|
|
|
|
|
|
struct in_addr addr;
|
|
|
|
|
|
char *s;
|
|
|
|
|
|
SCM answer;
|
|
|
|
|
|
addr.s_addr = htonl (SCM_NUM2ULONG (1, inetid));
|
|
|
|
|
|
s = inet_ntoa (addr);
|
2001-06-26 10:59:34 +00:00
|
|
|
|
answer = scm_mem2string (s, strlen (s));
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
return answer;
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INET_NETOF
|
|
|
|
|
|
SCM_DEFINE (scm_inet_netof, "inet-netof", 1, 0, 0,
|
|
|
|
|
|
(SCM address),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Return the network number part of the given IPv4\n"
|
|
|
|
|
|
"Internet address. E.g.,\n\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@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_ulong2num ((unsigned long) 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"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"IPv4 Internet address, using the obsolete class A/B/C system.\n"
|
|
|
|
|
|
"E.g.,\n\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@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_ulong2num ((unsigned long) 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),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Make an IPv4 Internet address by combining the network number\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@var{net} with the local-address-within-network number\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@var{lna}. E.g.,\n\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@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_ulong2num (ntohl (addr.s_addr));
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2001-05-05 08:31:00 +00:00
|
|
|
|
#ifdef HAVE_IPV6
|
2001-04-22 19:52:41 +00:00
|
|
|
|
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
/* 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++)\
|
|
|
|
|
|
{\
|
2003-04-04 21:51:35 +00:00
|
|
|
|
scm_t_uint8 c = (addr)[i];\
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
\
|
|
|
|
|
|
(addr)[i] = (addr)[15 - i];\
|
|
|
|
|
|
(addr)[15 - i] = c;\
|
|
|
|
|
|
}\
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2003-04-04 21:51:35 +00:00
|
|
|
|
#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
|
2003-04-04 21:51:35 +00:00
|
|
|
|
#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
|
2003-04-04 21:51:35 +00:00
|
|
|
|
#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
|
2003-04-04 21:51:35 +00:00
|
|
|
|
#error "Assumption that unsigned long long <= 128 bits has been violated."
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
/* convert a 128 bit IPv6 address in network order to a host ordered
|
|
|
|
|
|
SCM integer. */
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
static SCM
|
|
|
|
|
|
scm_from_ipv6 (const scm_t_uint8 *src)
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
{
|
2003-04-04 21:51:35 +00:00
|
|
|
|
int i = 0;
|
|
|
|
|
|
const scm_t_uint8 *ptr = src;
|
|
|
|
|
|
int num_zero_bytes = 0;
|
|
|
|
|
|
scm_t_uint8 addr[16];
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
|
2003-04-04 21:51:35 +00:00
|
|
|
|
/* count leading zeros (since we know it's bigendian, they'll be first) */
|
|
|
|
|
|
while (i < 16)
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
{
|
2003-04-04 21:51:35 +00:00
|
|
|
|
if (*ptr) break;
|
|
|
|
|
|
num_zero_bytes++;
|
|
|
|
|
|
i++;
|
|
|
|
|
|
}
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
|
2003-04-04 21:51:35 +00:00
|
|
|
|
if (SCM_SIZEOF_UNSIGNED_LONG_LONG != 0) /* compiler should optimize this */
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((16 - num_zero_bytes) <= sizeof (unsigned long long))
|
|
|
|
|
|
{
|
|
|
|
|
|
/* it fits */
|
|
|
|
|
|
unsigned long long x;
|
|
|
|
|
|
|
|
|
|
|
|
FLIPCPY_NET_HOST_128(addr, src);
|
|
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
|
|
|
|
memcpy (&x, addr + (16 - sizeof (x)), sizeof (x));
|
|
|
|
|
|
#else
|
|
|
|
|
|
memcpy (&x, addr, sizeof (x));
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return scm_ulong_long2num (x);
|
|
|
|
|
|
}
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2003-04-04 21:51:35 +00:00
|
|
|
|
if ((16 - num_zero_bytes) <= sizeof (unsigned long))
|
|
|
|
|
|
{
|
|
|
|
|
|
/* this is just so that we use INUM where possible. */
|
|
|
|
|
|
unsigned long x;
|
|
|
|
|
|
|
|
|
|
|
|
FLIPCPY_NET_HOST_128(addr, src);
|
|
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
|
|
|
|
memcpy (&x, addr + (16 - sizeof (x)), sizeof (x));
|
|
|
|
|
|
#else
|
|
|
|
|
|
memcpy (&x, addr, sizeof (x));
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return scm_ulong2num (x);
|
|
|
|
|
|
}
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
}
|
2003-04-04 21:51:35 +00:00
|
|
|
|
/* otherwise get the big hammer */
|
|
|
|
|
|
{
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* convert a host ordered SCM integer to a 128 bit IPv6 address in
|
|
|
|
|
|
network order. */
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
static void
|
|
|
|
|
|
scm_to_ipv6 (scm_t_uint8 dst[16], SCM src)
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
{
|
2004-07-23 15:43:02 +00:00
|
|
|
|
if (SCM_I_INUMP (src))
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
{
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_t_signed_bits n = SCM_I_INUM (src);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
if (n < 0)
|
|
|
|
|
|
scm_out_of_range (NULL, src);
|
2003-04-04 21:51:35 +00:00
|
|
|
|
#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
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
}
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
else if (SCM_BIGP (src))
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
{
|
2003-04-04 21:51:35 +00:00
|
|
|
|
size_t count;
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
|
|
|
|
|
|
if ((mpz_sgn (SCM_I_BIG_MPZ (src)) < 0)
|
|
|
|
|
|
|| mpz_sizeinbase (SCM_I_BIG_MPZ (src), 2) > 128)
|
|
|
|
|
|
scm_out_of_range (NULL, src);
|
|
|
|
|
|
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
memset (dst, 0, 16);
|
2003-04-04 21:51:35 +00:00
|
|
|
|
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);
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
}
|
2003-04-04 21:51:35 +00:00
|
|
|
|
else
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
scm_wrong_type_arg (NULL, 0, src);
|
2003-04-04 21:51:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
#ifdef HAVE_INET_PTON
|
|
|
|
|
|
SCM_DEFINE (scm_inet_pton, "inet-pton", 2, 0, 0,
|
|
|
|
|
|
(SCM family, SCM address),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Convert a string containing a printable network address to\n"
|
|
|
|
|
|
"an integer address. Note that unlike the C version of this\n"
|
|
|
|
|
|
"function,\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"the result is an integer with normal host byte ordering.\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@var{family} can be @code{AF_INET} or @code{AF_INET6}. E.g.,\n\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@lisp\n"
|
2001-05-28 12:36:41 +00:00
|
|
|
|
"(inet-pton AF_INET \"127.0.0.1\") @result{} 2130706433\n"
|
|
|
|
|
|
"(inet-pton AF_INET6 \"::1\") @result{} 1\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@end lisp")
|
|
|
|
|
|
#define FUNC_NAME s_scm_inet_pton
|
|
|
|
|
|
{
|
|
|
|
|
|
int af;
|
|
|
|
|
|
char *src;
|
|
|
|
|
|
char dst[16];
|
|
|
|
|
|
int rv;
|
|
|
|
|
|
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
af = scm_to_int (family);
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
SCM_ASSERT_RANGE (1, family, af == AF_INET || af == AF_INET6);
|
|
|
|
|
|
SCM_VALIDATE_STRING_COPY (2, address, src);
|
|
|
|
|
|
rv = inet_pton (af, src, dst);
|
|
|
|
|
|
if (rv == -1)
|
|
|
|
|
|
SCM_SYSERROR;
|
|
|
|
|
|
else if (rv == 0)
|
|
|
|
|
|
SCM_MISC_ERROR ("Bad address", SCM_EOL);
|
|
|
|
|
|
if (af == AF_INET)
|
2003-03-25 23:59:59 +00:00
|
|
|
|
return scm_ulong2num (ntohl (*(scm_t_uint32 *) dst));
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
else
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
return scm_from_ipv6 ((char *) dst);
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INET_NTOP
|
|
|
|
|
|
SCM_DEFINE (scm_inet_ntop, "inet-ntop", 2, 0, 0,
|
|
|
|
|
|
(SCM family, SCM address),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Convert a network address into a printable string.\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"Note that unlike the C version of this function,\n"
|
|
|
|
|
|
"the input is an integer with normal host byte ordering.\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@var{family} can be @code{AF_INET} or @code{AF_INET6}. E.g.,\n\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"@lisp\n"
|
2001-05-28 12:36:41 +00:00
|
|
|
|
"(inet-ntop AF_INET 2130706433) @result{} \"127.0.0.1\"\n"
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
"(inet-ntop AF_INET6 (- (expt 2 128) 1)) @result{}\n"
|
|
|
|
|
|
"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
|
|
|
|
|
|
char addr6[16];
|
|
|
|
|
|
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
af = scm_to_int (family);
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
SCM_ASSERT_RANGE (1, family, af == AF_INET || af == AF_INET6);
|
|
|
|
|
|
if (af == AF_INET)
|
2003-03-25 23:59:59 +00:00
|
|
|
|
*(scm_t_uint32 *) addr6 = htonl (SCM_NUM2ULONG (2, address));
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
else
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
scm_to_ipv6 (addr6, address);
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
if (inet_ntop (af, &addr6, dst, sizeof dst) == NULL)
|
|
|
|
|
|
SCM_SYSERROR;
|
|
|
|
|
|
return scm_makfrom0str (dst);
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2001-05-05 08:31:00 +00:00
|
|
|
|
#endif /* HAVE_IPV6 */
|
2001-04-22 19:52:41 +00:00
|
|
|
|
|
1998-10-09 12:46:31 +00:00
|
|
|
|
SCM_SYMBOL (sym_socket, "socket");
|
1996-08-23 16:18:38 +00:00
|
|
|
|
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
#define SCM_SOCK_FD_TO_PORT(fd) scm_fdes_to_port (fd, "r+0", sym_socket)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_socket, "socket", 3, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM family, SCM style, SCM proto),
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"Return a new socket port of the type specified by @var{family},\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@var{style} and @var{proto}. All three parameters are\n"
|
2001-04-17 23:03:07 +00:00
|
|
|
|
"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"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@code{SOCK_DGRAM} and @code{SOCK_RAW}.\n\n"
|
|
|
|
|
|
"@var{proto} can be obtained from a protocol name using\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"@code{getprotobyname}. A value of zero specifies the default\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"protocol, which is usually right.\n\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"A single socket port cannot by used for communication until it\n"
|
|
|
|
|
|
"has been connected to another socket.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_socket
|
1996-07-25 22:56:11 +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
|
|
|
|
int fd;
|
|
|
|
|
|
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
fd = socket (scm_to_int (family),
|
|
|
|
|
|
scm_to_int (style),
|
|
|
|
|
|
scm_to_int (proto));
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
if (fd == -1)
|
|
|
|
|
|
SCM_SYSERROR;
|
|
|
|
|
|
return SCM_SOCK_FD_TO_PORT (fd);
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
Changes to compile under gnu-win32, from Marcus Daniels:
* stime.c (tzset): If tzset isn't provided, make it a NOP.
(scm_localtime): Change SCM_EOF to SCM_EOL.
(scm_mktime): Likewise.
* socket.c: Don't include sys/un.h unless autoconf tells
us Unix domain sockets are available.
(scm_fill_sockaddr): Ignore Unix domain code.
(scm_addr_vector): Likewise.
(scm_init_addr_buffer): Likewise.
(scm_socketpair): Don't include unless socketpair was
found during autoconf.
* simpos.c (SYSTNAME): Treat cygwin like Unix.
* scmsigs.c (scm_pause): Don't include unless pause was found
during autoconf.
* posix.c (scm_getgroups): Don't include unless support function
was found during autoconf (in this case, getgroups).
(scm_setpwent): For setpwent.
(scm_setegid): For setegid.
* net_db.c (scm_inet_netof): Don't include unless support
function was found during autoconf (in this case, inet_netof).
(scm_lnaof): For inet_lnaof.
(scm_inet_makeaddr): For inet_makeaddr.
(scm_getnet): For getnetent, getnetbyname, getnetbyaddr.
(scm_getproto): For getprotoent.
(scm_getserv): For getservent.
(scm_sethost): For sethostent, endhostent.
(scm_setnet): For setnetent, endnetent.
(scm_setproto): For setprotoent, endprotoent.
(scm_setserv): For setservent, endservent.
* scmconfig.h.in: Regenerated.
1997-07-11 05:43:36 +00:00
|
|
|
|
#ifdef HAVE_SOCKETPAIR
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_socketpair, "socketpair", 3, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM family, SCM style, SCM proto),
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"Return a pair of connected (but unnamed) socket ports of the\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"type specified by @var{family}, @var{style} and @var{proto}.\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"Many systems support only socket pairs of the @code{AF_UNIX}\n"
|
|
|
|
|
|
"family. Zero is likely to be the only meaningful value for\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@var{proto}.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_socketpair
|
1996-07-25 22:56:11 +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
|
|
|
|
int fam;
|
|
|
|
|
|
int fd[2];
|
|
|
|
|
|
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
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
|
|
|
|
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
if (socketpair (fam, scm_to_int (style), scm_to_int (proto), fd) == -1)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
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
|
|
|
|
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
return scm_cons (SCM_SOCK_FD_TO_PORT (fd[0]), SCM_SOCK_FD_TO_PORT (fd[1]));
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
Changes to compile under gnu-win32, from Marcus Daniels:
* stime.c (tzset): If tzset isn't provided, make it a NOP.
(scm_localtime): Change SCM_EOF to SCM_EOL.
(scm_mktime): Likewise.
* socket.c: Don't include sys/un.h unless autoconf tells
us Unix domain sockets are available.
(scm_fill_sockaddr): Ignore Unix domain code.
(scm_addr_vector): Likewise.
(scm_init_addr_buffer): Likewise.
(scm_socketpair): Don't include unless socketpair was
found during autoconf.
* simpos.c (SYSTNAME): Treat cygwin like Unix.
* scmsigs.c (scm_pause): Don't include unless pause was found
during autoconf.
* posix.c (scm_getgroups): Don't include unless support function
was found during autoconf (in this case, getgroups).
(scm_setpwent): For setpwent.
(scm_setegid): For setegid.
* net_db.c (scm_inet_netof): Don't include unless support
function was found during autoconf (in this case, inet_netof).
(scm_lnaof): For inet_lnaof.
(scm_inet_makeaddr): For inet_makeaddr.
(scm_getnet): For getnetent, getnetbyname, getnetbyaddr.
(scm_getproto): For getprotoent.
(scm_getserv): For getservent.
(scm_sethost): For sethostent, endhostent.
(scm_setnet): For setnetent, endnetent.
(scm_setproto): For setprotoent, endprotoent.
(scm_setserv): For setservent, endservent.
* scmconfig.h.in: Regenerated.
1997-07-11 05:43:36 +00:00
|
|
|
|
#endif
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_getsockopt, "getsockopt", 3, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM level, SCM optname),
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"Return the value of a particular socket option for the socket\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"port @var{sock}. @var{level} is an integer code for type of\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"option being requested, e.g., @code{SOL_SOCKET} for\n"
|
|
|
|
|
|
"socket-level options. @var{optname} is an integer code for the\n"
|
|
|
|
|
|
"option required and should be specified using one of the\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"symbols @code{SO_DEBUG}, @code{SO_REUSEADDR} etc.\n\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"The returned value is typically an integer but @code{SO_LINGER}\n"
|
|
|
|
|
|
"returns a pair of integers.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_getsockopt
|
1996-07-25 22:56:11 +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
|
|
|
|
int fd;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
/* size of optval is the largest supported option. */
|
* 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
|
|
|
|
|
|
char optval[sizeof (struct linger)];
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int optlen = sizeof (struct 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
|
* validate.h
(SCM_NUM2{SIZE,PTRDIFF,SHORT,USHORT,BITS,UBITS,INT,UINT}[_DEF]):
new macros.
* unif.h: type renaming:
scm_array -> scm_array_t
scm_array_dim -> scm_array_dim_t
the old names are deprecated, all in-Guile uses changed.
* tags.h (scm_ubits_t): new typedef, representing unsigned
scm_bits_t.
* stacks.h: type renaming:
scm_info_frame -> scm_info_frame_t
scm_stack -> scm_stack_t
the old names are deprecated, all in-Guile uses changed.
* srcprop.h: type renaming:
scm_srcprops -> scm_srcprops_t
scm_srcprops_chunk -> scm_srcprops_chunk_t
the old names are deprecated, all in-Guile uses changed.
* gsubr.c, procs.c, print.c, ports.c, read.c, rdelim.c, ramap.c,
rw.c, smob.c, sort.c, srcprop.c, stacks.c, strings.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, values.c,
vectors.c, vports.c, weaks.c:
various int/size_t -> size_t/scm_bits_t changes.
* random.h: type renaming:
scm_rstate -> scm_rstate_t
scm_rng -> scm_rng_t
scm_i_rstate -> scm_i_rstate_t
the old names are deprecated, all in-Guile uses changed.
* procs.h: type renaming:
scm_subr_entry -> scm_subr_entry_t
the old name is deprecated, all in-Guile uses changed.
* options.h (scm_option_t.val): unsigned long -> scm_bits_t.
type renaming:
scm_option -> scm_option_t
the old name is deprecated, all in-Guile uses changed.
* objects.c: various long -> scm_bits_t changes.
(scm_i_make_class_object): flags: unsigned long -> scm_ubits_t
* numbers.h (SCM_FIXNUM_BIT): deprecated, renamed to
SCM_I_FIXNUM_BIT.
* num2integral.i.c: new file, multiply included by numbers.c, used
to "templatize" the various integral <-> num conversion routines.
* numbers.c (scm_mkbig, scm_big2num, scm_adjbig, scm_normbig,
scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl):
deprecated.
(scm_i_mkbig, scm_i_big2inum, scm_i_adjbig, scm_i_normbig,
scm_i_copybig, scm_i_short2big, scm_i_ushort2big, scm_i_int2big,
scm_i_uint2big, scm_i_long2big, scm_i_ulong2big, scm_i_bits2big,
scm_i_ubits2big, scm_i_size2big, scm_i_ptrdiff2big,
scm_i_long_long2big, scm_i_ulong_long2big, scm_i_dbl2big,
scm_i_big2dbl, scm_short2num, scm_ushort2num, scm_int2num,
scm_uint2num, scm_bits2num, scm_ubits2num, scm_size2num,
scm_ptrdiff2num, scm_num2short, scm_num2ushort, scm_num2int,
scm_num2uint, scm_num2bits, scm_num2ubits, scm_num2ptrdiff,
scm_num2size): new functions.
* modules.c (scm_module_reverse_lookup): i, n: int -> scm_bits_t.x
* load.c: change int -> size_t in various places (where the
variable is used to store a string length).
(search-path): call scm_done_free, not scm_done_malloc.
* list.c (scm_ilength): return a scm_bits_t, not long.
some other {int,long} -> scm_bits_t changes.
* hashtab.c: various [u]int -> scm_bits_t changes.
scm_ihashx_closure -> scm_ihashx_closure_t (and made a typedef).
(scm_ihashx): n: uint -> scm_bits_t
use scm_bits2num instead of scm_ulong2num.
* gsubr.c: various int -> scm_bits_t changes.
* gh_data.c (gh_scm2double): no loss of precision any more.
* gh.h (gh_str2scm): len: int -> size_t
(gh_{get,set}_substr): start: int -> scm_bits_t,
len: int -> size_t
(gh_<num>2scm): n: int -> scm_bits_t
(gh_*vector_length): return scm_[u]size_t, not unsigned long.
(gh_length): return scm_bits_t, not unsigned long.
* fports.h: type renaming:
scm_fport -> scm_fport_t
the old name is deprecated, all in-Guile uses changed.
* fports.c (fport_fill_input): count: int -> scm_bits_t
(fport_flush): init_size, remaining, count: int -> scm_bits_t
* debug.h (scm_lookup_cstr, scm_lookup_soft, scm_evstr): removed
those prototypes, as the functions they prototype don't exist.
* fports.c (default_buffer_size): int -> size_t
(scm_fport_buffer_add): read_size, write_size: int -> scm_bits_t
default_size: int -> size_t
(scm_setvbuf): csize: int -> scm_bits_t
* fluids.c (n_fluids): int -> scm_bits_t
(grow_fluids): old_length, i: int -> scm_bits_t
(next_fluid_num, scm_fluid_ref, scm_fluid_set_x): n: int ->
scm_bits_t
(scm_c_with_fluids): flen, vlen: int -> scm_bits_t
* filesys.c (s_scm_open_fdes): changed calls to SCM_NUM2LONG to
the new and shiny SCM_NUM2INT.
* extensions.c: extension -> extension_t (and made a typedef).
* eval.h (SCM_IFRAME): cast to scm_bits_t, not int. just so
there are no nasty surprises if/when the various deeply magic tag
bits move somewhere else.
* eval.c: changed the locals used to store results of SCM_IFRAME,
scm_ilength and such to be of type scm_bits_t (and not int/long).
(iqq): depth, edepth: int -> scm_bits_t
(scm_eval_stack): int -> scm_bits_t
(SCM_CEVAL): various vars are not scm_bits_t instead of int.
(check_map_args, scm_map, scm_for_each): len: long -> scm_bits_t
i: int -> scm_bits_t
* environments.c: changed the many calls to scm_ulong2num to
scm_ubits2num.
(import_environment_fold): proc_as_ul: ulong -> scm_ubits_t
* dynwind.c (scm_dowinds): delta: long -> scm_bits_t
* debug.h: type renaming:
scm_debug_info -> scm_debug_info_t
scm_debug_frame -> scm_debug_frame_t
the old names are deprecated, all in-Guile uses changed.
(scm_debug_eframe_size): int -> scm_bits_t
* debug.c (scm_init_debug): use scm_c_define instead of the
deprecated scm_define.
* continuations.h: type renaming:
scm_contregs -> scm_contregs_t
the old name is deprecated, all in-Guile uses changed.
(scm_contregs_t.num_stack_items): size_t -> scm_bits_t
(scm_contregs_t.num_stack_items): ulong -> scm_ubits_t
* continuations.c (scm_make_continuation): change the type of
stack_size form long to scm_bits_t.
* ports.h: type renaming:
scm_port_rw_active -> scm_port_rw_active_t (and made a typedef)
scm_port -> scm_port_t
scm_ptob_descriptor -> scm_ptob_descriptor_t
the old names are deprecated, all in-Guile uses changed.
(scm_port_t.entry): int -> scm_bits_t.
(scm_port_t.line_number): int -> long.
(scm_port_t.putback_buf_size): int -> size_t.
* __scm.h (long_long, ulong_long): deprecated (they pollute the
global namespace and have little value besides that).
(SCM_BITS_LENGTH): new, is the bit size of scm_bits_t (i.e. of an
SCM handle).
(ifdef spaghetti): include sys/types.h and sys/stdtypes.h, if they
exist (for size_t & ptrdiff_t)
(scm_sizet): deprecated.
* Makefile.am (noinst_HEADERS): add num2integral.i.c
2001-05-24 00:50:51 +00:00
|
|
|
|
char optval[sizeof (size_t)];
|
|
|
|
|
|
int optlen = sizeof (size_t);
|
* 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
|
|
|
|
|
|
int ilevel;
|
|
|
|
|
|
int ioptname;
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
2000-06-14 01:33:10 +00:00
|
|
|
|
SCM_VALIDATE_OPFPORT (1, sock);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
ilevel = scm_to_int (level);
|
|
|
|
|
|
ioptname = scm_to_int (optname);
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
* 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
|
|
|
|
if (getsockopt (fd, ilevel, ioptname, (void *) optval, &optlen) == -1)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
SCM_SYSERROR;
|
* __scm.h, alist.c, alist.h, append.c, append.h, appinit.c,
arbiters.c, arbiters.h, async.c, async.h, boolean.c, boolean.h,
chars.c, chars.h, continuations.c, continuations.h, debug.c,
debug.h, dynwind.c, dynwind.h, eq.c, eq.h, error.c, eval.c,
eval.h, extchrs.c, extchrs.h, fdsocket.c, fdsocket.h, filesys.c,
filesys.h, fports.c, fports.h, gc.c, gdb_interface.h, gdbint.c,
gdbint.h, genio.c, genio.h, gscm.c, gscm.h, gsubr.c, gsubr.h,
hash.c, hash.h, hashtab.c, hashtab.h, init.c, ioext.c, ioext.h,
kw.c, kw.h, libguile.h, mallocs.c, mallocs.h, markers.c,
markers.h, mbstrings.c, mbstrings.h, numbers.c, numbers.h,
objprop.c, objprop.h, options.c, options.h, pairs.c, pairs.h,
ports.c, ports.h, posix.c, posix.h, print.c, print.h, procprop.c,
procprop.h, procs.c, procs.h, ramap.c, ramap.h, read.c, read.h,
root.c, scmsigs.c, scmsigs.h, sequences.c, sequences.h, simpos.c,
simpos.h, smob.c, socket.c, socket.h, srcprop.c, srcprop.h,
stackchk.c, stackchk.h, stime.c, stime.h, strings.c, strings.h,
strop.c, strop.h, strorder.c, strorder.h, strports.c, strports.h,
struct.c, struct.h, symbols.c, symbols.h, tag.c, tag.h, unif.c,
unif.h, variable.c, variable.h, vectors.c, vectors.h, version.c,
version.h, vports.c, vports.h, weaks.c, weaks.h: Use SCM_P to
declare functions with prototypes. (Patch thanks to Marius
Vollmer.)
1996-10-14 01:33:50 +00:00
|
|
|
|
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
if (ilevel == SOL_SOCKET)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
{
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
struct linger *ling = (struct linger *) optval;
|
|
|
|
|
|
|
|
|
|
|
|
return scm_cons (scm_long2num (ling->l_onoff),
|
|
|
|
|
|
scm_long2num (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
|
2001-06-26 17:53:09 +00:00
|
|
|
|
return scm_cons (scm_long2num (*(int *) optval),
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
scm_from_int (0));
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#endif
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
* 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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
if (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
|
|
|
|
#ifdef SO_SNDBUF
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|| ioptname == 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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|| ioptname == 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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
)
|
|
|
|
|
|
{
|
* validate.h
(SCM_NUM2{SIZE,PTRDIFF,SHORT,USHORT,BITS,UBITS,INT,UINT}[_DEF]):
new macros.
* unif.h: type renaming:
scm_array -> scm_array_t
scm_array_dim -> scm_array_dim_t
the old names are deprecated, all in-Guile uses changed.
* tags.h (scm_ubits_t): new typedef, representing unsigned
scm_bits_t.
* stacks.h: type renaming:
scm_info_frame -> scm_info_frame_t
scm_stack -> scm_stack_t
the old names are deprecated, all in-Guile uses changed.
* srcprop.h: type renaming:
scm_srcprops -> scm_srcprops_t
scm_srcprops_chunk -> scm_srcprops_chunk_t
the old names are deprecated, all in-Guile uses changed.
* gsubr.c, procs.c, print.c, ports.c, read.c, rdelim.c, ramap.c,
rw.c, smob.c, sort.c, srcprop.c, stacks.c, strings.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, values.c,
vectors.c, vports.c, weaks.c:
various int/size_t -> size_t/scm_bits_t changes.
* random.h: type renaming:
scm_rstate -> scm_rstate_t
scm_rng -> scm_rng_t
scm_i_rstate -> scm_i_rstate_t
the old names are deprecated, all in-Guile uses changed.
* procs.h: type renaming:
scm_subr_entry -> scm_subr_entry_t
the old name is deprecated, all in-Guile uses changed.
* options.h (scm_option_t.val): unsigned long -> scm_bits_t.
type renaming:
scm_option -> scm_option_t
the old name is deprecated, all in-Guile uses changed.
* objects.c: various long -> scm_bits_t changes.
(scm_i_make_class_object): flags: unsigned long -> scm_ubits_t
* numbers.h (SCM_FIXNUM_BIT): deprecated, renamed to
SCM_I_FIXNUM_BIT.
* num2integral.i.c: new file, multiply included by numbers.c, used
to "templatize" the various integral <-> num conversion routines.
* numbers.c (scm_mkbig, scm_big2num, scm_adjbig, scm_normbig,
scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl):
deprecated.
(scm_i_mkbig, scm_i_big2inum, scm_i_adjbig, scm_i_normbig,
scm_i_copybig, scm_i_short2big, scm_i_ushort2big, scm_i_int2big,
scm_i_uint2big, scm_i_long2big, scm_i_ulong2big, scm_i_bits2big,
scm_i_ubits2big, scm_i_size2big, scm_i_ptrdiff2big,
scm_i_long_long2big, scm_i_ulong_long2big, scm_i_dbl2big,
scm_i_big2dbl, scm_short2num, scm_ushort2num, scm_int2num,
scm_uint2num, scm_bits2num, scm_ubits2num, scm_size2num,
scm_ptrdiff2num, scm_num2short, scm_num2ushort, scm_num2int,
scm_num2uint, scm_num2bits, scm_num2ubits, scm_num2ptrdiff,
scm_num2size): new functions.
* modules.c (scm_module_reverse_lookup): i, n: int -> scm_bits_t.x
* load.c: change int -> size_t in various places (where the
variable is used to store a string length).
(search-path): call scm_done_free, not scm_done_malloc.
* list.c (scm_ilength): return a scm_bits_t, not long.
some other {int,long} -> scm_bits_t changes.
* hashtab.c: various [u]int -> scm_bits_t changes.
scm_ihashx_closure -> scm_ihashx_closure_t (and made a typedef).
(scm_ihashx): n: uint -> scm_bits_t
use scm_bits2num instead of scm_ulong2num.
* gsubr.c: various int -> scm_bits_t changes.
* gh_data.c (gh_scm2double): no loss of precision any more.
* gh.h (gh_str2scm): len: int -> size_t
(gh_{get,set}_substr): start: int -> scm_bits_t,
len: int -> size_t
(gh_<num>2scm): n: int -> scm_bits_t
(gh_*vector_length): return scm_[u]size_t, not unsigned long.
(gh_length): return scm_bits_t, not unsigned long.
* fports.h: type renaming:
scm_fport -> scm_fport_t
the old name is deprecated, all in-Guile uses changed.
* fports.c (fport_fill_input): count: int -> scm_bits_t
(fport_flush): init_size, remaining, count: int -> scm_bits_t
* debug.h (scm_lookup_cstr, scm_lookup_soft, scm_evstr): removed
those prototypes, as the functions they prototype don't exist.
* fports.c (default_buffer_size): int -> size_t
(scm_fport_buffer_add): read_size, write_size: int -> scm_bits_t
default_size: int -> size_t
(scm_setvbuf): csize: int -> scm_bits_t
* fluids.c (n_fluids): int -> scm_bits_t
(grow_fluids): old_length, i: int -> scm_bits_t
(next_fluid_num, scm_fluid_ref, scm_fluid_set_x): n: int ->
scm_bits_t
(scm_c_with_fluids): flen, vlen: int -> scm_bits_t
* filesys.c (s_scm_open_fdes): changed calls to SCM_NUM2LONG to
the new and shiny SCM_NUM2INT.
* extensions.c: extension -> extension_t (and made a typedef).
* eval.h (SCM_IFRAME): cast to scm_bits_t, not int. just so
there are no nasty surprises if/when the various deeply magic tag
bits move somewhere else.
* eval.c: changed the locals used to store results of SCM_IFRAME,
scm_ilength and such to be of type scm_bits_t (and not int/long).
(iqq): depth, edepth: int -> scm_bits_t
(scm_eval_stack): int -> scm_bits_t
(SCM_CEVAL): various vars are not scm_bits_t instead of int.
(check_map_args, scm_map, scm_for_each): len: long -> scm_bits_t
i: int -> scm_bits_t
* environments.c: changed the many calls to scm_ulong2num to
scm_ubits2num.
(import_environment_fold): proc_as_ul: ulong -> scm_ubits_t
* dynwind.c (scm_dowinds): delta: long -> scm_bits_t
* debug.h: type renaming:
scm_debug_info -> scm_debug_info_t
scm_debug_frame -> scm_debug_frame_t
the old names are deprecated, all in-Guile uses changed.
(scm_debug_eframe_size): int -> scm_bits_t
* debug.c (scm_init_debug): use scm_c_define instead of the
deprecated scm_define.
* continuations.h: type renaming:
scm_contregs -> scm_contregs_t
the old name is deprecated, all in-Guile uses changed.
(scm_contregs_t.num_stack_items): size_t -> scm_bits_t
(scm_contregs_t.num_stack_items): ulong -> scm_ubits_t
* continuations.c (scm_make_continuation): change the type of
stack_size form long to scm_bits_t.
* ports.h: type renaming:
scm_port_rw_active -> scm_port_rw_active_t (and made a typedef)
scm_port -> scm_port_t
scm_ptob_descriptor -> scm_ptob_descriptor_t
the old names are deprecated, all in-Guile uses changed.
(scm_port_t.entry): int -> scm_bits_t.
(scm_port_t.line_number): int -> long.
(scm_port_t.putback_buf_size): int -> size_t.
* __scm.h (long_long, ulong_long): deprecated (they pollute the
global namespace and have little value besides that).
(SCM_BITS_LENGTH): new, is the bit size of scm_bits_t (i.e. of an
SCM handle).
(ifdef spaghetti): include sys/types.h and sys/stdtypes.h, if they
exist (for size_t & ptrdiff_t)
(scm_sizet): deprecated.
* Makefile.am (noinst_HEADERS): add num2integral.i.c
2001-05-24 00:50:51 +00:00
|
|
|
|
return scm_long2num (*(size_t *) optval);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return scm_long2num (*(int *) optval);
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_setsockopt, "setsockopt", 4, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM level, SCM optname, SCM value),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Set the value of a particular socket option for the socket\n"
|
|
|
|
|
|
"port @var{sock}. @var{level} is an integer code for type of option\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"being set, e.g., @code{SOL_SOCKET} for socket-level options.\n"
|
|
|
|
|
|
"@var{optname} is an\n"
|
|
|
|
|
|
"integer code for the option to set and should be specified using one of\n"
|
|
|
|
|
|
"the symbols @code{SO_DEBUG}, @code{SO_REUSEADDR} etc.\n"
|
|
|
|
|
|
"@var{value} is the value to which the option should be set. For\n"
|
|
|
|
|
|
"most options this must be an integer, but for @code{SO_LINGER} it must\n"
|
|
|
|
|
|
"be a pair.\n\n"
|
|
|
|
|
|
"The return value is unspecified.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_setsockopt
|
1996-07-25 22:56:11 +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
|
|
|
|
int fd;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int optlen = -1;
|
|
|
|
|
|
/* size of optval is the largest supported option. */
|
* 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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
char optval[sizeof (struct 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
|
* validate.h
(SCM_NUM2{SIZE,PTRDIFF,SHORT,USHORT,BITS,UBITS,INT,UINT}[_DEF]):
new macros.
* unif.h: type renaming:
scm_array -> scm_array_t
scm_array_dim -> scm_array_dim_t
the old names are deprecated, all in-Guile uses changed.
* tags.h (scm_ubits_t): new typedef, representing unsigned
scm_bits_t.
* stacks.h: type renaming:
scm_info_frame -> scm_info_frame_t
scm_stack -> scm_stack_t
the old names are deprecated, all in-Guile uses changed.
* srcprop.h: type renaming:
scm_srcprops -> scm_srcprops_t
scm_srcprops_chunk -> scm_srcprops_chunk_t
the old names are deprecated, all in-Guile uses changed.
* gsubr.c, procs.c, print.c, ports.c, read.c, rdelim.c, ramap.c,
rw.c, smob.c, sort.c, srcprop.c, stacks.c, strings.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, values.c,
vectors.c, vports.c, weaks.c:
various int/size_t -> size_t/scm_bits_t changes.
* random.h: type renaming:
scm_rstate -> scm_rstate_t
scm_rng -> scm_rng_t
scm_i_rstate -> scm_i_rstate_t
the old names are deprecated, all in-Guile uses changed.
* procs.h: type renaming:
scm_subr_entry -> scm_subr_entry_t
the old name is deprecated, all in-Guile uses changed.
* options.h (scm_option_t.val): unsigned long -> scm_bits_t.
type renaming:
scm_option -> scm_option_t
the old name is deprecated, all in-Guile uses changed.
* objects.c: various long -> scm_bits_t changes.
(scm_i_make_class_object): flags: unsigned long -> scm_ubits_t
* numbers.h (SCM_FIXNUM_BIT): deprecated, renamed to
SCM_I_FIXNUM_BIT.
* num2integral.i.c: new file, multiply included by numbers.c, used
to "templatize" the various integral <-> num conversion routines.
* numbers.c (scm_mkbig, scm_big2num, scm_adjbig, scm_normbig,
scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl):
deprecated.
(scm_i_mkbig, scm_i_big2inum, scm_i_adjbig, scm_i_normbig,
scm_i_copybig, scm_i_short2big, scm_i_ushort2big, scm_i_int2big,
scm_i_uint2big, scm_i_long2big, scm_i_ulong2big, scm_i_bits2big,
scm_i_ubits2big, scm_i_size2big, scm_i_ptrdiff2big,
scm_i_long_long2big, scm_i_ulong_long2big, scm_i_dbl2big,
scm_i_big2dbl, scm_short2num, scm_ushort2num, scm_int2num,
scm_uint2num, scm_bits2num, scm_ubits2num, scm_size2num,
scm_ptrdiff2num, scm_num2short, scm_num2ushort, scm_num2int,
scm_num2uint, scm_num2bits, scm_num2ubits, scm_num2ptrdiff,
scm_num2size): new functions.
* modules.c (scm_module_reverse_lookup): i, n: int -> scm_bits_t.x
* load.c: change int -> size_t in various places (where the
variable is used to store a string length).
(search-path): call scm_done_free, not scm_done_malloc.
* list.c (scm_ilength): return a scm_bits_t, not long.
some other {int,long} -> scm_bits_t changes.
* hashtab.c: various [u]int -> scm_bits_t changes.
scm_ihashx_closure -> scm_ihashx_closure_t (and made a typedef).
(scm_ihashx): n: uint -> scm_bits_t
use scm_bits2num instead of scm_ulong2num.
* gsubr.c: various int -> scm_bits_t changes.
* gh_data.c (gh_scm2double): no loss of precision any more.
* gh.h (gh_str2scm): len: int -> size_t
(gh_{get,set}_substr): start: int -> scm_bits_t,
len: int -> size_t
(gh_<num>2scm): n: int -> scm_bits_t
(gh_*vector_length): return scm_[u]size_t, not unsigned long.
(gh_length): return scm_bits_t, not unsigned long.
* fports.h: type renaming:
scm_fport -> scm_fport_t
the old name is deprecated, all in-Guile uses changed.
* fports.c (fport_fill_input): count: int -> scm_bits_t
(fport_flush): init_size, remaining, count: int -> scm_bits_t
* debug.h (scm_lookup_cstr, scm_lookup_soft, scm_evstr): removed
those prototypes, as the functions they prototype don't exist.
* fports.c (default_buffer_size): int -> size_t
(scm_fport_buffer_add): read_size, write_size: int -> scm_bits_t
default_size: int -> size_t
(scm_setvbuf): csize: int -> scm_bits_t
* fluids.c (n_fluids): int -> scm_bits_t
(grow_fluids): old_length, i: int -> scm_bits_t
(next_fluid_num, scm_fluid_ref, scm_fluid_set_x): n: int ->
scm_bits_t
(scm_c_with_fluids): flen, vlen: int -> scm_bits_t
* filesys.c (s_scm_open_fdes): changed calls to SCM_NUM2LONG to
the new and shiny SCM_NUM2INT.
* extensions.c: extension -> extension_t (and made a typedef).
* eval.h (SCM_IFRAME): cast to scm_bits_t, not int. just so
there are no nasty surprises if/when the various deeply magic tag
bits move somewhere else.
* eval.c: changed the locals used to store results of SCM_IFRAME,
scm_ilength and such to be of type scm_bits_t (and not int/long).
(iqq): depth, edepth: int -> scm_bits_t
(scm_eval_stack): int -> scm_bits_t
(SCM_CEVAL): various vars are not scm_bits_t instead of int.
(check_map_args, scm_map, scm_for_each): len: long -> scm_bits_t
i: int -> scm_bits_t
* environments.c: changed the many calls to scm_ulong2num to
scm_ubits2num.
(import_environment_fold): proc_as_ul: ulong -> scm_ubits_t
* dynwind.c (scm_dowinds): delta: long -> scm_bits_t
* debug.h: type renaming:
scm_debug_info -> scm_debug_info_t
scm_debug_frame -> scm_debug_frame_t
the old names are deprecated, all in-Guile uses changed.
(scm_debug_eframe_size): int -> scm_bits_t
* debug.c (scm_init_debug): use scm_c_define instead of the
deprecated scm_define.
* continuations.h: type renaming:
scm_contregs -> scm_contregs_t
the old name is deprecated, all in-Guile uses changed.
(scm_contregs_t.num_stack_items): size_t -> scm_bits_t
(scm_contregs_t.num_stack_items): ulong -> scm_ubits_t
* continuations.c (scm_make_continuation): change the type of
stack_size form long to scm_bits_t.
* ports.h: type renaming:
scm_port_rw_active -> scm_port_rw_active_t (and made a typedef)
scm_port -> scm_port_t
scm_ptob_descriptor -> scm_ptob_descriptor_t
the old names are deprecated, all in-Guile uses changed.
(scm_port_t.entry): int -> scm_bits_t.
(scm_port_t.line_number): int -> long.
(scm_port_t.putback_buf_size): int -> size_t.
* __scm.h (long_long, ulong_long): deprecated (they pollute the
global namespace and have little value besides that).
(SCM_BITS_LENGTH): new, is the bit size of scm_bits_t (i.e. of an
SCM handle).
(ifdef spaghetti): include sys/types.h and sys/stdtypes.h, if they
exist (for size_t & ptrdiff_t)
(scm_sizet): deprecated.
* Makefile.am (noinst_HEADERS): add num2integral.i.c
2001-05-24 00:50:51 +00:00
|
|
|
|
char optval[sizeof (size_t)];
|
* 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
|
|
|
|
|
|
int ilevel, ioptname;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|
|
|
|
|
|
SCM_VALIDATE_OPFPORT (1, sock);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
ilevel = scm_to_int (level);
|
|
|
|
|
|
ioptname = scm_to_int (optname);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|
* 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);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
{
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
struct linger ling;
|
|
|
|
|
|
long lv;
|
|
|
|
|
|
|
|
|
|
|
|
SCM_ASSERT (SCM_CONSP (value), value, SCM_ARG4, FUNC_NAME);
|
|
|
|
|
|
lv = SCM_NUM2LONG (4, SCM_CAR (value));
|
|
|
|
|
|
ling.l_onoff = (int) lv;
|
|
|
|
|
|
SCM_ASSERT_RANGE (SCM_ARG4, value, ling.l_onoff == lv);
|
|
|
|
|
|
lv = SCM_NUM2LONG (4, SCM_CDR (value));
|
|
|
|
|
|
ling.l_linger = (int) lv;
|
|
|
|
|
|
SCM_ASSERT_RANGE (SCM_ARG4, value, ling.l_linger == lv);
|
|
|
|
|
|
optlen = (int) sizeof (struct linger);
|
|
|
|
|
|
memcpy (optval, (void *) &ling, optlen);
|
* 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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int ling;
|
|
|
|
|
|
long lv;
|
|
|
|
|
|
|
|
|
|
|
|
SCM_ASSERT (SCM_CONSP (value), value, SCM_ARG4, FUNC_NAME);
|
|
|
|
|
|
/* timeout is ignored, but may as well validate it. */
|
|
|
|
|
|
lv = SCM_NUM2LONG (4, SCM_CDR (value));
|
|
|
|
|
|
ling = (int) lv;
|
|
|
|
|
|
SCM_ASSERT_RANGE (SCM_ARG4, value, ling == lv);
|
|
|
|
|
|
lv = SCM_NUM2LONG (4, SCM_CAR (value));
|
|
|
|
|
|
ling = (int) lv;
|
|
|
|
|
|
SCM_ASSERT_RANGE (SCM_ARG4, value, ling == lv);
|
|
|
|
|
|
optlen = (int) sizeof (int);
|
|
|
|
|
|
(*(int *) optval) = ling;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
#endif
|
|
|
|
|
|
if (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
|
|
|
|
#ifdef SO_SNDBUF
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|| ioptname == 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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|| ioptname == 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
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
long lv = SCM_NUM2LONG (4, value);
|
|
|
|
|
|
|
* validate.h
(SCM_NUM2{SIZE,PTRDIFF,SHORT,USHORT,BITS,UBITS,INT,UINT}[_DEF]):
new macros.
* unif.h: type renaming:
scm_array -> scm_array_t
scm_array_dim -> scm_array_dim_t
the old names are deprecated, all in-Guile uses changed.
* tags.h (scm_ubits_t): new typedef, representing unsigned
scm_bits_t.
* stacks.h: type renaming:
scm_info_frame -> scm_info_frame_t
scm_stack -> scm_stack_t
the old names are deprecated, all in-Guile uses changed.
* srcprop.h: type renaming:
scm_srcprops -> scm_srcprops_t
scm_srcprops_chunk -> scm_srcprops_chunk_t
the old names are deprecated, all in-Guile uses changed.
* gsubr.c, procs.c, print.c, ports.c, read.c, rdelim.c, ramap.c,
rw.c, smob.c, sort.c, srcprop.c, stacks.c, strings.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, values.c,
vectors.c, vports.c, weaks.c:
various int/size_t -> size_t/scm_bits_t changes.
* random.h: type renaming:
scm_rstate -> scm_rstate_t
scm_rng -> scm_rng_t
scm_i_rstate -> scm_i_rstate_t
the old names are deprecated, all in-Guile uses changed.
* procs.h: type renaming:
scm_subr_entry -> scm_subr_entry_t
the old name is deprecated, all in-Guile uses changed.
* options.h (scm_option_t.val): unsigned long -> scm_bits_t.
type renaming:
scm_option -> scm_option_t
the old name is deprecated, all in-Guile uses changed.
* objects.c: various long -> scm_bits_t changes.
(scm_i_make_class_object): flags: unsigned long -> scm_ubits_t
* numbers.h (SCM_FIXNUM_BIT): deprecated, renamed to
SCM_I_FIXNUM_BIT.
* num2integral.i.c: new file, multiply included by numbers.c, used
to "templatize" the various integral <-> num conversion routines.
* numbers.c (scm_mkbig, scm_big2num, scm_adjbig, scm_normbig,
scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl):
deprecated.
(scm_i_mkbig, scm_i_big2inum, scm_i_adjbig, scm_i_normbig,
scm_i_copybig, scm_i_short2big, scm_i_ushort2big, scm_i_int2big,
scm_i_uint2big, scm_i_long2big, scm_i_ulong2big, scm_i_bits2big,
scm_i_ubits2big, scm_i_size2big, scm_i_ptrdiff2big,
scm_i_long_long2big, scm_i_ulong_long2big, scm_i_dbl2big,
scm_i_big2dbl, scm_short2num, scm_ushort2num, scm_int2num,
scm_uint2num, scm_bits2num, scm_ubits2num, scm_size2num,
scm_ptrdiff2num, scm_num2short, scm_num2ushort, scm_num2int,
scm_num2uint, scm_num2bits, scm_num2ubits, scm_num2ptrdiff,
scm_num2size): new functions.
* modules.c (scm_module_reverse_lookup): i, n: int -> scm_bits_t.x
* load.c: change int -> size_t in various places (where the
variable is used to store a string length).
(search-path): call scm_done_free, not scm_done_malloc.
* list.c (scm_ilength): return a scm_bits_t, not long.
some other {int,long} -> scm_bits_t changes.
* hashtab.c: various [u]int -> scm_bits_t changes.
scm_ihashx_closure -> scm_ihashx_closure_t (and made a typedef).
(scm_ihashx): n: uint -> scm_bits_t
use scm_bits2num instead of scm_ulong2num.
* gsubr.c: various int -> scm_bits_t changes.
* gh_data.c (gh_scm2double): no loss of precision any more.
* gh.h (gh_str2scm): len: int -> size_t
(gh_{get,set}_substr): start: int -> scm_bits_t,
len: int -> size_t
(gh_<num>2scm): n: int -> scm_bits_t
(gh_*vector_length): return scm_[u]size_t, not unsigned long.
(gh_length): return scm_bits_t, not unsigned long.
* fports.h: type renaming:
scm_fport -> scm_fport_t
the old name is deprecated, all in-Guile uses changed.
* fports.c (fport_fill_input): count: int -> scm_bits_t
(fport_flush): init_size, remaining, count: int -> scm_bits_t
* debug.h (scm_lookup_cstr, scm_lookup_soft, scm_evstr): removed
those prototypes, as the functions they prototype don't exist.
* fports.c (default_buffer_size): int -> size_t
(scm_fport_buffer_add): read_size, write_size: int -> scm_bits_t
default_size: int -> size_t
(scm_setvbuf): csize: int -> scm_bits_t
* fluids.c (n_fluids): int -> scm_bits_t
(grow_fluids): old_length, i: int -> scm_bits_t
(next_fluid_num, scm_fluid_ref, scm_fluid_set_x): n: int ->
scm_bits_t
(scm_c_with_fluids): flen, vlen: int -> scm_bits_t
* filesys.c (s_scm_open_fdes): changed calls to SCM_NUM2LONG to
the new and shiny SCM_NUM2INT.
* extensions.c: extension -> extension_t (and made a typedef).
* eval.h (SCM_IFRAME): cast to scm_bits_t, not int. just so
there are no nasty surprises if/when the various deeply magic tag
bits move somewhere else.
* eval.c: changed the locals used to store results of SCM_IFRAME,
scm_ilength and such to be of type scm_bits_t (and not int/long).
(iqq): depth, edepth: int -> scm_bits_t
(scm_eval_stack): int -> scm_bits_t
(SCM_CEVAL): various vars are not scm_bits_t instead of int.
(check_map_args, scm_map, scm_for_each): len: long -> scm_bits_t
i: int -> scm_bits_t
* environments.c: changed the many calls to scm_ulong2num to
scm_ubits2num.
(import_environment_fold): proc_as_ul: ulong -> scm_ubits_t
* dynwind.c (scm_dowinds): delta: long -> scm_bits_t
* debug.h: type renaming:
scm_debug_info -> scm_debug_info_t
scm_debug_frame -> scm_debug_frame_t
the old names are deprecated, all in-Guile uses changed.
(scm_debug_eframe_size): int -> scm_bits_t
* debug.c (scm_init_debug): use scm_c_define instead of the
deprecated scm_define.
* continuations.h: type renaming:
scm_contregs -> scm_contregs_t
the old name is deprecated, all in-Guile uses changed.
(scm_contregs_t.num_stack_items): size_t -> scm_bits_t
(scm_contregs_t.num_stack_items): ulong -> scm_ubits_t
* continuations.c (scm_make_continuation): change the type of
stack_size form long to scm_bits_t.
* ports.h: type renaming:
scm_port_rw_active -> scm_port_rw_active_t (and made a typedef)
scm_port -> scm_port_t
scm_ptob_descriptor -> scm_ptob_descriptor_t
the old names are deprecated, all in-Guile uses changed.
(scm_port_t.entry): int -> scm_bits_t.
(scm_port_t.line_number): int -> long.
(scm_port_t.putback_buf_size): int -> size_t.
* __scm.h (long_long, ulong_long): deprecated (they pollute the
global namespace and have little value besides that).
(SCM_BITS_LENGTH): new, is the bit size of scm_bits_t (i.e. of an
SCM handle).
(ifdef spaghetti): include sys/types.h and sys/stdtypes.h, if they
exist (for size_t & ptrdiff_t)
(scm_sizet): deprecated.
* Makefile.am (noinst_HEADERS): add num2integral.i.c
2001-05-24 00:50:51 +00:00
|
|
|
|
optlen = (int) sizeof (size_t);
|
|
|
|
|
|
(*(size_t *) optval) = (size_t) lv;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (optlen == -1)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
{
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
/* Most options take an int. */
|
|
|
|
|
|
long lv = SCM_NUM2LONG (4, value);
|
|
|
|
|
|
int val = (int) lv;
|
|
|
|
|
|
|
|
|
|
|
|
SCM_ASSERT_RANGE (SCM_ARG4, value, val == lv);
|
* 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
|
|
|
|
optlen = (int) sizeof (int);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
(*(int *) optval) = val;
|
1996-07-25 22:56:11 +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
|
|
|
|
if (setsockopt (fd, ilevel, ioptname, (void *) optval, optlen) == -1)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
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;
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_shutdown, "shutdown", 2, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM how),
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"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.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_shutdown
|
1996-07-25 22:56:11 +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
|
|
|
|
int fd;
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
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);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
if (shutdown (fd, scm_to_signed_integer (how, 0, 2)) == -1)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +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
|
|
|
|
/* 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 *
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
scm_fill_sockaddr (int fam, SCM address, SCM *args, int which_arg,
|
|
|
|
|
|
const char *proc, int *size)
|
2001-04-17 23:03:07 +00:00
|
|
|
|
#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)
|
1996-07-25 22:56:11 +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
|
|
|
|
case AF_INET:
|
|
|
|
|
|
{
|
|
|
|
|
|
struct sockaddr_in *soka;
|
2001-04-17 23:03:07 +00:00
|
|
|
|
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
|
|
|
|
|
2001-04-17 23:03:07 +00:00
|
|
|
|
SCM_VALIDATE_ULONG_COPY (which_arg, address, addr);
|
|
|
|
|
|
SCM_VALIDATE_CONS (which_arg + 1, *args);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
port = scm_to_int (SCM_CAR (*args));
|
2001-04-17 23:03:07 +00:00
|
|
|
|
*args = SCM_CDR (*args);
|
2002-08-16 22:01:10 +00:00
|
|
|
|
soka = (struct sockaddr_in *) scm_malloc (sizeof (struct sockaddr_in));
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
if (!soka)
|
|
|
|
|
|
scm_memory_error (proc);
|
2001-04-17 23:03:07 +00:00
|
|
|
|
/* 4.4BSD-style interface includes sin_len member and defines SIN_LEN,
|
|
|
|
|
|
4.3BSD does not. */
|
|
|
|
|
|
#ifdef 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;
|
2001-04-17 23:03:07 +00:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2001-05-05 08:31:00 +00:00
|
|
|
|
#ifdef HAVE_IPV6
|
2001-04-17 23:03:07 +00:00
|
|
|
|
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);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
port = scm_to_int (SCM_CAR (*args));
|
2001-04-17 23:03:07 +00:00
|
|
|
|
*args = SCM_CDR (*args);
|
|
|
|
|
|
if (SCM_CONSP (*args))
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM_VALIDATE_ULONG_COPY (which_arg + 2, SCM_CAR (*args), flowinfo);
|
|
|
|
|
|
*args = SCM_CDR (*args);
|
|
|
|
|
|
if (SCM_CONSP (*args))
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM_VALIDATE_ULONG_COPY (which_arg + 3, SCM_CAR (*args),
|
|
|
|
|
|
scope_id);
|
|
|
|
|
|
*args = SCM_CDR (*args);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2002-08-16 22:01:10 +00:00
|
|
|
|
soka = (struct sockaddr_in6 *) scm_malloc (sizeof (struct sockaddr_in6));
|
2001-04-17 23:03:07 +00:00
|
|
|
|
if (!soka)
|
|
|
|
|
|
scm_memory_error (proc);
|
|
|
|
|
|
#ifdef SIN_LEN6
|
|
|
|
|
|
soka->sin6_len = sizeof (struct sockaddr_in6);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
soka->sin6_family = AF_INET6;
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
scm_to_ipv6 (soka->sin6_addr.s6_addr, address);
|
2001-04-20 19:22:47 +00:00
|
|
|
|
soka->sin6_port = htons (port);
|
2001-04-17 23:03:07 +00:00
|
|
|
|
soka->sin6_flowinfo = flowinfo;
|
2001-04-20 19:22:47 +00:00
|
|
|
|
#ifdef HAVE_SIN6_SCOPE_ID
|
2001-04-17 23:03:07 +00:00
|
|
|
|
soka->sin6_scope_id = scope_id;
|
2001-04-20 19:22:47 +00:00
|
|
|
|
#endif
|
2001-04-17 23:03:07 +00:00
|
|
|
|
*size = sizeof (struct sockaddr_in6);
|
|
|
|
|
|
return (struct sockaddr *) soka;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
1998-04-12 16:27:48 +00:00
|
|
|
|
#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;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int 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
|
|
|
|
|
2000-10-30 11:42:26 +00:00
|
|
|
|
SCM_ASSERT (SCM_STRINGP (address), address, which_arg, proc);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +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, SCM_STRING_LENGTH (address) + 1 - (sizeof soka->sun_path));
|
2002-08-16 22:01:10 +00:00
|
|
|
|
soka = (struct sockaddr_un *) scm_malloc (addr_size);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
if (!soka)
|
|
|
|
|
|
scm_memory_error (proc);
|
|
|
|
|
|
memset (soka, 0, addr_size); /* for sun_len: see sin_len above. */
|
|
|
|
|
|
soka->sun_family = AF_UNIX;
|
2000-11-22 11:20:03 +00:00
|
|
|
|
memcpy (soka->sun_path, SCM_STRING_CHARS (address),
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
SCM_STRING_LENGTH (address));
|
|
|
|
|
|
*size = SUN_LEN (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 (struct sockaddr *) soka;
|
|
|
|
|
|
}
|
Changes to compile under gnu-win32, from Marcus Daniels:
* stime.c (tzset): If tzset isn't provided, make it a NOP.
(scm_localtime): Change SCM_EOF to SCM_EOL.
(scm_mktime): Likewise.
* socket.c: Don't include sys/un.h unless autoconf tells
us Unix domain sockets are available.
(scm_fill_sockaddr): Ignore Unix domain code.
(scm_addr_vector): Likewise.
(scm_init_addr_buffer): Likewise.
(scm_socketpair): Don't include unless socketpair was
found during autoconf.
* simpos.c (SYSTNAME): Treat cygwin like Unix.
* scmsigs.c (scm_pause): Don't include unless pause was found
during autoconf.
* posix.c (scm_getgroups): Don't include unless support function
was found during autoconf (in this case, getgroups).
(scm_setpwent): For setpwent.
(scm_setegid): For setegid.
* net_db.c (scm_inet_netof): Don't include unless support
function was found during autoconf (in this case, inet_netof).
(scm_lnaof): For inet_lnaof.
(scm_inet_makeaddr): For inet_makeaddr.
(scm_getnet): For getnetent, getnetbyname, getnetbyaddr.
(scm_getproto): For getprotoent.
(scm_getserv): For getservent.
(scm_sethost): For sethostent, endhostent.
(scm_setnet): For setnetent, endnetent.
(scm_setproto): For setprotoent, endprotoent.
(scm_setserv): For setservent, endservent.
* scmconfig.h.in: Regenerated.
1997-07-11 05:43:36 +00:00
|
|
|
|
#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:
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_out_of_range (proc, scm_from_int (fam));
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2001-04-17 23:03:07 +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
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_connect, "connect", 3, 0, 1,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM fam, SCM address, SCM args),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Initiate a connection from a socket using a specified address\n"
|
2001-04-17 23:03:07 +00:00
|
|
|
|
"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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"For a socket of family @code{AF_UNIX},\n"
|
2001-04-17 23:03:07 +00:00
|
|
|
|
"only @var{address} is specified and must be a string with the\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"filename where the socket is to be created.\n\n"
|
|
|
|
|
|
"For a socket of family @code{AF_INET},\n"
|
2001-04-17 23:03:07 +00:00
|
|
|
|
"@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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"The return value is unspecified.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_connect
|
1996-07-25 22:56:11 +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
|
|
|
|
int fd;
|
|
|
|
|
|
struct sockaddr *soka;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int size;
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
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);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
soka = scm_fill_sockaddr (scm_to_int (fam), address, &args, 3, FUNC_NAME,
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
&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)
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
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;
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_bind, "bind", 3, 0, 1,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM fam, SCM address, SCM args),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Assign an address to the socket port @var{sock}.\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"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"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"The format of @var{address} and @var{args} depends\n"
|
|
|
|
|
|
"on the family of the socket.\n\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"For a socket of family @code{AF_UNIX}, only @var{address}\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"@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"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"The return value is unspecified.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#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;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int 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;
|
|
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
SCM_VALIDATE_OPFPORT (1, sock);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
soka = scm_fill_sockaddr (scm_to_int (fam), address, &args, 3, FUNC_NAME,
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
&size);
|
* 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);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
if (bind (fd, soka, size) == -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
int save_errno = errno;
|
|
|
|
|
|
|
|
|
|
|
|
free (soka);
|
|
|
|
|
|
errno = save_errno;
|
1999-12-12 02:36:16 +00:00
|
|
|
|
SCM_SYSERROR;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
1999-12-12 02:36:16 +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
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_listen, "listen", 2, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM backlog),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Enable @var{sock} to accept connection\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"requests. @var{backlog} is an integer specifying\n"
|
|
|
|
|
|
"the maximum length of the queue for pending connections.\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"The return value is unspecified.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#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;
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
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);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
if (listen (fd, scm_to_int (backlog)) == -1)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
1999-12-12 02:36:16 +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
|
|
|
|
|
|
|
|
|
|
/* Put the components of a sockaddr into a new SCM vector. */
|
|
|
|
|
|
static SCM
|
2002-08-30 21:57:10 +00:00
|
|
|
|
scm_addr_vector (const struct sockaddr *address, int addr_size,
|
|
|
|
|
|
const char *proc)
|
1996-07-25 22:56:11 +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
|
|
|
|
short int fam = address->sa_family;
|
2002-07-21 17:46:23 +00:00
|
|
|
|
SCM result =SCM_EOL;
|
2002-07-20 14:08:34 +00:00
|
|
|
|
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|
2001-04-20 19:22:47 +00:00
|
|
|
|
switch (fam)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
{
|
2001-04-20 19:22:47 +00:00
|
|
|
|
case AF_INET:
|
|
|
|
|
|
{
|
2001-04-21 19:10:15 +00:00
|
|
|
|
const struct sockaddr_in *nad = (struct sockaddr_in *) address;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|
2002-07-21 17:46:23 +00:00
|
|
|
|
result = scm_c_make_vector (3, SCM_UNSPECIFIED);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
|
2002-07-21 17:46:23 +00:00
|
|
|
|
SCM_VECTOR_SET(result, 0, scm_ulong2num ((unsigned long) fam));
|
|
|
|
|
|
SCM_VECTOR_SET(result, 1, scm_ulong2num (ntohl (nad->sin_addr.s_addr)));
|
|
|
|
|
|
SCM_VECTOR_SET(result, 2, scm_ulong2num ((unsigned long) ntohs (nad->sin_port)));
|
2001-04-20 19:22:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2001-05-05 08:31:00 +00:00
|
|
|
|
#ifdef HAVE_IPV6
|
2001-04-20 19:22:47 +00:00
|
|
|
|
case AF_INET6:
|
|
|
|
|
|
{
|
2001-04-21 19:10:15 +00:00
|
|
|
|
const struct sockaddr_in6 *nad = (struct sockaddr_in6 *) address;
|
2001-04-20 19:22:47 +00:00
|
|
|
|
|
2002-07-21 17:46:23 +00:00
|
|
|
|
result = scm_c_make_vector (5, SCM_UNSPECIFIED);
|
|
|
|
|
|
SCM_VECTOR_SET(result, 0, scm_ulong2num ((unsigned long) fam));
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
SCM_VECTOR_SET(result, 1, scm_from_ipv6 (nad->sin6_addr.s6_addr));
|
2002-07-21 17:46:23 +00:00
|
|
|
|
SCM_VECTOR_SET(result, 2, scm_ulong2num ((unsigned long) ntohs (nad->sin6_port)));
|
|
|
|
|
|
SCM_VECTOR_SET(result, 3, scm_ulong2num ((unsigned long) nad->sin6_flowinfo));
|
2001-04-20 19:22:47 +00:00
|
|
|
|
#ifdef HAVE_SIN6_SCOPE_ID
|
2002-07-21 17:46:23 +00:00
|
|
|
|
SCM_VECTOR_SET(result, 4, scm_ulong2num ((unsigned long) nad->sin6_scope_id));
|
2001-04-20 19:22:47 +00:00
|
|
|
|
#else
|
2002-07-21 17:46:23 +00:00
|
|
|
|
SCM_VECTOR_SET(result, 4, SCM_INUM0);
|
Changes to compile under gnu-win32, from Marcus Daniels:
* stime.c (tzset): If tzset isn't provided, make it a NOP.
(scm_localtime): Change SCM_EOF to SCM_EOL.
(scm_mktime): Likewise.
* socket.c: Don't include sys/un.h unless autoconf tells
us Unix domain sockets are available.
(scm_fill_sockaddr): Ignore Unix domain code.
(scm_addr_vector): Likewise.
(scm_init_addr_buffer): Likewise.
(scm_socketpair): Don't include unless socketpair was
found during autoconf.
* simpos.c (SYSTNAME): Treat cygwin like Unix.
* scmsigs.c (scm_pause): Don't include unless pause was found
during autoconf.
* posix.c (scm_getgroups): Don't include unless support function
was found during autoconf (in this case, getgroups).
(scm_setpwent): For setpwent.
(scm_setegid): For setegid.
* net_db.c (scm_inet_netof): Don't include unless support
function was found during autoconf (in this case, inet_netof).
(scm_lnaof): For inet_lnaof.
(scm_inet_makeaddr): For inet_makeaddr.
(scm_getnet): For getnetent, getnetbyname, getnetbyaddr.
(scm_getproto): For getprotoent.
(scm_getserv): For getservent.
(scm_sethost): For sethostent, endhostent.
(scm_setnet): For setnetent, endnetent.
(scm_setproto): For setprotoent, endprotoent.
(scm_setserv): For setservent, endservent.
* scmconfig.h.in: Regenerated.
1997-07-11 05:43:36 +00:00
|
|
|
|
#endif
|
2001-04-20 19:22:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
|
|
|
|
|
|
case AF_UNIX:
|
|
|
|
|
|
{
|
2001-04-21 19:10:15 +00:00
|
|
|
|
const struct sockaddr_un *nad = (struct sockaddr_un *) address;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|
2002-07-21 17:46:23 +00:00
|
|
|
|
result = scm_c_make_vector (2, SCM_UNSPECIFIED);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
|
2002-07-21 17:46:23 +00:00
|
|
|
|
SCM_VECTOR_SET(result, 0, scm_ulong2num ((unsigned long) fam));
|
2002-08-30 21:57:10 +00:00
|
|
|
|
/* 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_VECTOR_SET(result, 1, SCM_BOOL_F);
|
|
|
|
|
|
else
|
|
|
|
|
|
SCM_VECTOR_SET(result, 1, scm_mem2string (nad->sun_path,
|
|
|
|
|
|
strlen (nad->sun_path)));
|
2001-04-20 19:22:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
default:
|
|
|
|
|
|
scm_misc_error (proc, "Unrecognised address family: ~A",
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_list_1 (scm_from_int (fam)));
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
2002-07-21 17:46:23 +00:00
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
/* calculate the size of a buffer large enough to hold any supported
|
|
|
|
|
|
sockaddr type. if the buffer isn't large enough, certain system
|
|
|
|
|
|
calls will return a truncated 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
|
|
|
|
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
#if defined (HAVE_UNIX_DOMAIN_SOCKETS)
|
|
|
|
|
|
#define MAX_SIZE_UN sizeof (struct sockaddr_un)
|
Changes to compile under gnu-win32, from Marcus Daniels:
* stime.c (tzset): If tzset isn't provided, make it a NOP.
(scm_localtime): Change SCM_EOF to SCM_EOL.
(scm_mktime): Likewise.
* socket.c: Don't include sys/un.h unless autoconf tells
us Unix domain sockets are available.
(scm_fill_sockaddr): Ignore Unix domain code.
(scm_addr_vector): Likewise.
(scm_init_addr_buffer): Likewise.
(scm_socketpair): Don't include unless socketpair was
found during autoconf.
* simpos.c (SYSTNAME): Treat cygwin like Unix.
* scmsigs.c (scm_pause): Don't include unless pause was found
during autoconf.
* posix.c (scm_getgroups): Don't include unless support function
was found during autoconf (in this case, getgroups).
(scm_setpwent): For setpwent.
(scm_setegid): For setegid.
* net_db.c (scm_inet_netof): Don't include unless support
function was found during autoconf (in this case, inet_netof).
(scm_lnaof): For inet_lnaof.
(scm_inet_makeaddr): For inet_makeaddr.
(scm_getnet): For getnetent, getnetbyname, getnetbyaddr.
(scm_getproto): For getprotoent.
(scm_getserv): For getservent.
(scm_sethost): For sethostent, endhostent.
(scm_setnet): For setnetent, endnetent.
(scm_setproto): For setprotoent, endprotoent.
(scm_setserv): For setservent, endservent.
* scmconfig.h.in: Regenerated.
1997-07-11 05:43:36 +00:00
|
|
|
|
#else
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
#define MAX_SIZE_UN 0
|
Changes to compile under gnu-win32, from Marcus Daniels:
* stime.c (tzset): If tzset isn't provided, make it a NOP.
(scm_localtime): Change SCM_EOF to SCM_EOL.
(scm_mktime): Likewise.
* socket.c: Don't include sys/un.h unless autoconf tells
us Unix domain sockets are available.
(scm_fill_sockaddr): Ignore Unix domain code.
(scm_addr_vector): Likewise.
(scm_init_addr_buffer): Likewise.
(scm_socketpair): Don't include unless socketpair was
found during autoconf.
* simpos.c (SYSTNAME): Treat cygwin like Unix.
* scmsigs.c (scm_pause): Don't include unless pause was found
during autoconf.
* posix.c (scm_getgroups): Don't include unless support function
was found during autoconf (in this case, getgroups).
(scm_setpwent): For setpwent.
(scm_setegid): For setegid.
* net_db.c (scm_inet_netof): Don't include unless support
function was found during autoconf (in this case, inet_netof).
(scm_lnaof): For inet_lnaof.
(scm_inet_makeaddr): For inet_makeaddr.
(scm_getnet): For getnetent, getnetbyname, getnetbyaddr.
(scm_getproto): For getprotoent.
(scm_getserv): For getservent.
(scm_sethost): For sethostent, endhostent.
(scm_setnet): For setnetent, endnetent.
(scm_setproto): For setprotoent, endprotoent.
(scm_setserv): For setservent, endservent.
* scmconfig.h.in: Regenerated.
1997-07-11 05:43:36 +00:00
|
|
|
|
#endif
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
|
2001-05-05 08:31:00 +00:00
|
|
|
|
#if defined (HAVE_IPV6)
|
2001-04-20 19:22:47 +00:00
|
|
|
|
#define MAX_SIZE_IN6 sizeof (struct sockaddr_in6)
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define MAX_SIZE_IN6 0
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#define MAX_ADDR_SIZE max (max (sizeof (struct sockaddr_in), MAX_SIZE_IN6),\
|
|
|
|
|
|
MAX_SIZE_UN)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_accept, "accept", 1, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Accept a connection on a bound, listening socket.\n"
|
|
|
|
|
|
"If there\n"
|
|
|
|
|
|
"are no pending connections in the queue, wait until\n"
|
|
|
|
|
|
"one is available unless the non-blocking option has been\n"
|
|
|
|
|
|
"set on the socket.\n\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"The return value is a\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"pair in which the @emph{car} is a new socket port for the\n"
|
|
|
|
|
|
"connection and\n"
|
|
|
|
|
|
"the @emph{cdr} is an object with address information about the\n"
|
|
|
|
|
|
"client which initiated the connection.\n\n"
|
|
|
|
|
|
"@var{sock} does not become part of the\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"connection and will continue to accept new requests.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_accept
|
1996-07-25 22:56:11 +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
|
|
|
|
int fd;
|
|
|
|
|
|
int newfd;
|
|
|
|
|
|
SCM address;
|
|
|
|
|
|
SCM newsock;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int addr_size = MAX_ADDR_SIZE;
|
|
|
|
|
|
char max_addr[MAX_ADDR_SIZE];
|
|
|
|
|
|
struct sockaddr *addr = (struct sockaddr *) max_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
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
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);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
newfd = accept (fd, addr, &addr_size);
|
|
|
|
|
|
if (newfd == -1)
|
|
|
|
|
|
SCM_SYSERROR;
|
|
|
|
|
|
newsock = SCM_SOCK_FD_TO_PORT (newfd);
|
2002-08-30 21:57:10 +00:00
|
|
|
|
address = scm_addr_vector (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
|
|
|
|
return scm_cons (newsock, address);
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_getsockname, "getsockname", 1, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Return the address of @var{sock}, in the same form as the\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"object returned by @code{accept}. On many systems the address\n"
|
|
|
|
|
|
"of a socket in the @code{AF_FILE} namespace cannot be read.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_getsockname
|
1996-07-25 22:56:11 +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
|
|
|
|
int fd;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int addr_size = MAX_ADDR_SIZE;
|
|
|
|
|
|
char max_addr[MAX_ADDR_SIZE];
|
|
|
|
|
|
struct sockaddr *addr = (struct sockaddr *) max_addr;
|
|
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
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);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
if (getsockname (fd, addr, &addr_size) == -1)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
SCM_SYSERROR;
|
2002-08-30 21:57:10 +00:00
|
|
|
|
return scm_addr_vector (addr, addr_size, FUNC_NAME);
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_getpeername, "getpeername", 1, 0, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Return the address that @var{sock}\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"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.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_getpeername
|
1996-07-25 22:56:11 +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
|
|
|
|
int fd;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int addr_size = MAX_ADDR_SIZE;
|
|
|
|
|
|
char max_addr[MAX_ADDR_SIZE];
|
|
|
|
|
|
struct sockaddr *addr = (struct sockaddr *) max_addr;
|
|
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
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);
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
if (getpeername (fd, addr, &addr_size) == -1)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
SCM_SYSERROR;
|
2002-08-30 21:57:10 +00:00
|
|
|
|
return scm_addr_vector (addr, addr_size, FUNC_NAME);
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_recv, "recv!", 2, 1, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM buf, SCM flags),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Receive data from a socket port.\n"
|
|
|
|
|
|
"@var{sock} must already\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"be bound to the address from which data is to be received.\n"
|
|
|
|
|
|
"@var{buf} is a string into which\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"the data will be written. The size of @var{buf} limits\n"
|
|
|
|
|
|
"the amount of\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"data which can be received: in the case of packet\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"protocols, if a packet larger than this limit is encountered\n"
|
|
|
|
|
|
"then some data\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"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"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"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.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#define FUNC_NAME s_scm_recv
|
1996-07-25 22:56:11 +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
|
|
|
|
int rv;
|
|
|
|
|
|
int fd;
|
|
|
|
|
|
int flg;
|
|
|
|
|
|
|
2002-07-20 14:08:34 +00:00
|
|
|
|
SCM_VALIDATE_OPFPORT (1, sock);
|
|
|
|
|
|
SCM_VALIDATE_STRING (2, buf);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
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
|
|
|
|
|
2000-10-09 14:37:36 +00:00
|
|
|
|
SCM_SYSCALL (rv = recv (fd, SCM_STRING_CHARS (buf), SCM_STRING_LENGTH (buf), 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)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
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
|
|
|
|
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
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
|
|
|
|
}
|
1999-12-12 02:36:16 +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
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_send, "send", 2, 1, 0,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM message, SCM flags),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Transmit the string @var{message} on a 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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.\n\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Note that the data is written directly to the socket\n"
|
|
|
|
|
|
"file descriptor:\n"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"any unflushed buffered port data is ignored.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#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;
|
|
|
|
|
|
int fd;
|
|
|
|
|
|
int flg;
|
|
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
SCM_VALIDATE_OPFPORT (1, sock);
|
2000-10-30 11:42:26 +00:00
|
|
|
|
SCM_VALIDATE_STRING (2, message);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
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
|
|
|
|
|
2000-11-22 11:20:03 +00:00
|
|
|
|
SCM_SYSCALL (rv = send (fd, SCM_STRING_CHARS (message), SCM_STRING_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)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
SCM_SYSERROR;
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
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
|
|
|
|
}
|
1999-12-12 02:36:16 +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
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_recvfrom, "recvfrom!", 2, 3, 0,
|
2001-01-08 23:10:06 +00:00
|
|
|
|
(SCM sock, SCM str, SCM flags, SCM start, SCM end),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Return data from the socket port @var{sock} and also\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"information about where the data was received from.\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@var{sock} must already be bound to the address from which\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"data is to be received. @code{str}, is a string into which the\n"
|
|
|
|
|
|
"data will be written. The size of @var{str} limits the amount\n"
|
|
|
|
|
|
"of data which can be received: in the case of packet protocols,\n"
|
|
|
|
|
|
"if a packet larger than this limit is encountered then some\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"data will be irrevocably lost.\n\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"The optional @var{flags} argument is a value or bitwise OR of\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@code{MSG_OOB}, @code{MSG_PEEK}, @code{MSG_DONTROUTE} etc.\n\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"The value returned is a pair: the @emph{car} is the number of\n"
|
|
|
|
|
|
"bytes read from the socket and the @emph{cdr} an address object\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"in the same form as returned by @code{accept}. The address\n"
|
|
|
|
|
|
"will given as @code{#f} if not available, as is usually the\n"
|
|
|
|
|
|
"case for stream sockets.\n\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"The @var{start} and @var{end} arguments specify a substring of\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"@var{str} to which the data should be written.\n\n"
|
2001-04-03 13:19:05 +00:00
|
|
|
|
"Note that the data is read directly from the socket file\n"
|
|
|
|
|
|
"descriptor: any unread buffered port data is ignored.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#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;
|
|
|
|
|
|
int fd;
|
|
|
|
|
|
int flg;
|
2001-01-08 23:10:06 +00:00
|
|
|
|
char *buf;
|
|
|
|
|
|
int offset;
|
* 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
|
|
|
|
int cend;
|
* 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;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int addr_size = MAX_ADDR_SIZE;
|
|
|
|
|
|
char max_addr[MAX_ADDR_SIZE];
|
|
|
|
|
|
struct sockaddr *addr = (struct sockaddr *) max_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
|
|
|
|
|
2002-07-20 14:08:34 +00:00
|
|
|
|
SCM_VALIDATE_OPFPORT (1, sock);
|
2001-01-08 23:10:06 +00:00
|
|
|
|
fd = SCM_FPORT_FDES (sock);
|
|
|
|
|
|
SCM_VALIDATE_SUBSTRING_SPEC_COPY (2, str, buf, 4, start, offset,
|
|
|
|
|
|
5, end, cend);
|
* 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
|
2001-01-08 23:10:06 +00:00
|
|
|
|
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
|
|
|
|
|
2001-03-10 10:30:16 +00:00
|
|
|
|
/* recvfrom will not necessarily return an address. usually nothing
|
|
|
|
|
|
is returned for stream sockets. */
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
addr->sa_family = AF_UNSPEC;
|
2001-01-08 23:10:06 +00:00
|
|
|
|
SCM_SYSCALL (rv = recvfrom (fd, buf + offset,
|
* 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
|
|
|
|
cend - offset, flg,
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
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)
|
1999-12-12 02:36:16 +00:00
|
|
|
|
SCM_SYSERROR;
|
2001-04-22 19:52:41 +00:00
|
|
|
|
if (addr->sa_family != AF_UNSPEC)
|
2002-08-30 21:57:10 +00:00
|
|
|
|
address = scm_addr_vector (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;
|
|
|
|
|
|
|
2004-07-23 15:43:02 +00:00
|
|
|
|
return scm_cons (scm_from_int (rv), address);
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#undef FUNC_NAME
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 19:05:23 +00:00
|
|
|
|
SCM_DEFINE (scm_sendto, "sendto", 4, 0, 1,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
(SCM sock, SCM message, SCM fam, SCM address, SCM args_and_flags),
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"Transmit the string @var{message} on the socket port\n"
|
|
|
|
|
|
"@var{sock}. The\n"
|
|
|
|
|
|
"destination address is specified using the @var{fam},\n"
|
|
|
|
|
|
"@var{address} and\n"
|
|
|
|
|
|
"@var{args_and_flags} arguments, 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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.\n\n"
|
2001-04-22 19:52:41 +00:00
|
|
|
|
"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"
|
* alist.c, chars.c, debug.c, dynl.c, dynwind.c, error.c, eval.c,
evalext.c, filesys.c, gc.c, hash.c, hashtab.c, ioext.c,
keywords.c, list.c, load.c, macros.c, net_db.c, numbers.c,
objprop.c, ports.c, posix.c, print.c, procprop.c, procs.c,
ramap.c, regex-posix.c, root.c, scmsigs.c, simpos.c, socket.c,
stacks.c, stime.c, strings.c, strop.c, strports.c, struct.c,
symbols.c, throw.c, unif.c, vectors.c, version.c, vports.c,
weaks.c: Converted docstrings to ANSI C format.
2000-01-18 11:24:03 +00:00
|
|
|
|
"any unflushed buffered port data is ignored.")
|
1999-12-12 02:36:16 +00:00
|
|
|
|
#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;
|
|
|
|
|
|
int fd;
|
|
|
|
|
|
int flg;
|
|
|
|
|
|
struct sockaddr *soka;
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
int 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
|
|
|
|
|
* filesys.c (scm_close, set_element, get_element, scm_chown,
scm_chmod, scm_stat, scm_truncate_file, scm_fcntl, scm_fsync): Use
SCM_COERCE_OUTPORT to cope with the printstate/port magic.
* ports.c (scm_port_revealed, scm_set_port_revealed_x,
scm_close_port, scm_port_line, scm_set_port_line_x,
scm_port_column, scm_set_port_column_x, scm_port_filename,
scm_set_port_filename_x, scm_port_mode,
scm_close_all_ports_except, scm_set_current_output_port,
scm_set_current_error_port): Likewise
* ioext.c (scm_redirect_port, scm_dup_to_fdes, scm_freopen,
scm_ftell, scm_fileno, scm_isatty_p, scm_primitive_move_to_fdes):
Likewise
* posix.c (scm_ttyname, scm_tcgetpgrp, scm_tcsetpgrp): Likewise
* backtrace.c (display_backtrace_body): Likewise
* fports (scm_setvbuf): Likewise
* socket.c (scm_getsockopt, scm_setsockopt, scm_shutdown,
scm_connect, scm_bind, scm_listen, scm_accept, scm_getsockname,
scm_getpeername, scm_send, scm_sendto): Likewise
* unif.c (scm_uniform_array_write): Likewise
1997-10-25 21:54:12 +00:00
|
|
|
|
sock = SCM_COERCE_OUTPORT (sock);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
SCM_VALIDATE_FPORT (1, sock);
|
2000-10-30 11:42:26 +00:00
|
|
|
|
SCM_VALIDATE_STRING (2, message);
|
* 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);
|
(ipv6_net_to_num, scm_from_ipv6): Renamed
ipv6_net_to_num to scm_from_ipv6, for converting from an IPv&
byte-wise address to a SCM integer. Changed all uses.
(ipv6_num_to_net, scm_to_ipv6): Renamed ipv6_num_to_net to
scm_to_ipv6 and added type and range checking, for converting from
an IPv& byte-wise address to a SCM integer. Changed all uses.
(bignum_in_ipv6_range_p, VALIDATE_INET6): Removed, their function
is now done by scm_to_ipv6.
* validate.h, deprecated.h (SCM_VALIDATE_INUM, SCM_VALIDATE_INUM_COPY,
SCM_VALIDATE_BIGINT, SCM_VALIDATE_INUM_MIN,
SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY,SCM_VALIDATE_INUM_DEF,
SCM_VALIDATE_INUM_DEF_COPY, SCM_VALIDATE_INUM_RANGE,
SCM_VALIDATE_INUM_RANGE_COPY): Deprecated because they make the
fixnum/bignum distinction visible. Changed all uses to scm_to_size_t
or similar.
2004-07-10 14:34:59 +00:00
|
|
|
|
soka = scm_fill_sockaddr (scm_to_int (fam), address, &args_and_flags, 4,
|
1999-12-12 02:36:16 +00:00
|
|
|
|
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 (SCM_NULLP (args_and_flags))
|
|
|
|
|
|
flg = 0;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2002-07-20 14:08:34 +00:00
|
|
|
|
SCM_VALIDATE_CONS (5, args_and_flags);
|
2001-04-10 07:57:05 +00:00
|
|
|
|
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
|
|
|
|
}
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
SCM_SYSCALL (rv = sendto (fd, SCM_STRING_CHARS (message),
|
|
|
|
|
|
SCM_STRING_LENGTH (message),
|
1997-03-13 21:54:02 +00:00
|
|
|
|
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)
|
* socket.c (scm_fill_sockaddr): don't allow buffer overflows when
taking an unexpectedly large filename for an AF_UNIX socket from
bind/connect/sendto (thanks to Martin Grabmueller).
* socket.c (scm_sock_fd_to_port, SCM_SOCK_FD_TO_PORT): removed the
former and adjusted the latter.
(scm_socket, scm_socketpair): cosmetic changes.
(scm_getsockopt, scm_setsockopt): declare optlen as int, not
size_t as socklen_t substitute. don't restrict args/return values
to INUM: allow full range of int or size_t.
(scm_fill_sockaddr): check arguments before allocating memory, to
avoid leakage. use malloc, not scm_must_malloc.
(scm_connect, scm_bind, scm_sendto): use int, not size_t as socklen_t
substitute. free the sockaddr structure before throwing an error.
(scm_init_add_buffer): procedure removed, together with its static
buffer scm_addr_buffer, which wouldn't be thread safe. instead,
define a macro MAX_ADDR_SIZE and declare the buffer where needed.
(scm_accept, scm_getpeername, scm_getsockname, scm_recvfrom,
scm_sendto): use a local buffer instead of scm_addr_buffer.
adjust for new SCM_SOCK_FD_TO_PORT. use int for address size,
not size_t.
(scm_recvfrom): set addr->sa_family to AF_UNSPEC before the recvfrom
call to detect whether recvfrom could be bothered to set the address.
(scm_init_socket): don't call scm_init_addr_buffer.
2001-03-04 23:34:16 +00:00
|
|
|
|
{
|
|
|
|
|
|
int save_errno = errno;
|
|
|
|
|
|
free (soka);
|
|
|
|
|
|
errno = save_errno;
|
|
|
|
|
|
SCM_SYSERROR;
|
|
|
|
|
|
}
|
|
|
|
|
|
free (soka);
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
|
|
|
}
|
1999-12-12 02:36:16 +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
|
1996-07-25 22:56:11 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
|
|
|
|
|
#ifdef AF_UNIX
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2001-04-17 23:03:07 +00:00
|
|
|
|
#ifdef AF_INET6
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_c_define ("AF_INET6", scm_from_int (AF_INET6));
|
2001-04-17 23:03:07 +00:00
|
|
|
|
#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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2001-04-17 23:03:07 +00:00
|
|
|
|
#ifdef PF_INET6
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_c_define ("PF_INET6", scm_from_int (PF_INET6));
|
2001-04-17 23:03:07 +00:00
|
|
|
|
#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
|
|
|
|
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
/* standard addresses. */
|
|
|
|
|
|
#ifdef INADDR_ANY
|
2001-05-15 14:57:22 +00:00
|
|
|
|
scm_c_define ("INADDR_ANY", scm_ulong2num (INADDR_ANY));
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef INADDR_BROADCAST
|
2001-05-15 14:57:22 +00:00
|
|
|
|
scm_c_define ("INADDR_BROADCAST", scm_ulong2num (INADDR_BROADCAST));
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef INADDR_NONE
|
2001-05-15 14:57:22 +00:00
|
|
|
|
scm_c_define ("INADDR_NONE", scm_ulong2num (INADDR_NONE));
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef INADDR_LOOPBACK
|
2001-05-15 14:57:22 +00:00
|
|
|
|
scm_c_define ("INADDR_LOOPBACK", scm_ulong2num (INADDR_LOOPBACK));
|
* net_db.c: remove bogus "close" declaration.
(inet_aton declaration, scm_inet_aton, scm_inet_ntoa,
scm_inet_netof, scm_lnaof, scm_inet_makeaddr, INADDR_ANY etc.):
moved to socket.c.
* net_db.h: declarations moved too.
* socket.c (scm_htonl, scm_ntohl): use uint32_t instead of unsigned
long.
(ipv6_net_to_num, ipv6_num_to_net): new static procedures.
(VALIDATE_INET6): new macro.
(scm_inet_pton, scm_inet_ntop): new procedures, implementing
inet-pton and inet-ntop.
(scm_fill_sockaddr): use VALIDATE_INET6 and ipv6_num_to_net.
(scm_addr_vector): use ipv6_net_to_num.
2001-04-22 16:05:21 +00:00
|
|
|
|
#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
|
|
|
|
/* socket types. */
|
|
|
|
|
|
#ifdef SOCK_STREAM
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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_RAW
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
/* setsockopt level. */
|
|
|
|
|
|
#ifdef SOL_SOCKET
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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 SOL_IP
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_c_define ("SOL_IP", scm_from_int (SOL_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 SOL_TCP
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_c_define ("SOL_TCP", scm_from_int (SOL_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 SOL_UDP
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_c_define ("SOL_UDP", scm_from_int (SOL_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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
/* recv/send options. */
|
|
|
|
|
|
#ifdef MSG_OOB
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
2004-07-23 15:43:02 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
2001-11-07 15:08:45 +00:00
|
|
|
|
#ifdef __MINGW32__
|
|
|
|
|
|
scm_i_init_socket_Win32 ();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
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
|
|
|
|
|
2000-04-21 14:16:44 +00:00
|
|
|
|
#include "libguile/socket.x"
|
1996-07-25 22:56:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2000-03-19 19:01:16 +00:00
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
|
c-file-style: "gnu"
|
|
|
|
|
|
End:
|
|
|
|
|
|
*/
|