Check-in [00d9573880]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:new posix funcs. dup fork, improved wait-for-pid
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 00d95738806619529d3df573d401370683501226
User & Date: aldo 2016-12-11 13:55:00
Context
2016-12-11
13:55
bind/inet now sets SO_REUSEADDR check-in: 15fd017f95 user: aldo tags: trunk
13:55
new posix funcs. dup fork, improved wait-for-pid check-in: 00d9573880 user: aldo tags: trunk
2016-12-10
19:00
moved sockaddr_in inside the meta-cond check-in: 0776ca44d8 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
16
..
60
61
62
63
64
65
66




67


68

69
70
71
72
73
74
75
76
77
78
79






















80
81
82
83
84
85
86


(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)
................................................................................
  (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)])))))























  ;; 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))






>
|

|
>







 







>
>
>
>

>
>
|
>
|
|
|
|
|
|
|
|
|
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
..
62
63
64
65
66
67
68
69
70
71
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


(library (posix)
  (export strerror errno EAGAIN EINTR
	  mktemp mkstemp with-mktemp close
	  wtermsig wifexited wifsignaled wexitstatus
	  wait-flag
	  wait-for-pid fork dup file-write file-read bytes-ready)
  (import (chezscheme)
	  (only (thunder-utils) bytevector-copy*)
	  (ffi-utils))
;;; POSIX STUFF
  (define init (load-shared-object "libc.so.6"))

  (define strerror
    (case-lambda
     [() (strerror (errno))]
     [(n)
................................................................................
  (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))
  (meta-cond
   [(memq (machine-type) '(a6le ta6le i3le ti3le))
    (define-flags wait-flag (nohang 1) (untraced 2) (stopped 2) (exited 4) (continued 8)
      (nowait #x01000000) (nothread #x20000000) (all #x40000000) (clone #x80000000))])

  (define wait-for-pid
    (case-lambda
     [(pid) (wait-for-pid pid '())]
     [(pid options)
      (define waitpid* (foreign-procedure "waitpid" (int u8* int) int))
      (define status* (make-bytevector (foreign-sizeof 'int)))
      (let loop ()
	(let ([r (waitpid* pid status* (apply wait-flag options))])
	  (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)]))))]))

  (define (fork)
    (define fork* (foreign-procedure "fork" () integer-32))
     (let ([r (fork*)])
      (if (< r 0)
	  (errorf 'dup2 "failed: ~d" (strerror))
	  r)))

  (define dup
    (case-lambda
     [(filedes filedes2)
      (define dup2* (foreign-procedure "dup2" (int int) int))
      (let ([r (dup2* filedes filedes2)])
	(if (< r 0)
	    (errorf 'dup2 "failed: ~d" (strerror))
	    r))]
     [(filedes)
      (define dup* (foreign-procedure "dup" (int) int))
      (let ([r (dup* filedes)])
	(if (< r 0)
	    (errorf 'dup "failed: ~d" (strerror))
	    r))]))
  
  ;; 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))