Check-in [e0957430e1]
Not logged in

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

Overview
Comment:added better errno support
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: e0957430e18204ca5ce8c2c811f87a832294933a
User & Date: aldo 2016-12-12 16:01:40
Context
2016-12-12
22:48
fixed sockaddr_in.sin_zero size, thanks to gwatt check-in: f1282eed3e user: aldo tags: trunk
16:01
added better errno support check-in: e0957430e1 user: aldo tags: trunk
15:32
added EINTR support on connect/inet and accept check-in: c7ecd28930 user: aldo tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to posix.sls.

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
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.

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







|






|
>
>



<
<
<
<
<
<
<
<
<
<
<
<
<
<







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
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.

(library (posix)
  (export strerror errno
	  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)
	  (only (posix errno) strerror errno EAGAIN EINTR))
  
;;; POSIX STUFF
  (define init (load-shared-object "libc.so.6"))















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

Added posix/errno-c-eval.ss.





































































































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


(define errors '(
		 ;;FROM linux's asm/errno-base.h
		 EPERM ENOENT ESRCH EINTR EIO ENXIO E2BIG ENOEXEC EBADF ECHILD EAGAIN
		 ENOMEM EACCES EFAULT ENOTBLK EBUSY EEXIST EXDEV ENODEV ENOTDIR EISDIR
		 EINVAL ENFILE EMFILE ENOTTY ETXTBSY EFBIG ENOSPC ESPIPE EROFS EMLINK
		 EPIPE EDOM ERANGE
		 
		 ;;FROM linux's asm/errno.h
		 EDEADLK ENAMETOOLONG ENOLCK

		 ENOSYS

		 ENOTEMPTY ELOOP EWOULDBLOCK ENOMSG EIDRM ECHRNG EL2NSYNC EL3HLT EL3RST
		 ELNRNG EUNATCH ENOCSI EL2HLT EBADE EBADR EXFULL ENOANO EBADRQC EBADSLT

		 EDEADLOCK

		 EBFONT ENOSTR ENODATA ETIME ENOSR ENONET ENOPKG EREMOTE ENOLINK EADV
		 ESRMNT ECOMM EPROTO EMULTIHOP EDOTDOT EBADMSG EOVERFLOW ENOTUNIQ
		 EBADFD EREMCHG ELIBACC ELIBBAD ELIBSCN ELIBMAX ELIBEXEC EILSEQ
		 ERESTART ESTRPIPE EUSERS ENOTSOCK EDESTADDRREQ EMSGSIZE EPROTOTYPE
		 ENOPROTOOPT EPROTONOSUPPORT ESOCKTNOSUPPORT EOPNOTSUPP EPFNOSUPPORT
		 EAFNOSUPPORT EADDRINUSE EADDRNOTAVAIL ENETDOWN ENETUNREACH ENETRESET
		 ECONNABORTED ECONNRESET ENOBUFS EISCONN ENOTCONN ESHUTDOWN
		 ETOOMANYREFS ETIMEDOUT ECONNREFUSED EHOSTDOWN EHOSTUNREACH EALREADY
		 EINPROGRESS ESTALE EUCLEAN ENOTNAM ENAVAIL EISNAM EREMOTEIO EDQUOT
		 ENOMEDIUM EMEDIUMTYPE ECANCELED ENOKEY EKEYEXPIRED EKEYREVOKED
		 EKEYREJECTED EOWNERDEAD ENOTRECOVERABLE))

