Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | added posix.sls |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
a6f295058668459347fc6be33f83b8e6 |
User & Date: | aldo 2016-12-08 00:35:19 |
Context
2016-12-08
| ||
00:36 | added c-eval check-in: 56b242ceac user: aldo tags: trunk | |
00:35 | added posix.sls check-in: a6f2950586 user: aldo tags: trunk | |
2016-12-05
| ||
22:28 | added to-html and tree-trans to sxml check-in: 2e060a1291 user: aldo tags: trunk | |
Changes
Added posix.sls.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
(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) (define strerror* (foreign-procedure "strerror_r" (int u8* size_t) string)) (define buff (make-bytevector 1024)) (strerror* n buff 1024)])) (define (errno) (foreign-ref 'int (foreign-entry "errno") 0)) (define EAGAIN 11) (define EINTR 4) (define (mkstemp template) (define mkstemp* (foreign-procedure "mkstemp" (u8*) int)) (define t (string->utf8 template)) (let ([fd (mkstemp* t)]) (when (< fd 0) (errorf 'mkstemp "failed: ~a" (strerror))) (values fd (utf8->string t)))) (define (mktemp template) (define mktemp* (foreign-procedure "mktemp" (string) string)) (let ([s (mktemp* template)]) (when (string=? s "") (errorf 'mktemp "failed: ~a" (strerror))) s)) (define (with-mktemp template f) (define file #f) (dynamic-wind (lambda () (set! file (mktemp template))) (lambda () (f file)) (lambda () (delete-file file)))) (define (close fd) (define close* (foreign-procedure "close" (int) int)) (if (< (close* fd) 0) (errorf 'close "failed: ~a" (strerror)))) (define (wtermsig x) (logand x #x7f)) (define (wifexited x) (eq? (wtermsig x) 0)) (define (wifsignaled x) (> (logand #xff (bitwise-arithmetic-shift-right (+ 1 (wtermsig x)) 1)) 0)) (define (wexitstatus x) (bitwise-arithmetic-shift-right (logand x #xff00) 8)) (define (wait-for-pid pid) (define waitpid* (foreign-procedure "waitpid" (int u8* int) int)) (define status* (make-bytevector (foreign-sizeof 'int))) (let loop () (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 |