1 /* Copyright (C) 1996,1997 Free Software Foundation, Inc.
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
16 * Boston, MA 02111-1307 USA
18 * As a special exception, the Free Software Foundation gives permission
19 * for additional uses of the text contained in its release of GUILE.
21 * The exception is that, if you link the GUILE library with other files
22 * to produce an executable, this does not by itself cause the
23 * resulting executable to be covered by the GNU General Public License.
24 * Your use of that executable is in no way restricted on account of
25 * linking the GUILE library code into it.
27 * This exception does not however invalidate any other reasons why
28 * the executable file might be covered by the GNU General Public License.
30 * This exception applies only to the code released by the
31 * Free Software Foundation under the name GUILE. If you copy
32 * code from other Free Software Foundation releases into a copy of
33 * GUILE, as the General Public License permits, the exception does
34 * not apply to the code that you add in this way. To avoid misleading
35 * anyone as to the status of such modified files, you must delete
36 * this exception notice from them.
38 * If you write modifications of your own for GUILE, it is your choice
39 * whether to permit this exception to apply to your modifications.
40 * If you do not wish that, delete this exception notice. */
58 #include <sys/types.h>
59 #include <sys/socket.h>
60 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
63 #include <netinet/in.h>
65 #include <arpa/inet.h>
69 static SCM scm_sock_fd_to_port
SCM_P ((int fd
, char *proc
));
72 scm_sock_fd_to_port (fd
, proc
)
81 f
= fdopen (fd
, "r+");
84 SCM_SYSCALL (close (fd
));
89 struct scm_port_table
*pt
= scm_add_to_port_table (result
);
91 SCM_SETPTAB_ENTRY (result
, pt
);
93 SCM_SETCAR (result
, scm_tc16_fport
| scm_mode_bits ("r+0"));
94 SCM_SETSTREAM (result
, (SCM
)f
);
99 SCM_PROC (s_socket
, "socket", 3, 0, 0, scm_socket
);
102 scm_socket (family
, style
, proto
)
110 SCM_ASSERT (SCM_INUMP (family
), family
, SCM_ARG1
, s_socket
);
111 SCM_ASSERT (SCM_INUMP (style
), style
, SCM_ARG2
, s_socket
);
112 SCM_ASSERT (SCM_INUMP (proto
), proto
, SCM_ARG3
, s_socket
);
114 fd
= socket (SCM_INUM (family
), SCM_INUM (style
), SCM_INUM (proto
));
115 result
= scm_sock_fd_to_port (fd
, s_socket
);
122 #ifdef HAVE_SOCKETPAIR
123 SCM_PROC (s_socketpair
, "socketpair", 3, 0, 0, scm_socketpair
);
126 scm_socketpair (family
, style
, proto
)
136 SCM_ASSERT (SCM_INUMP (family
), family
, SCM_ARG1
, s_socketpair
);
137 SCM_ASSERT (SCM_INUMP (style
), style
, SCM_ARG2
, s_socketpair
);
138 SCM_ASSERT (SCM_INUMP (proto
), proto
, SCM_ARG3
, s_socketpair
);
140 fam
= SCM_INUM (family
);
143 if (socketpair (fam
, SCM_INUM (style
), SCM_INUM (proto
), fd
) == -1)
144 scm_syserror (s_socketpair
);
146 a
= scm_sock_fd_to_port (fd
[0], s_socketpair
);
147 b
= scm_sock_fd_to_port (fd
[1], s_socketpair
);
149 return scm_cons (a
, b
);
153 SCM_PROC (s_getsockopt
, "getsockopt", 3, 0, 0, scm_getsockopt
);
156 scm_getsockopt (sock
, level
, optname
)
163 #ifdef HAVE_STRUCT_LINGER
164 char optval
[sizeof (struct linger
)];
166 char optval
[sizeof (scm_sizet
)];
171 #ifdef HAVE_STRUCT_LINGER
172 optlen
= (int) sizeof (struct linger
);
174 optlen
= (int) sizeof (scm_sizet
);
177 sock
= SCM_COERCE_OUTPORT (sock
);
178 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
,
180 SCM_ASSERT (SCM_INUMP (level
), level
, SCM_ARG2
, s_getsockopt
);
181 SCM_ASSERT (SCM_INUMP (optname
), optname
, SCM_ARG3
, s_getsockopt
);
183 fd
= fileno ((FILE *)SCM_STREAM (sock
));
184 ilevel
= SCM_INUM (level
);
185 ioptname
= SCM_INUM (optname
);
186 if (getsockopt (fd
, ilevel
, ioptname
, (void *) optval
, &optlen
) == -1)
187 scm_syserror (s_getsockopt
);
190 if (ilevel
== SOL_SOCKET
&& ioptname
== SO_LINGER
)
192 #ifdef HAVE_STRUCT_LINGER
193 struct linger
*ling
= (struct linger
*) optval
;
194 return scm_cons (SCM_MAKINUM (ling
->l_onoff
),
195 SCM_MAKINUM (ling
->l_linger
));
197 scm_sizet
*ling
= (scm_sizet
*) optval
;
198 return scm_cons (SCM_MAKINUM (*ling
),
204 if (ilevel
== SOL_SOCKET
&& ioptname
== SO_SNDBUF
)
206 scm_sizet
*bufsize
= (scm_sizet
*) optval
;
207 return SCM_MAKINUM (*bufsize
);
211 if (ilevel
== SOL_SOCKET
&& ioptname
== SO_RCVBUF
)
213 scm_sizet
*bufsize
= (scm_sizet
*) optval
;
214 return SCM_MAKINUM (*bufsize
);
217 return SCM_MAKINUM (*(int *) optval
);
220 SCM_PROC (s_setsockopt
, "setsockopt", 4, 0, 0, scm_setsockopt
);
223 scm_setsockopt (sock
, level
, optname
, value
)
231 #ifdef HAVE_STRUCT_LINGER
232 char optval
[sizeof (struct linger
)]; /* Biggest option :-( */
234 char optval
[sizeof (scm_sizet
)];
236 int ilevel
, ioptname
;
237 sock
= SCM_COERCE_OUTPORT (sock
);
238 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
,
240 SCM_ASSERT (SCM_INUMP (level
), level
, SCM_ARG2
, s_setsockopt
);
241 SCM_ASSERT (SCM_INUMP (optname
), optname
, SCM_ARG3
, s_setsockopt
);
242 fd
= fileno ((FILE *)SCM_STREAM (sock
));
243 ilevel
= SCM_INUM (level
);
244 ioptname
= SCM_INUM (optname
);
247 else if (ilevel
== SOL_SOCKET
&& ioptname
== SO_LINGER
)
249 #ifdef HAVE_STRUCT_LINGER
251 SCM_ASSERT (SCM_NIMP (value
) && SCM_CONSP (value
)
252 && SCM_INUMP (SCM_CAR (value
))
253 && SCM_INUMP (SCM_CDR (value
)),
254 value
, SCM_ARG4
, s_setsockopt
);
255 ling
.l_onoff
= SCM_INUM (SCM_CAR (value
));
256 ling
.l_linger
= SCM_INUM (SCM_CDR (value
));
257 optlen
= (int) sizeof (struct linger
);
258 memcpy (optval
, (void *) &ling
, optlen
);
261 SCM_ASSERT (SCM_NIMP (value
) && SCM_CONSP (value
)
262 && SCM_INUMP (SCM_CAR (value
))
263 && SCM_INUMP (SCM_CDR (value
)),
264 value
, SCM_ARG4
, s_setsockopt
);
265 ling
= SCM_INUM (SCM_CAR (value
));
266 optlen
= (int) sizeof (scm_sizet
);
267 (*(scm_sizet
*) optval
) = (scm_sizet
) SCM_INUM (value
);
272 else if (ilevel
== SOL_SOCKET
&& ioptname
== SO_SNDBUF
)
274 SCM_ASSERT (SCM_INUMP (value
), value
, SCM_ARG4
, s_setsockopt
);
275 optlen
= (int) sizeof (scm_sizet
);
276 (*(scm_sizet
*) optval
) = (scm_sizet
) SCM_INUM (value
);
280 else if (ilevel
== SOL_SOCKET
&& ioptname
== SO_RCVBUF
)
282 SCM_ASSERT (SCM_INUMP (value
), value
, SCM_ARG4
, s_setsockopt
);
283 optlen
= (int) sizeof (scm_sizet
);
284 (*(scm_sizet
*) optval
) = (scm_sizet
) SCM_INUM (value
);
289 /* Most options just take an int. */
290 SCM_ASSERT (SCM_INUMP (value
), value
, SCM_ARG4
, s_setsockopt
);
291 optlen
= (int) sizeof (int);
292 (*(int *) optval
) = (int) SCM_INUM (value
);
294 if (setsockopt (fd
, ilevel
, ioptname
, (void *) optval
, optlen
) == -1)
295 scm_syserror (s_setsockopt
);
296 return SCM_UNSPECIFIED
;
299 SCM_PROC (s_shutdown
, "shutdown", 2, 0, 0, scm_shutdown
);
302 scm_shutdown (sock
, how
)
307 sock
= SCM_COERCE_OUTPORT (sock
);
308 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
,
310 SCM_ASSERT (SCM_INUMP (how
) && 0 <= SCM_INUM (how
) && 2 >= SCM_INUM (how
),
311 how
, SCM_ARG2
, s_shutdown
);
312 fd
= fileno ((FILE *)SCM_STREAM (sock
));
313 if (shutdown (fd
, SCM_INUM (how
)) == -1)
314 scm_syserror (s_shutdown
);
315 return SCM_UNSPECIFIED
;
318 /* convert fam/address/args into a sockaddr of the appropriate type.
319 args is modified by removing the arguments actually used.
320 which_arg and proc are used when reporting errors:
321 which_arg is the position of address in the original argument list.
322 proc is the name of the original procedure.
323 size returns the size of the structure allocated. */
326 static struct sockaddr
* scm_fill_sockaddr
SCM_P ((int fam
, SCM address
, SCM
*args
, int which_arg
, char *proc
, scm_sizet
*size
));
328 static struct sockaddr
*
329 scm_fill_sockaddr (fam
, address
, args
, which_arg
, proc
, size
)
342 struct sockaddr_in
*soka
;
344 soka
= (struct sockaddr_in
*)
345 scm_must_malloc (sizeof (struct sockaddr_in
), proc
);
346 soka
->sin_family
= AF_INET
;
347 soka
->sin_addr
.s_addr
=
348 htonl (scm_num2ulong (address
, (char *) which_arg
, proc
));
349 SCM_ASSERT (SCM_NIMP (*args
) && SCM_CONSP (*args
), *args
,
350 which_arg
+ 1, proc
);
351 isport
= SCM_CAR (*args
);
352 *args
= SCM_CDR (*args
);
353 SCM_ASSERT (SCM_INUMP (isport
), isport
, which_arg
+ 1, proc
);
354 soka
->sin_port
= htons (SCM_INUM (isport
));
355 *size
= sizeof (struct sockaddr_in
);
356 return (struct sockaddr
*) soka
;
358 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
361 struct sockaddr_un
*soka
;
363 soka
= (struct sockaddr_un
*)
364 scm_must_malloc (sizeof (struct sockaddr_un
), proc
);
365 soka
->sun_family
= AF_UNIX
;
366 SCM_ASSERT (SCM_NIMP (address
) && SCM_ROSTRINGP (address
), address
,
368 memcpy (soka
->sun_path
, SCM_ROCHARS (address
),
369 1 + SCM_ROLENGTH (address
));
370 *size
= sizeof (struct sockaddr_un
);
371 return (struct sockaddr
*) soka
;
375 scm_out_of_range (proc
, SCM_MAKINUM (fam
));
379 SCM_PROC (s_connect
, "connect", 3, 0, 1, scm_connect
);
382 scm_connect (sock
, fam
, address
, args
)
390 struct sockaddr
*soka
;
393 sock
= SCM_COERCE_OUTPORT (sock
);
394 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_connect
);
395 SCM_ASSERT (SCM_INUMP (fam
), fam
, SCM_ARG2
, s_connect
);
396 fd
= fileno ((FILE *)SCM_STREAM (sock
));
398 soka
= scm_fill_sockaddr (SCM_INUM (fam
), address
, &args
, 3, s_connect
, &size
);
399 if (connect (fd
, soka
, size
) == -1)
400 scm_syserror (s_connect
);
401 scm_must_free ((char *) soka
);
403 return SCM_UNSPECIFIED
;
406 SCM_PROC (s_bind
, "bind", 3, 0, 1, scm_bind
);
409 scm_bind (sock
, fam
, address
, args
)
416 struct sockaddr
*soka
;
420 sock
= SCM_COERCE_OUTPORT (sock
);
421 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_bind
);
422 SCM_ASSERT (SCM_INUMP (fam
), fam
, SCM_ARG2
, s_bind
);
423 soka
= scm_fill_sockaddr (SCM_INUM (fam
), address
, &args
, 3, s_bind
, &size
);
424 fd
= fileno ((FILE *)SCM_STREAM (sock
));
425 rv
= bind (fd
, soka
, size
);
427 scm_syserror (s_bind
);
428 scm_must_free ((char *) soka
);
429 return SCM_UNSPECIFIED
;
432 SCM_PROC (s_listen
, "listen", 2, 0, 0, scm_listen
);
435 scm_listen (sock
, backlog
)
440 sock
= SCM_COERCE_OUTPORT (sock
);
441 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_listen
);
442 SCM_ASSERT (SCM_INUMP (backlog
), backlog
, SCM_ARG2
, s_listen
);
443 fd
= fileno ((FILE *)SCM_STREAM (sock
));
444 if (listen (fd
, SCM_INUM (backlog
)) == -1)
445 scm_syserror (s_listen
);
446 return SCM_UNSPECIFIED
;
449 /* Put the components of a sockaddr into a new SCM vector. */
451 static SCM scm_addr_vector
SCM_P ((struct sockaddr
*address
, char *proc
));
454 scm_addr_vector (address
, proc
)
455 struct sockaddr
*address
;
458 short int fam
= address
->sa_family
;
461 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
464 struct sockaddr_un
*nad
= (struct sockaddr_un
*) address
;
465 result
= scm_make_vector (SCM_MAKINUM (2), SCM_UNSPECIFIED
, SCM_BOOL_F
);
466 ve
= SCM_VELTS (result
);
467 ve
[0] = scm_ulong2num ((unsigned long) fam
);
468 ve
[1] = scm_makfromstr (nad
->sun_path
,
469 (scm_sizet
) strlen (nad
->sun_path
), 0);
475 struct sockaddr_in
*nad
= (struct sockaddr_in
*) address
;
476 result
= scm_make_vector (SCM_MAKINUM (3), SCM_UNSPECIFIED
, SCM_BOOL_F
);
477 ve
= SCM_VELTS (result
);
478 ve
[0] = scm_ulong2num ((unsigned long) fam
);
479 ve
[1] = scm_ulong2num (ntohl (nad
->sin_addr
.s_addr
));
480 ve
[2] = scm_ulong2num ((unsigned long) ntohs (nad
->sin_port
));
483 scm_misc_error (proc
, "Unrecognised address family: %s",
484 scm_listify (SCM_MAKINUM (fam
), SCM_UNDEFINED
));
489 /* Allocate a buffer large enough to hold any sockaddr type. */
490 static char *scm_addr_buffer
;
491 static int scm_addr_buffer_size
;
493 static void scm_init_addr_buffer
SCM_P ((void));
496 scm_init_addr_buffer ()
498 scm_addr_buffer_size
=
499 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
500 (int) sizeof (struct sockaddr_un
)
505 if (sizeof (struct sockaddr_in
) > scm_addr_buffer_size
)
506 scm_addr_buffer_size
= (int) sizeof (struct sockaddr_in
);
507 scm_addr_buffer
= scm_must_malloc (scm_addr_buffer_size
, "address buffer");
510 SCM_PROC (s_accept
, "accept", 1, 0, 0, scm_accept
);
522 sock
= SCM_COERCE_OUTPORT (sock
);
523 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_accept
);
524 fd
= fileno ((FILE *)SCM_STREAM (sock
));
526 tmp_size
= scm_addr_buffer_size
;
527 newfd
= accept (fd
, (struct sockaddr
*) scm_addr_buffer
, &tmp_size
);
528 newsock
= scm_sock_fd_to_port (newfd
, s_accept
);
530 address
= scm_addr_vector ((struct sockaddr
*) scm_addr_buffer
, s_accept
);
532 address
= SCM_BOOL_F
;
535 return scm_cons (newsock
, address
);
538 SCM_PROC (s_getsockname
, "getsockname", 1, 0, 0, scm_getsockname
);
541 scm_getsockname (sock
)
547 sock
= SCM_COERCE_OUTPORT (sock
);
548 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_getsockname
);
549 fd
= fileno ((FILE *)SCM_STREAM (sock
));
551 tmp_size
= scm_addr_buffer_size
;
552 if (getsockname (fd
, (struct sockaddr
*) scm_addr_buffer
, &tmp_size
) == -1)
553 scm_syserror (s_getsockname
);
555 result
= scm_addr_vector ((struct sockaddr
*) scm_addr_buffer
, s_getsockname
);
562 SCM_PROC (s_getpeername
, "getpeername", 1, 0, 0, scm_getpeername
);
565 scm_getpeername (sock
)
571 sock
= SCM_COERCE_OUTPORT (sock
);
572 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_getpeername
);
573 fd
= fileno ((FILE *)SCM_STREAM (sock
));
575 tmp_size
= scm_addr_buffer_size
;
576 if (getpeername (fd
, (struct sockaddr
*) scm_addr_buffer
, &tmp_size
) == -1)
577 scm_syserror (s_getpeername
);
579 result
= scm_addr_vector ((struct sockaddr
*) scm_addr_buffer
, s_getpeername
);
586 SCM_PROC (s_recv
, "recv!", 2, 1, 0, scm_recv
);
589 scm_recv (sock
, buf
, flags
)
598 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_recv
);
599 SCM_ASSERT (SCM_NIMP (buf
) && SCM_STRINGP (buf
), buf
, SCM_ARG2
, s_recv
);
600 fd
= fileno ((FILE *)SCM_STREAM (sock
));
602 if (SCM_UNBNDP (flags
))
605 flg
= scm_num2ulong (flags
, (char *) SCM_ARG3
, s_recv
);
607 SCM_SYSCALL (rv
= recv (fd
, SCM_CHARS (buf
), SCM_LENGTH (buf
), flg
));
609 scm_syserror (s_recv
);
611 return SCM_MAKINUM (rv
);
614 SCM_PROC (s_send
, "send", 2, 1, 0, scm_send
);
617 scm_send (sock
, message
, flags
)
626 sock
= SCM_COERCE_OUTPORT (sock
);
627 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_send
);
628 SCM_ASSERT (SCM_NIMP (message
) && SCM_ROSTRINGP (message
), message
, SCM_ARG2
, s_send
);
629 fd
= fileno ((FILE *)SCM_STREAM (sock
));
631 if (SCM_UNBNDP (flags
))
634 flg
= scm_num2ulong (flags
, (char *) SCM_ARG3
, s_send
);
636 SCM_SYSCALL (rv
= send (fd
, SCM_ROCHARS (message
), SCM_ROLENGTH (message
), flg
));
638 scm_syserror (s_send
);
639 return SCM_MAKINUM (rv
);
642 SCM_PROC (s_recvfrom
, "recvfrom!", 2, 3, 0, scm_recvfrom
);
645 scm_recvfrom (sock
, buf
, flags
, start
, end
)
660 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
,
662 SCM_ASSERT (SCM_NIMP (buf
) && SCM_STRINGP (buf
), buf
, SCM_ARG2
, s_recvfrom
);
663 cend
= SCM_LENGTH (buf
);
665 if (SCM_UNBNDP (flags
))
669 flg
= scm_num2ulong (flags
, (char *) SCM_ARG3
, s_recvfrom
);
671 if (!SCM_UNBNDP (start
))
673 offset
= (int) scm_num2long (start
,
674 (char *) SCM_ARG4
, s_recvfrom
);
676 if (offset
< 0 || offset
>= cend
)
677 scm_out_of_range (s_recvfrom
, start
);
679 if (!SCM_UNBNDP (end
))
681 int tend
= (int) scm_num2long (end
,
682 (char *) SCM_ARG5
, s_recvfrom
);
684 if (tend
<= offset
|| tend
> cend
)
685 scm_out_of_range (s_recvfrom
, end
);
692 fd
= fileno ((FILE *)SCM_STREAM (sock
));
694 tmp_size
= scm_addr_buffer_size
;
695 SCM_SYSCALL (rv
= recvfrom (fd
, SCM_CHARS (buf
) + offset
,
697 (struct sockaddr
*) scm_addr_buffer
,
700 scm_syserror (s_recvfrom
);
702 address
= scm_addr_vector ((struct sockaddr
*) scm_addr_buffer
, s_recvfrom
);
704 address
= SCM_BOOL_F
;
706 return scm_cons (SCM_MAKINUM (rv
), address
);
709 SCM_PROC (s_sendto
, "sendto", 4, 0, 1, scm_sendto
);
712 scm_sendto (sock
, message
, fam
, address
, args_and_flags
)
722 struct sockaddr
*soka
;
725 sock
= SCM_COERCE_OUTPORT (sock
);
726 SCM_ASSERT (SCM_NIMP (sock
) && SCM_FPORTP (sock
), sock
, SCM_ARG1
, s_sendto
);
727 SCM_ASSERT (SCM_NIMP (message
) && SCM_ROSTRINGP (message
), message
,
729 SCM_ASSERT (SCM_INUMP (fam
), fam
, SCM_ARG3
, s_sendto
);
730 fd
= fileno ((FILE *)SCM_STREAM (sock
));
732 soka
= scm_fill_sockaddr (SCM_INUM (fam
), address
, &args_and_flags
, 4,
734 if (SCM_NULLP (args_and_flags
))
738 SCM_ASSERT (SCM_NIMP (args_and_flags
) && SCM_CONSP (args_and_flags
),
739 args_and_flags
, SCM_ARG5
, s_sendto
);
740 flg
= scm_num2ulong (SCM_CAR (args_and_flags
), (char *) SCM_ARG5
, s_sendto
);
742 SCM_SYSCALL (rv
= sendto (fd
, SCM_ROCHARS (message
), SCM_ROLENGTH (message
),
745 scm_syserror (s_sendto
);
746 scm_must_free ((char *) soka
);
748 return SCM_MAKINUM (rv
);
756 /* protocol families. */
758 scm_sysintern ("AF_UNSPEC", SCM_MAKINUM (AF_UNSPEC
));
761 scm_sysintern ("AF_UNIX", SCM_MAKINUM (AF_UNIX
));
764 scm_sysintern ("AF_INET", SCM_MAKINUM (AF_INET
));
768 scm_sysintern ("PF_UNSPEC", SCM_MAKINUM (PF_UNSPEC
));
771 scm_sysintern ("PF_UNIX", SCM_MAKINUM (PF_UNIX
));
774 scm_sysintern ("PF_INET", SCM_MAKINUM (PF_INET
));
779 scm_sysintern ("SOCK_STREAM", SCM_MAKINUM (SOCK_STREAM
));
782 scm_sysintern ("SOCK_DGRAM", SCM_MAKINUM (SOCK_DGRAM
));
785 scm_sysintern ("SOCK_RAW", SCM_MAKINUM (SOCK_RAW
));
788 /* setsockopt level. */
790 scm_sysintern ("SOL_SOCKET", SCM_MAKINUM (SOL_SOCKET
));
793 scm_sysintern ("SOL_IP", SCM_MAKINUM (SOL_IP
));
796 scm_sysintern ("SOL_TCP", SCM_MAKINUM (SOL_TCP
));
799 scm_sysintern ("SOL_UDP", SCM_MAKINUM (SOL_UDP
));
802 /* setsockopt names. */
804 scm_sysintern ("SO_DEBUG", SCM_MAKINUM (SO_DEBUG
));
807 scm_sysintern ("SO_REUSEADDR", SCM_MAKINUM (SO_REUSEADDR
));
810 scm_sysintern ("SO_STYLE", SCM_MAKINUM (SO_STYLE
));
813 scm_sysintern ("SO_TYPE", SCM_MAKINUM (SO_TYPE
));
816 scm_sysintern ("SO_ERROR", SCM_MAKINUM (SO_ERROR
));
819 scm_sysintern ("SO_DONTROUTE", SCM_MAKINUM (SO_DONTROUTE
));
822 scm_sysintern ("SO_BROADCAST", SCM_MAKINUM (SO_BROADCAST
));
825 scm_sysintern ("SO_SNDBUF", SCM_MAKINUM (SO_SNDBUF
));
828 scm_sysintern ("SO_RCVBUF", SCM_MAKINUM (SO_RCVBUF
));
831 scm_sysintern ("SO_KEEPALIVE", SCM_MAKINUM (SO_KEEPALIVE
));
834 scm_sysintern ("SO_OOBINLINE", SCM_MAKINUM (SO_OOBINLINE
));
837 scm_sysintern ("SO_NO_CHECK", SCM_MAKINUM (SO_NO_CHECK
));
840 scm_sysintern ("SO_PRIORITY", SCM_MAKINUM (SO_PRIORITY
));
843 scm_sysintern ("SO_LINGER", SCM_MAKINUM (SO_LINGER
));
846 /* recv/send options. */
848 scm_sysintern ("MSG_OOB", SCM_MAKINUM (MSG_OOB
));
851 scm_sysintern ("MSG_PEEK", SCM_MAKINUM (MSG_PEEK
));
854 scm_sysintern ("MSG_DONTROUTE", SCM_MAKINUM (MSG_DONTROUTE
));
857 scm_add_feature ("socket");
858 scm_init_addr_buffer ();