mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 03:30:27 +02:00
* socket.c (scm_fill_sockaddr): call htons for sin6_port.
Don't assign sin6_scope_id in structure unless HAVE_SIN6_SCOPE_ID is defined. (scm_addr_vector): use a switch instead of multiple if statements. Add support for IPv6 (incomplete) . MAX_ADDR_SIZE: increase to size of struct sockaddr_in if needed.
This commit is contained in:
parent
6764198159
commit
5a525b8441
2 changed files with 65 additions and 24 deletions
|
@ -1,3 +1,12 @@
|
|||
2001-04-20 Gary Houston <ghouston@arglist.com>
|
||||
|
||||
* socket.c (scm_fill_sockaddr): call htons for sin6_port.
|
||||
Don't assign sin6_scope_id in structure unless HAVE_SIN6_SCOPE_ID
|
||||
is defined.
|
||||
(scm_addr_vector): use a switch instead of multiple if statements.
|
||||
Add support for IPv6 (incomplete) .
|
||||
MAX_ADDR_SIZE: increase to size of struct sockaddr_in if needed.
|
||||
|
||||
2001-04-20 Dirk Herrmann <D.Herrmann@tu-bs.de>
|
||||
|
||||
* struct.c (scm_free_structs): Only pairs may be accessed with
|
||||
|
|
|
@ -500,9 +500,11 @@ scm_fill_sockaddr (int fam, SCM address, SCM *args, int which_arg,
|
|||
}
|
||||
#endif
|
||||
}
|
||||
soka->sin6_port = port;
|
||||
soka->sin6_port = htons (port);
|
||||
soka->sin6_flowinfo = flowinfo;
|
||||
#ifdef HAVE_SIN6_SCOPE_ID
|
||||
soka->sin6_scope_id = scope_id;
|
||||
#endif
|
||||
*size = sizeof (struct sockaddr_in6);
|
||||
return (struct sockaddr *) soka;
|
||||
}
|
||||
|
@ -666,33 +668,56 @@ scm_addr_vector (struct sockaddr *address, const char *proc)
|
|||
SCM result;
|
||||
SCM *ve;
|
||||
|
||||
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
|
||||
if (fam == AF_UNIX)
|
||||
switch (fam)
|
||||
{
|
||||
struct sockaddr_un *nad = (struct sockaddr_un *) address;
|
||||
case AF_INET:
|
||||
{
|
||||
struct sockaddr_in *nad = (struct sockaddr_in *) address;
|
||||
|
||||
result = scm_c_make_vector (2, SCM_UNSPECIFIED);
|
||||
ve = SCM_VELTS (result);
|
||||
ve[0] = scm_ulong2num ((unsigned long) fam);
|
||||
ve[1] = scm_makfromstr (nad->sun_path,
|
||||
(scm_sizet) strlen (nad->sun_path), 0);
|
||||
}
|
||||
else
|
||||
result = scm_c_make_vector (3, SCM_UNSPECIFIED);
|
||||
ve = SCM_VELTS (result);
|
||||
ve[0] = scm_ulong2num ((unsigned long) fam);
|
||||
ve[1] = scm_ulong2num (ntohl (nad->sin_addr.s_addr));
|
||||
ve[2] = scm_ulong2num ((unsigned long) ntohs (nad->sin_port));
|
||||
}
|
||||
break;
|
||||
#ifdef AF_INET6
|
||||
case AF_INET6:
|
||||
{
|
||||
struct sockaddr_in6 *nad = (struct sockaddr_in6 *) address;
|
||||
|
||||
result = scm_c_make_vector (5, SCM_UNSPECIFIED);
|
||||
ve = SCM_VELTS (result);
|
||||
ve[0] = scm_ulong2num ((unsigned long) fam);
|
||||
/* FIXME */
|
||||
ve[1] = SCM_INUM0;
|
||||
ve[2] = scm_ulong2num ((unsigned long) ntohs (nad->sin6_port));
|
||||
ve[3] = scm_ulong2num ((unsigned long) nad->sin6_flowinfo);
|
||||
#ifdef HAVE_SIN6_SCOPE_ID
|
||||
ve[4] = scm_ulong2num ((unsigned long) nad->sin6_scope_id);
|
||||
#else
|
||||
ve[4] = SCM_INUM0;
|
||||
#endif
|
||||
if (fam == AF_INET)
|
||||
{
|
||||
struct sockaddr_in *nad = (struct sockaddr_in *) address;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
|
||||
case AF_UNIX:
|
||||
{
|
||||
struct sockaddr_un *nad = (struct sockaddr_un *) address;
|
||||
|
||||
result = scm_c_make_vector (3, SCM_UNSPECIFIED);
|
||||
ve = SCM_VELTS (result);
|
||||
ve[0] = scm_ulong2num ((unsigned long) fam);
|
||||
ve[1] = scm_ulong2num (ntohl (nad->sin_addr.s_addr));
|
||||
ve[2] = scm_ulong2num ((unsigned long) ntohs (nad->sin_port));
|
||||
result = scm_c_make_vector (2, SCM_UNSPECIFIED);
|
||||
ve = SCM_VELTS (result);
|
||||
ve[0] = scm_ulong2num ((unsigned long) fam);
|
||||
ve[1] = scm_makfromstr (nad->sun_path,
|
||||
(scm_sizet) strlen (nad->sun_path), 0);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
scm_misc_error (proc, "Unrecognised address family: ~A",
|
||||
SCM_LIST1 (SCM_MAKINUM (fam)));
|
||||
}
|
||||
else
|
||||
scm_misc_error (proc, "Unrecognised address family: ~A",
|
||||
SCM_LIST1 (SCM_MAKINUM (fam)));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -706,7 +731,14 @@ scm_addr_vector (struct sockaddr *address, const char *proc)
|
|||
#define MAX_SIZE_UN 0
|
||||
#endif
|
||||
|
||||
#define MAX_ADDR_SIZE max (sizeof (struct sockaddr_in), MAX_SIZE_UN)
|
||||
#if defined (AF_INET6)
|
||||
#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)
|
||||
|
||||
SCM_DEFINE (scm_accept, "accept", 1, 0, 0,
|
||||
(SCM sock),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue