1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 22:10:21 +02:00

squish remove some mingw-specific code that is covered by gnulib

* libguile/socket.c (scm_init_socket): Remove mingw-specific code.

* libguile/fports.c: Remove ftruncate redefine; mingw is fine.
  (scm_i_fdes_to_port): If we have no F_GETFL, just do an fstat.  The
  right place for an F_GETFL replacement would be in gnulib.
  (fport_input_waiting): Remove an outdated comment.

* libguile/error.c (SCM_I_STRERROR, SCM_I_ERRNO): Remove, replacing uses
  with strerror and errno.

* libguile/win32-socket.c:
* libguile/win32-socket.h: Remove.  Mingw has suitable replacements.

* configure.ac:
* libguile/Makefile.am (EXTRA_libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES):
  (noinst_HEADERS): Update for win32-socket removal.
This commit is contained in:
Andy Wingo 2013-03-09 16:39:47 +01:00
parent 7e369c3899
commit 09b204d387
7 changed files with 18 additions and 609 deletions

View file

@ -707,9 +707,6 @@ case $host in
[Define if you have the <winsock2.h> header file.])])
AC_CHECK_LIB(ws2_32, main)
AC_LIBOBJ([win32-uname])
if test "$enable_networking" = yes ; then
AC_LIBOBJ([win32-socket])
fi
if test "$enable_shared" = yes ; then
EXTRA_DEFS="-DSCM_IMPORT"
AC_DEFINE([USE_DLL_IMPORT], 1,

View file

@ -434,7 +434,7 @@ EXTRA_libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES = _scm.h \
dynl.c regex-posix.c \
posix.c net_db.c socket.c \
debug-malloc.c mkstemp.c \
win32-uname.c win32-socket.c \
win32-uname.c \
locale-categories.h
## delete guile-snarf.awk from the installation bindir, in case it's
@ -450,7 +450,7 @@ install-exec-hook:
noinst_HEADERS = conv-integer.i.c conv-uinteger.i.c \
srfi-14.i.c \
quicksort.i.c \
win32-uname.h win32-socket.h \
win32-uname.h \
private-gc.h private-options.h
# vm instructions

View file

@ -1,5 +1,5 @@
/* Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2004, 2006, 2010,
* 2012 Free Software Foundation, Inc.
* 2012, 2013 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@ -100,17 +100,6 @@ SCM_DEFINE (scm_error_scm, "scm-error", 5, 0, 0,
}
#undef FUNC_NAME
#if defined __MINGW32__ && defined HAVE_NETWORKING
# include "win32-socket.h"
# define SCM_I_STRERROR(err) \
((err >= WSABASEERR) ? scm_i_socket_strerror (err) : strerror (err))
# define SCM_I_ERRNO() \
(errno ? errno : scm_i_socket_errno ())
#else
# define SCM_I_STRERROR(err) strerror (err)
# define SCM_I_ERRNO() errno
#endif /* __MINGW32__ */
/* strerror may not be thread safe, for instance in glibc (version 2.3.2) an
error number not among the known values results in a string like "Unknown
error 9999" formed in a static buffer, which will be overwritten by a
@ -136,7 +125,7 @@ SCM_DEFINE (scm_strerror, "strerror", 1, 0, 0,
scm_dynwind_begin (0);
scm_i_dynwind_pthread_mutex_lock (&scm_i_misc_mutex);
ret = scm_from_locale_string (SCM_I_STRERROR (scm_to_int (err)));
ret = scm_from_locale_string (strerror (scm_to_int (err)));
scm_dynwind_end ();
return ret;
@ -147,7 +136,7 @@ SCM_GLOBAL_SYMBOL (scm_system_error_key, "system-error");
void
scm_syserror (const char *subr)
{
SCM err = scm_from_int (SCM_I_ERRNO ());
SCM err = scm_from_int (errno);
/* It could be that we're getting here because the syscall was
interrupted by a signal. In that case a signal handler might have

View file

@ -55,32 +55,12 @@
#endif
#include <errno.h>
#include <sys/types.h>
#include <full-write.h>
#include <sys/stat.h>
#include "libguile/iselect.h"
/* Some defines for Windows (native port, not Cygwin). */
#ifdef __MINGW32__
# include <sys/stat.h>
# include <winsock2.h>
#endif /* __MINGW32__ */
#include <full-write.h>
/* Mingw (version 3.4.5, circa 2006) has ftruncate as an alias for chsize
already, but have this code here in case that wasn't so in past versions,
or perhaps to help other minimal DOS environments.
gnulib ftruncate.c has code using fcntl F_CHSIZE and F_FREESP, which
might be possibilities if we've got other systems without ftruncate. */
#if defined HAVE_CHSIZE && ! defined HAVE_FTRUNCATE
# define ftruncate(fd, size) chsize (fd, size)
# undef HAVE_FTRUNCATE
# define HAVE_FTRUNCATE 1
#endif
#if SIZEOF_OFF_T == SIZEOF_INT
#define OFF_T_MAX INT_MAX
#define OFF_T_MIN INT_MIN
@ -496,48 +476,6 @@ SCM_DEFINE (scm_open_file, "open-file", 2, 0, 0,
#undef FUNC_NAME
#ifdef __MINGW32__
/*
* Try getting the appropiate file flags for a given file descriptor
* under Windows. This incorporates some fancy operations because Windows
* differentiates between file, pipe and socket descriptors.
*/
#ifndef O_ACCMODE
# define O_ACCMODE 0x0003
#endif
static int getflags (int fdes)
{
int flags = 0;
struct stat buf;
int error, optlen = sizeof (int);
/* Is this a socket ? */
if (getsockopt (fdes, SOL_SOCKET, SO_ERROR, (void *) &error, &optlen) >= 0)
flags = O_RDWR;
/* Maybe a regular file ? */
else if (fstat (fdes, &buf) < 0)
flags = -1;
else
{
/* Or an anonymous pipe handle ? */
if (buf.st_mode & _S_IFIFO)
flags = PeekNamedPipe ((HANDLE) _get_osfhandle (fdes), NULL, 0,
NULL, NULL, NULL) ? O_RDONLY : O_WRONLY;
/* stdin ? */
else if (fdes == fileno (stdin) && isatty (fdes))
flags = O_RDONLY;
/* stdout / stderr ? */
else if ((fdes == fileno (stdout) || fdes == fileno (stderr)) &&
isatty (fdes))
flags = O_WRONLY;
else
flags = buf.st_mode;
}
return flags;
}
#endif /* __MINGW32__ */
/* Building Guile ports from a file descriptor. */
/* Build a Scheme port from an open file descriptor `fdes'.
@ -551,14 +489,10 @@ scm_i_fdes_to_port (int fdes, long mode_bits, SCM name)
{
SCM port;
scm_t_port *pt;
int flags;
/* test that fdes is valid. */
#ifdef __MINGW32__
flags = getflags (fdes);
#else
flags = fcntl (fdes, F_GETFL, 0);
#endif
/* Test that fdes is valid. */
#ifdef F_GETFL
int flags = fcntl (fdes, F_GETFL, 0);
if (flags == -1)
SCM_SYSERROR;
flags &= O_ACCMODE;
@ -568,6 +502,13 @@ scm_i_fdes_to_port (int fdes, long mode_bits, SCM name)
{
SCM_MISC_ERROR ("requested file mode not available on fdes", SCM_EOL);
}
#else
/* If we don't have F_GETFL, as on mingw, at least we can test that
it is a valid file descriptor. */
struct stat st;
if (fstat (fdes, &st) != 0)
SCM_SYSERROR;
#endif
scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex);
@ -639,8 +580,6 @@ fport_input_waiting (SCM port)
return FD_ISSET (fdes, &read_set) ? 1 : 0;
#elif HAVE_IOCTL && defined (FIONREAD)
/* Note: cannot test just defined(FIONREAD) here, since mingw has FIONREAD
(for use with winsock ioctlsocket()) but not ioctl(). */
int fdes = SCM_FSTREAM (port)->fdes;
int remir;
ioctl(fdes, FIONREAD, &remir);

View file

@ -1,5 +1,5 @@
/* Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005,
* 2006, 2007, 2009, 2011, 2012 Free Software Foundation, Inc.
* 2006, 2007, 2009, 2011, 2012, 2013 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@ -44,11 +44,6 @@
# include "libguile/deprecation.h"
#endif
#ifdef __MINGW32__
#include "win32-socket.h"
#include <netdb.h>
#endif
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif
@ -59,9 +54,6 @@
#include <unistd.h>
#endif
#include <sys/types.h>
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
#else
#include <sys/socket.h>
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
#include <sys/un.h>
@ -69,7 +61,7 @@
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#if defined (HAVE_UNIX_DOMAIN_SOCKETS) && !defined (SUN_LEN)
#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
@ -1877,10 +1869,6 @@ scm_init_socket ()
scm_c_define ("MSG_DONTROUTE", scm_from_int (MSG_DONTROUTE));
#endif
#ifdef __MINGW32__
scm_i_init_socket_Win32 ();
#endif
#ifdef IP_ADD_MEMBERSHIP
scm_c_define ("IP_ADD_MEMBERSHIP", scm_from_int (IP_ADD_MEMBERSHIP));
scm_c_define ("IP_DROP_MEMBERSHIP", scm_from_int (IP_DROP_MEMBERSHIP));

View file

@ -1,469 +0,0 @@
/* Copyright (C) 2001, 2006, 2013 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 3 of
* the License, or (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "libguile/__scm.h"
#include "libguile/modules.h"
#include "libguile/numbers.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#ifndef PATH_MAX
#define PATH_MAX 255
#endif
#include "win32-socket.h"
/* Winsock API error description structure. The error description is
necessary because there is no error list available. */
typedef struct
{
int error; /* Error code. */
char *str; /* Error description. */
int replace; /* Possible error code replacement. */
char *replace_str; /* Replacement symbol. */
char *correct_str; /* Original symbol. */
}
socket_error_t;
#define FILE_ETC_SERVICES "services"
#define ENVIRON_ETC_SERVICES "SERVICES"
#define FILE_ETC_NETWORKS "networks"
#define ENVIRON_ETC_NETWORKS "NETWORKS"
#define FILE_ETC_PROTOCOLS "protocol"
#define ENVIRON_ETC_PROTOCOLS "PROTOCOLS"
#define MAX_NAMLEN 256
#define MAX_ALIASES 4
/* Internal structure for a thread's M$-Windows servent interface. */
typedef struct
{
FILE *fd; /* Current file. */
char file[PATH_MAX]; /* File name. */
struct servent ent; /* Return value. */
char name[MAX_NAMLEN]; /* Service name. */
char proto[MAX_NAMLEN]; /* Protocol name. */
char alias[MAX_ALIASES][MAX_NAMLEN]; /* All aliases. */
char *aliases[MAX_ALIASES]; /* Alias pointers. */
int port; /* Network port. */
}
scm_i_servent_t;
static scm_i_servent_t scm_i_servent;
/* Internal structure for a thread's M$-Windows protoent interface. */
typedef struct
{
FILE *fd; /* Current file. */
char file[PATH_MAX]; /* File name. */
struct protoent ent; /* Return value. */
char name[MAX_NAMLEN]; /* Protocol name. */
char alias[MAX_ALIASES][MAX_NAMLEN]; /* All aliases. */
char *aliases[MAX_ALIASES]; /* Alias pointers. */
int proto; /* Protocol number. */
}
scm_i_protoent_t;
static scm_i_protoent_t scm_i_protoent;
/* Define replacement symbols for most of the WSA* error codes. */
#ifndef EWOULDBLOCK
# define EWOULDBLOCK WSAEWOULDBLOCK
#endif
#ifndef EINPROGRESS
# define EINPROGRESS WSAEINPROGRESS
#endif
#ifndef EALREADY
# define EALREADY WSAEALREADY
#endif
#ifndef EDESTADDRREQ
# define EDESTADDRREQ WSAEDESTADDRREQ
#endif
#ifndef EMSGSIZE
# define EMSGSIZE WSAEMSGSIZE
#endif
#ifndef EPROTOTYPE
# define EPROTOTYPE WSAEPROTOTYPE
#endif
#ifndef ENOTSOCK
# define ENOTSOCK WSAENOTSOCK
#endif
#ifndef ENOPROTOOPT
# define ENOPROTOOPT WSAENOPROTOOPT
#endif
#ifndef EPROTONOSUPPORT
# define EPROTONOSUPPORT WSAEPROTONOSUPPORT
#endif
#ifndef ESOCKTNOSUPPORT
# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
#endif
#ifndef EOPNOTSUPP
# define EOPNOTSUPP WSAEOPNOTSUPP
#endif
#ifndef EPFNOSUPPORT
# define EPFNOSUPPORT WSAEPFNOSUPPORT
#endif
#ifndef EAFNOSUPPORT
# define EAFNOSUPPORT WSAEAFNOSUPPORT
#endif
#ifndef EADDRINUSE
# define EADDRINUSE WSAEADDRINUSE
#endif
#ifndef EADDRNOTAVAIL
# define EADDRNOTAVAIL WSAEADDRNOTAVAIL
#endif
#ifndef ENETDOWN
# define ENETDOWN WSAENETDOWN
#endif
#ifndef ENETUNREACH
# define ENETUNREACH WSAENETUNREACH
#endif
#ifndef ENETRESET
# define ENETRESET WSAENETRESET
#endif
#ifndef ECONNABORTED
# define ECONNABORTED WSAECONNABORTED
#endif
#ifndef ECONNRESET
# define ECONNRESET WSAECONNRESET
#endif
#ifndef ENOBUFS
# define ENOBUFS WSAENOBUFS
#endif
#ifndef EISCONN
# define EISCONN WSAEISCONN
#endif
#ifndef ENOTCONN
# define ENOTCONN WSAENOTCONN
#endif
#ifndef ESHUTDOWN
# define ESHUTDOWN WSAESHUTDOWN
#endif
#ifndef ETOOMANYREFS
# define ETOOMANYREFS WSAETOOMANYREFS
#endif
#ifndef ETIMEDOUT
# define ETIMEDOUT WSAETIMEDOUT
#endif
#ifndef ECONNREFUSED
# define ECONNREFUSED WSAECONNREFUSED
#endif
#ifndef ELOOP
# define ELOOP WSAELOOP
#endif
#ifndef EHOSTDOWN
# define EHOSTDOWN WSAEHOSTDOWN
#endif
#ifndef EHOSTUNREACH
# define EHOSTUNREACH WSAEHOSTUNREACH
#endif
#ifndef EPROCLIM
# define EPROCLIM WSAEPROCLIM
#endif
#ifndef EUSERS
# define EUSERS WSAEUSERS
#endif
#ifndef EDQUOT
# define EDQUOT WSAEDQUOT
#endif
#ifndef ESTALE
# define ESTALE WSAESTALE
#endif
#ifndef EREMOTE
# define EREMOTE WSAEREMOTE
#endif
/* List of error structures. */
static socket_error_t socket_errno [] = {
/* 000 */ { 0, NULL, 0, NULL, NULL },
/* 001 */ { 0, NULL, 0, NULL, NULL },
/* 002 */ { 0, NULL, 0, NULL, NULL },
/* 003 */ { 0, NULL, 0, NULL, NULL },
/* 004 */ { WSAEINTR, "Interrupted function call", EINTR, NULL, "WSAEINTR" },
/* 005 */ { 0, NULL, 0, NULL, NULL },
/* 006 */ { 0, NULL, 0, NULL, NULL },
/* 007 */ { 0, NULL, 0, NULL, NULL },
/* 008 */ { 0, NULL, 0, NULL, NULL },
/* 009 */ { WSAEBADF, "Bad file number", EBADF, NULL, "WSAEBADF" },
/* 010 */ { 0, NULL, 0, NULL, NULL },
/* 011 */ { 0, NULL, 0, NULL, NULL },
/* 012 */ { 0, NULL, 0, NULL, NULL },
/* 013 */ { WSAEACCES, "Permission denied", EACCES, NULL, "WSAEACCES" },
/* 014 */ { WSAEFAULT, "Bad address", EFAULT, NULL, "WSAEFAULT" },
/* 015 */ { 0, NULL, 0, NULL, NULL },
/* 016 */ { 0, NULL, 0, NULL, NULL },
/* 017 */ { 0, NULL, 0, NULL, NULL },
/* 018 */ { 0, NULL, 0, NULL, NULL },
/* 019 */ { 0, NULL, 0, NULL, NULL },
/* 020 */ { 0, NULL, 0, NULL, NULL },
/* 021 */ { 0, NULL, 0, NULL, NULL },
/* 022 */ { WSAEINVAL, "Invalid argument", EINVAL, NULL, "WSAEINVAL" },
/* 023 */ { 0, NULL, 0, NULL, NULL },
/* 024 */ { WSAEMFILE, "Too many open files", EMFILE, NULL, "WSAEMFILE" },
/* 025 */ { 0, NULL, 0, NULL, NULL },
/* 026 */ { 0, NULL, 0, NULL, NULL },
/* 027 */ { 0, NULL, 0, NULL, NULL },
/* 028 */ { 0, NULL, 0, NULL, NULL },
/* 029 */ { 0, NULL, 0, NULL, NULL },
/* 030 */ { 0, NULL, 0, NULL, NULL },
/* 031 */ { 0, NULL, 0, NULL, NULL },
/* 032 */ { 0, NULL, 0, NULL, NULL },
/* 033 */ { 0, NULL, 0, NULL, NULL },
/* 034 */ { 0, NULL, 0, NULL, NULL },
/* 035 */ { WSAEWOULDBLOCK, "Resource temporarily unavailable",
EWOULDBLOCK, "EWOULDBLOCK", "WSAEWOULDBLOCK" },
/* 036 */ { WSAEINPROGRESS, "Operation now in progress",
EINPROGRESS, "EINPROGRESS", "WSAEINPROGRESS" },
/* 037 */ { WSAEALREADY, "Operation already in progress",
EALREADY, "EALREADY", "WSAEALREADY" },
/* 038 */ { WSAENOTSOCK, "Socket operation on non-socket",
ENOTSOCK, "ENOTSOCK", "WSAENOTSOCK"},
/* 039 */ { WSAEDESTADDRREQ, "Destination address required",
EDESTADDRREQ, "EDESTADDRREQ", "WSAEDESTADDRREQ" },
/* 040 */ { WSAEMSGSIZE, "Message too long",
EMSGSIZE, "EMSGSIZE", "WSAEMSGSIZE" },
/* 041 */ { WSAEPROTOTYPE, "Protocol wrong type for socket",
EPROTOTYPE, "EPROTOTYPE", "WSAEPROTOTYPE" },
/* 042 */ { WSAENOPROTOOPT, "Bad protocol option",
ENOPROTOOPT, "ENOPROTOOPT", "WSAENOPROTOOPT" },
/* 043 */ { WSAEPROTONOSUPPORT, "Protocol not supported",
EPROTONOSUPPORT, "EPROTONOSUPPORT", "WSAEPROTONOSUPPORT" },
/* 044 */ { WSAESOCKTNOSUPPORT, "Socket type not supported",
ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "WSAESOCKTNOSUPPORT" },
/* 045 */ { WSAEOPNOTSUPP, "Operation not supported",
EOPNOTSUPP, "EOPNOTSUPP", "WSAEOPNOTSUPP" },
/* 046 */ { WSAEPFNOSUPPORT, "Protocol family not supported",
EPFNOSUPPORT, "EPFNOSUPPORT", "WSAEPFNOSUPPORT" },
/* 047 */ { WSAEAFNOSUPPORT,
"Address family not supported by protocol family",
EAFNOSUPPORT, "EAFNOSUPPORT", "WSAEAFNOSUPPORT" },
/* 048 */ { WSAEADDRINUSE, "Address already in use",
EADDRINUSE, "EADDRINUSE", "WSAEADDRINUSE" },
/* 049 */ { WSAEADDRNOTAVAIL, "Cannot assign requested address",
EADDRNOTAVAIL, "EADDRNOTAVAIL", "WSAEADDRNOTAVAIL" },
/* 050 */ { WSAENETDOWN, "Network is down",
ENETDOWN, "ENETDOWN", "WSAENETDOWN" },
/* 051 */ { WSAENETUNREACH, "Network is unreachable",
ENETUNREACH, "ENETUNREACH", "WSAENETUNREACH" },
/* 052 */ { WSAENETRESET, "Network dropped connection on reset",
ENETRESET, "ENETRESET", "WSAENETRESET" },
/* 053 */ { WSAECONNABORTED, "Software caused connection abort",
ECONNABORTED, "ECONNABORTED", "WSAECONNABORTED" },
/* 054 */ { WSAECONNRESET, "Connection reset by peer",
ECONNRESET, "ECONNRESET", "WSAECONNRESET" },
/* 055 */ { WSAENOBUFS, "No buffer space available",
ENOBUFS, "ENOBUFS", "WSAENOBUFS" },
/* 056 */ { WSAEISCONN, "Socket is already connected",
EISCONN, "EISCONN", "WSAEISCONN" },
/* 057 */ { WSAENOTCONN, "Socket is not connected",
ENOTCONN, "ENOTCONN", "WSAENOTCONN" },
/* 058 */ { WSAESHUTDOWN, "Cannot send after socket shutdown",
ESHUTDOWN, "ESHUTDOWN", "WSAESHUTDOWN" },
/* 059 */ { WSAETOOMANYREFS, "Too many references; can't splice",
ETOOMANYREFS, "ETOOMANYREFS", "WSAETOOMANYREFS" },
/* 060 */ { WSAETIMEDOUT, "Connection timed out",
ETIMEDOUT, "ETIMEDOUT", "WSAETIMEDOUT" },
/* 061 */ { WSAECONNREFUSED, "Connection refused",
ECONNREFUSED, "ECONNREFUSED", "WSAECONNREFUSED" },
/* 062 */ { WSAELOOP, "Too many levels of symbolic links",
ELOOP, "ELOOP", "WSAELOOP" },
/* 063 */ { WSAENAMETOOLONG, "File name too long",
ENAMETOOLONG, NULL, "WSAENAMETOOLONG" },
/* 064 */ { WSAEHOSTDOWN, "Host is down",
EHOSTDOWN, "EHOSTDOWN", "WSAEHOSTDOWN" },
/* 065 */ { WSAEHOSTUNREACH, "No route to host",
EHOSTUNREACH, "EHOSTUNREACH", "WSAEHOSTUNREACH" },
/* 066 */ { WSAENOTEMPTY, "Directory not empty",
ENOTEMPTY, NULL, "WSAENOTEMPTY" },
/* 067 */ { WSAEPROCLIM, "Too many processes",
EPROCLIM, "EPROCLIM", "WSAEPROCLIM" },
/* 068 */ { WSAEUSERS, "Too many users",
EUSERS, "EUSERS", "WSAEUSERS" },
/* 069 */ { WSAEDQUOT, "Disc quota exceeded",
EDQUOT, "EDQUOT", "WSAEDQUOT" },
/* 070 */ { WSAESTALE, "Stale NFS file handle",
ESTALE, "ESTALE", "WSAESTALE" },
/* 071 */ { WSAEREMOTE, "Too many levels of remote in path",
EREMOTE, "EREMOTE", "WSAEREMOTE" },
/* 072 */ { 0, NULL, 0, NULL, NULL },
/* 073 */ { 0, NULL, 0, NULL, NULL },
/* 074 */ { 0, NULL, 0, NULL, NULL },
/* 075 */ { 0, NULL, 0, NULL, NULL },
/* 076 */ { 0, NULL, 0, NULL, NULL },
/* 077 */ { 0, NULL, 0, NULL, NULL },
/* 078 */ { 0, NULL, 0, NULL, NULL },
/* 079 */ { 0, NULL, 0, NULL, NULL },
/* 080 */ { 0, NULL, 0, NULL, NULL },
/* 081 */ { 0, NULL, 0, NULL, NULL },
/* 082 */ { 0, NULL, 0, NULL, NULL },
/* 083 */ { 0, NULL, 0, NULL, NULL },
/* 084 */ { 0, NULL, 0, NULL, NULL },
/* 085 */ { 0, NULL, 0, NULL, NULL },
/* 086 */ { 0, NULL, 0, NULL, NULL },
/* 087 */ { 0, NULL, 0, NULL, NULL },
/* 088 */ { 0, NULL, 0, NULL, NULL },
/* 089 */ { 0, NULL, 0, NULL, NULL },
/* 090 */ { 0, NULL, 0, NULL, NULL },
/* 091 */ { WSASYSNOTREADY, "Network subsystem is unavailable",
0, NULL, "WSASYSNOTREADY" },
/* 092 */ { WSAVERNOTSUPPORTED, "WINSOCK.DLL version out of range",
0, NULL, "WSAVERNOTSUPPORTED" },
/* 093 */ { WSANOTINITIALISED, "Successful WSAStartup not yet performed",
0, NULL, "WSANOTINITIALISED" },
/* 094 */ { 0, NULL, 0, NULL, NULL },
/* 095 */ { 0, NULL, 0, NULL, NULL },
/* 096 */ { 0, NULL, 0, NULL, NULL },
/* 097 */ { 0, NULL, 0, NULL, NULL },
/* 098 */ { 0, NULL, 0, NULL, NULL },
/* 099 */ { 0, NULL, 0, NULL, NULL },
/* 100 */ { 0, NULL, 0, NULL, NULL },
/* 101 */ { WSAEDISCON, "Graceful shutdown in progress",
0, NULL, "WSAEDISCON" },
/* 102 */ { WSAENOMORE, "No more services",
0, NULL, "WSAENOMORE" },
/* 103 */ { WSAECANCELLED, "Service lookup cancelled",
0, NULL, "WSAECANCELLED" },
/* 104 */ { WSAEINVALIDPROCTABLE, "Invalid procedure call table",
0, NULL, "WSAEINVALIDPROCTABLE" },
/* 105 */ { WSAEINVALIDPROVIDER, "Invalid service provider",
0, NULL, "WSAEINVALIDPROVIDER" },
/* 106 */ { WSAEPROVIDERFAILEDINIT, "Service provider failure",
0, NULL, "WSAEPROVIDERFAILEDINIT" },
/* 107 */ { WSASYSCALLFAILURE, "System call failed",
0, NULL, "WSASYSCALLFAILURE" },
/* 108 */ { WSASERVICE_NOT_FOUND, "No such service",
0, NULL, "WSASERVICE_NOT_FOUND" },
/* 109 */ { WSATYPE_NOT_FOUND, "Class not found",
0, NULL, "WSATYPE_NOT_FOUND" },
/* 110 */ { WSA_E_NO_MORE, "No more services",
0, NULL, "WSA_E_NO_MORE" },
/* 111 */ { WSA_E_CANCELLED, "Service lookup cancelled",
0, NULL, "WSA_E_CANCELLED" },
/* 112 */ { WSAEREFUSED, "Database query refused",
0, NULL, "WSAEREFUSED" },
/* end */ { -1, NULL, -1, NULL, NULL }
};
/* Extended list of error structures. */
static socket_error_t socket_h_errno [] = {
/* 000 */ { 0, NULL, 0, NULL, NULL },
/* 001 */ { WSAHOST_NOT_FOUND, "Host not found",
HOST_NOT_FOUND, "HOST_NOT_FOUND", "WSAHOST_NOT_FOUND" },
/* 002 */ { WSATRY_AGAIN, "Non-authoritative host not found",
TRY_AGAIN, "TRY_AGAIN", "WSATRY_AGAIN" },
/* 003 */ { WSANO_RECOVERY, "This is a non-recoverable error",
NO_RECOVERY, "NO_RECOVERY", "WSANO_RECOVERY" },
/* 004 */ { WSANO_DATA, "Valid name, no data record of requested type",
NO_DATA, "NO_DATA", "WSANO_DATA" },
/* 005 */ { WSANO_ADDRESS, "No address, look for MX record",
NO_ADDRESS, "NO_ADDRESS", "WSANO_ADDRESS" },
/* end */ { -1, NULL, -1, NULL, NULL }
};
/* Returns the result of @code{WSAGetLastError()}. */
int
scm_i_socket_errno (void)
{
return WSAGetLastError ();
}
/* Returns a valid error message for Winsock-API error codes obtained via
@code{WSAGetLastError()} or NULL otherwise. */
char *
scm_i_socket_strerror (int error)
{
if (error >= WSABASEERR && error <= (WSABASEERR + 112))
return socket_errno[error - WSABASEERR].str;
else if (error >= (WSABASEERR + 1000) && error <= (WSABASEERR + 1005))
return socket_h_errno[error - (WSABASEERR + 1000)].str;
return NULL;
}
/* Constructs a valid filename for the given file @var{file} in the M$-Windows
directory. This is usually the default location for the network files. */
char *
scm_i_socket_filename (char *file)
{
static char dir[PATH_MAX];
int len = PATH_MAX;
len = GetWindowsDirectory (dir, len);
if (dir[len - 1] != '\\')
strcat (dir, "\\");
strcat (dir, file);
return dir;
}
/* Removes comments and white spaces at end of line and returns a pointer
to the end of the line. */
static char *
scm_i_socket_uncomment (char *line)
{
char *end;
if ((end = strchr (line, '#')) != NULL)
*end-- = '\0';
else
{
end = line + strlen (line) - 1;
while (end > line && (*end == '\r' || *end == '\n'))
*end-- = '\0';
}
while (end > line && isspace ((int) (*end)))
*end-- = '\0';
return end;
}
/* Define both the original and replacement error symbol is possible. Thus
the user is able to check symbolic errors after unsuccessful networking
function calls. */
static void
scm_socket_symbols_Win32 (socket_error_t * e)
{
while (e->error != -1)
{
if (e->error)
{
if (e->correct_str)
scm_c_define (e->correct_str, scm_from_int (e->error));
if (e->replace && e->replace_str)
scm_c_define (e->replace_str, scm_from_int (e->replace));
}
e++;
}
}
/* Initialize Winsock API under M$-Windows. */
void
scm_i_init_socket_Win32 (void)
{
scm_socket_symbols_Win32 (socket_errno);
scm_socket_symbols_Win32 (socket_h_errno);
}

View file

@ -1,35 +0,0 @@
/* classes: h_files */
#ifndef SCM_WIN32_SOCKET_H
#define SCM_WIN32_SOCKET_H
/* Copyright (C) 2001, 2006, 2013 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 3 of
* the License, or (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include "libguile/__scm.h"
#ifdef SCM_HAVE_WINSOCK2_H
# include <winsock2.h>
#endif
int scm_i_socket_errno (void);
char * scm_i_socket_strerror (int error);
void scm_i_init_socket_Win32 (void);
char * scm_i_socket_filename (char *file);
#endif /* SCM_WIN32_SOCKET_H */