diff options
author | Paul A. Patience <paul@apatience.com> | 2021-09-11 22:19:18 -0400 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-09-12 10:13:03 -0700 |
commit | 521ab968ee48e4e40a3e1a5ea00851d39e59b4b3 (patch) | |
tree | 560dd8b023d5d7bb2492b2944c46f59d130aafdf /stdlib | |
parent | 68ad6419262bf60874f034c62d29b83ed4bb2a48 (diff) | |
download | txr-521ab968ee48e4e40a3e1a5ea00851d39e59b4b3.tar.gz txr-521ab968ee48e4e40a3e1a5ea00851d39e59b4b3.tar.bz2 txr-521ab968ee48e4e40a3e1a5ea00851d39e59b4b3.zip |
ffi, sockets: add sock-opt and sock-set-opt.
The new sock-opt and sock-set-opt functions are wrappers around
getsockopt and setsockopt, respectively.
All POSIX socket options are registered. Platform-specific
options may be added in the future.
* ffi.c (sock_opt, sock_set_opt): New functions.
(ffi_init): Register sock-opt, sock-set-opt, sol-socket,
ipproto-ip, ipproto-ipv6, ipproto-tcp, ipproto-udp,
so-acceptconn, so-broadcast, so-debug, so-dontroute, so-error,
so-keepalive, so-linger, so-oobinline, so-rcvbuf, so-rcvlowat,
so-rcvtimeo, so-reuseaddr, so-sndbuf, so-sndlowat, so-sndtimeo,
so-type, ipv6-join-group, ipv6-leave-group, ipv6-multicast-hops,
ipv6-multicast-if, ipv6-multicast-loop, ipv6-unicast-hops,
ipv6-v6only, tcp-nodelay.
* lisplib.c (sock_set_entries): Add sock-opt and sock-set-opt.
* stdlib/socket.tl (sock-opt): Define as syntactic place.
* tests/014/socket-misc.tl: New cases, for sock-opt.
(set-and-get): New macro.
* txr.1: Documented. Also, mention that sock-bind enables
so-reuseaddr.
* stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/doc-syms.tl | 31 | ||||
-rw-r--r-- | stdlib/socket.tl | 7 |
2 files changed, 38 insertions, 0 deletions
diff --git a/stdlib/doc-syms.tl b/stdlib/doc-syms.tl index 8875254b..3de245da 100644 --- a/stdlib/doc-syms.tl +++ b/stdlib/doc-syms.tl @@ -1024,6 +1024,17 @@ ("invoke-catch" "N-0337FC1B") ("ip" "N-011CFC0C") ("ipf" "N-012A7E6A") + ("ipproto-ip" "N-031C01CB") + ("ipproto-ipv6" "N-031C01CB") + ("ipproto-tcp" "N-031C01CB") + ("ipproto-udp" "N-031C01CB") + ("ipv6-join-group" "N-001E8B40") + ("ipv6-leave-group" "N-001E8B40") + ("ipv6-multicast-hops" "N-001E8B40") + ("ipv6-multicast-if" "N-001E8B40") + ("ipv6-multicast-loop" "N-001E8B40") + ("ipv6-unicast-hops" "N-001E8B40") + ("ipv6-v6only" "N-001E8B40") ("iread" "N-03FE5500") ("isatty" "N-03709E8A") ("isec" "N-0385B074") @@ -1752,15 +1763,33 @@ ("slots" "N-00E90177") ("slotset" "N-02657437") ("sme" "N-008C6621") + ("so-acceptconn" "N-02FFF4E8") + ("so-broadcast" "N-02FFF4E8") + ("so-debug" "N-02FFF4E8") + ("so-dontroute" "N-02FFF4E8") + ("so-error" "N-02FFF4E8") + ("so-keepalive" "N-02FFF4E8") + ("so-linger" "N-02FFF4E8") + ("so-oobinline" "N-02FFF4E8") + ("so-rcvbuf" "N-02FFF4E8") + ("so-rcvlowat" "N-02FFF4E8") + ("so-rcvtimeo" "N-02FFF4E8") + ("so-reuseaddr" "N-02FFF4E8") + ("so-sndbuf" "N-02FFF4E8") + ("so-sndlowat" "N-02FFF4E8") + ("so-sndtimeo" "N-02FFF4E8") + ("so-type" "N-02FFF4E8") ("sock-accept" "N-00AF0FE8") ("sock-bind" "N-02B052CF") ("sock-connect" "N-00E5DFD4") ("sock-dgram" "N-01D17D22") ("sock-family" "N-0323EB36") ("sock-listen" "N-02F624A8") + ("sock-opt" "N-022F35E2") ("sock-peer" "N-015ABEC7") ("sock-recv-timeout" "N-03DF15F2") ("sock-send-timeout" "N-03DF15F2") + ("sock-set-opt" "N-02A4F848") ("sock-set-peer" "N-01FE18ED") ("sock-shutdown" "N-0222BA70") ("sock-stream" "N-01D17D22") @@ -1770,6 +1799,7 @@ ("sockaddr-in6" "N-013DD169") ("sockaddr-un" "N-01DD05D2") ("socklen-t" "N-01153D9E") + ("sol-socket" "N-031C01CB") ("some" "D-0040") ("sort" "N-01FE5176") ("sort-group" "N-01E65DDC") @@ -1891,6 +1921,7 @@ ("tcoflush" "N-0279ED46") ("tcooff" "N-02173FF9") ("tcoon" "N-02173FF9") + ("tcp-nodelay" "N-02C5CE3B") ("tcsadrain" "N-02C6ECF5") ("tcsaflush" "N-02C6ECF5") ("tcsanow" "N-02C6ECF5") diff --git a/stdlib/socket.tl b/stdlib/socket.tl index 0b39151e..eac123be 100644 --- a/stdlib/socket.tl +++ b/stdlib/socket.tl @@ -272,3 +272,10 @@ ^(macrolet ((,getter () ^(sock-peer ,',sock)) (,setter (val) ^(sock-set-peer ,',sock ,val))) ,body))) + +(defplace (sock-opt sock level option : type) body + (getter setter + ^(macrolet ((,getter () ^(sock-opt ,',sock ,',level ,',option ,',type)) + (,setter (val) + ^(sock-set-opt ,',sock ,',level ,',option ,val ,',type))) + ,body))) |