Hi, Marius Vollmer <[EMAIL PROTECTED]> writes:
> [EMAIL PROTECTED] (Ludovic Courtès) writes: > >> Obviously, the best solution would be to expose the relevant functions >> to the user. :-) > > Yes, we should do that, following the scm_to and scm_from naming scheme. Following this discussion, I propose the following addition which exposes the wrapping/unwrapping functions of `sockaddr' objects. Thanks, Ludovic. 2005-06-14 Ludovic Courtès <[EMAIL PROTECTED]> * socket.c (scm_addr_vector): Renamed to `_scm_from_sockaddr' and made inline. (scm_from_sockaddr): New function. (scm_to_sockaddr): New function. (scm_fill_sockaddr): Made inline. * socket.h (scm_from_sockaddr): New declaration. (scm_to_sockaddr): New declaration. Index: socket.c =================================================================== RCS file: /cvsroot/guile/guile/guile-core/libguile/socket.c,v retrieving revision 1.114 diff -u -B -b -r1.114 socket.c --- socket.c 5 Jun 2005 18:27:53 -0000 1.114 +++ socket.c 14 Jun 2005 16:26:51 -0000 @@ -664,7 +664,7 @@ proc is the name of the original procedure. size returns the size of the structure allocated. */ -static struct sockaddr * +static SCM_C_INLINE_KEYWORD struct sockaddr * scm_fill_sockaddr (int fam, SCM address, SCM *args, int which_arg, const char *proc, int *size) #define FUNC_NAME proc @@ -769,6 +769,22 @@ } #undef FUNC_NAME +/* Return a newly-allocated `sockaddr' structure that reflects ADDRESS, being + an address of family FAMILY, with the family-specific parameters ARGS (see + the description of `connect' for details). The returned structure may be + freed using `free ()'. */ +struct sockaddr * +scm_to_sockaddr (int family, SCM address, SCM args) +{ + size_t size; + struct sockaddr *soka; + + soka = scm_fill_sockaddr (family, address, &args, 1, + "scm_to_sockaddr", &size); + + return soka; +} + SCM_DEFINE (scm_connect, "connect", 3, 0, 1, (SCM sock, SCM fam, SCM address, SCM args), "Initiate a connection from a socket using a specified address\n" @@ -893,8 +909,8 @@ #undef FUNC_NAME /* Put the components of a sockaddr into a new SCM vector. */ -static SCM -scm_addr_vector (const struct sockaddr *address, int addr_size, +static SCM_C_INLINE_KEYWORD SCM +_scm_from_sockaddr (const struct sockaddr *address, unsigned addr_size, const char *proc) { short int fam = address->sa_family; @@ -953,8 +969,10 @@ break; #endif default: + result = SCM_UNSPECIFIED; scm_misc_error (proc, "Unrecognised address family: ~A", scm_list_1 (scm_from_int (fam))); + } return result; } @@ -959,6 +977,14 @@ return result; } +/* The publicly-visible function. Return a Scheme object representing + ADDRESS, an address of ADDR_SIZE bytes. */ +SCM +scm_from_sockaddr (const struct sockaddr *address, unsigned addr_size) +{ + return (_scm_from_sockaddr (address, addr_size, "scm_from_sockaddr")); +} + /* 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. */ @@ -1009,7 +1035,7 @@ if (newfd == -1) SCM_SYSERROR; newsock = SCM_SOCK_FD_TO_PORT (newfd); - address = scm_addr_vector (addr, addr_size, FUNC_NAME); + address = _scm_from_sockaddr (addr, addr_size, FUNC_NAME); return scm_cons (newsock, address); } #undef FUNC_NAME @@ -1031,7 +1057,7 @@ fd = SCM_FPORT_FDES (sock); if (getsockname (fd, addr, &addr_size) == -1) SCM_SYSERROR; - return scm_addr_vector (addr, addr_size, FUNC_NAME); + return _scm_from_sockaddr (addr, addr_size, FUNC_NAME); } #undef FUNC_NAME @@ -1053,7 +1079,7 @@ fd = SCM_FPORT_FDES (sock); if (getpeername (fd, addr, &addr_size) == -1) SCM_SYSERROR; - return scm_addr_vector (addr, addr_size, FUNC_NAME); + return _scm_from_sockaddr (addr, addr_size, FUNC_NAME); } #undef FUNC_NAME @@ -1207,7 +1233,7 @@ if (rv == -1) SCM_SYSERROR; if (addr->sa_family != AF_UNSPEC) - address = scm_addr_vector (addr, addr_size, FUNC_NAME); + address = _scm_from_sockaddr (addr, addr_size, FUNC_NAME); else address = SCM_BOOL_F; Index: socket.h =================================================================== RCS file: /cvsroot/guile/guile/guile-core/libguile/socket.h,v retrieving revision 1.17 diff -u -B -b -r1.17 socket.h --- socket.h 23 May 2005 19:57:21 -0000 1.17 +++ socket.h 14 Jun 2005 16:26:51 -0000 @@ -54,6 +54,11 @@ SCM_API SCM scm_sendto (SCM sockfd, SCM message, SCM fam, SCM address, SCM args_and_flags); SCM_API void scm_init_socket (void); +struct sockaddr; +SCM_API SCM scm_from_sockaddr (const struct sockaddr *address, + unsigned addr_size); +SCM_API struct sockaddr *scm_to_sockaddr (int family, SCM address, SCM args); + #endif /* SCM_SOCKET_H */ /* _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user