Merge branch 'master' of git://factorcode.org/git/factor

db4
Joe Groff 2009-09-03 20:32:27 -05:00
commit a6921edd29
11 changed files with 176 additions and 167 deletions

View File

@ -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" <c-object> ;
M: inet4 empty-sockaddr drop sockaddr-in <struct> ;
M: inet4 make-sockaddr ( inet -- sockaddr )
"sockaddr-in" <c-object>
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 <struct>
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 <uint> ] dip inet-ntop
swap sockaddr-in-port ntohs <inet4> ;
M: inet4 parse-sockaddr ( sockaddr-in addrspec -- newaddrspec )
[ [ addr>> <uint> ] dip inet-ntop ]
[ drop port>> ntohs ] 2bi <inet4> ;
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" <c-object> ;
M: inet6 empty-sockaddr drop sockaddr-in6 <struct> ;
M: inet6 make-sockaddr ( inet -- sockaddr )
"sockaddr-in6" <c-object>
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 <struct>
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 <inet6> ;
[ [ addr>> ] dip inet-ntop ]
[ drop port>> ntohs ] 2bi <inet6> ;
: 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> inet
{ T{ inet6 f "::" f } T{ inet4 f "0.0.0.0" f } } [ clone ] map ;
: prepare-addrinfo ( -- addrinfo )
"addrinfo" <c-object>
PF_UNSPEC over set-addrinfo-family
IPPROTO_TCP over set-addrinfo-protocol ;
addrinfo <struct>
PF_UNSPEC >>family
IPPROTO_TCP >>protocol ;
: fill-in-ports ( addrspecs port -- addrspecs )
'[ _ >>port ] map ;
@ -292,7 +301,7 @@ C: <inet> inet
M: inet resolve-host
[ port>> ] [ host>> ] bi [
f prepare-addrinfo f <void*>
[ 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 ;

View File

@ -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" <c-object> ;
M: local empty-sockaddr drop sockaddr-un <struct> ;
M: local make-sockaddr
path>> (normalize-path)
dup length 1 + max-un-path > [ "Path too long" throw ] when
"sockaddr-un" <c-object>
AF_UNIX over set-sockaddr-un-family
[ [ utf8 string>alien ] dip set-sockaddr-un-path ] keep ;
sockaddr-un <struct>
AF_UNIX >>family
swap utf8 string>alien >>path ;
M: local parse-sockaddr
drop
sockaddr-un-path utf8 alien>string <local> ;
path>> utf8 alien>string <local> ;

View File

@ -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* }

View File

@ -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 }

View File

@ -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

View File

@ -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 }

View File

@ -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" }

View File

@ -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 }

View File

@ -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

View File

@ -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

View File

@ -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 <alien> ; inline
CONSTANT: INVALID_SOCKET $[ -1 <alien> ]
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" }