986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ CDDL HEADER START
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ The contents of this file are subject to the terms of the
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ Common Development and Distribution License (the "License").
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ You may not use this file except in compliance with the License.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ or http://www.opensolaris.org/os/licensing.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ See the License for the specific language governing permissions
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ and limitations under the License.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ When distributing Covered Code, include this CDDL HEADER in each
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ file and include the License file at usr/src/OPENSOLARIS.LICENSE.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ If applicable, add the following below this CDDL HEADER, with the
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ fields enclosed by brackets "[]" replaced with your own identifying
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ information: Portions Copyright [yyyy] [name of copyright owner]
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ CDDL HEADER END
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\
c713350eb0c205161e2a4ab06cd996300721ac78John Johnson\
c713350eb0c205161e2a4ab06cd996300721ac78John Johnson\ Copyright 2009 Sun Microsystems, Inc. All rights reserved.
c713350eb0c205161e2a4ab06cd996300721ac78John Johnson\ Use is subject to license terms.
c713350eb0c205161e2a4ab06cd996300721ac78John Johnson\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjepurpose: HSFS file system support package for NewBoot
c713350eb0c205161e2a4ab06cd996300721ac78John Johnsoncopyright: Copyright 2009 Sun Microsystems, Inc. All Rights Reserved
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ High Sierra, Rock Ridge (CD-ROM) file system reader and boot block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjeheaders
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" /packages" get-package push-package
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjenew-device
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje fs-pkg$ device-name diag-cr?
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ HSFS variables
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value dev-ih
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value vol-desc
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value dir-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value sua-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value ce-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ HSFS volume descriptor routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ unaligned load of 2-byte item
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : xw@ ( adr -- n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup c@ swap char+ ( c0 adr+1 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje c@ ( c0 c1 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje bwjoin
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ unaligned store of 2-byte item
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : xw! ( n adr -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje swap wbsplit swap 2 pick c! swap char+ c!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ unaligned load of 4-byte item
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : xl@ ( adr -- n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup xw@ swap wa1+ ( w0 adr+2 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje xw@ ( w0 w1 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje wljoin
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ unaligned store of 4-byte item
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : xl! ( n adr -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje swap lwsplit swap 2 pick xw! swap wa1+ xw!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje d# 2048 constant /sector
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje d# 16 constant vol-desc-sector# ( -- n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : +vd ( index -- adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje vol-desc 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." invalid access of +vd" cr abort
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje vol-desc +
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : root-dir ( -- n ) d# 156 +vd ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : /block ( -- n ) d# 128 +vd xw@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : byte>blkoff ( byte-off -- block-off ) /block mod ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-vol-desc ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje vol-desc /sector vol-desc-sector# /sector * dev-ih read-disk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : read-fs-blocks ( adr len fs-blk# -- ) /block * dev-ih read-disk ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ HSFS directory routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Current directory variables.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable cdir-blk \ Current directory device block ptr.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable cdir-blk0 \ Current directory block0.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable cdir-offset \ Current directory logical offset.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable cdir-size \ Current directory logical size.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable cdir-ptr \ Current directory entry pointer.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false instance value cdir-rescan \ Rescan current directory for symlink.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Access of current directory entry.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : +dr ( n -- adr ) cdir-ptr @ + ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-entrylen ( -- n ) d# 0 +dr c@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-block0 ( -- n ) d# 2 +dr xl@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-filesize ( -- n ) d# 10 +dr xl@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-flags ( -- n ) d# 25 +dr c@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-filenamelen ( -- n ) d# 32 +dr c@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-filename ( -- adr ) d# 33 +dr ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-isdir? ( -- flag ) dir-flags h# 02 and 0<> ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-file$ ( -- adr len ) dir-filename dir-filenamelen ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-sualen ( -- len ) dir-entrylen d# 33 - dir-filenamelen - ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj \ ISO name, including dot & dot-dot check
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj : dir-iso$ ( -- adr len )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj dir-filenamelen 1 = if
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj dir-filename c@ ( name[0] )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj dup 0= if
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj drop " ." exit ( dot )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj then
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj 1 = if ( )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj " .." exit ( dot-dot )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj then
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj then
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj dir-file$ ( name$ )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj ;
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false instance value symlink?
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-dirblk ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-buf /block cdir-blk @ read-fs-blocks
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 1 cdir-blk +!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : froot ( -- ) root-dir cdir-ptr ! ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ SUAs - System Use Area in directory entry (Rock Ridge
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Extensions to High Sierra/ISO 9660 Format).
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Immediately follows directory entry name rounded up to
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ a half-word boundary.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value sua-ptr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value sua-len
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : +suf ( n -- adr ) sua-ptr + ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-sig ( -- adr len ) sua-ptr 2 ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-len ( -- len ) 2 +suf c@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-dat ( -- data ) 5 +suf ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-ce-lbn ( -- lbn ) 4 +suf xl@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-ce-offset ( -- offset ) d# 12 +suf xl@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-ce-len ( -- len ) d# 20 +suf xl@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : init-sua ( -- )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj dir-file$ + /w roundup to sua-ptr
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj dir-sualen to sua-len
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : next-suf ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje sua-len suf-len - to sua-len
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-len +suf to sua-ptr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : end-sua ( -- end? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje sua-len 4 <
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-nm$ ( -- adr len ) suf-dat suf-len 5 - ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Continuation suffix handling. When a 'CE' suffix is seen,
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ record the CE parameters (logical block#, offset and length
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ of continuation). We process the CE continuation only after
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ we've finished processing the current SUA area.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable ce-lbn
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable ce-offset
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable ce-len
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-ce-set ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-ce-lbn ce-lbn !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-ce-offset ce-offset !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-ce-len ce-len !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-ce-process ( -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ce-lbn @ 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje sua-buf ce-len @ ce-lbn @ read-fs-blocks
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje sua-buf to sua-ptr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ce-len @ to sua-len
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 ce-len ! 0 ce-lbn ! 0 ce-offset !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /buf-len instance buffer: suf-sl-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false instance value symlink-need-sep
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Format of Rock Ridge symlinks needs to be munged to unix-style
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ name. Format is: <flag><nbytes>file-name<flag><nbytes>filename...
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ where \ <flag> is flag byte (0=filename, 2=current dir, 4=parent
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ dir, 8=root dir) and <nbytes> is one-byte byte count (zero for
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ !filename).
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : suf-copy-to-symlinkbuf ( name$ -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false to symlink-need-sep
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-sl-buf -rot bounds do ( dst )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje symlink-need-sep if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ascii / over c! char+
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true to symlink-need-sep
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje i c@ dup 2 = if ( dst 2 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ CURRENT (".")
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop ascii . over c! char+ 2 ( dst' inc )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else dup 4 = if ( dst 4 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ PARENT ("..")
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop " .." 2 pick swap move ( dst )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje wa1+ 2 ( dst' inc )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else dup 8 = if ( dst 8 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ ROOT ("/")
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop ascii / over c! char+ 2 ( dst' inc )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false to symlink-need-sep
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else dup 0<> if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." unknown SL flag: " .x cr abort
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else ( dst c )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop ( dst )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje i char+ dup c@ >r ( dst src+1 R:nbytes )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje char+ over r@ move ( dst R:nbytes )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje r@ + ( dst' R:nbytes )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje r> wa1+ ( dst' inc )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then then then then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje +loop ( dst )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 swap c!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Saved 'NM' prefix buffer.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /buf-len instance buffer: suf-nm-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value suf-nm-size
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Return the Rock Ridge file name associated with the current
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ dirent ('NM' suffix). Otherwise returns standard iso filename.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Marks whether returned filename is a symbolic link ('SL' suffix)
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ and also processes continuations ('CE' suffix).
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : rr-file$ ( -- adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false to symlink?
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 to suf-nm-size
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ select start of sua, record sua offset
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje init-sua
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje end-sua if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-ce-process if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-nm-size if
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj suf-nm-buf suf-nm-size ( NM$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj dir-iso$ ( iso$ )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj then ( file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-sig ( sig-adr sig-len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup " NM" $= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-nm$ to suf-nm-size ( sig-adr sig-len suf-nm-adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-nm-buf suf-nm-size move
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( sig-adr sig-len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup " SL" $= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true to symlink?
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-nm$ suf-copy-to-symlinkbuf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup " CE" $= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-ce-set
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( sig-adr sig-len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop next-suf ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje again
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ HSFS high-level routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Used for rescanning current directory for symbolic links.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Initializes current directory settings from current directory
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ entry pointer or for rescan. If it's not a rescan, we have
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ access to the actual directory entry, so we can check whether
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ it's a directory or not here.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : init-dent ( -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cdir-rescan if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false to cdir-rescan
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cdir-blk0 @ cdir-blk !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-isdir? 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-block0 dup cdir-blk ! cdir-blk0 !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-filesize cdir-size !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( blk0 size )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 cdir-offset !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-dent ( -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Check for end of directory, return true if we're past the EOF.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cdir-offset @ cdir-size @ >= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ If we're at a block boundary, get the next block. Otherwise
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ increment the directory pointer.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cdir-offset @ byte>blkoff 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje get-dirblk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-buf cdir-ptr !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-entrylen cdir-ptr +!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ If dir-entrylen is not zero, increment the current directory
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ file offset. Otherwise, a dir-entrylen of zero indicates
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ the end of a dir block, so round up cdir-offset to fetch the
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ next one
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-entrylen ?dup if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cdir-offset +! true
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cdir-offset @ /block roundup cdir-offset !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje until false
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Look through current directory for file name 'file$'.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Will leave current directory entry (cdir-ptr) pointing
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ to matched entry on success.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dirlook ( file$ -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje init-dent if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin get-dent 0= while ( file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup rr-file$ $= if ( file$ )
629270abbcc9bcad8f09aeb9500f67a1933334d1jgj 2drop false exit ( succeeded )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje repeat 2drop true ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /buf-len instance buffer: symlink-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : symlink-buf$ ( -- path$ ) symlink-buf cscount ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : follow-symlink ( tail$ -- tail$' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ copy symlink value (plus null) to buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje suf-sl-buf cscount 1+ symlink-buf swap move
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje false to symlink?
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ append to current path
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ?dup if ( tail$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje " /" symlink-buf$ $append ( tail$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje symlink-buf$ $append ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else drop then ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje symlink-buf$ ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje over c@ ascii / = if ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje froot str++ ( path$' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true to cdir-rescan
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : lookup ( path$ -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje over c@ ascii / = if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje froot str++ ( path$' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ascii / left-parse-string ( path$ file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup while ( path$ file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dirlook if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop true exit ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje symlink? if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje follow-symlink ( path$' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje repeat ( path$ file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop 2drop false ( succeeded )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ HSFS installation routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Allocate memory for necessary data structures. Need to
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ read volume desriptor sector in order to get /block value.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : initialize ( -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /sector mem-alloc to vol-desc
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje get-vol-desc
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /block mem-alloc to dir-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /block mem-alloc to sua-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /block mem-alloc to ce-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : release-buffers ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ce-buf /block mem-free
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje sua-buf /block mem-free
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-buf /block mem-free
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje vol-desc /sector mem-free
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 to vol-desc
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ HSFS file interface
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje struct
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /x field >filesize
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /x field >offset
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /x field >block0
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje constant /file-record
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje d# 10 constant #opens
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje #opens /file-record * constant /file-records
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /file-records instance buffer: file-records
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje -1 instance value current-fd
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : fd>record ( fd -- record ) /file-record * file-records + ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : set-fd ( fd -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup 0 #opens 1 - between 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop true exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup fd>record >block0 x@ 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop true exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje to current-fd false
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : file-offset@ ( -- off )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-fd fd>record >offset x@
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : file-offset! ( off -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-fd fd>record >offset x!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : file-size@ ( -- size )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-fd fd>record >filesize x@
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : file-size! ( size -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-fd fd>record >filesize x!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : file-block0@ ( -- block0 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-fd fd>record >block0 x@
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : file-block0! ( block0 -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-fd fd>record >block0 x!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-slot ( -- fd false | true )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje #opens 0 do
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje i fd>record >block0 x@ 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje i false unloop exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje loop true
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : free-slot ( fd -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje set-fd 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 file-offset!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 file-size!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 file-block0!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ initializes the open structure with information from
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ the inode (on UFS) or directory entry (from HSFS).
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : init-fd ( fd -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje to current-fd
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-block0 file-block0!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-filesize file-size!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 file-offset!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje external
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : open ( -- okay? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje my-args dev-open dup 0= if ( 0 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje exit ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then to dev-ih
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje initialize froot
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje file-records /file-records erase
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true ( succeeded )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : close ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dev-ih dev-close
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje release-buffers
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : open-file ( path$ -- fd true | false )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje get-slot if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop false exit ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then -rot ( fd path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje lookup if ( fd )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop false exit ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup init-fd true ( fd success )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : close-file ( fd -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje free-slot ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : read-file ( adr len fd -- #read )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Check if fd is valid, if it is set current-fd.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje set-fd if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop 0 exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Adjust len if less than len bytes remain.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje file-size@ file-offset@ - min ( adr len' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Check for invalid length read.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup 0<= if 2drop 0 exit then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ Compute physical device byte offset.
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje tuck ( len adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje file-block0@ /block * file-offset@ + ( len adr len off )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dev-ih read-disk ( #read )
2a55f96f316db08eb5801e122b96b149215c5095John Johnson dup file-offset@ + file-offset!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : seek-file ( off fd -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje set-fd if ( off )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop false exit ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( off )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup file-size@ > if ( off )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop false exit ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( off )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup file-offset! true ( off succeeded )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : size-file ( fd -- size )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje set-fd if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje file-size@
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ we don't support compression (yet)
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : cinfo-file ( fd -- bsize fsize comp? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje set-fd if 0 0 0 else /block file-size@ 0 then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ read ramdisk fcode at rd-offset
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-rd ( adr len -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje rd-offset dev-ih read-disk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ no additional props needed for hsfs
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : bootprop ( -- ) false ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ debug words
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : chdir ( path$ -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup lookup if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje type ." Not found" cr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-isdir? 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje type ." Not a directory" cr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje type
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." blk0 "
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cdir-blk0 @ .x
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." size "
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cdir-size @ .x
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje init-dent
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin get-dent 0= while
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje rr-file$ type
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." flags " dir-flags .x
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." blk0 " dir-block0 .x
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." size " dir-filesize .x
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje repeat
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true to cdir-rescan
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjefinish-device
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjepop-package
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje