factor/library/unix/syscalls.factor

195 lines
4.9 KiB
Factor
Raw Normal View History

! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
2005-04-17 18:34:09 -04:00
IN: unix-internals
USING: alien errors kernel math namespaces ;
! Alien wrappers for various Unix libc functions.
ALIAS: ulonglong off_t
ALIAS: long ssize_t
ALIAS: ulong size_t
ALIAS: uint socklen_t
2005-04-17 18:34:09 -04:00
ALIAS: uint in_addr_t
BEGIN-STRUCT: stat
FIELD: uint dev
FIELD: uint ino
FIELD: ushort mode
FIELD: ushort nlink
FIELD: uint uid
FIELD: uint gid
FIELD: uint rdev
FIELD: ulong atime
FIELD: ulong atimensec
FIELD: ulong mtime
FIELD: ulong mtimensec
FIELD: ulong ctime
FIELD: ulong ctimensec
FIELD: off_t size
FIELD: off_t blocks
FIELD: uint blksize
FIELD: uint flags
FIELD: uint gen
FIELD: uint padding
FIELD: ulonglong padding
FIELD: ulonglong padding
END-STRUCT
: S_IFMT OCT: 0170000 ; inline
: S_ISDIR ( m -- ? ) OCT: 0170000 bitand OCT: 0040000 = ; inline
2005-04-17 18:34:09 -04:00
: stat ( path stat -- n )
"int" "libc" "stat" [ "char*" "stat*" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: opendir ( path -- dir* )
"void*" "libc" "opendir" [ "char*" ] alien-invoke ;
BEGIN-STRUCT: dirent
FIELD: uint fileno
FIELD: ushort reclen
FIELD: uchar type
FIELD: uchar namlen
FIELD: uchar256 name
END-STRUCT
2005-04-17 18:34:09 -04:00
: readdir ( dir* -- dirent* )
"dirent*" "libc" "readdir" [ "void*" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: closedir ( dir* -- )
"void" "libc" "closedir" [ "void*" ] alien-invoke ;
BEGIN-STRUCT: string-box
FIELD: uchar256 value
END-STRUCT
: EINPROGRESS 36 ;
: errno ( -- n )
"int" "libc" "errno" alien-global ;
: strerror ( n -- str )
"char*" "libc" "strerror" [ "int" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: getcwd ( str len -- n )
"int" "libc" "getcwd" [ "string-box*" "uint" ] alien-invoke ;
: O_RDONLY HEX: 0000 ;
: O_WRONLY HEX: 0001 ;
: O_RDWR HEX: 0002 ;
: O_CREAT HEX: 0200 ;
: O_TRUNC HEX: 0400 ;
2005-04-17 18:34:09 -04:00
: open ( path flags prot -- fd )
"int" "libc" "open" [ "char*" "int" "int" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: close ( fd -- )
"void" "libc" "close" [ "int" ] alien-invoke ;
2005-04-14 19:37:13 -04:00
: F_SETFL 4 ; ! set file status flags
: O_NONBLOCK 4 ; ! no delay
2005-04-17 18:34:09 -04:00
: fcntl ( fd cmd key value -- n )
2005-04-14 19:37:13 -04:00
"int" "libc" "fcntl" [ "int" "int" "int" "int" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: read ( fd buf nbytes -- n )
"ssize_t" "libc" "read" [ "int" "ulong" "size_t" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: write ( fd buf nbytes -- n )
"ssize_t" "libc" "write" [ "int" "ulong" "size_t" ] alien-invoke ;
: MSG_OOB HEX: 1 ;
2005-04-17 18:34:09 -04:00
: recv ( fd buf nbytes flags -- )
"ssize_t" "libc" "read" [ "int" "ulong" "size_t" "int" ] alien-invoke ;
2005-04-09 22:43:41 -04:00
BEGIN-STRUCT: pollfd
FIELD: int fd
FIELD: short events
FIELD: short revents
END-STRUCT
: POLLIN HEX: 0001 ; ! any readable data available
: POLLPRI HEX: 0002 ; ! OOB/Urgent readable data
: POLLOUT HEX: 0004 ; ! file descriptor is writeable
: POLLRDNORM HEX: 0040 ; ! non-OOB/URG data available
: POLLWRNORM POLLOUT ; ! no write type differentiation
: POLLRDBAND HEX: 0080 ; ! OOB/Urgent readable data
: POLLWRBAND HEX: 0100 ; ! OOB/Urgent data can be written
2005-04-14 01:32:06 -04:00
: read-events POLLIN POLLRDNORM bitor POLLRDBAND bitor ;
: write-events POLLOUT POLLWRNORM bitor POLLWRBAND bitor ;
2005-04-17 18:34:09 -04:00
: poll ( pollfds nfds timeout -- n )
2005-04-09 22:43:41 -04:00
"int" "libc" "poll" [ "pollfd*" "uint" "int" ] alien-invoke ;
BEGIN-STRUCT: uint*
FIELD: uint s
END-STRUCT
BEGIN-STRUCT: VOID* ( ugly )
2005-04-17 18:34:09 -04:00
FIELD: void* s
END-STRUCT
BEGIN-STRUCT: hostent
FIELD: char* name
FIELD: VOID** aliases
FIELD: int addrtype
FIELD: int length
FIELD: VOID** addr-list
END-STRUCT
: hostent-addr hostent-addr-list VOID*-s uint*-s ;
2005-04-17 18:34:09 -04:00
: gethostbyname ( name -- hostent )
"hostent*" "libc" "gethostbyname" [ "char*" ] alien-invoke ;
BEGIN-STRUCT: sockaddr-in
2005-04-17 18:34:09 -04:00
FIELD: uchar len
FIELD: uchar family
FIELD: ushort port
FIELD: in_addr_t addr
FIELD: longlong unused
END-STRUCT
: AF_INET 2 ;
: PF_INET AF_INET ;
: SOCK_STREAM 1 ;
2005-04-17 18:34:09 -04:00
: socket ( domain type protocol -- n )
"int" "libc" "socket" [ "int" "int" "int" ] alien-invoke ;
: SOL_SOCKET HEX: ffff ; ! options for socket level
: SO_REUSEADDR HEX: 4 ; ! allow local address reuse
: INADDR_ANY 0 ;
2005-04-17 18:34:09 -04:00
: setsockopt ( s level optname optval optlen -- n )
"int" "libc" "setsockopt" [ "int" "int" "int" "void*" "socklen_t" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: connect ( s name namelen -- n )
"int" "libc" "connect" [ "int" "sockaddr-in*" "socklen_t" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: bind ( s sockaddr socklen -- n )
"int" "libc" "bind" [ "int" "sockaddr-in*" "socklen_t" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: listen ( s backlog -- n )
"int" "libc" "listen" [ "int" "int" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: accept ( s sockaddr socklen -- n )
2005-04-24 23:02:19 -04:00
"int" "libc" "accept" [ "int" "sockaddr-in*" "int-box*" ] alien-invoke ;
2005-04-17 18:34:09 -04:00
: inet-ntoa ( sockaddr -- string )
"char*" "libc" "inet_ntoa" [ "in_addr_t" ] alien-invoke ;
: htonl ( n -- n )
"uint" "libc" "htonl" [ "uint" ] alien-invoke ;
: htons ( n -- n )
"ushort" "libc" "htons" [ "ushort" ] alien-invoke ;
: ntohl ( n -- n )
"uint" "libc" "ntohl" [ "uint" ] alien-invoke ;
: ntohs ( n -- n )
"ushort" "libc" "ntohs" [ "ushort" ] alien-invoke ;