diff --git a/basis/io/sockets/sockets.factor b/basis/io/sockets/sockets.factor index 6e41f083b7..e783aea0c5 100644 --- a/basis/io/sockets/sockets.factor +++ b/basis/io/sockets/sockets.factor @@ -5,7 +5,8 @@ USING: generic kernel io.backend namespaces continuations sequences arrays io.encodings io.ports io.streams.duplex io.encodings.ascii alien.strings io.binary accessors destructors classes byte-arrays parser alien.c-types math.parser splitting grouping math assocs -summary system vocabs.loader combinators present fry vocabs.parser ; +summary system vocabs.loader combinators present fry vocabs.parser +classes.struct ; IN: io.sockets << { @@ -75,21 +76,20 @@ M: inet4 address-size drop 4 ; M: inet4 protocol-family drop PF_INET ; -M: inet4 sockaddr-size drop "sockaddr-in" heap-size ; +M: inet4 sockaddr-size drop sockaddr-in heap-size ; -M: inet4 empty-sockaddr drop "sockaddr-in" ; +M: inet4 empty-sockaddr drop sockaddr-in ; M: inet4 make-sockaddr ( inet -- sockaddr ) - "sockaddr-in" - AF_INET over set-sockaddr-in-family - over port>> htons over set-sockaddr-in-port - over host>> - "0.0.0.0" or - rot inet-pton *uint over set-sockaddr-in-addr ; + sockaddr-in + AF_INET >>family + swap [ port>> htons >>port ] + [ host>> "0.0.0.0" or ] + [ inet-pton *uint >>addr ] tri ; -M: inet4 parse-sockaddr - [ dup sockaddr-in-addr ] dip inet-ntop - swap sockaddr-in-port ntohs ; +M: inet4 parse-sockaddr ( sockaddr-in addrspec -- newaddrspec ) + [ [ addr>> ] dip inet-ntop ] + [ drop port>> ntohs ] 2bi ; TUPLE: inet6 < abstract-inet ; @@ -131,20 +131,20 @@ M: inet6 address-size drop 16 ; M: inet6 protocol-family drop PF_INET6 ; -M: inet6 sockaddr-size drop "sockaddr-in6" heap-size ; +M: inet6 sockaddr-size drop sockaddr-in6 heap-size ; -M: inet6 empty-sockaddr drop "sockaddr-in6" ; +M: inet6 empty-sockaddr drop sockaddr-in6 ; M: inet6 make-sockaddr ( inet -- sockaddr ) - "sockaddr-in6" - AF_INET6 over set-sockaddr-in6-family - over port>> htons over set-sockaddr-in6-port - over host>> "::" or - rot inet-pton over set-sockaddr-in6-addr ; + sockaddr-in6 + AF_INET6 >>family + swap [ port>> htons >>port ] + [ host>> "::" or ] + [ inet-pton >>addr ] tri ; M: inet6 parse-sockaddr - [ dup sockaddr-in6-addr ] dip inet-ntop - swap sockaddr-in6-port ntohs ; + [ [ addr>> ] dip inet-ntop ] + [ drop port>> ntohs ] 2bi ; : addrspec-of-family ( af -- addrspec ) { @@ -154,6 +154,14 @@ M: inet6 parse-sockaddr [ drop f ] } case ; +: sockaddr-of-family ( af -- addrspec ) + { + { AF_INET [ sockaddr-in ] } + { AF_INET6 [ sockaddr-in6 ] } + { AF_UNIX [ sockaddr-un ] } + [ drop f ] + } case ; + M: f parse-sockaddr nip ; GENERIC: (get-local-address) ( handle remote -- sockaddr ) @@ -262,11 +270,12 @@ HOOK: (send) io-backend ( packet addrspec datagram -- ) check-datagram-send (send) ; : addrinfo>addrspec ( addrinfo -- addrspec ) - [ addrinfo-addr ] [ addrinfo-family addrspec-of-family ] bi + [ [ addr>> ] [ family>> sockaddr-of-family ] bi memory>struct ] + [ family>> addrspec-of-family ] bi parse-sockaddr ; : parse-addrinfo-list ( addrinfo -- seq ) - [ addrinfo-next ] follow + [ next>> dup [ addrinfo memory>struct ] when ] follow [ addrinfo>addrspec ] map sift ; @@ -282,9 +291,9 @@ C: inet { T{ inet6 f "::" f } T{ inet4 f "0.0.0.0" f } } [ clone ] map ; : prepare-addrinfo ( -- addrinfo ) - "addrinfo" - PF_UNSPEC over set-addrinfo-family - IPPROTO_TCP over set-addrinfo-protocol ; + addrinfo + PF_UNSPEC >>family + IPPROTO_TCP >>protocol ; : fill-in-ports ( addrspecs port -- addrspecs ) '[ _ >>port ] map ; @@ -292,7 +301,7 @@ C: inet M: inet resolve-host [ port>> ] [ host>> ] bi [ f prepare-addrinfo f - [ getaddrinfo addrinfo-error ] keep *void* + [ getaddrinfo addrinfo-error ] keep *void* addrinfo memory>struct [ parse-addrinfo-list ] keep freeaddrinfo ] [ resolve-passive-host ] if* swap fill-in-ports ; diff --git a/basis/io/sockets/unix/unix.factor b/basis/io/sockets/unix/unix.factor index 9803ec8e69..1b780e705b 100644 --- a/basis/io/sockets/unix/unix.factor +++ b/basis/io/sockets/unix/unix.factor @@ -4,7 +4,7 @@ USING: alien alien.c-types alien.strings generic kernel math threads sequences byte-arrays io.binary io.backend.unix io.streams.duplex io.backend io.pathnames io.files.private io.encodings.utf8 math.parser continuations libc combinators system accessors destructors unix -locals init ; +locals init classes.struct ; EXCLUDE: namespaces => bind ; EXCLUDE: io => read write ; @@ -139,17 +139,17 @@ M: unix (send) ( packet addrspec datagram -- ) ! Unix domain sockets M: local protocol-family drop PF_UNIX ; -M: local sockaddr-size drop "sockaddr-un" heap-size ; +M: local sockaddr-size drop sockaddr-un heap-size ; -M: local empty-sockaddr drop "sockaddr-un" ; +M: local empty-sockaddr drop sockaddr-un ; M: local make-sockaddr path>> (normalize-path) dup length 1 + max-un-path > [ "Path too long" throw ] when - "sockaddr-un" - AF_UNIX over set-sockaddr-un-family - [ [ utf8 string>alien ] dip set-sockaddr-un-path ] keep ; + sockaddr-un + AF_UNIX >>family + swap utf8 string>alien >>path ; M: local parse-sockaddr drop - sockaddr-un-path utf8 alien>string ; + path>> utf8 alien>string ; diff --git a/basis/unix/bsd/bsd.factor b/basis/unix/bsd/bsd.factor index dd45a42d3e..ebc0b80097 100644 --- a/basis/unix/bsd/bsd.factor +++ b/basis/unix/bsd/bsd.factor @@ -27,25 +27,25 @@ CONSTANT: F_SETFD 2 CONSTANT: F_SETFL 4 CONSTANT: FD_CLOEXEC 1 -C-STRUCT: sockaddr-in - { "uchar" "len" } - { "uchar" "family" } - { "ushort" "port" } - { "in_addr_t" "addr" } - { "longlong" "unused" } ; +STRUCT: sockaddr-in + { len uchar } + { family uchar } + { port ushort } + { addr in_addr_t } + { unused longlong } ; -C-STRUCT: sockaddr-in6 - { "uchar" "len" } - { "uchar" "family" } - { "ushort" "port" } - { "uint" "flowinfo" } - { { "uchar" 16 } "addr" } - { "uint" "scopeid" } ; +STRUCT: sockaddr-in6 + { len uchar } + { family uchar } + { port ushort } + { flowinfo uint } + { addr uchar[16] } + { scopeid uint } ; -C-STRUCT: sockaddr-un - { "uchar" "len" } - { "uchar" "family" } - { { "char" 104 } "path" } ; +STRUCT: sockaddr-un + { len uchar } + { family uchar } + { path char[104] } ; STRUCT: passwd { pw_name char* } diff --git a/basis/unix/bsd/freebsd/freebsd.factor b/basis/unix/bsd/freebsd/freebsd.factor index 58af91271d..13a4a24be1 100644 --- a/basis/unix/bsd/freebsd/freebsd.factor +++ b/basis/unix/bsd/freebsd/freebsd.factor @@ -3,15 +3,15 @@ IN: unix CONSTANT: FD_SETSIZE 1024 -C-STRUCT: addrinfo - { "int" "flags" } - { "int" "family" } - { "int" "socktype" } - { "int" "protocol" } - { "socklen_t" "addrlen" } - { "char*" "canonname" } - { "void*" "addr" } - { "addrinfo*" "next" } ; +STRUCT: addrinfo + { flags int } + { family int } + { socktype int } + { protocol int } + { addrlen socklen_t } + { canonname char* } + { addr void* } + { next addrinfo* } ; STRUCT: dirent { d_fileno u_int32_t } diff --git a/basis/unix/bsd/macosx/macosx.factor b/basis/unix/bsd/macosx/macosx.factor index d4a57f47c2..5edd1a5093 100644 --- a/basis/unix/bsd/macosx/macosx.factor +++ b/basis/unix/bsd/macosx/macosx.factor @@ -3,15 +3,15 @@ IN: unix CONSTANT: FD_SETSIZE 1024 -C-STRUCT: addrinfo - { "int" "flags" } - { "int" "family" } - { "int" "socktype" } - { "int" "protocol" } - { "socklen_t" "addrlen" } - { "char*" "canonname" } - { "void*" "addr" } - { "addrinfo*" "next" } ; +STRUCT: addrinfo + { flags int } + { family int } + { socktype int } + { protocol int } + { addrlen socklen_t } + { canonname char* } + { addr void* } + { next addrinfo* } ; CONSTANT: _UTX_USERSIZE 256 CONSTANT: _UTX_LINESIZE 32 diff --git a/basis/unix/bsd/netbsd/netbsd.factor b/basis/unix/bsd/netbsd/netbsd.factor index 8cd4d4f484..40d7cf4b02 100644 --- a/basis/unix/bsd/netbsd/netbsd.factor +++ b/basis/unix/bsd/netbsd/netbsd.factor @@ -4,15 +4,15 @@ IN: unix CONSTANT: FD_SETSIZE 256 -C-STRUCT: addrinfo - { "int" "flags" } - { "int" "family" } - { "int" "socktype" } - { "int" "protocol" } - { "socklen_t" "addrlen" } - { "char*" "canonname" } - { "void*" "addr" } - { "addrinfo*" "next" } ; +STRUCT: addrinfo + { flags int } + { family int } + { socktype int } + { protocol int } + { addrlen socklen_t } + { canonname char* } + { addr void* } + { next addrinfo* } ; STRUCT: dirent { d_fileno __uint32_t } diff --git a/basis/unix/bsd/netbsd/structs/structs.factor b/basis/unix/bsd/netbsd/structs/structs.factor index dba7590a93..f8aee1635d 100644 --- a/basis/unix/bsd/netbsd/structs/structs.factor +++ b/basis/unix/bsd/netbsd/structs/structs.factor @@ -1,18 +1,18 @@ ! Copyright (C) 2008 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.syntax unix.time ; +USING: alien.syntax unix.time classes.struct ; IN: unix -C-STRUCT: sockaddr_storage - { "__uint8_t" "ss_len" } - { "sa_family_t" "ss_family" } - { { "char" _SS_PAD1SIZE } "__ss_pad1" } - { "__int64_t" "__ss_align" } - { { "char" _SS_PAD2SIZE } "__ss_pad2" } ; +STRUCT: sockaddr_storage + { ss_len __uint8_t } + { ss_family sa_family_t } + { __ss_pad1 { "char" _SS_PAD1SIZE } } + { __ss_align __int64_t } + { __ss_pad2 { "char" _SS_PAD2SIZE } } ; -C-STRUCT: exit_struct - { "uint16_t" "e_termination" } - { "uint16_t" "e_exit" } ; +STRUCT: exit_struct + { e_termination uint16_t } + { e_exit uint16_t } ; C-STRUCT: utmpx { { "char" _UTX_USERSIZE } "ut_user" } diff --git a/basis/unix/bsd/openbsd/openbsd.factor b/basis/unix/bsd/openbsd/openbsd.factor index c77b043723..d5537abd8f 100644 --- a/basis/unix/bsd/openbsd/openbsd.factor +++ b/basis/unix/bsd/openbsd/openbsd.factor @@ -3,15 +3,15 @@ IN: unix CONSTANT: FD_SETSIZE 1024 -C-STRUCT: addrinfo - { "int" "flags" } - { "int" "family" } - { "int" "socktype" } - { "int" "protocol" } - { "socklen_t" "addrlen" } - { "void*" "addr" } - { "char*" "canonname" } - { "addrinfo*" "next" } ; +STRUCT: addrinfo + { flags int } + { family int } + { socktype int } + { protocol int } + { addrlen socklen_t } + { addr void* } + { canonname char* } + { next addrinfo* } ; STRUCT: dirent { d_fileno __uint32_t } diff --git a/basis/unix/linux/linux.factor b/basis/unix/linux/linux.factor index 5b1a41f21f..48044c731c 100644 --- a/basis/unix/linux/linux.factor +++ b/basis/unix/linux/linux.factor @@ -33,34 +33,34 @@ CONSTANT: FD_CLOEXEC 1 CONSTANT: F_SETFL 4 -C-STRUCT: addrinfo - { "int" "flags" } - { "int" "family" } - { "int" "socktype" } - { "int" "protocol" } - { "socklen_t" "addrlen" } - { "void*" "addr" } - { "char*" "canonname" } - { "addrinfo*" "next" } ; +STRUCT: addrinfo + { flags int } + { family int } + { socktype int } + { protocol int } + { addrlen socklen_t } + { addr void* } + { canonname char* } + { next addrinfo* } ; -C-STRUCT: sockaddr-in - { "ushort" "family" } - { "ushort" "port" } - { "in_addr_t" "addr" } - { "longlong" "unused" } ; +STRUCT: sockaddr-in + { family ushort } + { port ushort } + { addr in_addr_t } + { unused longlong } ; -C-STRUCT: sockaddr-in6 - { "ushort" "family" } - { "ushort" "port" } - { "uint" "flowinfo" } - { { "uchar" 16 } "addr" } - { "uint" "scopeid" } ; +STRUCT: sockaddr-in6 + { family ushort } + { port ushort } + { flowinfo uint } + { addr uchar[16] } + { scopeid uint } ; CONSTANT: max-un-path 108 -C-STRUCT: sockaddr-un - { "ushort" "family" } - { { "char" max-un-path } "path" } ; +STRUCT: sockaddr-un + { family ushort } + { path { "char" max-un-path } } ; CONSTANT: SOCK_STREAM 1 CONSTANT: SOCK_DGRAM 2 diff --git a/basis/unix/solaris/solaris.factor b/basis/unix/solaris/solaris.factor index d91fbdfddc..b7ea3f172e 100644 --- a/basis/unix/solaris/solaris.factor +++ b/basis/unix/solaris/solaris.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2006 Patrick Mauritz. ! See http://factorcode.org/license.txt for BSD license. -IN: unix USING: alien.syntax system kernel layouts ; +IN: unix ! Solaris. @@ -26,37 +26,37 @@ CONSTANT: SO_RCVTIMEO HEX: 1006 CONSTANT: F_SETFL 4 ! set file status flags CONSTANT: O_NONBLOCK HEX: 80 ! no delay -C-STRUCT: addrinfo - { "int" "flags" } - { "int" "family" } - { "int" "socktype" } - { "int" "protocol" } +STRUCT: addrinfo + { flags int } + { family int } + { socktype int } + { protocol int } ! #ifdef __sparcv9 ! int _ai_pad; ! #endif - { "int" "addrlen" } - { "char*" "canonname" } - { "void*" "addr" } - { "void*" "next" } ; + { addrlen int } + { canonname char* } + { addr void* } + { next void* } ; -C-STRUCT: sockaddr-in - { "ushort" "family" } - { "ushort" "port" } - { "in_addr_t" "addr" } - { "longlong" "unused" } ; +STRUCT: sockaddr-in + { family ushort } + { port ushort } + { addr in_addr_t } + { unused longlong } ; -C-STRUCT: sockaddr-in6 - { "ushort" "family" } - { "ushort" "port" } - { "uint" "flowinfo" } - { { "uchar" 16 } "addr" } - { "uint" "scopeid" } ; +STRUCT: sockaddr-in6 + { family ushort } + { port ushort } + { flowinfo uint } + { addr uchar[16] } + { scopeid uint } ; : max-un-path 108 ; -C-STRUCT: sockaddr-un - { "ushort" "family" } - { { "char" max-un-path } "path" } ; +STRUCT: sockaddr-un + { family ushort } + { path { "char" max-un-path } } ; CONSTANT: EINTR 4 CONSTANT: EAGAIN 11 diff --git a/basis/windows/winsock/winsock.factor b/basis/windows/winsock/winsock.factor index 74f67a4924..6b99824cb7 100755 --- a/basis/windows/winsock/winsock.factor +++ b/basis/windows/winsock/winsock.factor @@ -30,7 +30,7 @@ CONSTANT: SO_BROADCAST HEX: 20 CONSTANT: SO_USELOOPBACK HEX: 40 CONSTANT: SO_LINGER HEX: 80 CONSTANT: SO_OOBINLINE HEX: 100 -: SO_DONTLINGER ( -- n ) SO_LINGER bitnot ; inline +CONSTANT: SO_DONTLINGER $[ SO_LINGER bitnot ] CONSTANT: SO_SNDBUF HEX: 1001 CONSTANT: SO_RCVBUF HEX: 1002 @@ -75,7 +75,7 @@ CONSTANT: PF_INET6 23 CONSTANT: AI_PASSIVE 1 CONSTANT: AI_CANONNAME 2 CONSTANT: AI_NUMERICHOST 4 -: AI_MASK ( -- n ) { AI_PASSIVE AI_CANONNAME AI_NUMERICHOST } flags ; +CONSTANT: AI_MASK $[ { AI_PASSIVE AI_CANONNAME AI_NUMERICHOST } flags ] CONSTANT: NI_NUMERICHOST 1 CONSTANT: NI_NUMERICSERV 2 @@ -96,7 +96,7 @@ ALIAS: WSA_IO_PENDING ERROR_IO_PENDING CONSTANT: INADDR_ANY 0 -: INVALID_SOCKET ( -- alien ) -1 ; inline +CONSTANT: INVALID_SOCKET $[ -1 ] CONSTANT: SOCKET_ERROR -1 CONSTANT: SD_RECV 0 @@ -109,18 +109,18 @@ CONSTANT: SOL_SOCKET HEX: ffff ! C-STRUCT: in_addr ! { "in_addr_t" "s_addr" } ; -C-STRUCT: sockaddr-in - { "short" "family" } - { "ushort" "port" } - { "uint" "addr" } - { { "char" 8 } "pad" } ; +STRUCT: sockaddr-in + { family short } + { port ushort } + { addr uint } + { pad char[8] } ; -C-STRUCT: sockaddr-in6 - { "uchar" "family" } - { "ushort" "port" } - { "uint" "flowinfo" } - { { "uchar" 16 } "addr" } - { "uint" "scopeid" } ; +STRUCT: sockaddr-in6 + { family uchar } + { port ushort } + { flowinfo uint } + { addr uchar[16] } + { scopeid uint } ; STRUCT: hostent { name char* } @@ -129,15 +129,15 @@ STRUCT: hostent { length short } { addr-list void* } ; -C-STRUCT: addrinfo - { "int" "flags" } - { "int" "family" } - { "int" "socktype" } - { "int" "protocol" } - { "size_t" "addrlen" } - { "char*" "canonname" } - { "sockaddr*" "addr" } - { "addrinfo*" "next" } ; +STRUCT: addrinfo + { flags int } + { family int } + { socktype int } + { protocol int } + { addrlen size_t } + { canonname char* } + { addr sockaddr* } + { next addrinfo* } ; C-STRUCT: timeval { "long" "sec" }