~ chicken-core (master) /posix.scm
Trap1;;;; posix.scm - Platform-specific routines2;3; Copyright (c) 2008-2022, The CHICKEN Team4; Copyright (c) 2000-2007, Felix L. Winkelmann5; All rights reserved.6;7; Redistribution and use in source and binary forms, with or without8; modification, are permitted provided that the following conditions are9; met:10;11; Redistributions of source code must retain the above copyright12; notice, this list of conditions and the following disclaimer.13;14; Redistributions in binary form must reproduce the above copyright15; notice, this list of conditions and the following disclaimer in the16; documentation and/or other materials provided with the distribution.17;18; Neither the name of the author nor the names of its contributors may19; be used to endorse or promote products derived from this software20; without specific prior written permission.21;22; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS23; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT24; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR25; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT26; HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,27; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,28; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS29; OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND30; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR31; TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE32; USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH33; DAMAGE.343536(declare37 (unit posix)38 (uses scheduler pathname extras port lolevel)39 (disable-interrupts)40 (not inline ##sys#interrupt-hook ##sys#user-interrupt-hook))414243(module chicken.file.posix44 (create-fifo create-symbolic-link read-symbolic-link45 duplicate-fileno fcntl/dupfd fcntl/getfd fcntl/getfl fcntl/setfd46 fcntl/setfl file-access-time file-change-time file-modification-time47 file-close file-control file-creation-mode file-group file-link48 file-lock file-lock/blocking file-mkstemp file-open file-owner49 file-permissions file-position file-read file-select file-size50 file-stat file-truncate file-unlock file-write51 file-type block-device? character-device? directory? fifo?52 regular-file? socket? symbolic-link?53 fileno/stderr fileno/stdin fileno/stdout54 open-input-file* open-output-file*55 open/append open/binary open/creat open/excl open/fsync open/noctty56 open/noinherit open/nonblock open/rdonly open/rdwr open/read57 open/sync open/text open/trunc open/write open/wronly58 perm/irgrp perm/iroth perm/irusr perm/irwxg perm/irwxo perm/irwxu59 perm/isgid perm/isuid perm/isvtx perm/iwgrp perm/iwoth perm/iwusr60 perm/ixgrp perm/ixoth perm/ixusr61 port->fileno set-file-group! set-file-owner!62 set-file-permissions! set-file-position! set-file-times!63 seek/cur seek/set seek/end)6465(import scheme)6667;; These are all set! inside the posix module68(define create-fifo)69(define create-symbolic-link)70(define read-symbolic-link)71(define duplicate-fileno)7273(define fcntl/dupfd)74(define fcntl/getfd)75(define fcntl/getfl)76(define fcntl/setfd)77(define fcntl/setfl)7879(define file-access-time)80(define file-change-time)81(define file-modification-time)82(define file-close)83(define file-control)84(define file-creation-mode)85(define file-group)86(define file-link)87(define file-lock)88(define file-lock/blocking)89(define file-mkstemp)90(define file-open)91(define file-owner)92(define file-permissions)93(define file-position)94(define file-read)95(define file-select)96(define file-size)97(define file-stat)98(define file-truncate)99(define file-unlock)100(define file-write)101(define file-type)102103(define block-device?)104(define character-device?)105(define directory?)106(define fifo?)107(define regular-file?)108(define socket?)109(define symbolic-link?)110111(define fileno/stderr)112(define fileno/stdin)113(define fileno/stdout)114115(define open-input-file*)116(define open-output-file*)117118(define open/append)119(define open/binary)120(define open/creat)121(define open/excl)122(define open/fsync)123(define open/noctty)124(define open/noinherit)125(define open/nonblock)126(define open/rdonly)127(define open/rdwr)128(define open/read)129(define open/sync)130(define open/text)131(define open/trunc)132(define open/write)133(define open/wronly)134135(define perm/irgrp)136(define perm/iroth)137(define perm/irusr)138(define perm/irwxg)139(define perm/irwxo)140(define perm/irwxu)141(define perm/isgid)142(define perm/isuid)143(define perm/isvtx)144(define perm/iwgrp)145(define perm/iwoth)146(define perm/iwusr)147(define perm/ixgrp)148(define perm/ixoth)149(define perm/ixusr)150151(define port->fileno)152153(define seek/cur)154(define seek/end)155(define seek/set)156157(define set-file-group!)158(define set-file-owner!)159(define set-file-permissions!)160(define set-file-position!)161(define set-file-times!)162) ; chicken.file.posix163164165(module chicken.time.posix166 (seconds->utc-time utc-time->seconds seconds->local-time167 seconds->string local-time->seconds string->time time->string168 local-timezone-abbreviation)169170(import scheme)171172;; These are all set! inside the posix module173(define seconds->utc-time)174(define utc-time->seconds)175(define seconds->local-time)176(define seconds->string)177(define local-time->seconds)178(define string->time)179(define time->string)180(define local-timezone-abbreviation)181) ; chicken.time.posix182183184(module chicken.process185 (qs system system* process-execute process-fork process-run186 process-signal process-spawn process-wait call-with-input-pipe187 call-with-output-pipe close-input-pipe close-output-pipe create-pipe188 open-input-pipe open-output-pipe with-input-from-pipe189 with-output-to-pipe process process* process-sleep pipe/buf190 spawn/overlay spawn/wait spawn/nowait spawn/nowaito spawn/detach191 process? process-exit-status process-returned-normally? process-input-port192 process-output-port process-error-port process-id)193194(import scheme chicken.base chicken.fixnum chicken.platform)195196197;;; Execute a shell command:198199(define (system cmd)200 (##sys#check-string cmd 'system)201 (let ((r (##core#inline "C_execute_shell_command" cmd)))202 (cond ((fx< r 0)203 (##sys#signal-hook/errno204 #:process-error (##sys#update-errno) 'system "`system' invocation failed" cmd))205 (else r))))206207;;; Like `system', but bombs on nonzero return code:208209(define (system* str)210 (let ((n (system str)))211 (unless (zero? n)212 (##sys#error "shell invocation failed with non-zero return status" str n))))213214215;;; Quote string for shell:216217(define (qs str #!optional (platform (software-version)))218 (let* ((delim (if (eq? platform 'mingw) #\" #\'))219 (escaped (if (eq? platform 'mingw) "\"\"" "'\\''"))220 (escaped-parts221 (map (lambda (c)222 (cond223 ((char=? c delim) escaped)224 ((char=? c #\nul)225 (error 'qs "NUL character can not be represented in shell string" str))226 (else (string c))))227 (string->list str))))228 (string-append229 (string delim)230 (apply string-append escaped-parts)231 (string delim))))232233234;; These are all set! inside the posix module235(define process-execute)236(define process-fork)237(define process-run)238(define process-signal)239(define process-spawn)240(define process-wait)241242(define call-with-input-pipe)243(define call-with-output-pipe)244(define close-input-pipe)245(define close-output-pipe)246(define create-pipe)247(define open-input-pipe)248(define open-output-pipe)249(define with-input-from-pipe)250(define with-output-to-pipe)251252(define process)253(define process*)254(define process-sleep)255256(define process?)257(define process-exit-status)258(define process-returned-normally?)259(define process-input-port)260(define process-output-port)261(define process-error-port)262(define process-id)263264(define pipe/buf)265266(define spawn/overlay)267(define spawn/wait)268(define spawn/nowait)269(define spawn/nowaito)270(define spawn/detach)271) ; chicken.process272273274(module chicken.process.signal275 (set-alarm! set-signal-mask!276 make-signal-handler signal-ignore signal-default277 set-signal-handler! signal-handler ; DEPRECATED278 signal-mask signal-mask! signal-masked? signal-unmask!279 signal/abrt signal/alrm signal/break signal/bus signal/chld280 signal/cont signal/fpe signal/hup signal/ill signal/int signal/io281 signal/kill signal/pipe signal/prof signal/quit signal/segv282 signal/stop signal/term signal/trap signal/tstp signal/urg283 signal/usr1 signal/usr2 signal/vtalrm signal/winch signal/xcpu284 signal/xfsz signals-list)285286(import scheme)287288;; These are all set! inside the posix module289(define set-alarm!)290(define set-signal-handler!) ; DEPRECATED291(define set-signal-mask!)292(define signal-handler) ; DEPRECATED293(define make-signal-handler)294(define signal-ignore)295(define signal-default)296297(define signal-mask)298(define signal-mask!)299(define signal-masked?)300(define signal-unmask!)301302(define signal/abrt)303(define signal/alrm)304(define signal/break)305(define signal/bus)306(define signal/chld)307(define signal/cont)308(define signal/fpe)309(define signal/hup)310(define signal/ill)311(define signal/int)312(define signal/io)313(define signal/kill)314(define signal/pipe)315(define signal/prof)316(define signal/quit)317(define signal/segv)318(define signal/stop)319(define signal/term)320(define signal/trap)321(define signal/tstp)322(define signal/urg)323(define signal/usr1)324(define signal/usr2)325(define signal/vtalrm)326(define signal/winch)327(define signal/xcpu)328(define signal/xfsz)329330(define signals-list)331) ; chicken.process.signal332333334(module chicken.process-context.posix335 (change-directory* set-root-directory!336 current-effective-group-id current-effective-user-id337 current-process-id current-group-id current-user-id338 parent-process-id current-user-name339 current-effective-user-name create-session340 process-group-id user-information)341342(import scheme)343344(define change-directory*)345(define set-root-directory!)346(define current-effective-group-id)347(define current-effective-user-id)348(define current-group-id)349(define current-user-id)350(define current-process-id)351(define parent-process-id)352(define current-user-name)353(define current-effective-user-name)354(define create-session)355(define process-group-id)356(define user-information)357) ; chicken.process-context.posix358359360;; This module really exports nothing. It is used to keep all the361;; posix stuff in one place, in a clean namespace. The included file362;; will set! values from the modules defined above.363(module chicken.posix ()364365(import scheme366 chicken.base367 chicken.bitwise368 chicken.condition369 chicken.fixnum370 chicken.foreign371 chicken.memory372 chicken.pathname373 chicken.port374 chicken.process-context375 chicken.time)376377(cond-expand378 (platform-unix379 (include "posixunix.scm"))380 (platform-windows381 (include "posixwin.scm")))382383) ; chicken.posix [internal, no implib generated]384385386(module chicken.errno *387(import scheme)388(define (errno) (##sys#errno))389(define errno/2big _e2big)390(define errno/acces _eacces)391(define errno/again _eagain)392(define errno/badf _ebadf)393(define errno/busy _ebusy)394(define errno/child _echild)395(define errno/deadlk _edeadlk)396(define errno/dom _edom)397(define errno/exist _eexist)398(define errno/fault _efault)399(define errno/fbig _efbig)400(define errno/ilseq _eilseq)401(define errno/intr _eintr)402(define errno/inval _einval)403(define errno/io _eio)404(define errno/isdir _eisdir)405(define errno/mfile _emfile)406(define errno/mlink _emlink)407(define errno/nametoolong _enametoolong)408(define errno/nfile _enfile)409(define errno/nodev _enodev)410(define errno/noent _enoent)411(define errno/noexec _enoexec)412(define errno/nolck _enolck)413(define errno/nomem _enomem)414(define errno/nospc _enospc)415(define errno/nosys _enosys)416(define errno/notdir _enotdir)417(define errno/notempty _enotempty)418(define errno/notty _enotty)419(define errno/nxio _enxio)420(define errno/perm _eperm)421(define errno/pipe _epipe)422(define errno/range _erange)423(define errno/rofs _erofs)424(define errno/spipe _espipe)425(define errno/srch _esrch)426(define errno/wouldblock _ewouldblock)427(define errno/xdev _exdev)428) ; chicken.errno