private/security-guard.ss
(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)  ; (do not combine with other values)
     ))
  
  ;; use utf-8 strings
  (default-_string-type _string*/utf-8)
  
  ;; This kludge is only needed for pre 350.2 versions of mzscheme
  (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
                       ; who filename guards
                       (string? (union path? string?) (union symbol? (listof symbol?)) . => . void?)
                       (_fun _string _string _guards -> _void)]
                      
                      [security-check-network-client
                       ; who host portno
                       (string? string? integer? . => . void?)
                       (_fun _string _string _int -> _void)]
                      
                      [security-check-network-server
                       ; who portno
                       (string? integer? . => . void?)
                       (_fun _string (_int = 0) _int -> _void)]))
  )