unix.ffi, windows.winsock: wraps for servent functions

db4
Björn Lindqvist 2013-09-16 14:45:11 +02:00 committed by John Benediktsson
parent 32b07016b0
commit 7c179f876c
6 changed files with 31 additions and 9 deletions

View File

@ -169,3 +169,5 @@ os unix? [
! Binding to all interfaces should work
[ ] [ f 0 <inet4> <datagram> dispose ] unit-test
[ ] [ f 0 <inet6> <datagram> dispose ] unit-test
[ 80 ] [ "http" protocol-port ] unit-test

View File

@ -464,6 +464,9 @@ M: invalid-local-address summary
[ invalid-local-address ] if
] dip with-variable ; inline
: protocol-port ( protocol -- port )
f getservbyname [ port>> htons ] [ f ] if* ;
{
{ [ os unix? ] [ "io.sockets.unix" require ] }
{ [ os windows? ] [ "io.sockets.windows" require ] }

View File

@ -0,0 +1,10 @@
IN: unix.ffi.tests
USING: accessors alien.c-types tools.test unix.ffi ;
[ 80 ] [ "http" f getservbyname port>> ntohs ] unit-test
[ "www" ] [
0 "http" f getservbyname aliases>> c-string alien-element
] unit-test
[ "http" ] [ 80 htons f getservbyport name>> ] unit-test

View File

@ -62,6 +62,12 @@ STRUCT: iovec
{ iov_base void* }
{ iov_len size_t } ;
STRUCT: servent
{ name c-string }
{ aliases void* }
{ port int }
{ proto c-string } ;
CONSTANT: F_OK 0 ! test for existence of file
CONSTANT: X_OK 1 ! test for execute or search permission
CONSTANT: W_OK 2 ! test for write permission
@ -121,6 +127,8 @@ FUNCTION: int gethostname ( c-string name, int len ) ;
FUNCTION: int getsockname ( int socket, sockaddr* address, socklen_t* address_len ) ;
FUNCTION: int getpeername ( int socket, sockaddr* address, socklen_t* address_len ) ;
FUNCTION: protoent* getprotobyname ( c-string name ) ;
FUNCTION: servent* getservbyname ( c-string name, c-string prot ) ;
FUNCTION: servent* getservbyport ( int port, c-string prot ) ;
FUNCTION: uid_t getuid ;
FUNCTION: uint htonl ( uint n ) ;
FUNCTION: ushort htons ( ushort n ) ;

View File

@ -87,14 +87,6 @@ M: string >url
M: pathname >url string>> >url ;
: protocol-port ( protocol -- port )
{
{ "http" [ 80 ] }
{ "https" [ 443 ] }
{ "ftp" [ 21 ] }
[ drop f ]
} case ;
: relative-url ( url -- url' )
clone
f >>protocol

View File

@ -146,6 +146,10 @@ STRUCT: timeval
{ sec long }
{ usec long } ;
STRUCT: servent
{ name c-string }
{ proto c-string } ;
GENERIC: sockaddr>ip ( sockaddr -- string )
M: sockaddr-in sockaddr>ip ( sockaddr -- string )
@ -187,6 +191,9 @@ FUNCTION: int getpeername ( SOCKET s, sockaddr-in* address, int* addrlen ) ;
FUNCTION: protoent* getprotobyname ( c-string name ) ;
FUNCTION: servent* getservbyname ( c-string name, c-string prot ) ;
FUNCTION: servent* getservbyport ( c-string name, c-string prot ) ;
TYPEDEF: uint SERVICETYPE
TYPEDEF: OVERLAPPED WSAOVERLAPPED
TYPEDEF: WSAOVERLAPPED* LPWSAOVERLAPPED
@ -430,7 +437,7 @@ ERROR: winsock-exception n string ;
: throw-winsock-error ( -- * )
WSAGetLastError (throw-winsock-error) ;
: winsock-error=0/f ( n/f -- )
{ 0 f } member? [ throw-winsock-error ] when ;