mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-18 21:29:19 +02:00
131 lines
4.4 KiB
Text
131 lines
4.4 KiB
Text
|
|
(c-system-include "arpa/inet.h")
|
|
(c-system-include "sys/types.h")
|
|
(c-system-include "sys/socket.h")
|
|
(c-system-include "netinet/in.h")
|
|
(c-system-include "netdb.h")
|
|
|
|
(define-c-int-type socklen_t)
|
|
|
|
(define-c-struct sockaddr
|
|
constructor: (make-sockaddr)
|
|
predicate: sockaddr?)
|
|
|
|
(define-c-struct addrinfo
|
|
constructor: (%make-address-info ai_family ai_socktype ai_protocol ai_flags)
|
|
finalizer: freeaddrinfo
|
|
predicate: address-info?
|
|
(int ai_family address-info-family)
|
|
(int ai_socktype address-info-socket-type)
|
|
(int ai_protocol address-info-protocol)
|
|
(int ai_flags address-info-flags)
|
|
((link sockaddr) ai_addr address-info-address)
|
|
(size_t ai_addrlen address-info-address-length)
|
|
(string ai_canonname address-info-canonname)
|
|
((link addrinfo) ai_next address-info-next))
|
|
|
|
;;> The addrinfo struct accessors.
|
|
;;/
|
|
|
|
(define-c errno (%get-address-info getaddrinfo)
|
|
((maybe-null string) (maybe-null string) (maybe-null addrinfo)
|
|
(result free addrinfo)))
|
|
|
|
;;> Bind a name to a socket.
|
|
|
|
(define-c sexp (bind "sexp_bind")
|
|
((value ctx sexp) (value self sexp) fileno sockaddr int))
|
|
|
|
;;> Listen on a socket.
|
|
|
|
(define-c sexp (listen "sexp_listen")
|
|
((value ctx sexp) (value self sexp) sexp sexp))
|
|
|
|
;;> Accept a connection on a socket.
|
|
|
|
(define-c sexp (accept "sexp_accept")
|
|
((value ctx sexp) (value self sexp) fileno sockaddr int))
|
|
|
|
;;> Create an endpoint for communication.
|
|
|
|
(define-c fileno socket (int int int))
|
|
|
|
;;> Initiate a connection on a socket.
|
|
|
|
(define-c int connect (fileno sockaddr int))
|
|
|
|
(define-c sexp (%send "sexp_sendto")
|
|
((value ctx sexp) (value self sexp)
|
|
fileno bytevector (value (bytevector-length arg3) size_t) int
|
|
(maybe-null sockaddr) socklen_t sexp))
|
|
|
|
(define-c sexp (%receive! "sexp_recvfrom")
|
|
((value ctx sexp) (value self sexp)
|
|
fileno bytevector (value (bytevector-length arg3) size_t) int
|
|
(maybe-null sockaddr) socklen_t sexp))
|
|
|
|
;;> Returns a list of 2 new sockets, the input and output end of a new
|
|
;;> pipe, respectively.
|
|
|
|
(define-c errno (open-socket-pair "socketpair")
|
|
(int int int (result (array fileno 2))))
|
|
|
|
;;> Return the IP address of a sockaddr as an "N.N.N.N" string.
|
|
|
|
(define-c sexp (sockaddr-name "sexp_sockaddr_name")
|
|
((value ctx sexp) (value self sexp) sockaddr))
|
|
|
|
;;> Return the port a sockaddr is connected on.
|
|
|
|
(define-c int (sockaddr-port "sexp_sockaddr_port")
|
|
((value ctx sexp) (value self sexp) sockaddr))
|
|
|
|
(define-c-const int (address-family/unspecified "AF_UNSPEC"))
|
|
(define-c-const int (address-family/unix "AF_UNIX"))
|
|
(define-c-const int (address-family/inet "AF_INET"))
|
|
(define-c-const int (address-family/inet6 "AF_INET6"))
|
|
(define-c-const int (socket-type/stream "SOCK_STREAM"))
|
|
(define-c-const int (socket-type/datagram "SOCK_DGRAM"))
|
|
(define-c-const int (socket-type/raw "SOCK_RAW"))
|
|
(define-c-const int (ip-proto/ip "IPPROTO_IP"))
|
|
(define-c-const int (ip-proto/icmp "IPPROTO_ICMP"))
|
|
(define-c-const int (ip-proto/tcp "IPPROTO_TCP"))
|
|
(define-c-const int (ip-proto/udp "IPPROTO_UDP"))
|
|
(define-c-const int (ai/passive "AI_PASSIVE"))
|
|
(define-c-const int (ai/canonname "AI_CANONNAME"))
|
|
(define-c-const int (ai/numeric-host "AI_NUMERICHOST"))
|
|
|
|
;;> The constants for the addrinfo struct.
|
|
;;/
|
|
|
|
(c-include-verbatim "accept.c")
|
|
|
|
(define-c errno (get-peer-name getpeername)
|
|
(fileno sockaddr (result (value (sizeof sockaddr) socklen_t))))
|
|
|
|
(define-c errno getsockopt
|
|
(fileno int int (result int) (result (value (sizeof int) socklen_t))))
|
|
|
|
;;> Set an option for the given socket. For example, to make the
|
|
;;> address reusable:
|
|
;;> \scheme{(set-socket-option! sock level/socket socket-opt/reuseaddr 1)}
|
|
|
|
(define-c errno (set-socket-option! "setsockopt")
|
|
(fileno int int (pointer int) (value (sizeof int) socklen_t)))
|
|
|
|
(define-c-const int (level/socket "SOL_SOCKET"))
|
|
|
|
(define-c-const int (socket-opt/debug "SO_DEBUG"))
|
|
(define-c-const int (socket-opt/broadcast "SO_BROADCAST"))
|
|
(define-c-const int (socket-opt/reuseaddr "SO_REUSEADDR"))
|
|
(define-c-const int (socket-opt/keepalive "SO_KEEPALIVE"))
|
|
(define-c-const int (socket-opt/oobinline "SO_OOBINLINE"))
|
|
(define-c-const int (socket-opt/sndbuf "SO_SNDBUF"))
|
|
(define-c-const int (socket-opt/rcvbuf "SO_RCVBUF"))
|
|
(define-c-const int (socket-opt/dontroute "SO_DONTROUTE"))
|
|
(define-c-const int (socket-opt/rcvlowat "SO_RCVLOWAT"))
|
|
(define-c-const int (socket-opt/sndlowat "SO_SNDLOWAT"))
|
|
|
|
;;> The constants for the \scheme{get-socket-option} and
|
|
;;> \scheme{set-socket-option!}.
|
|
;;/
|