#include <sys/socket.h>
#include <sys/errno.h>
#include <sys/mman.h>
+ #include <sys/syslimits.h>
#include <fcntl.h>
#include <unistd.h>
#endif
constant(PROT_WRITE);
constant(MAP_FILE);
constant(MAP_SHARED);
+ constant(PATH_MAX);
grovel(pid_t);
}
USING: io.backend io.files.private io hashtables kernel math
memory namespaces sequences strings assocs arrays definitions
system combinators splitting sbufs continuations io.encodings
-io.encodings.binary init ;
+io.encodings.binary init accessors ;
IN: io.files
HOOK: (file-reader) io-backend ( path -- stream )
TUPLE: file-info type size permissions modified ;
HOOK: file-info io-backend ( path -- info )
+
+! Symlinks
HOOK: link-info io-backend ( path -- info )
+HOOK: make-link io-backend ( path1 path2 -- )
+
+HOOK: read-link io-backend ( path -- info )
+
+: copy-link ( path1 path2 -- )
+ >r read-link r> make-link ;
+
SYMBOL: +regular-file+
SYMBOL: +directory+
SYMBOL: +character-device+
HOOK: delete-directory io-backend ( path -- )
-: (delete-tree) ( path dir? -- )
- [
- dup directory* [ (delete-tree) ] assoc-each
- delete-directory
- ] [ delete-file ] if ;
-
: delete-tree ( path -- )
- dup directory? (delete-tree) ;
+ dup link-info type>> +directory+ = [
+ dup directory over [
+ [ first delete-tree ] each
+ ] with-directory delete-directory
+ ] [
+ delete-file
+ ] if ;
: to-directory over file-name append-path ;
DEFER: copy-tree-into
: copy-tree ( from to -- )
- over directory? [
- >r dup directory swap r> [
- >r swap first append-path r> copy-tree-into
- ] 2curry each
- ] [
- copy-file
- ] if ;
+ over link-info type>>
+ {
+ { +symbolic-link+ [ copy-link ] }
+ { +directory+ [
+ >r dup directory r> rot [
+ [ >r first r> copy-tree-into ] curry each
+ ] with-directory
+ ] }
+ [ drop copy-file ]
+ } case ;
: copy-tree-into ( from to -- )
to-directory copy-tree ;
: record-git-id ( -- ) git-id "../git-id" utf8 [ . ] with-file-writer ;
-: do-make-clean ( -- ) { "make" "clean" } try-process ;
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: gnu-make ( -- string )
+ os { "freebsd" "openbsd" "netbsd" } member?
+ [ "gmake" ]
+ [ "make" ]
+ if ;
+
+! : do-make-clean ( -- ) { "make" "clean" } try-process ;
+
+: do-make-clean ( -- ) { gnu-make "clean" } to-strings try-process ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! : make-vm ( -- desc )
+! <process>
+! { "make" } >>command
+! "../compile-log" >>stdout
+! +stdout+ >>stderr ;
+
: make-vm ( -- desc )
<process>
- { "make" } >>command
- "../compile-log" >>stdout
- +stdout+ >>stderr ;
+ { gnu-make } to-strings >>command
+ "../compile-log" >>stdout
+ +stdout+ >>stderr ;
: do-make-vm ( -- )
make-vm [ "vm compile error" print "../compile-log" cat ] run-or-bail ;
--- /dev/null
+IN: io.sockets.tests
+USING: io.sockets sequences math tools.test ;
+
+[ t ] [ "localhost" 80 f resolve-host length 1 >= ] unit-test
USING: io.backend io.nonblocking io.unix.backend io.files io
unix unix.stat unix.time kernel math continuations
math.bitfields byte-arrays alien combinators calendar
-io.encodings.binary ;
+io.encodings.binary accessors sequences strings ;
IN: io.unix.files
{ [ dup S_ISLNK ] [ +symbolic-link+ ] }
{ [ dup S_ISSOCK ] [ +socket+ ] }
{ [ t ] [ +unknown+ ] }
- } cond nip ;
+ } cond nip ;
: stat>file-info ( stat -- info )
{
M: unix-io link-info ( path -- info )
normalize-pathname lstat* stat>file-info ;
+
+M: unix-io make-link ( path1 path2 -- )
+ normalize-pathname symlink io-error ;
+
+M: unix-io read-link ( path -- path' )
+ normalize-pathname
+ PATH_MAX [ <byte-array> tuck ] [ ] bi readlink
+ dup io-error head-slice >string ;
USING: alien.c-types io io.files io.nonblocking kernel
namespaces random io.encodings.binary singleton init
-accessors ;
+accessors system ;
IN: random.unix
TUPLE: unix-random path ;
M: unix-random random-bytes* ( n tuple -- byte-array )
path>> file-read-unbuffered ;
-[
- "/dev/random" <unix-random> secure-random-generator set-global
- "/dev/urandom" <unix-random> insecure-random-generator set-global
-] "random.unix" add-init-hook
+os "openbsd" = [
+ [
+ "/dev/srandom" <unix-random> secure-random-generator set-global
+ "/dev/prandom" <unix-random> insecure-random-generator set-global
+ ] "random.unix" add-init-hook
+] [
+ [
+ "/dev/random" <unix-random> secure-random-generator set-global
+ "/dev/urandom" <unix-random> insecure-random-generator set-global
+ ] "random.unix" add-init-hook
+] if
M: method-spec make-disassemble-cmd
first2 method make-disassemble-cmd ;
+: gdb-binary ( -- string )
+ os "freebsd" = "gdb66" "gdb" ? ;
+
: run-gdb ( -- lines )
<process>
+closed+ >>stdin
out-file >>stdout
- [ "gdb" , "-x" , in-file , "-batch" , ] { } make >>command
+ [ gdb-binary , "-x" , in-file , "-batch" , ] { } make >>command
try-process
out-file ascii file-lines ;
: F_SETFL 4 ; inline
: O_NONBLOCK 4 ; inline
-C-STRUCT: addrinfo
- { "int" "flags" }
- { "int" "family" }
- { "int" "socktype" }
- { "int" "protocol" }
- { "socklen_t" "addrlen" }
- { "char*" "canonname" }
- { "void*" "addr" }
- { "addrinfo*" "next" } ;
-
C-STRUCT: sockaddr-in
{ "uchar" "len" }
{ "uchar" "family" }
+USING: alien.syntax ;
IN: unix
: FD_SETSIZE 1024 ;
+
+C-STRUCT: addrinfo
+ { "int" "flags" }
+ { "int" "family" }
+ { "int" "socktype" }
+ { "int" "protocol" }
+ { "socklen_t" "addrlen" }
+ { "char*" "canonname" }
+ { "void*" "addr" }
+ { "addrinfo*" "next" } ;
+USING: alien.syntax ;
IN: unix
: FD_SETSIZE 1024 ; inline
+
+C-STRUCT: addrinfo
+ { "int" "flags" }
+ { "int" "family" }
+ { "int" "socktype" }
+ { "int" "protocol" }
+ { "socklen_t" "addrlen" }
+ { "char*" "canonname" }
+ { "void*" "addr" }
+ { "addrinfo*" "next" } ;
+USING: alien.syntax ;
IN: unix
: FD_SETSIZE 256 ; inline
+
+C-STRUCT: addrinfo
+ { "int" "flags" }
+ { "int" "family" }
+ { "int" "socktype" }
+ { "int" "protocol" }
+ { "socklen_t" "addrlen" }
+ { "char*" "canonname" }
+ { "void*" "addr" }
+ { "addrinfo*" "next" } ;
+USING: alien.syntax ;
IN: unix
: FD_SETSIZE 1024 ; inline
+
+C-STRUCT: addrinfo
+ { "int" "flags" }
+ { "int" "family" }
+ { "int" "socktype" }
+ { "int" "protocol" }
+ { "socklen_t" "addrlen" }
+ { "void*" "addr" }
+ { "char*" "canonname" }
+ { "addrinfo*" "next" } ;
FUNCTION: int pipe ( int* filedes ) ;
FUNCTION: void* popen ( char* command, char* type ) ;
FUNCTION: ssize_t read ( int fd, void* buf, size_t nbytes ) ;
+FUNCTION: ssize_t readlink ( char* path, char* buf, size_t bufsize ) ;
FUNCTION: ssize_t recv ( int s, void* buf, size_t nbytes, int flags ) ;
FUNCTION: ssize_t recvfrom ( int s, void* buf, size_t nbytes, int flags, sockaddr-in* from, socklen_t* fromlen ) ;
FUNCTION: int rename ( char* from, char* to ) ;
FUNCTION: int setuid ( uid_t uid ) ;
FUNCTION: int socket ( int domain, int type, int protocol ) ;
FUNCTION: char* strerror ( int errno ) ;
+FUNCTION: int symlink ( char* path1, char* path2 ) ;
FUNCTION: int system ( char* command ) ;
FUNCTION: int unlink ( char* path ) ;
FUNCTION: int utimes ( char* path, timeval[2] times ) ;
FUNCTION: int kill ( pid_t pid, int sig ) ;
+: PATH_MAX 1024 ; inline
+
: PRIO_PROCESS 0 ; inline
: PRIO_PGRP 1 ; inline
: PRIO_USER 2 ; inline