Check-in [2e3180323d]
Not logged in

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: 2e3180323df84368552becc0b921c47f1de8fcd6
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
Hide Diffs Unified Diffs Ignore Whitespace Patch

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