Merge remote-tracking branch 'origin/stable-2.0'
[bpt/guile.git] / libguile / socket.c
1 /* Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005,
2 * 2006, 2007, 2009, 2011, 2012, 2013 Free Software Foundation, Inc.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public License
6 * as published by the Free Software Foundation; either version 3 of
7 * the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301 USA
18 */
19
20
21 \f
22
23 #ifdef HAVE_CONFIG_H
24 # include <config.h>
25 #endif
26
27 #include <errno.h>
28 #include <verify.h>
29
30 #ifdef HAVE_STDINT_H
31 #include <stdint.h>
32 #endif
33 #ifdef HAVE_STRING_H
34 #include <string.h>
35 #endif
36 #ifdef HAVE_UNISTD_H
37 #include <unistd.h>
38 #endif
39 #include <sys/types.h>
40 #include <sys/socket.h>
41 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
42 #include <sys/un.h>
43 #endif
44 #include <netinet/in.h>
45 #include <netdb.h>
46 #include <arpa/inet.h>
47
48 #include <gmp.h>
49
50 #include "libguile/_scm.h"
51 #include "libguile/arrays.h"
52 #include "libguile/feature.h"
53 #include "libguile/fports.h"
54 #include "libguile/strings.h"
55 #include "libguile/vectors.h"
56 #include "libguile/dynwind.h"
57 #include "libguile/srfi-13.h"
58
59 #include "libguile/validate.h"
60 #include "libguile/socket.h"
61
62 #if SCM_ENABLE_DEPRECATED == 1
63 # include "libguile/deprecation.h"
64 #endif
65
66
67
68 #if defined (HAVE_UNIX_DOMAIN_SOCKETS) && !defined (SUN_LEN)
69 #define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
70 + strlen ((ptr)->sun_path))
71 #endif
72
73 /* The largest possible socket address. Wrapping it in a union guarantees
74 that the compiler will make it suitably aligned. */
75 typedef union
76 {
77 struct sockaddr sockaddr;
78 struct sockaddr_in sockaddr_in;
79
80 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
81 struct sockaddr_un sockaddr_un;
82 #endif
83 #ifdef HAVE_IPV6
84 struct sockaddr_in6 sockaddr_in6;
85 #endif
86 } scm_t_max_sockaddr;
87
88
89 /* Maximum size of a socket address. */
90 #define MAX_ADDR_SIZE (sizeof (scm_t_max_sockaddr))
91
92
93 \f
94
95 SCM_DEFINE (scm_htons, "htons", 1, 0, 0,
96 (SCM value),
97 "Convert a 16 bit quantity from host to network byte ordering.\n"
98 "@var{value} is packed into 2 bytes, which are then converted\n"
99 "and returned as a new integer.")
100 #define FUNC_NAME s_scm_htons
101 {
102 return scm_from_ushort (htons (scm_to_ushort (value)));
103 }
104 #undef FUNC_NAME
105
106 SCM_DEFINE (scm_ntohs, "ntohs", 1, 0, 0,
107 (SCM value),
108 "Convert a 16 bit quantity from network to host byte ordering.\n"
109 "@var{value} is packed into 2 bytes, which are then converted\n"
110 "and returned as a new integer.")
111 #define FUNC_NAME s_scm_ntohs
112 {
113 return scm_from_ushort (ntohs (scm_to_ushort (value)));
114 }
115 #undef FUNC_NAME
116
117 SCM_DEFINE (scm_htonl, "htonl", 1, 0, 0,
118 (SCM value),
119 "Convert a 32 bit quantity from host to network byte ordering.\n"
120 "@var{value} is packed into 4 bytes, which are then converted\n"
121 "and returned as a new integer.")
122 #define FUNC_NAME s_scm_htonl
123 {
124 return scm_from_ulong (htonl (scm_to_uint32 (value)));
125 }
126 #undef FUNC_NAME
127
128 SCM_DEFINE (scm_ntohl, "ntohl", 1, 0, 0,
129 (SCM value),
130 "Convert a 32 bit quantity from network to host byte ordering.\n"
131 "@var{value} is packed into 4 bytes, which are then converted\n"
132 "and returned as a new integer.")
133 #define FUNC_NAME s_scm_ntohl
134 {
135 return scm_from_ulong (ntohl (scm_to_uint32 (value)));
136 }
137 #undef FUNC_NAME
138
139 #ifdef HAVE_INET_NETOF
140 SCM_DEFINE (scm_inet_netof, "inet-netof", 1, 0, 0,
141 (SCM address),
142 "Return the network number part of the given IPv4\n"
143 "Internet address. E.g.,\n\n"
144 "@lisp\n"
145 "(inet-netof 2130706433) @result{} 127\n"
146 "@end lisp")
147 #define FUNC_NAME s_scm_inet_netof
148 {
149 struct in_addr addr;
150 addr.s_addr = htonl (SCM_NUM2ULONG (1, address));
151 return scm_from_ulong (inet_netof (addr));
152 }
153 #undef FUNC_NAME
154 #endif
155
156 #ifdef HAVE_INET_LNAOF
157 SCM_DEFINE (scm_lnaof, "inet-lnaof", 1, 0, 0,
158 (SCM address),
159 "Return the local-address-with-network part of the given\n"
160 "IPv4 Internet address, using the obsolete class A/B/C system.\n"
161 "E.g.,\n\n"
162 "@lisp\n"
163 "(inet-lnaof 2130706433) @result{} 1\n"
164 "@end lisp")
165 #define FUNC_NAME s_scm_lnaof
166 {
167 struct in_addr addr;
168 addr.s_addr = htonl (SCM_NUM2ULONG (1, address));
169 return scm_from_ulong (inet_lnaof (addr));
170 }
171 #undef FUNC_NAME
172 #endif
173
174 #ifdef HAVE_INET_MAKEADDR
175 SCM_DEFINE (scm_inet_makeaddr, "inet-makeaddr", 2, 0, 0,
176 (SCM net, SCM lna),
177 "Make an IPv4 Internet address by combining the network number\n"
178 "@var{net} with the local-address-within-network number\n"
179 "@var{lna}. E.g.,\n\n"
180 "@lisp\n"
181 "(inet-makeaddr 127 1) @result{} 2130706433\n"
182 "@end lisp")
183 #define FUNC_NAME s_scm_inet_makeaddr
184 {
185 struct in_addr addr;
186 unsigned long netnum;
187 unsigned long lnanum;
188
189 netnum = SCM_NUM2ULONG (1, net);
190 lnanum = SCM_NUM2ULONG (2, lna);
191 addr = inet_makeaddr (netnum, lnanum);
192 return scm_from_ulong (ntohl (addr.s_addr));
193 }
194 #undef FUNC_NAME
195 #endif
196
197 #ifdef HAVE_IPV6
198
199 /* flip a 128 bit IPv6 address between host and network order. */
200 #ifdef WORDS_BIGENDIAN
201 #define FLIP_NET_HOST_128(addr)
202 #else
203 #define FLIP_NET_HOST_128(addr)\
204 {\
205 int i;\
206 \
207 for (i = 0; i < 8; i++)\
208 {\
209 scm_t_uint8 c = (addr)[i];\
210 \
211 (addr)[i] = (addr)[15 - i];\
212 (addr)[15 - i] = c;\
213 }\
214 }
215 #endif
216
217 #ifdef WORDS_BIGENDIAN
218 #define FLIPCPY_NET_HOST_128(dest, src) memcpy (dest, src, 16)
219 #else
220 #define FLIPCPY_NET_HOST_128(dest, src) \
221 { \
222 const scm_t_uint8 *tmp_srcp = (src) + 15; \
223 scm_t_uint8 *tmp_destp = (dest); \
224 \
225 do { \
226 *tmp_destp++ = *tmp_srcp--; \
227 } while (tmp_srcp != (src)); \
228 }
229 #endif
230
231
232 #if (SIZEOF_SCM_T_BITS * SCM_CHAR_BIT) > 128
233 #error "Assumption that scm_t_bits <= 128 bits has been violated."
234 #endif
235
236 #if (SIZEOF_UNSIGNED_LONG * SCM_CHAR_BIT) > 128
237 #error "Assumption that unsigned long <= 128 bits has been violated."
238 #endif
239
240 #if (SIZEOF_UNSIGNED_LONG_LONG * SCM_CHAR_BIT) > 128
241 #error "Assumption that unsigned long long <= 128 bits has been violated."
242 #endif
243
244 /* convert a 128 bit IPv6 address in network order to a host ordered
245 SCM integer. */
246 static SCM
247 scm_from_ipv6 (const scm_t_uint8 *src)
248 {
249 SCM result = scm_i_mkbig ();
250 mpz_import (SCM_I_BIG_MPZ (result),
251 1, /* chunk */
252 1, /* big-endian chunk ordering */
253 16, /* chunks are 16 bytes long */
254 1, /* big-endian byte ordering */
255 0, /* "nails" -- leading unused bits per chunk */
256 src);
257 return scm_i_normbig (result);
258 }
259
260 /* convert a host ordered SCM integer to a 128 bit IPv6 address in
261 network order. */
262 static void
263 scm_to_ipv6 (scm_t_uint8 dst[16], SCM src)
264 {
265 if (SCM_I_INUMP (src))
266 {
267 scm_t_signed_bits n = SCM_I_INUM (src);
268 if (n < 0)
269 scm_out_of_range (NULL, src);
270 #ifdef WORDS_BIGENDIAN
271 memset (dst, 0, 16 - sizeof (scm_t_signed_bits));
272 memcpy (dst + (16 - sizeof (scm_t_signed_bits)),
273 &n,
274 sizeof (scm_t_signed_bits));
275 #else
276 memset (dst + sizeof (scm_t_signed_bits),
277 0,
278 16 - sizeof (scm_t_signed_bits));
279 /* FIXME: this pair of ops is kinda wasteful -- should rewrite as
280 a single loop perhaps, similar to the handling of bignums. */
281 memcpy (dst, &n, sizeof (scm_t_signed_bits));
282 FLIP_NET_HOST_128 (dst);
283 #endif
284 }
285 else if (SCM_BIGP (src))
286 {
287 size_t count;
288
289 if ((mpz_sgn (SCM_I_BIG_MPZ (src)) < 0)
290 || mpz_sizeinbase (SCM_I_BIG_MPZ (src), 2) > 128)
291 scm_out_of_range (NULL, src);
292
293 memset (dst, 0, 16);
294 mpz_export (dst,
295 &count,
296 1, /* big-endian chunk ordering */
297 16, /* chunks are 16 bytes long */
298 1, /* big-endian byte ordering */
299 0, /* "nails" -- leading unused bits per chunk */
300 SCM_I_BIG_MPZ (src));
301 scm_remember_upto_here_1 (src);
302 }
303 else
304 scm_wrong_type_arg_msg ("scm_to_ipv6", 0, src, "integer");
305 }
306
307 #endif /* HAVE_IPV6 */
308
309 \f
310
311 SCM_DEFINE (scm_inet_ntop, "inet-ntop", 2, 0, 0,
312 (SCM family, SCM address),
313 "Convert a network address into a printable string.\n"
314 "Note that unlike the C version of this function,\n"
315 "the input is an integer with normal host byte ordering.\n"
316 "@var{family} can be @code{AF_INET} or @code{AF_INET6}. E.g.,\n\n"
317 "@lisp\n"
318 "(inet-ntop AF_INET 2130706433) @result{} \"127.0.0.1\"\n"
319 "(inet-ntop AF_INET6 (- (expt 2 128) 1))\n"
320 " @result{} \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\"\n"
321 "@end lisp")
322 #define FUNC_NAME s_scm_inet_ntop
323 {
324 int af;
325 #ifdef INET6_ADDRSTRLEN
326 char dst[INET6_ADDRSTRLEN];
327 #else
328 char dst[46];
329 #endif
330 const char *result;
331
332 af = scm_to_int (family);
333 SCM_ASSERT_RANGE (1, family,
334 af == AF_INET
335 #ifdef HAVE_IPV6
336 || af == AF_INET6
337 #endif
338 );
339 if (af == AF_INET)
340 {
341 scm_t_uint32 addr4;
342
343 addr4 = htonl (SCM_NUM2ULONG (2, address));
344 result = inet_ntop (af, &addr4, dst, sizeof (dst));
345 }
346 #ifdef HAVE_IPV6
347 else if (af == AF_INET6)
348 {
349 char addr6[16];
350
351 scm_to_ipv6 ((scm_t_uint8 *) addr6, address);
352 result = inet_ntop (af, &addr6, dst, sizeof (dst));
353 }
354 #endif
355 else
356 SCM_MISC_ERROR ("unsupported address family", family);
357
358 if (result == NULL)
359 SCM_SYSERROR;
360
361 return scm_from_locale_string (dst);
362 }
363 #undef FUNC_NAME
364
365 SCM_DEFINE (scm_inet_pton, "inet-pton", 2, 0, 0,
366 (SCM family, SCM address),
367 "Convert a string containing a printable network address to\n"
368 "an integer address. Note that unlike the C version of this\n"
369 "function,\n"
370 "the result is an integer with normal host byte ordering.\n"
371 "@var{family} can be @code{AF_INET} or @code{AF_INET6}. E.g.,\n\n"
372 "@lisp\n"
373 "(inet-pton AF_INET \"127.0.0.1\") @result{} 2130706433\n"
374 "(inet-pton AF_INET6 \"::1\") @result{} 1\n"
375 "@end lisp")
376 #define FUNC_NAME s_scm_inet_pton
377 {
378 int af;
379 char *src;
380 scm_t_uint32 dst[4];
381 int rv, eno;
382
383 af = scm_to_int (family);
384 SCM_ASSERT_RANGE (1, family,
385 af == AF_INET
386 #ifdef HAVE_IPV6
387 || af == AF_INET6
388 #endif
389 );
390
391 src = scm_to_locale_string (address);
392 rv = inet_pton (af, src, dst);
393 eno = errno;
394 free (src);
395 errno = eno;
396
397 if (rv == -1)
398 SCM_SYSERROR;
399 else if (rv == 0)
400 SCM_MISC_ERROR ("Bad address", SCM_EOL);
401 if (af == AF_INET)
402 return scm_from_ulong (ntohl (*dst));
403 #ifdef HAVE_IPV6
404 else if (af == AF_INET6)
405 return scm_from_ipv6 ((scm_t_uint8 *) dst);
406 #endif
407 else
408 SCM_MISC_ERROR ("unsupported address family", family);
409 }
410 #undef FUNC_NAME
411
412 \f
413 SCM_SYMBOL (sym_socket, "socket");
414
415 #define SCM_SOCK_FD_TO_PORT(fd) scm_fdes_to_port (fd, "r+0", sym_socket)
416
417 SCM_DEFINE (scm_socket, "socket", 3, 0, 0,
418 (SCM family, SCM style, SCM proto),
419 "Return a new socket port of the type specified by @var{family},\n"
420 "@var{style} and @var{proto}. All three parameters are\n"
421 "integers. Supported values for @var{family} are\n"
422 "@code{AF_UNIX}, @code{AF_INET} and @code{AF_INET6}.\n"
423 "Typical values for @var{style} are @code{SOCK_STREAM},\n"
424 "@code{SOCK_DGRAM} and @code{SOCK_RAW}.\n\n"
425 "@var{proto} can be obtained from a protocol name using\n"
426 "@code{getprotobyname}. A value of zero specifies the default\n"
427 "protocol, which is usually right.\n\n"
428 "A single socket port cannot by used for communication until it\n"
429 "has been connected to another socket.")
430 #define FUNC_NAME s_scm_socket
431 {
432 int fd;
433
434 fd = socket (scm_to_int (family),
435 scm_to_int (style),
436 scm_to_int (proto));
437 if (fd == -1)
438 SCM_SYSERROR;
439 return SCM_SOCK_FD_TO_PORT (fd);
440 }
441 #undef FUNC_NAME
442
443 #ifdef HAVE_SOCKETPAIR
444 SCM_DEFINE (scm_socketpair, "socketpair", 3, 0, 0,
445 (SCM family, SCM style, SCM proto),
446 "Return a pair of connected (but unnamed) socket ports of the\n"
447 "type specified by @var{family}, @var{style} and @var{proto}.\n"
448 "Many systems support only socket pairs of the @code{AF_UNIX}\n"
449 "family. Zero is likely to be the only meaningful value for\n"
450 "@var{proto}.")
451 #define FUNC_NAME s_scm_socketpair
452 {
453 int fam;
454 int fd[2];
455
456 fam = scm_to_int (family);
457
458 if (socketpair (fam, scm_to_int (style), scm_to_int (proto), fd) == -1)
459 SCM_SYSERROR;
460
461 return scm_cons (SCM_SOCK_FD_TO_PORT (fd[0]), SCM_SOCK_FD_TO_PORT (fd[1]));
462 }
463 #undef FUNC_NAME
464 #endif
465
466 /* Possible results for `getsockopt ()'. Wrapping it into a union guarantees
467 suitable alignment. */
468 typedef union
469 {
470 #ifdef HAVE_STRUCT_LINGER
471 struct linger linger;
472 #endif
473 size_t size;
474 int integer;
475 } scm_t_getsockopt_result;
476
477 SCM_DEFINE (scm_getsockopt, "getsockopt", 3, 0, 0,
478 (SCM sock, SCM level, SCM optname),
479 "Return an option value from socket port @var{sock}.\n"
480 "\n"
481 "@var{level} is an integer specifying a protocol layer, either\n"
482 "@code{SOL_SOCKET} for socket level options, or a protocol\n"
483 "number from the @code{IPPROTO} constants or @code{getprotoent}\n"
484 "(@pxref{Network Databases}).\n"
485 "\n"
486 "@defvar SOL_SOCKET\n"
487 "@defvarx IPPROTO_IP\n"
488 "@defvarx IPPROTO_TCP\n"
489 "@defvarx IPPROTO_UDP\n"
490 "@end defvar\n"
491 "\n"
492 "@var{optname} is an integer specifying an option within the\n"
493 "protocol layer.\n"
494 "\n"
495 "For @code{SOL_SOCKET} level the following @var{optname}s are\n"
496 "defined (when provided by the system). For their meaning see\n"
497 "@ref{Socket-Level Options,,, libc, The GNU C Library Reference\n"
498 "Manual}, or @command{man 7 socket}.\n"
499 "\n"
500 "@defvar SO_DEBUG\n"
501 "@defvarx SO_REUSEADDR\n"
502 "@defvarx SO_STYLE\n"
503 "@defvarx SO_TYPE\n"
504 "@defvarx SO_ERROR\n"
505 "@defvarx SO_DONTROUTE\n"
506 "@defvarx SO_BROADCAST\n"
507 "@defvarx SO_SNDBUF\n"
508 "@defvarx SO_RCVBUF\n"
509 "@defvarx SO_KEEPALIVE\n"
510 "@defvarx SO_OOBINLINE\n"
511 "@defvarx SO_NO_CHECK\n"
512 "@defvarx SO_PRIORITY\n"
513 "@defvarx SO_REUSEPORT\n"
514 "The value returned is an integer.\n"
515 "@end defvar\n"
516 "\n"
517 "@defvar SO_LINGER\n"
518 "The value returned is a pair of integers\n"
519 "@code{(@var{enable} . @var{timeout})}. On old systems without\n"
520 "timeout support (ie.@: without @code{struct linger}), only\n"
521 "@var{enable} has an effect but the value in Guile is always a\n"
522 "pair.\n"
523 "@end defvar")
524 #define FUNC_NAME s_scm_getsockopt
525 {
526 int fd;
527 /* size of optval is the largest supported option. */
528 scm_t_getsockopt_result optval;
529 socklen_t optlen = sizeof (optval);
530 int ilevel;
531 int ioptname;
532
533 sock = SCM_COERCE_OUTPORT (sock);
534 SCM_VALIDATE_OPFPORT (1, sock);
535 ilevel = scm_to_int (level);
536 ioptname = scm_to_int (optname);
537
538 fd = SCM_FPORT_FDES (sock);
539 if (getsockopt (fd, ilevel, ioptname, (void *) &optval, &optlen) == -1)
540 SCM_SYSERROR;
541
542 if (ilevel == SOL_SOCKET)
543 {
544 #ifdef SO_LINGER
545 if (ioptname == SO_LINGER)
546 {
547 #ifdef HAVE_STRUCT_LINGER
548 struct linger *ling = (struct linger *) &optval;
549
550 return scm_cons (scm_from_long (ling->l_onoff),
551 scm_from_long (ling->l_linger));
552 #else
553 return scm_cons (scm_from_long (*(int *) &optval),
554 scm_from_int (0));
555 #endif
556 }
557 else
558 #endif
559 if (0
560 #ifdef SO_SNDBUF
561 || ioptname == SO_SNDBUF
562 #endif
563 #ifdef SO_RCVBUF
564 || ioptname == SO_RCVBUF
565 #endif
566 )
567 {
568 return scm_from_size_t (*(size_t *) &optval);
569 }
570 }
571 return scm_from_int (*(int *) &optval);
572 }
573 #undef FUNC_NAME
574
575 SCM_DEFINE (scm_setsockopt, "setsockopt", 4, 0, 0,
576 (SCM sock, SCM level, SCM optname, SCM value),
577 "Set an option on socket port @var{sock}. The return value is\n"
578 "unspecified.\n"
579 "\n"
580 "@var{level} is an integer specifying a protocol layer, either\n"
581 "@code{SOL_SOCKET} for socket level options, or a protocol\n"
582 "number from the @code{IPPROTO} constants or @code{getprotoent}\n"
583 "(@pxref{Network Databases}).\n"
584 "\n"
585 "@defvar SOL_SOCKET\n"
586 "@defvarx IPPROTO_IP\n"
587 "@defvarx IPPROTO_TCP\n"
588 "@defvarx IPPROTO_UDP\n"
589 "@end defvar\n"
590 "\n"
591 "@var{optname} is an integer specifying an option within the\n"
592 "protocol layer.\n"
593 "\n"
594 "For @code{SOL_SOCKET} level the following @var{optname}s are\n"
595 "defined (when provided by the system). For their meaning see\n"
596 "@ref{Socket-Level Options,,, libc, The GNU C Library Reference\n"
597 "Manual}, or @command{man 7 socket}.\n"
598 "\n"
599 "@defvar SO_DEBUG\n"
600 "@defvarx SO_REUSEADDR\n"
601 "@defvarx SO_STYLE\n"
602 "@defvarx SO_TYPE\n"
603 "@defvarx SO_ERROR\n"
604 "@defvarx SO_DONTROUTE\n"
605 "@defvarx SO_BROADCAST\n"
606 "@defvarx SO_SNDBUF\n"
607 "@defvarx SO_RCVBUF\n"
608 "@defvarx SO_KEEPALIVE\n"
609 "@defvarx SO_OOBINLINE\n"
610 "@defvarx SO_NO_CHECK\n"
611 "@defvarx SO_PRIORITY\n"
612 "@defvarx SO_REUSEPORT\n"
613 "@var{value} is an integer.\n"
614 "@end defvar\n"
615 "\n"
616 "@defvar SO_LINGER\n"
617 "@var{value} is a pair of integers @code{(@var{ENABLE}\n"
618 ". @var{TIMEOUT})}. On old systems without timeout support\n"
619 "(ie.@: without @code{struct linger}), only @var{ENABLE} has an\n"
620 "effect but the value in Guile is always a pair.\n"
621 "@end defvar\n"
622 "\n"
623 "@c Note that we refer only to ``man ip'' here. On GNU/Linux it's\n"
624 "@c ``man 7 ip'' but on NetBSD it's ``man 4 ip''.\n"
625 "@c \n"
626 "For IP level (@code{IPPROTO_IP}) the following @var{optname}s\n"
627 "are defined (when provided by the system). See @command{man\n"
628 "ip} for what they mean.\n"
629 "\n"
630 "@defvar IP_MULTICAST_IF\n"
631 "This sets the source interface used by multicast traffic.\n"
632 "@end defvar\n"
633 "\n"
634 "@defvar IP_MULTICAST_TTL\n"
635 "This sets the default TTL for multicast traffic. This defaults \n"
636 "to 1 and should be increased to allow traffic to pass beyond the\n"
637 "local network.\n"
638 "@end defvar\n"
639 "\n"
640 "@defvar IP_ADD_MEMBERSHIP\n"
641 "@defvarx IP_DROP_MEMBERSHIP\n"
642 "These can be used only with @code{setsockopt}, not\n"
643 "@code{getsockopt}. @var{value} is a pair\n"
644 "@code{(@var{MULTIADDR} . @var{INTERFACEADDR})} of IPv4\n"
645 "addresses (@pxref{Network Address Conversion}).\n"
646 "@var{MULTIADDR} is a multicast address to be added to or\n"
647 "dropped from the interface @var{INTERFACEADDR}.\n"
648 "@var{INTERFACEADDR} can be @code{INADDR_ANY} to have the system\n"
649 "select the interface. @var{INTERFACEADDR} can also be an\n"
650 "interface index number, on systems supporting that.\n"
651 "@end defvar")
652 #define FUNC_NAME s_scm_setsockopt
653 {
654 int fd;
655
656 int opt_int;
657 #ifdef HAVE_STRUCT_LINGER
658 struct linger opt_linger;
659 #endif
660
661 #ifdef HAVE_STRUCT_IP_MREQ
662 struct ip_mreq opt_mreq;
663 #endif
664
665 const void *optval = NULL;
666 socklen_t optlen = 0;
667
668 int ilevel, ioptname;
669
670 sock = SCM_COERCE_OUTPORT (sock);
671
672 SCM_VALIDATE_OPFPORT (1, sock);
673 ilevel = scm_to_int (level);
674 ioptname = scm_to_int (optname);
675
676 fd = SCM_FPORT_FDES (sock);
677
678 if (ilevel == SOL_SOCKET)
679 {
680 #ifdef SO_LINGER
681 if (ioptname == SO_LINGER)
682 {
683 #ifdef HAVE_STRUCT_LINGER
684 SCM_ASSERT (scm_is_pair (value), value, SCM_ARG4, FUNC_NAME);
685 opt_linger.l_onoff = scm_to_int (SCM_CAR (value));
686 opt_linger.l_linger = scm_to_int (SCM_CDR (value));
687 optlen = sizeof (struct linger);
688 optval = &opt_linger;
689 #else
690 SCM_ASSERT (scm_is_pair (value), value, SCM_ARG4, FUNC_NAME);
691 opt_int = scm_to_int (SCM_CAR (value));
692 /* timeout is ignored, but may as well validate it. */
693 scm_to_int (SCM_CDR (value));
694 optlen = sizeof (int);
695 optval = &opt_int;
696 #endif
697 }
698 else
699 #endif
700 if (0
701 #ifdef SO_SNDBUF
702 || ioptname == SO_SNDBUF
703 #endif
704 #ifdef SO_RCVBUF
705 || ioptname == SO_RCVBUF
706 #endif
707 )
708 {
709 opt_int = scm_to_int (value);
710 optlen = sizeof (size_t);
711 optval = &opt_int;
712 }
713 }
714
715 #ifdef HAVE_STRUCT_IP_MREQ
716 if (ilevel == IPPROTO_IP &&
717 (ioptname == IP_ADD_MEMBERSHIP || ioptname == IP_DROP_MEMBERSHIP))
718 {
719 /* Fourth argument must be a pair of addresses. */
720 SCM_ASSERT (scm_is_pair (value), value, SCM_ARG4, FUNC_NAME);
721 opt_mreq.imr_multiaddr.s_addr = htonl (scm_to_ulong (SCM_CAR (value)));
722 opt_mreq.imr_interface.s_addr = htonl (scm_to_ulong (SCM_CDR (value)));
723 optlen = sizeof (opt_mreq);
724 optval = &opt_mreq;
725 }
726 #endif
727
728 if (optval == NULL)
729 {
730 /* Most options take an int. */
731 opt_int = scm_to_int (value);
732 optlen = sizeof (int);
733 optval = &opt_int;
734 }
735
736 if (setsockopt (fd, ilevel, ioptname, optval, optlen) == -1)
737 SCM_SYSERROR;
738 return SCM_UNSPECIFIED;
739 }
740 #undef FUNC_NAME
741
742 /* Our documentation hard-codes this mapping, so make sure it holds. */
743 verify (SHUT_RD == 0);
744 verify (SHUT_WR == 1);
745 verify (SHUT_RDWR == 2);
746
747 SCM_DEFINE (scm_shutdown, "shutdown", 2, 0, 0,
748 (SCM sock, SCM how),
749 "Sockets can be closed simply by using @code{close-port}. The\n"
750 "@code{shutdown} procedure allows reception or transmission on a\n"
751 "connection to be shut down individually, according to the parameter\n"
752 "@var{how}:\n\n"
753 "@table @asis\n"
754 "@item 0\n"
755 "Stop receiving data for this socket. If further data arrives, reject it.\n"
756 "@item 1\n"
757 "Stop trying to transmit data from this socket. Discard any\n"
758 "data waiting to be sent. Stop looking for acknowledgement of\n"
759 "data already sent; don't retransmit it if it is lost.\n"
760 "@item 2\n"
761 "Stop both reception and transmission.\n"
762 "@end table\n\n"
763 "The return value is unspecified.")
764 #define FUNC_NAME s_scm_shutdown
765 {
766 int fd;
767 sock = SCM_COERCE_OUTPORT (sock);
768 SCM_VALIDATE_OPFPORT (1, sock);
769 fd = SCM_FPORT_FDES (sock);
770 if (shutdown (fd, scm_to_signed_integer (how, 0, 2)) == -1)
771 SCM_SYSERROR;
772 return SCM_UNSPECIFIED;
773 }
774 #undef FUNC_NAME
775
776 /* convert fam/address/args into a sockaddr of the appropriate type.
777 args is modified by removing the arguments actually used.
778 which_arg and proc are used when reporting errors:
779 which_arg is the position of address in the original argument list.
780 proc is the name of the original procedure.
781 size returns the size of the structure allocated. */
782
783 static struct sockaddr *
784 scm_fill_sockaddr (int fam, SCM address, SCM *args, int which_arg,
785 const char *proc, size_t *size)
786 #define FUNC_NAME proc
787 {
788 switch (fam)
789 {
790 case AF_INET:
791 {
792 struct sockaddr_in *soka;
793 unsigned long addr;
794 int port;
795
796 SCM_VALIDATE_ULONG_COPY (which_arg, address, addr);
797 SCM_VALIDATE_CONS (which_arg + 1, *args);
798 port = scm_to_int (SCM_CAR (*args));
799 *args = SCM_CDR (*args);
800 soka = (struct sockaddr_in *) scm_malloc (sizeof (struct sockaddr_in));
801 memset (soka, '\0', sizeof (struct sockaddr_in));
802
803 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
804 soka->sin_len = sizeof (struct sockaddr_in);
805 #endif
806 soka->sin_family = AF_INET;
807 soka->sin_addr.s_addr = htonl (addr);
808 soka->sin_port = htons (port);
809 *size = sizeof (struct sockaddr_in);
810 return (struct sockaddr *) soka;
811 }
812 #ifdef HAVE_IPV6
813 case AF_INET6:
814 {
815 /* see RFC2553. */
816 int port;
817 struct sockaddr_in6 *soka;
818 unsigned long flowinfo = 0;
819 unsigned long scope_id = 0;
820
821 SCM_VALIDATE_CONS (which_arg + 1, *args);
822 port = scm_to_int (SCM_CAR (*args));
823 *args = SCM_CDR (*args);
824 if (scm_is_pair (*args))
825 {
826 SCM_VALIDATE_ULONG_COPY (which_arg + 2, SCM_CAR (*args), flowinfo);
827 *args = SCM_CDR (*args);
828 if (scm_is_pair (*args))
829 {
830 SCM_VALIDATE_ULONG_COPY (which_arg + 3, SCM_CAR (*args),
831 scope_id);
832 *args = SCM_CDR (*args);
833 }
834 }
835 soka = (struct sockaddr_in6 *) scm_malloc (sizeof (struct sockaddr_in6));
836
837 #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
838 soka->sin6_len = sizeof (struct sockaddr_in6);
839 #endif
840 soka->sin6_family = AF_INET6;
841 scm_to_ipv6 (soka->sin6_addr.s6_addr, address);
842 soka->sin6_port = htons (port);
843 soka->sin6_flowinfo = flowinfo;
844 #ifdef HAVE_SIN6_SCOPE_ID
845 soka->sin6_scope_id = scope_id;
846 #endif
847 *size = sizeof (struct sockaddr_in6);
848 return (struct sockaddr *) soka;
849 }
850 #endif
851 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
852 case AF_UNIX:
853 {
854 struct sockaddr_un *soka;
855 int addr_size;
856 char *c_address;
857
858 scm_dynwind_begin (0);
859
860 c_address = scm_to_locale_string (address);
861 scm_dynwind_free (c_address);
862
863 /* the static buffer size in sockaddr_un seems to be arbitrary
864 and not necessarily a hard limit. e.g., the glibc manual
865 suggests it may be possible to declare it size 0. let's
866 ignore it. if the O/S doesn't like the size it will cause
867 connect/bind etc., to fail. sun_path is always the last
868 member of the structure. */
869 addr_size = sizeof (struct sockaddr_un)
870 + max (0, strlen (c_address) + 1 - (sizeof soka->sun_path));
871 soka = (struct sockaddr_un *) scm_malloc (addr_size);
872 memset (soka, 0, addr_size); /* for sun_len: see sin_len above. */
873 soka->sun_family = AF_UNIX;
874 strcpy (soka->sun_path, c_address);
875 *size = SUN_LEN (soka);
876
877 scm_dynwind_end ();
878 return (struct sockaddr *) soka;
879 }
880 #endif
881 default:
882 scm_out_of_range (proc, scm_from_int (fam));
883 }
884 }
885 #undef FUNC_NAME
886
887 SCM_DEFINE (scm_connect, "connect", 2, 1, 1,
888 (SCM sock, SCM fam_or_sockaddr, SCM address, SCM args),
889 "Initiate a connection from a socket using a specified address\n"
890 "family to the address\n"
891 "specified by @var{address} and possibly @var{args}.\n"
892 "The format required for @var{address}\n"
893 "and @var{args} depends on the family of the socket.\n\n"
894 "For a socket of family @code{AF_UNIX},\n"
895 "only @var{address} is specified and must be a string with the\n"
896 "filename where the socket is to be created.\n\n"
897 "For a socket of family @code{AF_INET},\n"
898 "@var{address} must be an integer IPv4 host address and\n"
899 "@var{args} must be a single integer port number.\n\n"
900 "For a socket of family @code{AF_INET6},\n"
901 "@var{address} must be an integer IPv6 host address and\n"
902 "@var{args} may be up to three integers:\n"
903 "port [flowinfo] [scope_id],\n"
904 "where flowinfo and scope_id default to zero.\n\n"
905 "Alternatively, the second argument can be a socket address object "
906 "as returned by @code{make-socket-address}, in which case the "
907 "no additional arguments should be passed.\n\n"
908 "The return value is unspecified.")
909 #define FUNC_NAME s_scm_connect
910 {
911 int fd;
912 struct sockaddr *soka;
913 size_t size;
914
915 sock = SCM_COERCE_OUTPORT (sock);
916 SCM_VALIDATE_OPFPORT (1, sock);
917 fd = SCM_FPORT_FDES (sock);
918
919 if (scm_is_eq (address, SCM_UNDEFINED))
920 /* No third argument was passed to FAM_OR_SOCKADDR must actually be a
921 `socket address' object. */
922 soka = scm_to_sockaddr (fam_or_sockaddr, &size);
923 else
924 soka = scm_fill_sockaddr (scm_to_int (fam_or_sockaddr), address,
925 &args, 3, FUNC_NAME, &size);
926
927 if (connect (fd, soka, size) == -1)
928 {
929 int save_errno = errno;
930
931 free (soka);
932 errno = save_errno;
933 SCM_SYSERROR;
934 }
935 free (soka);
936 return SCM_UNSPECIFIED;
937 }
938 #undef FUNC_NAME
939
940 SCM_DEFINE (scm_bind, "bind", 2, 1, 1,
941 (SCM sock, SCM fam_or_sockaddr, SCM address, SCM args),
942 "Assign an address to the socket port @var{sock}.\n"
943 "Generally this only needs to be done for server sockets,\n"
944 "so they know where to look for incoming connections. A socket\n"
945 "without an address will be assigned one automatically when it\n"
946 "starts communicating.\n\n"
947 "The format of @var{address} and @var{args} depends\n"
948 "on the family of the socket.\n\n"
949 "For a socket of family @code{AF_UNIX}, only @var{address}\n"
950 "is specified and must be a string with the filename where\n"
951 "the socket is to be created.\n\n"
952 "For a socket of family @code{AF_INET}, @var{address}\n"
953 "must be an integer IPv4 address and @var{args}\n"
954 "must be a single integer port number.\n\n"
955 "The values of the following variables can also be used for\n"
956 "@var{address}:\n\n"
957 "@defvar INADDR_ANY\n"
958 "Allow connections from any address.\n"
959 "@end defvar\n\n"
960 "@defvar INADDR_LOOPBACK\n"
961 "The address of the local host using the loopback device.\n"
962 "@end defvar\n\n"
963 "@defvar INADDR_BROADCAST\n"
964 "The broadcast address on the local network.\n"
965 "@end defvar\n\n"
966 "@defvar INADDR_NONE\n"
967 "No address.\n"
968 "@end defvar\n\n"
969 "For a socket of family @code{AF_INET6}, @var{address}\n"
970 "must be an integer IPv6 address and @var{args}\n"
971 "may be up to three integers:\n"
972 "port [flowinfo] [scope_id],\n"
973 "where flowinfo and scope_id default to zero.\n\n"
974 "Alternatively, the second argument can be a socket address object "
975 "as returned by @code{make-socket-address}, in which case the "
976 "no additional arguments should be passed.\n\n"
977 "The return value is unspecified.")
978 #define FUNC_NAME s_scm_bind
979 {
980 struct sockaddr *soka;
981 size_t size;
982 int fd;
983
984 sock = SCM_COERCE_OUTPORT (sock);
985 SCM_VALIDATE_OPFPORT (1, sock);
986 fd = SCM_FPORT_FDES (sock);
987
988 if (scm_is_eq (address, SCM_UNDEFINED))
989 /* No third argument was passed to FAM_OR_SOCKADDR must actually be a
990 `socket address' object. */
991 soka = scm_to_sockaddr (fam_or_sockaddr, &size);
992 else
993 soka = scm_fill_sockaddr (scm_to_int (fam_or_sockaddr), address,
994 &args, 3, FUNC_NAME, &size);
995
996
997 if (bind (fd, soka, size) == -1)
998 {
999 int save_errno = errno;
1000
1001 free (soka);
1002 errno = save_errno;
1003 SCM_SYSERROR;
1004 }
1005 free (soka);
1006 return SCM_UNSPECIFIED;
1007 }
1008 #undef FUNC_NAME
1009
1010 SCM_DEFINE (scm_listen, "listen", 2, 0, 0,
1011 (SCM sock, SCM backlog),
1012 "Enable @var{sock} to accept connection\n"
1013 "requests. @var{backlog} is an integer specifying\n"
1014 "the maximum length of the queue for pending connections.\n"
1015 "If the queue fills, new clients will fail to connect until\n"
1016 "the server calls @code{accept} to accept a connection from\n"
1017 "the queue.\n\n"
1018 "The return value is unspecified.")
1019 #define FUNC_NAME s_scm_listen
1020 {
1021 int fd;
1022 sock = SCM_COERCE_OUTPORT (sock);
1023 SCM_VALIDATE_OPFPORT (1, sock);
1024 fd = SCM_FPORT_FDES (sock);
1025 if (listen (fd, scm_to_int (backlog)) == -1)
1026 SCM_SYSERROR;
1027 return SCM_UNSPECIFIED;
1028 }
1029 #undef FUNC_NAME
1030
1031 /* Put the components of a sockaddr into a new SCM vector. */
1032 static SCM_C_INLINE_KEYWORD SCM
1033 _scm_from_sockaddr (const scm_t_max_sockaddr *address, unsigned addr_size,
1034 const char *proc)
1035 {
1036 SCM result = SCM_EOL;
1037 short int fam = ((struct sockaddr *) address)->sa_family;
1038
1039 switch (fam)
1040 {
1041 case AF_INET:
1042 {
1043 const struct sockaddr_in *nad = (struct sockaddr_in *) address;
1044
1045 result = scm_c_make_vector (3, SCM_UNSPECIFIED);
1046
1047 SCM_SIMPLE_VECTOR_SET(result, 0,
1048 scm_from_short (fam));
1049 SCM_SIMPLE_VECTOR_SET(result, 1,
1050 scm_from_ulong (ntohl (nad->sin_addr.s_addr)));
1051 SCM_SIMPLE_VECTOR_SET(result, 2,
1052 scm_from_ushort (ntohs (nad->sin_port)));
1053 }
1054 break;
1055 #ifdef HAVE_IPV6
1056 case AF_INET6:
1057 {
1058 const struct sockaddr_in6 *nad = (struct sockaddr_in6 *) address;
1059
1060 result = scm_c_make_vector (5, SCM_UNSPECIFIED);
1061 SCM_SIMPLE_VECTOR_SET(result, 0, scm_from_short (fam));
1062 SCM_SIMPLE_VECTOR_SET(result, 1, scm_from_ipv6 (nad->sin6_addr.s6_addr));
1063 SCM_SIMPLE_VECTOR_SET(result, 2, scm_from_ushort (ntohs (nad->sin6_port)));
1064 SCM_SIMPLE_VECTOR_SET(result, 3, scm_from_uint32 (nad->sin6_flowinfo));
1065 #ifdef HAVE_SIN6_SCOPE_ID
1066 SCM_SIMPLE_VECTOR_SET(result, 4, scm_from_ulong (nad->sin6_scope_id));
1067 #else
1068 SCM_SIMPLE_VECTOR_SET(result, 4, SCM_INUM0);
1069 #endif
1070 }
1071 break;
1072 #endif
1073 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
1074 case AF_UNIX:
1075 {
1076 const struct sockaddr_un *nad = (struct sockaddr_un *) address;
1077
1078 result = scm_c_make_vector (2, SCM_UNSPECIFIED);
1079
1080 SCM_SIMPLE_VECTOR_SET(result, 0, scm_from_short (fam));
1081 /* When addr_size is not enough to cover sun_path, do not try
1082 to access it. */
1083 if (addr_size <= offsetof (struct sockaddr_un, sun_path))
1084 SCM_SIMPLE_VECTOR_SET(result, 1, SCM_BOOL_F);
1085 else
1086 SCM_SIMPLE_VECTOR_SET(result, 1, scm_from_locale_string (nad->sun_path));
1087 }
1088 break;
1089 #endif
1090 default:
1091 result = SCM_UNSPECIFIED;
1092 scm_misc_error (proc, "unrecognised address family: ~A",
1093 scm_list_1 (scm_from_int (fam)));
1094
1095 }
1096 return result;
1097 }
1098
1099 /* The publicly-visible function. Return a Scheme object representing
1100 ADDRESS, an address of ADDR_SIZE bytes. */
1101 SCM
1102 scm_from_sockaddr (const struct sockaddr *address, unsigned addr_size)
1103 {
1104 return (_scm_from_sockaddr ((scm_t_max_sockaddr *) address,
1105 addr_size, "scm_from_sockaddr"));
1106 }
1107
1108 /* Convert ADDRESS, an address object returned by either
1109 `scm_from_sockaddr ()' or `scm_make_socket_address ()', into its C
1110 representation. On success, a non-NULL pointer is returned and
1111 ADDRESS_SIZE is updated to the actual size (in bytes) of the returned
1112 address. The result must eventually be freed using `free ()'. */
1113 struct sockaddr *
1114 scm_to_sockaddr (SCM address, size_t *address_size)
1115 #define FUNC_NAME "scm_to_sockaddr"
1116 {
1117 short int family;
1118 struct sockaddr *c_address = NULL;
1119
1120 SCM_VALIDATE_VECTOR (1, address);
1121
1122 *address_size = 0;
1123 family = scm_to_short (SCM_SIMPLE_VECTOR_REF (address, 0));
1124
1125 switch (family)
1126 {
1127 case AF_INET:
1128 {
1129 if (SCM_SIMPLE_VECTOR_LENGTH (address) != 3)
1130 scm_misc_error (FUNC_NAME,
1131 "invalid inet address representation: ~A",
1132 scm_list_1 (address));
1133 else
1134 {
1135 struct sockaddr_in c_inet;
1136
1137 memset (&c_inet, '\0', sizeof (struct sockaddr_in));
1138
1139 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1140 c_inet.sin_len = sizeof (struct sockaddr_in);
1141 #endif
1142
1143 c_inet.sin_addr.s_addr =
1144 htonl (scm_to_ulong (SCM_SIMPLE_VECTOR_REF (address, 1)));
1145 c_inet.sin_port =
1146 htons (scm_to_ushort (SCM_SIMPLE_VECTOR_REF (address, 2)));
1147 c_inet.sin_family = AF_INET;
1148
1149 *address_size = sizeof (c_inet);
1150 c_address = scm_malloc (sizeof (c_inet));
1151 memcpy (c_address, &c_inet, sizeof (c_inet));
1152 }
1153
1154 break;
1155 }
1156
1157 #ifdef HAVE_IPV6
1158 case AF_INET6:
1159 {
1160 if (SCM_SIMPLE_VECTOR_LENGTH (address) != 5)
1161 scm_misc_error (FUNC_NAME, "invalid inet6 address representation: ~A",
1162 scm_list_1 (address));
1163 else
1164 {
1165 struct sockaddr_in6 c_inet6;
1166
1167 scm_to_ipv6 (c_inet6.sin6_addr.s6_addr,
1168 SCM_SIMPLE_VECTOR_REF (address, 1));
1169 c_inet6.sin6_port =
1170 htons (scm_to_ushort (SCM_SIMPLE_VECTOR_REF (address, 2)));
1171 c_inet6.sin6_flowinfo =
1172 scm_to_uint32 (SCM_SIMPLE_VECTOR_REF (address, 3));
1173 #ifdef HAVE_SIN6_SCOPE_ID
1174 c_inet6.sin6_scope_id =
1175 scm_to_ulong (SCM_SIMPLE_VECTOR_REF (address, 4));
1176 #endif
1177
1178 c_inet6.sin6_family = AF_INET6;
1179
1180 *address_size = sizeof (c_inet6);
1181 c_address = scm_malloc (sizeof (c_inet6));
1182 memcpy (c_address, &c_inet6, sizeof (c_inet6));
1183 }
1184
1185 break;
1186 }
1187 #endif
1188
1189 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
1190 case AF_UNIX:
1191 {
1192 if (SCM_SIMPLE_VECTOR_LENGTH (address) != 2)
1193 scm_misc_error (FUNC_NAME, "invalid unix address representation: ~A",
1194 scm_list_1 (address));
1195 else
1196 {
1197 SCM path;
1198 size_t path_len = 0;
1199
1200 path = SCM_SIMPLE_VECTOR_REF (address, 1);
1201 if (!scm_is_string (path) && !scm_is_false (path))
1202 scm_misc_error (FUNC_NAME, "invalid unix address "
1203 "path: ~A", scm_list_1 (path));
1204 else
1205 {
1206 struct sockaddr_un c_unix;
1207
1208 if (scm_is_false (path))
1209 path_len = 0;
1210 else
1211 path_len = scm_c_string_length (path);
1212
1213 #ifdef UNIX_PATH_MAX
1214 if (path_len >= UNIX_PATH_MAX)
1215 #else
1216 /* We can hope that this limit will eventually vanish, at least on GNU.
1217 However, currently, while glibc doesn't define `UNIX_PATH_MAX', it
1218 documents it has being limited to 108 bytes. */
1219 if (path_len >= sizeof (c_unix.sun_path))
1220 #endif
1221 scm_misc_error (FUNC_NAME, "unix address path "
1222 "too long: ~A", scm_list_1 (path));
1223 else
1224 {
1225 if (path_len)
1226 {
1227 scm_to_locale_stringbuf (path, c_unix.sun_path,
1228 #ifdef UNIX_PATH_MAX
1229 UNIX_PATH_MAX);
1230 #else
1231 sizeof (c_unix.sun_path));
1232 #endif
1233 c_unix.sun_path[path_len] = '\0';
1234
1235 /* Sanity check. */
1236 if (strlen (c_unix.sun_path) != path_len)
1237 scm_misc_error (FUNC_NAME, "unix address path "
1238 "contains nul characters: ~A",
1239 scm_list_1 (path));
1240 }
1241 else
1242 c_unix.sun_path[0] = '\0';
1243
1244 c_unix.sun_family = AF_UNIX;
1245
1246 *address_size = SUN_LEN (&c_unix);
1247 c_address = scm_malloc (sizeof (c_unix));
1248 memcpy (c_address, &c_unix, sizeof (c_unix));
1249 }
1250 }
1251 }
1252
1253 break;
1254 }
1255 #endif
1256
1257 default:
1258 scm_misc_error (FUNC_NAME, "unrecognised address family: ~A",
1259 scm_list_1 (scm_from_ushort (family)));
1260 }
1261
1262 return c_address;
1263 }
1264 #undef FUNC_NAME
1265
1266
1267 /* Return a newly-allocated `sockaddr' structure that reflects ADDRESS, being
1268 an address of family FAMILY, with the family-specific parameters ARGS (see
1269 the description of `connect' for details). The returned structure may be
1270 freed using `free ()'. */
1271 struct sockaddr *
1272 scm_c_make_socket_address (SCM family, SCM address, SCM args,
1273 size_t *address_size)
1274 {
1275 struct sockaddr *soka;
1276
1277 soka = scm_fill_sockaddr (scm_to_ushort (family), address, &args, 1,
1278 "scm_c_make_socket_address", address_size);
1279
1280 return soka;
1281 }
1282
1283 SCM_DEFINE (scm_make_socket_address, "make-socket-address", 2, 0, 1,
1284 (SCM family, SCM address, SCM args),
1285 "Return a Scheme address object that reflects @var{address}, "
1286 "being an address of family @var{family}, with the "
1287 "family-specific parameters @var{args} (see the description of "
1288 "@code{connect} for details).")
1289 #define FUNC_NAME s_scm_make_socket_address
1290 {
1291 SCM result = SCM_BOOL_F;
1292 struct sockaddr *c_address;
1293 size_t c_address_size;
1294
1295 c_address = scm_c_make_socket_address (family, address, args,
1296 &c_address_size);
1297 if (c_address != NULL)
1298 {
1299 result = scm_from_sockaddr (c_address, c_address_size);
1300 free (c_address);
1301 }
1302
1303 return result;
1304 }
1305 #undef FUNC_NAME
1306
1307 \f
1308 SCM_DEFINE (scm_accept, "accept", 1, 0, 0,
1309 (SCM sock),
1310 "Accept a connection on a bound, listening socket.\n"
1311 "If there\n"
1312 "are no pending connections in the queue, wait until\n"
1313 "one is available unless the non-blocking option has been\n"
1314 "set on the socket.\n\n"
1315 "The return value is a\n"
1316 "pair in which the @emph{car} is a new socket port for the\n"
1317 "connection and\n"
1318 "the @emph{cdr} is an object with address information about the\n"
1319 "client which initiated the connection.\n\n"
1320 "@var{sock} does not become part of the\n"
1321 "connection and will continue to accept new requests.")
1322 #define FUNC_NAME s_scm_accept
1323 {
1324 int fd;
1325 int newfd;
1326 SCM address;
1327 SCM newsock;
1328 socklen_t addr_size = MAX_ADDR_SIZE;
1329 scm_t_max_sockaddr addr;
1330
1331 sock = SCM_COERCE_OUTPORT (sock);
1332 SCM_VALIDATE_OPFPORT (1, sock);
1333 fd = SCM_FPORT_FDES (sock);
1334 newfd = accept (fd, (struct sockaddr *) &addr, &addr_size);
1335 if (newfd == -1)
1336 SCM_SYSERROR;
1337 newsock = SCM_SOCK_FD_TO_PORT (newfd);
1338 address = _scm_from_sockaddr (&addr, addr_size,
1339 FUNC_NAME);
1340
1341 return scm_cons (newsock, address);
1342 }
1343 #undef FUNC_NAME
1344
1345 SCM_DEFINE (scm_getsockname, "getsockname", 1, 0, 0,
1346 (SCM sock),
1347 "Return the address of @var{sock}, in the same form as the\n"
1348 "object returned by @code{accept}. On many systems the address\n"
1349 "of a socket in the @code{AF_FILE} namespace cannot be read.")
1350 #define FUNC_NAME s_scm_getsockname
1351 {
1352 int fd;
1353 socklen_t addr_size = MAX_ADDR_SIZE;
1354 scm_t_max_sockaddr addr;
1355
1356 sock = SCM_COERCE_OUTPORT (sock);
1357 SCM_VALIDATE_OPFPORT (1, sock);
1358 fd = SCM_FPORT_FDES (sock);
1359 if (getsockname (fd, (struct sockaddr *) &addr, &addr_size) == -1)
1360 SCM_SYSERROR;
1361
1362 return _scm_from_sockaddr (&addr, addr_size, FUNC_NAME);
1363 }
1364 #undef FUNC_NAME
1365
1366 SCM_DEFINE (scm_getpeername, "getpeername", 1, 0, 0,
1367 (SCM sock),
1368 "Return the address that @var{sock}\n"
1369 "is connected to, in the same form as the object returned by\n"
1370 "@code{accept}. On many systems the address of a socket in the\n"
1371 "@code{AF_FILE} namespace cannot be read.")
1372 #define FUNC_NAME s_scm_getpeername
1373 {
1374 int fd;
1375 socklen_t addr_size = MAX_ADDR_SIZE;
1376 scm_t_max_sockaddr addr;
1377
1378 sock = SCM_COERCE_OUTPORT (sock);
1379 SCM_VALIDATE_OPFPORT (1, sock);
1380 fd = SCM_FPORT_FDES (sock);
1381 if (getpeername (fd, (struct sockaddr *) &addr, &addr_size) == -1)
1382 SCM_SYSERROR;
1383
1384 return _scm_from_sockaddr (&addr, addr_size, FUNC_NAME);
1385 }
1386 #undef FUNC_NAME
1387
1388 SCM_DEFINE (scm_recv, "recv!", 2, 1, 0,
1389 (SCM sock, SCM buf, SCM flags),
1390 "Receive data from a socket port.\n"
1391 "@var{sock} must already\n"
1392 "be bound to the address from which data is to be received.\n"
1393 "@var{buf} is a bytevector into which\n"
1394 "the data will be written. The size of @var{buf} limits\n"
1395 "the amount of\n"
1396 "data which can be received: in the case of packet\n"
1397 "protocols, if a packet larger than this limit is encountered\n"
1398 "then some data\n"
1399 "will be irrevocably lost.\n\n"
1400 "The optional @var{flags} argument is a value or\n"
1401 "bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.\n\n"
1402 "The value returned is the number of bytes read from the\n"
1403 "socket.\n\n"
1404 "Note that the data is read directly from the socket file\n"
1405 "descriptor:\n"
1406 "any unread buffered port data is ignored.")
1407 #define FUNC_NAME s_scm_recv
1408 {
1409 int rv, fd, flg;
1410
1411 SCM_VALIDATE_OPFPORT (1, sock);
1412
1413 if (SCM_UNBNDP (flags))
1414 flg = 0;
1415 else
1416 flg = scm_to_int (flags);
1417 fd = SCM_FPORT_FDES (sock);
1418
1419 SCM_VALIDATE_BYTEVECTOR (1, buf);
1420
1421 SCM_SYSCALL (rv = recv (fd,
1422 SCM_BYTEVECTOR_CONTENTS (buf),
1423 SCM_BYTEVECTOR_LENGTH (buf),
1424 flg));
1425
1426 if (SCM_UNLIKELY (rv == -1))
1427 SCM_SYSERROR;
1428
1429 scm_remember_upto_here (buf);
1430 return scm_from_int (rv);
1431 }
1432 #undef FUNC_NAME
1433
1434 SCM_DEFINE (scm_send, "send", 2, 1, 0,
1435 (SCM sock, SCM message, SCM flags),
1436 "Transmit bytevector @var{message} on socket port @var{sock}.\n"
1437 "@var{sock} must already be bound to a destination address. The\n"
1438 "value returned is the number of bytes transmitted --\n"
1439 "it's possible for\n"
1440 "this to be less than the length of @var{message}\n"
1441 "if the socket is\n"
1442 "set to be non-blocking. The optional @var{flags} argument\n"
1443 "is a value or\n"
1444 "bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.\n\n"
1445 "Note that the data is written directly to the socket\n"
1446 "file descriptor:\n"
1447 "any unflushed buffered port data is ignored.\n\n"
1448 "This operation is defined only for strings containing codepoints\n"
1449 "zero to 255.")
1450 #define FUNC_NAME s_scm_send
1451 {
1452 int rv, fd, flg;
1453
1454 sock = SCM_COERCE_OUTPORT (sock);
1455 SCM_VALIDATE_OPFPORT (1, sock);
1456
1457 if (SCM_UNBNDP (flags))
1458 flg = 0;
1459 else
1460 flg = scm_to_int (flags);
1461
1462 fd = SCM_FPORT_FDES (sock);
1463
1464 SCM_VALIDATE_BYTEVECTOR (1, message);
1465
1466 SCM_SYSCALL (rv = send (fd,
1467 SCM_BYTEVECTOR_CONTENTS (message),
1468 SCM_BYTEVECTOR_LENGTH (message),
1469 flg));
1470
1471 if (rv == -1)
1472 SCM_SYSERROR;
1473
1474 scm_remember_upto_here_1 (message);
1475 return scm_from_int (rv);
1476 }
1477 #undef FUNC_NAME
1478
1479 SCM_DEFINE (scm_recvfrom, "recvfrom!", 2, 3, 0,
1480 (SCM sock, SCM buf, SCM flags, SCM start, SCM end),
1481 "Receive data from socket port @var{sock} (which must be already\n"
1482 "bound), returning the originating address as well as the data.\n"
1483 "This is usually for use on datagram sockets, but can be used on\n"
1484 "stream-oriented sockets too.\n"
1485 "\n"
1486 "The data received is stored in bytevector @var{buf}, using\n"
1487 "either the whole bytevector or just the region between the optional\n"
1488 "@var{start} and @var{end} positions. The size of @var{buf}\n"
1489 "limits the amount of data that can be received. For datagram\n"
1490 "protocols, if a packet larger than this is received then excess\n"
1491 "bytes are irrevocably lost.\n"
1492 "\n"
1493 "The return value is a pair. The @code{car} is the number of\n"
1494 "bytes read. The @code{cdr} is a socket address object which is\n"
1495 "where the data came from, or @code{#f} if the origin is\n"
1496 "unknown.\n"
1497 "\n"
1498 "The optional @var{flags} argument is a or bitwise OR\n"
1499 "(@code{logior}) of @code{MSG_OOB}, @code{MSG_PEEK},\n"
1500 "@code{MSG_DONTROUTE} etc.\n"
1501 "\n"
1502 "Data is read directly from the socket file descriptor, any\n"
1503 "buffered port data is ignored.\n"
1504 "\n"
1505 "On a GNU/Linux system @code{recvfrom!} is not multi-threading,\n"
1506 "all threads stop while a @code{recvfrom!} call is in progress.\n"
1507 "An application may need to use @code{select}, @code{O_NONBLOCK}\n"
1508 "or @code{MSG_DONTWAIT} to avoid this.")
1509 #define FUNC_NAME s_scm_recvfrom
1510 {
1511 int rv, fd, flg;
1512 SCM address;
1513 size_t offset, cend;
1514 socklen_t addr_size = MAX_ADDR_SIZE;
1515 scm_t_max_sockaddr addr;
1516
1517 SCM_VALIDATE_OPFPORT (1, sock);
1518 fd = SCM_FPORT_FDES (sock);
1519
1520 if (SCM_UNBNDP (flags))
1521 flg = 0;
1522 else
1523 SCM_VALIDATE_ULONG_COPY (3, flags, flg);
1524
1525 ((struct sockaddr *) &addr)->sa_family = AF_UNSPEC;
1526
1527 SCM_VALIDATE_BYTEVECTOR (1, buf);
1528
1529 if (SCM_UNBNDP (start))
1530 offset = 0;
1531 else
1532 offset = scm_to_size_t (start);
1533
1534 if (SCM_UNBNDP (end))
1535 cend = SCM_BYTEVECTOR_LENGTH (buf);
1536 else
1537 {
1538 cend = scm_to_size_t (end);
1539 if (SCM_UNLIKELY (cend >= SCM_BYTEVECTOR_LENGTH (buf)
1540 || cend < offset))
1541 scm_out_of_range (FUNC_NAME, end);
1542 }
1543
1544 SCM_SYSCALL (rv = recvfrom (fd,
1545 SCM_BYTEVECTOR_CONTENTS (buf) + offset,
1546 cend - offset, flg,
1547 (struct sockaddr *) &addr, &addr_size));
1548
1549 if (rv == -1)
1550 SCM_SYSERROR;
1551
1552 /* `recvfrom' does not necessarily return an address. Usually nothing
1553 is returned for stream sockets. */
1554 if (((struct sockaddr *) &addr)->sa_family != AF_UNSPEC)
1555 address = _scm_from_sockaddr (&addr, addr_size, FUNC_NAME);
1556 else
1557 address = SCM_BOOL_F;
1558
1559 scm_remember_upto_here_1 (buf);
1560
1561 return scm_cons (scm_from_int (rv), address);
1562 }
1563 #undef FUNC_NAME
1564
1565 SCM_DEFINE (scm_sendto, "sendto", 3, 1, 1,
1566 (SCM sock, SCM message, SCM fam_or_sockaddr, SCM address, SCM args_and_flags),
1567 "Transmit bytevector @var{message} on socket port\n"
1568 "@var{sock}. The\n"
1569 "destination address is specified using the @var{fam_or_sockaddr},\n"
1570 "@var{address} and\n"
1571 "@var{args_and_flags} arguments, or just a socket address object "
1572 "returned by @code{make-socket-address}, in a similar way to the\n"
1573 "@code{connect} procedure. @var{args_and_flags} contains\n"
1574 "the usual connection arguments optionally followed by\n"
1575 "a flags argument, which is a value or\n"
1576 "bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.\n\n"
1577 "The value returned is the number of bytes transmitted --\n"
1578 "it's possible for\n"
1579 "this to be less than the length of @var{message} if the\n"
1580 "socket is\n"
1581 "set to be non-blocking.\n"
1582 "Note that the data is written directly to the socket\n"
1583 "file descriptor:\n"
1584 "any unflushed buffered port data is ignored.\n"
1585 "This operation is defined only for strings containing codepoints\n"
1586 "zero to 255.")
1587 #define FUNC_NAME s_scm_sendto
1588 {
1589 int rv, fd, flg;
1590 struct sockaddr *soka;
1591 size_t size;
1592
1593 sock = SCM_COERCE_OUTPORT (sock);
1594 SCM_VALIDATE_FPORT (1, sock);
1595 fd = SCM_FPORT_FDES (sock);
1596
1597 if (!scm_is_number (fam_or_sockaddr))
1598 {
1599 /* FAM_OR_SOCKADDR must actually be a `socket address' object. This
1600 means that the following arguments, i.e. ADDRESS and those listed in
1601 ARGS_AND_FLAGS, are the `MSG_' flags. */
1602 soka = scm_to_sockaddr (fam_or_sockaddr, &size);
1603 if (!scm_is_eq (address, SCM_UNDEFINED))
1604 args_and_flags = scm_cons (address, args_and_flags);
1605 }
1606 else
1607 soka = scm_fill_sockaddr (scm_to_int (fam_or_sockaddr), address,
1608 &args_and_flags, 3, FUNC_NAME, &size);
1609
1610 if (scm_is_null (args_and_flags))
1611 flg = 0;
1612 else
1613 {
1614 SCM_VALIDATE_CONS (5, args_and_flags);
1615 flg = SCM_NUM2ULONG (5, SCM_CAR (args_and_flags));
1616 }
1617
1618 SCM_VALIDATE_BYTEVECTOR (1, message);
1619
1620 SCM_SYSCALL (rv = sendto (fd,
1621 SCM_BYTEVECTOR_CONTENTS (message),
1622 SCM_BYTEVECTOR_LENGTH (message),
1623 flg, soka, size));
1624
1625 if (rv == -1)
1626 {
1627 int save_errno = errno;
1628 free (soka);
1629 errno = save_errno;
1630 SCM_SYSERROR;
1631 }
1632 free (soka);
1633
1634 scm_remember_upto_here_1 (message);
1635 return scm_from_int (rv);
1636 }
1637 #undef FUNC_NAME
1638 \f
1639
1640
1641 void
1642 scm_init_socket ()
1643 {
1644 /* protocol families. */
1645 #ifdef AF_UNSPEC
1646 scm_c_define ("AF_UNSPEC", scm_from_int (AF_UNSPEC));
1647 #endif
1648 #ifdef AF_UNIX
1649 scm_c_define ("AF_UNIX", scm_from_int (AF_UNIX));
1650 #endif
1651 #ifdef AF_INET
1652 scm_c_define ("AF_INET", scm_from_int (AF_INET));
1653 #endif
1654 #ifdef AF_INET6
1655 scm_c_define ("AF_INET6", scm_from_int (AF_INET6));
1656 #endif
1657
1658 #ifdef PF_UNSPEC
1659 scm_c_define ("PF_UNSPEC", scm_from_int (PF_UNSPEC));
1660 #endif
1661 #ifdef PF_UNIX
1662 scm_c_define ("PF_UNIX", scm_from_int (PF_UNIX));
1663 #endif
1664 #ifdef PF_INET
1665 scm_c_define ("PF_INET", scm_from_int (PF_INET));
1666 #endif
1667 #ifdef PF_INET6
1668 scm_c_define ("PF_INET6", scm_from_int (PF_INET6));
1669 #endif
1670
1671 /* standard addresses. */
1672 #ifdef INADDR_ANY
1673 scm_c_define ("INADDR_ANY", scm_from_ulong (INADDR_ANY));
1674 #endif
1675 #ifdef INADDR_BROADCAST
1676 scm_c_define ("INADDR_BROADCAST", scm_from_ulong (INADDR_BROADCAST));
1677 #endif
1678 #ifdef INADDR_NONE
1679 scm_c_define ("INADDR_NONE", scm_from_ulong (INADDR_NONE));
1680 #endif
1681 #ifdef INADDR_LOOPBACK
1682 scm_c_define ("INADDR_LOOPBACK", scm_from_ulong (INADDR_LOOPBACK));
1683 #endif
1684
1685 /* socket types.
1686
1687 SOCK_PACKET is deliberately omitted, the GNU/Linux socket(2) and
1688 packet(7) advise that it's obsolete and strongly deprecated. */
1689
1690 #ifdef SOCK_STREAM
1691 scm_c_define ("SOCK_STREAM", scm_from_int (SOCK_STREAM));
1692 #endif
1693 #ifdef SOCK_DGRAM
1694 scm_c_define ("SOCK_DGRAM", scm_from_int (SOCK_DGRAM));
1695 #endif
1696 #ifdef SOCK_SEQPACKET
1697 scm_c_define ("SOCK_SEQPACKET", scm_from_int (SOCK_SEQPACKET));
1698 #endif
1699 #ifdef SOCK_RAW
1700 scm_c_define ("SOCK_RAW", scm_from_int (SOCK_RAW));
1701 #endif
1702 #ifdef SOCK_RDM
1703 scm_c_define ("SOCK_RDM", scm_from_int (SOCK_RDM));
1704 #endif
1705
1706 /* setsockopt level.
1707
1708 SOL_IP, SOL_TCP and SOL_UDP are defined on gnu/linux, but not on for
1709 instance NetBSD. We define IPPROTOs because that's what the posix spec
1710 shows in its example at
1711
1712 http://www.opengroup.org/onlinepubs/007904975/functions/getsockopt.html
1713 */
1714 #ifdef SOL_SOCKET
1715 scm_c_define ("SOL_SOCKET", scm_from_int (SOL_SOCKET));
1716 #endif
1717 #ifdef IPPROTO_IP
1718 scm_c_define ("IPPROTO_IP", scm_from_int (IPPROTO_IP));
1719 #endif
1720 #ifdef IPPROTO_TCP
1721 scm_c_define ("IPPROTO_TCP", scm_from_int (IPPROTO_TCP));
1722 #endif
1723 #ifdef IPPROTO_UDP
1724 scm_c_define ("IPPROTO_UDP", scm_from_int (IPPROTO_UDP));
1725 #endif
1726
1727 /* setsockopt names. */
1728 #ifdef SO_DEBUG
1729 scm_c_define ("SO_DEBUG", scm_from_int (SO_DEBUG));
1730 #endif
1731 #ifdef SO_REUSEADDR
1732 scm_c_define ("SO_REUSEADDR", scm_from_int (SO_REUSEADDR));
1733 #endif
1734 #ifdef SO_STYLE
1735 scm_c_define ("SO_STYLE", scm_from_int (SO_STYLE));
1736 #endif
1737 #ifdef SO_TYPE
1738 scm_c_define ("SO_TYPE", scm_from_int (SO_TYPE));
1739 #endif
1740 #ifdef SO_ERROR
1741 scm_c_define ("SO_ERROR", scm_from_int (SO_ERROR));
1742 #endif
1743 #ifdef SO_DONTROUTE
1744 scm_c_define ("SO_DONTROUTE", scm_from_int (SO_DONTROUTE));
1745 #endif
1746 #ifdef SO_BROADCAST
1747 scm_c_define ("SO_BROADCAST", scm_from_int (SO_BROADCAST));
1748 #endif
1749 #ifdef SO_SNDBUF
1750 scm_c_define ("SO_SNDBUF", scm_from_int (SO_SNDBUF));
1751 #endif
1752 #ifdef SO_RCVBUF
1753 scm_c_define ("SO_RCVBUF", scm_from_int (SO_RCVBUF));
1754 #endif
1755 #ifdef SO_KEEPALIVE
1756 scm_c_define ("SO_KEEPALIVE", scm_from_int (SO_KEEPALIVE));
1757 #endif
1758 #ifdef SO_OOBINLINE
1759 scm_c_define ("SO_OOBINLINE", scm_from_int (SO_OOBINLINE));
1760 #endif
1761 #ifdef SO_NO_CHECK
1762 scm_c_define ("SO_NO_CHECK", scm_from_int (SO_NO_CHECK));
1763 #endif
1764 #ifdef SO_PRIORITY
1765 scm_c_define ("SO_PRIORITY", scm_from_int (SO_PRIORITY));
1766 #endif
1767 #ifdef SO_LINGER
1768 scm_c_define ("SO_LINGER", scm_from_int (SO_LINGER));
1769 #endif
1770 #ifdef SO_REUSEPORT /* new in Linux 3.9 */
1771 scm_c_define ("SO_REUSEPORT", scm_from_int (SO_REUSEPORT));
1772 #endif
1773
1774 /* recv/send options. */
1775 #ifdef MSG_DONTWAIT
1776 scm_c_define ("MSG_DONTWAIT", scm_from_int (MSG_DONTWAIT));
1777 #endif
1778 #ifdef MSG_OOB
1779 scm_c_define ("MSG_OOB", scm_from_int (MSG_OOB));
1780 #endif
1781 #ifdef MSG_PEEK
1782 scm_c_define ("MSG_PEEK", scm_from_int (MSG_PEEK));
1783 #endif
1784 #ifdef MSG_DONTROUTE
1785 scm_c_define ("MSG_DONTROUTE", scm_from_int (MSG_DONTROUTE));
1786 #endif
1787
1788 #ifdef IP_ADD_MEMBERSHIP
1789 scm_c_define ("IP_ADD_MEMBERSHIP", scm_from_int (IP_ADD_MEMBERSHIP));
1790 scm_c_define ("IP_DROP_MEMBERSHIP", scm_from_int (IP_DROP_MEMBERSHIP));
1791 #endif
1792
1793 #ifdef IP_MULTICAST_TTL
1794 scm_c_define ("IP_MULTICAST_TTL", scm_from_int ( IP_MULTICAST_TTL));
1795 #endif
1796
1797 #ifdef IP_MULTICAST_IF
1798 scm_c_define ("IP_MULTICAST_IF", scm_from_int ( IP_MULTICAST_IF));
1799 #endif
1800
1801 scm_add_feature ("socket");
1802
1803 #include "libguile/socket.x"
1804 }
1805
1806
1807 /*
1808 Local Variables:
1809 c-file-style: "gnu"
1810 End:
1811 */