(module security-guard mzscheme
(require
"ffi-utils.ss"
(all-except (lib "contract.ss") ->)
(rename (lib "contract.ss") => ->)
(lib "foreign.ss")
(lib "filename-version.ss" "dynext"))
(provide
security-check-file
security-check-network-client
security-check-network-server)
(define _guards
(_bitmask
'(SCHEME-GUARD-FILE-NONE = #x0
SCHEME-GUARD-FILE-READ = #x1
SCHEME-GUARD-FILE-WRITE = #x2
SCHEME-GUARD-FILE-EXECUTE = #x4
SCHEME-GUARD-FILE-DELETE = #x8
SCHEME-GUARD-FILE-EXISTS = #x10) ))
(default-_string-type _string*/utf-8)
(define (ffi-lib-xxxxxxx name)
(let* ([f (format "~a~a" name filename-version-part)])
(or (with-handlers ([exn? (lambda (x) #f)])
(ffi-lib (format "~a~a" name filename-version-part)))
(ffi-lib (format "~axxxxxxx" name)))))
(define 3m? (regexp-match #rx#"3m" (path->bytes (system-library-subpath))))
(define mzscm (case (system-type)
[(unix) (ffi-lib #f)]
[(windows) (ffi-lib-xxxxxxx (format "libmzsch~a" (if 3m? "3m" "")))]))
(ffi-func/contract mzscm
(("-" "_") ("^" "scheme_")("_client$" "") ("_server$" ""))
([security-check-file
(string? (union path? string?) (union symbol? (listof symbol?)) . => . void?)
(_fun _string _string _guards -> _void)]
[security-check-network-client
(string? string? integer? . => . void?)
(_fun _string _string _int -> _void)]
[security-check-network-server
(string? integer? . => . void?)
(_fun _string (_int = 0) _int -> _void)]))
)