(define (gen-errno platform)
  (call-with-output-file (string-append "errno-" platform ".ss")
    (lambda (p)
      (fprintf p";; generated by errno-c-eval.ss - platform: ~a\n" (machine-type))

      (for-each (lambda (err)
		  (printf "eval'ing ~a...\n" err)
	    (guard (e [else (fprintf p "(define ~a '~a-UNDEFINED)\n" err err)])
		   (fprintf p "(define ~a ~a)\n" err (c-eval-printf "%d" err))))
		errors))
    'truncate))

(c-eval-includes '("stdio.h" "errno.h"))

(cond
 [(memq (machine-type) '(a6le ta6le))
  (gen-errno "linux")]
 [else
  (error 'errno-c-eval.ss "unsupported machine-type ~a" (machine-type))])

Added posix/errno-linux.ss.









































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
121
122
123
124
125
126
127
128
129
130
131
132
;; generated by errno-c-eval.ss - platform: ta6le
(define EPERM 1)
(define ENOENT 2)
(define ESRCH 3)
(define EINTR 4)
(define EIO 5)
(define ENXIO 6)
(define E2BIG 7)
(define ENOEXEC 8)
(define EBADF 9)
(define ECHILD 10)
(define EAGAIN 11)
(define ENOMEM 12)
(define EACCES 13)
(define EFAULT 14)
(define ENOTBLK 15)
(define EBUSY 16)
(define EEXIST 17)
(define EXDEV 18)
(define ENODEV 19)
(define ENOTDIR 20)
(define EISDIR 21)
(define EINVAL 22)
(define ENFILE 23)
(define EMFILE 24)
(define ENOTTY 25)
(define ETXTBSY 26)
(define EFBIG 27)
(define ENOSPC 28)
(define ESPIPE 29)
(define EROFS 30)
(define EMLINK 31)
(define EPIPE 32)
(define EDOM 33)
(define ERANGE 34)
(define EDEADLK 35)
(define ENAMETOOLONG 36)
(define ENOLCK 37)
(define ENOSYS 38)
(define ENOTEMPTY 39)
(define ELOOP 40)
(define EWOULDBLOCK 11)
(define ENOMSG 42)
(define EIDRM 43)
(define ECHRNG 44)
(define EL2NSYNC 45)
(define EL3HLT 46)
(define EL3RST 47)
(define ELNRNG 48)
(define EUNATCH 49)
(define ENOCSI 50)
(define EL2HLT 51)
(define EBADE 52)
(define EBADR 53)
(define EXFULL 54)
(define ENOANO 55)
(define EBADRQC 56)
(define EBADSLT 57)
(define EDEADLOCK 35)
(define EBFONT 59)
(define ENOSTR 60)
(define ENODATA 61)
(define ETIME 62)
(define ENOSR 63)
(define ENONET 64)
(define ENOPKG 65)
(define EREMOTE 66)
(define ENOLINK 67)
(define EADV 68)
(define ESRMNT 69)
(define ECOMM 70)
(define EPROTO 71)
(define EMULTIHOP 72)
(define EDOTDOT 73)
(define EBADMSG 74)
(define EOVERFLOW 75)
(define ENOTUNIQ 76)
(define EBADFD 77)
(define EREMCHG 78)
(define ELIBACC 79)
(define ELIBBAD 80)
(define ELIBSCN 81)
(define ELIBMAX 82)
(define ELIBEXEC 'ELIBEXEC-UNDEFINED)
(define EILSEQ 84)
(define ERESTART 85)
(define ESTRPIPE 86)
(define EUSERS 87)
(define ENOTSOCK 88)
(define EDESTADDRREQ 89)
(define EMSGSIZE 90)
(define EPROTOTYPE 91)
(define ENOPROTOOPT 92)
(define EPROTONOSUPPORT 93)
(define ESOCKTNOSUPPORT 94)
(define EOPNOTSUPP 95)
(define EPFNOSUPPORT 96)
(define EAFNOSUPPORT 97)
(define EADDRINUSE 98)
(define EADDRNOTAVAIL 99)
(define ENETDOWN 100)
(define ENETUNREACH 101)
(define ENETRESET 102)
(define ECONNABORTED 103)
(define ECONNRESET 104)
(define ENOBUFS 105)
(define EISCONN 106)
(define ENOTCONN 107)
(define ESHUTDOWN 108)
(define ETOOMANYREFS 109)
(define ETIMEDOUT 110)
(define ECONNREFUSED 111)
(define EHOSTDOWN 112)
(define EHOSTUNREACH 113)
(define EALREADY 114)
(define EINPROGRESS 115)
(define ESTALE 116)
(define EUCLEAN 117)
(define ENOTNAM 118)
(define ENAVAIL 119)
(define EISNAM 120)
(define EREMOTEIO 121)
(define EDQUOT 122)
(define ENOMEDIUM 123)
(define EMEDIUMTYPE 124)
(define ECANCELED 125)
(define ENOKEY 126)
(define EKEYEXPIRED 127)
(define EKEYREVOKED 128)
(define EKEYREJECTED 129)
(define EOWNERDEAD 130)
(define ENOTRECOVERABLE 131)

Added posix/errno.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

(library (posix errno)
  (export         ;;FROM linux's asm/errno-base.h
		 EPERM ENOENT ESRCH EINTR EIO ENXIO E2BIG ENOEXEC EBADF ECHILD EAGAIN
		 ENOMEM EACCES EFAULT ENOTBLK EBUSY EEXIST EXDEV ENODEV ENOTDIR EISDIR
		 EINVAL ENFILE EMFILE ENOTTY ETXTBSY EFBIG ENOSPC ESPIPE EROFS EMLINK
		 EPIPE EDOM ERANGE
		 
		 ;;FROM linux's asm/errno.h
		 EDEADLK ENAMETOOLONG ENOLCK

		 ENOSYS

		 ENOTEMPTY ELOOP EWOULDBLOCK ENOMSG EIDRM ECHRNG EL2NSYNC EL3HLT EL3RST
		 ELNRNG EUNATCH ENOCSI EL2HLT EBADE EBADR EXFULL ENOANO EBADRQC EBADSLT

		 EDEADLOCK

		 EBFONT ENOSTR ENODATA ETIME ENOSR ENONET ENOPKG EREMOTE ENOLINK EADV
		 ESRMNT ECOMM EPROTO EMULTIHOP EDOTDOT EBADMSG EOVERFLOW ENOTUNIQ
		 EBADFD EREMCHG ELIBACC ELIBBAD ELIBSCN ELIBMAX ELIBEXEC EILSEQ
		 ERESTART ESTRPIPE EUSERS ENOTSOCK EDESTADDRREQ EMSGSIZE EPROTOTYPE
		 ENOPROTOOPT EPROTONOSUPPORT ESOCKTNOSUPPORT EOPNOTSUPP EPFNOSUPPORT
		 EAFNOSUPPORT EADDRINUSE EADDRNOTAVAIL ENETDOWN ENETUNREACH ENETRESET
		 ECONNABORTED ECONNRESET ENOBUFS EISCONN ENOTCONN ESHUTDOWN
		 ETOOMANYREFS ETIMEDOUT ECONNREFUSED EHOSTDOWN EHOSTUNREACH EALREADY
		 EINPROGRESS ESTALE EUCLEAN ENOTNAM ENAVAIL EISNAM EREMOTEIO EDQUOT
		 ENOMEDIUM EMEDIUMTYPE ECANCELED ENOKEY EKEYEXPIRED EKEYREVOKED
		 EKEYREJECTED EOWNERDEAD ENOTRECOVERABLE


		 strerror errno)
  (import (chezscheme)
	  (srfi private include))

  (meta-cond
   [(memq (machine-type) '(a6le ta6le i3le ti3le))
    (include/resolve () "posix/errno-linux.ss")]
   [else
    (error 'posix.sls "unsupported machine-type ~a" (machine-type))])

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

Changes to socket.sls.

16
17
18
19
20
21
22

23
24
25
26
27
28
29
(library (socket)
  (export file-write file-read bytes-ready socket close
	  socket-domain socket-type-flag socket-type gethostbyname
	  connect/inet bind/inet listen accept)
  
  (import (except (chezscheme) bytevector-copy)
	  (posix)

	  (ffi-utils))

  (meta-cond
   [(memq (machine-type) '(a6le ta6le))
    
    (define-enumeration* socket-domain
      (unspec local inet ax25 ipx appletalk







>







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(library (socket)
  (export file-write file-read bytes-ready socket close
	  socket-domain socket-type-flag socket-type gethostbyname
	  connect/inet bind/inet listen accept)
  
  (import (except (chezscheme) bytevector-copy)
	  (posix)
	  (only (posix errno) EAGAIN EINTR)
	  (ffi-utils))

  (meta-cond
   [(memq (machine-type) '(a6le ta6le))
    
    (define-enumeration* socket-domain
      (unspec local inet ax25 ipx appletalk