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\ Copyright 2009 Sun Microsystems, Inc. All rights reserved.
c713350eb0c205161e2a4ab06cd996300721ac78John Johnson\ Use is subject to license terms.
c713350eb0c205161e2a4ab06cd996300721ac78John Johnson\
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjepurpose: UFS file system support package
c713350eb0c205161e2a4ab06cd996300721ac78John Johnsoncopyright: Copyright 2009 Sun Microsystems, Inc. All Rights Reserved
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjeheaders
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje" /packages" get-package push-package
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjenew-device
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje fs-pkg$ device-name diag-cr?
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ UFS low-level block routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje h# 2000 constant /max-bsize
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje d# 512 constant /disk-block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value dev-ih
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value temp-block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : blk>byte ( block# -- byte# ) /disk-block * ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : read-disk-blocks ( adr len dev-block# -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje blk>byte dev-ih read-disk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ UFS superblock routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje d# 512 constant /super-block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje d# 16 constant super-block#
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value super-block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : +sb ( index -- value ) super-block swap la+ l@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : iblkno ( -- n ) d# 04 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : cgoffset ( -- n ) d# 06 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : cgmask ( -- n ) d# 07 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : bsize ( -- n ) d# 12 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : fragshift ( -- n ) d# 24 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : fsbtodbc ( -- n ) d# 25 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : inopb ( -- n ) d# 30 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : ipg ( -- n ) d# 46 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : fpg ( -- n ) d# 47 +sb ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : /frag ( -- fragsize ) bsize fragshift rshift ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-super-block ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje super-block /super-block super-block# read-disk-blocks
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : cgstart ( cg -- block# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup cgmask invert and cgoffset * swap fpg * +
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : cgimin ( cg -- block# ) cgstart iblkno + ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : blkstofrags ( #blocks -- #frags ) fragshift lshift ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : lblkno ( byte-off -- lblk# ) bsize / ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : blkoff ( byte-off -- blk-off ) bsize mod ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : fsbtodb ( fs-blk# -- dev-blk# ) fsbtodbc lshift ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : read-fs-blocks ( adr len fs-blk# -- ) fsbtodb read-disk-blocks ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ UFS inode routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje h# 80 constant /inode
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value inode
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value iptr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : itoo ( i# -- offset ) inopb mod ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : itog ( i# -- group ) ipg / ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : itod ( i# -- block# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup itog cgimin swap ipg mod inopb / blkstofrags +
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : +i ( n -- adr ) iptr + ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : ftype ( -- n ) 0 +i w@ h# f000 and ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir? ( -- flag ) ftype h# 4000 = ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : symlink? ( -- flag ) ftype h# a000 = ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : regular? ( -- flag ) ftype h# 8000 = ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : file-size ( -- n ) 8 +i x@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : direct0 ( -- adr ) d# 40 +i ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : indirect0 ( -- adr ) d# 88 +i ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : indirect1 ( -- adr ) d# 92 +i ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : indirect2 ( -- adr ) d# 96 +i ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : comp? ( -- flag ) d# 100 +i l@ 4 and 0<> ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value current-file
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : iget ( i# -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup temp-block bsize rot itod ( i# adr len blk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje read-fs-blocks
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup itoo /inode * temp-block + inode /inode move
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje inode to iptr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje to current-file ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : l@++ ( ptr -- value ) dup @ l@ /l rot +! ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje d# 12 constant #direct
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : #blk-addr/blk bsize /l / ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : #sgl-addr #blk-addr/blk ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : #dbl-addr #sgl-addr #blk-addr/blk * ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ : #tri-addr #dbl-addr #blk-addr/blk * ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : >1-idx ( blk# -- idx ) #blk-addr/blk mod ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : >2-idx ( blk# -- idx ) #sgl-addr / >1-idx ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ : >3-idx ( blk# -- idx ) #dbl-addr / >1-idx ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ indirect block cache
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ we assume reads will mostly be sequential, and only
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ cache the current indirect block tree
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-indir ( fs-blk# var adr -- adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje -rot dup >r @ over = if ( adr fs-blk# r: var )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje r> 2drop exit ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( adr fs-blk# r: var )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup bsize swap read-fs-blocks ( adr fs-blk# r: var )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje r> ! ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value indir0-adr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable cur-indir0
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-indir0 ( fs-blk# -- adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cur-indir0 indir0-adr get-indir
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value indir1-adr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable cur-indir1
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-indir1 ( fs-blk# -- adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje cur-indir1 indir1-adr get-indir
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ blkptr and blklim point to an array of blk#s,
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ whether in the inode direct block array or in
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ an indirect block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable blkptr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable blklim
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : (bmap) ( lblk# -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup #direct < if ( lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje direct0 swap la+ blkptr ! ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje direct0 #direct la+ blklim !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje #direct - ( lblk#' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup #sgl-addr < if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje indirect0 l@ get-indir0 ( lblk# adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje tuck swap >1-idx la+ blkptr ! ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje #blk-addr/blk la+ blklim !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje #sgl-addr - ( lblk#' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup #dbl-addr < if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje indirect1 l@ get-indir0 ( lblk# adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje over >2-idx la+ l@ get-indir1 ( lblk# adr' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje tuck swap >1-idx la+ blkptr ! ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje #blk-addr/blk la+ blklim ! ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ #dbl-addr - ( lblk#' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ dup #tri-addr < if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ indirect2 l@ get-indir0 ( lblk# adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ over >3-idx la+ l@ get-indir1 ( lblk# adr' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ over >2-idx la+ l@ get-indir2 ( lblk# adr' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ tuck swap >1-idx la+ blkptr ! ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ #blk-addr/blk la+ blklim ! ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje\ then ( lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." file too large" cr drop true ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value cur-blk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : bmap ( lblk# -- fs-blk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup cur-blk <> blkptr @ blklim @ = or if ( lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup (bmap) ( lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 1+ to cur-blk ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje blkptr l@++ ( fs-blk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : read-one-block ( adr block# -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje bmap ?dup if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje bsize swap read-fs-blocks
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje bsize erase
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : read-partial-block ( adr len off block# -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje bmap ?dup if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje fsbtodb blk>byte + ( adr len byte# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dev-ih read-disk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop erase
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ UFS directory routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable dir-blk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable totoff
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje instance variable dirptr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value dir-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-dirblk ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-buf bsize dir-blk @ bmap ( adr len fs-blk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje read-fs-blocks ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 1 dir-blk +!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2 constant rootino
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : +d ( n -- adr ) dirptr @ + ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-ino ( -- adr ) 0 +d l@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : reclen ( -- adr ) 4 +d w@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : namelen ( -- adr ) 6 +d w@ ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-name ( -- adr ) 8 +d ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir-name$ ( -- file$ ) dir-name namelen ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ UFS high-level routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ After this point, the code should be independent of the disk format!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 instance value search-dir
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : init-dent
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 totoff ! 0 dir-blk !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-file to search-dir
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : get-dent ( -- end-of-dir? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje totoff @ file-size >= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje totoff @ blkoff 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje get-dirblk
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-buf dirptr !
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje reclen dirptr +!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje reclen totoff +!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-ino 0<>
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje until false
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dirlook ( file$ -- not-found? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje init-dent
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin get-dent 0= while ( file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup dir-name$ $= if ( file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-ino iget ( file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop false exit ( found )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje repeat 2drop true ( not-found )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje h# 200 constant /fpath-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /fpath-buf instance buffer: fpath-buf
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : clr-fpath-buf ( -- ) fpath-buf /fpath-buf erase ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : fpath-buf$ ( -- path$ ) fpath-buf cscount ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : follow-symlink ( tail$ -- tail$' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje clr-fpath-buf ( tail$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje fpath-buf file-size 0 0 read-partial-block ( tail$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ?dup if ( tail$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje " /" fpath-buf$ $append ( tail$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje fpath-buf$ $append ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else drop then ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje fpath-buf$ ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje over c@ ascii / = if ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje str++ rootino ( path$' i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje search-dir ( path$ i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( path$ i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje iget ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : lookup ( path$ -- not-found? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje over c@ ascii / = if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje str++ rootino ( path$' i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-file ( path$ i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( path$ i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje iget ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ascii / left-parse-string ( path$ file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup while
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir? 0= if 2drop true exit then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dirlook if 2drop true exit then ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje symlink? if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje follow-symlink ( path$' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( path$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje repeat ( path$ file$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop 2drop false ( succeeded )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : i#>name ( i# -- name$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje init-dent ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin get-dent 0= while ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup dir-ino = if ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje drop dir-name$ exit ( name$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje repeat drop " ???" ( name$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ UFS installation routines
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /max-bsize 4 *
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /super-block +
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /inode +
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje constant alloc-size
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ **** Allocate memory for necessary data structures
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : allocate-buffers ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje alloc-size mem-alloc dup 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." no memory" abort
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup to temp-block /max-bsize + ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup to dir-buf /max-bsize + ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup to indir0-adr /max-bsize + ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup to indir1-adr /max-bsize + ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup to super-block /super-block + ( adr )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje to inode ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : release-buffers ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje temp-block alloc-size mem-free
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ UFS file interface
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje struct
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /x field >busy
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /x field >offset
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje /inode field >inode
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 : fd>record ( fd -- record ) /file-record * file-records + ;
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 : get-slot ( -- fd false | true )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje #opens 0 do
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje i fd>record >busy x@ 0= if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje i false unloop exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje loop true
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : free-slot ( fd -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 swap fd>record >busy x!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : init-fd ( fd -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje fd>record ( rec )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup >busy 1 swap x!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup >inode inode swap /inode move
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje >offset 0 swap x!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : set-fd ( fd -- error? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup fd>record dup >busy x@ 0= if ( fd rec )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop true exit ( failed )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje >inode to iptr ( fd )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje to current-fd false ( succeeded )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ get current lblk# and offset within it
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : file-blk+off ( -- off block# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje file-offset@ dup blkoff swap lblkno
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ advance file io stack by n
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : fio+ ( # adr len n -- #+n adr+n len-n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup file-offset@ + file-offset!
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup >r - -rot ( len' # adr r: n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje r@ + -rot ( adr' len' # r: n )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje r> + -rot ( #' adr' len' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : (cwd) ( i# -- ) tokenizer[ reveal ]tokenizer
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup rootino <> if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ open parent, find current name
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje " .." lookup drop
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje i#>name ( name$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ recurse to print path components above
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-file (cwd) ( name$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ and print this component
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje type ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje else drop then ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ slash is both root name and separator
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." /"
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 allocate-buffers
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje get-super-block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje file-records /file-records erase
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje true ( succeeded )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : close ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dev-ih dev-close
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 to dev-ih
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 succeeded )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : close-file ( fd -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje free-slot ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : size-file ( fd -- size )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje set-fd if 0 else file-size then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : seek-file ( off fd -- off true | false )
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 : read-file ( adr len fd -- #read )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje set-fd if ( adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2drop 0 exit ( 0 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje regular? 0= if 2drop 0 exit then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ adjust len if reading past eof
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup file-offset@ + file-size > if
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup file-offset@ + file-size - -
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup 0= if nip exit then
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 0 -rot ( #read adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ initial partial block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje file-offset@ blkoff ?dup if ( #read adr len off )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje bsize swap - over min ( #read adr len len' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 3dup nip file-blk+off ( #read adr len len' adr len' off lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje read-partial-block ( #read adr len len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje fio+ ( #read' adr' len' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( #read adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup lblkno 0 ?do ( #read adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje over file-blk+off nip ( #read adr len adr lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje read-one-block ( #read adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje bsize fio+ ( #read' adr' len' )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje loop ( #read adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ final partial block
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup if ( #read adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje 2dup file-blk+off ( #read adr len adr len off lblk# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje read-partial-block ( #read adr len )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup fio+ ( #read' adr' 0 )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then 2drop ( #read )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : cinfo-file ( fd -- bsize fsize comp? )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje set-fd if 0 0 0 else bsize file-size comp? 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 ufs
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : bootprop ( -- ) false ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje \ debug words
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje headers
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : chdir ( dir$ -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-file -rot ( i# dir$ )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje lookup if ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje to current-file ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." no such dir" cr exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir? 0= if ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje to current-file ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ." not a dir" cr exit
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje then drop ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : dir ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-file iget
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje init-dent
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje begin get-dent 0= while
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dir-name$ type cr
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje repeat
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje : cwd ( -- )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje current-file ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje dup (cwd) cr ( i# )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje iget ( )
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje ;
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setje
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjefinish-device
986fd29a0dc13f7608ef7f508f6e700bd7bc2720setjepop-package