Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | added file-read file-write bytes-ready to posix |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
2e3180323df84368552becc0b921c47f |
User & Date: | aldo 2016-12-09 16:39:19 |
Context
2016-12-09
| ||
16:43 | added pure scheme socket lib check-in: 385207811d user: aldo tags: trunk | |
16:39 | added file-read file-write bytes-ready to posix check-in: 2e3180323d user: aldo tags: trunk | |
16:38 | added bytevector-copy* check-in: 28f201db00 user: aldo tags: trunk | |
Changes
Changes to posix.sls.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
..
71
72
73
74
75
76
77
78
|
(library (posix) (export strerror errno EAGAIN EINTR mktemp mkstemp with-mktemp close wtermsig wifexited wifsignaled wexitstatus wait-for-pid) (import (chezscheme)) ;;; POSIX STUFF (define init (load-shared-object "libc.so.6")) (define strerror (case-lambda [() (strerror (errno))] [(n) ................................................................................ (let ([r (waitpid* pid status* 0)]) (when (< r 0) (errorf 'wait-for-pid "waitpid failed: ~d" (strerror))) (let ([status (bytevector-sint-ref status* 0 (native-endianness) (foreign-sizeof 'int))]) (cond [(wifexited status) (wexitstatus status)] [(wifsignaled status) #f] [(loop)]))))) ) ;;library posix |
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
..
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
(library (posix) (export strerror errno EAGAIN EINTR mktemp mkstemp with-mktemp close wtermsig wifexited wifsignaled wexitstatus wait-for-pid file-write file-read bytes-ready) (import (chezscheme) (only (thunder-utils) bytevector-copy*)) ;;; POSIX STUFF (define init (load-shared-object "libc.so.6")) (define strerror (case-lambda [() (strerror (errno))] [(n) ................................................................................ (let ([r (waitpid* pid status* 0)]) (when (< r 0) (errorf 'wait-for-pid "waitpid failed: ~d" (strerror))) (let ([status (bytevector-sint-ref status* 0 (native-endianness) (foreign-sizeof 'int))]) (cond [(wifexited status) (wexitstatus status)] [(wifsignaled status) #f] [(loop)]))))) ;; these shouldn't be needed.. use just open-fd-input-port, ;; open-fd-output-port or open-fd-input/output-port and then use the scheme ;; functions... (define (file-write fd data) (define write* (foreign-procedure "write" (int u8* size_t) ssize_t)) (define n (bytevector-length data)) (let loop ([data data]) (let ([m (bytevector-length data)]) (cond [(> m 0) (let ([r (write* fd data m)]) (cond [(< r 0) (if (or (= (errno) EAGAIN) (= (errno) EINTR)) (loop data) (errorf 'write "error writing data: ~a: ~a" (errno) (strerror)))] [else (loop (bytevector-copy* data r))]))] [else n])))) (define (file-read fd n) (define read* (foreign-procedure "read" (int u8* size_t) ssize_t)) (define buf (make-bytevector n)) (let loop () (let ([r (read* fd buf n)]) (cond [(>= r 0) r] [(or (= (errno) EAGAIN) (= (errno) EINTR)) -1] [else (loop)])))) (define FIONREAD #x541B) (define (bytes-ready fd) (define ioctl* (foreign-procedure "ioctl" (int int void*) int)) (define n* (foreign-alloc (foreign-sizeof 'int))) (ioctl* fd FIONREAD n*) (let ([n (foreign-ref 'int n* 0)]) (foreign-free n*) n)) ) ;;library posix |