[comp.os.minix] V1.3c posting #10 - fs

ast@cs.vu.nl (Andy Tanenbaum) (09/28/88)

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 17
X-rw-r--r--  1 ast          4197 Sep 27 15:12 at_makefile
X-rw-r--r--  1 ast          2585 Sep 27 15:12 inode.c.cdif
X-rw-r--r--  1 ast          1449 Sep 27 15:12 link.c.cdif
X-rw-r--r--  1 ast          4266 Sep 27 15:12 pc_makefile
X-rw-r--r--  1 ast          1736 Sep 27 15:12 read.c.cdif
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
295)	:;;
*)	echo 'Bad character count in ''LISTING' >&2
		echo 'Count should be 295' >&2
esac
echo Extracting 'at_makefile'
sed 's/^X//' > 'at_makefile' << '+ END-OF-FILE ''at_makefile'
X# On a PC, cpp and cem are in /lib and will be removed to make space while
X# linking the kernel.  On an AT, they are in /usr/lib are are not removed.
X# This is because they have to be in /lib on a PC; the diskette is too small
X# for them to be in /usr/lib.
X
XCFLAGS= -Di8088 -F -T.
Xh=../h
Xl=/usr/lib
X
Xobj =	main.s open.s read.s write.s pipe.s device.s \
X	path.s mount.s link.s super.s inode.s cache.s filedes.s \
X	stadir.s protect.s time.s misc.s utility.s table.s putc.s
X
Xfs:	makefile   $l/head.s $(obj) $l/libc.a $l/end.s
X	@echo "Start linking FS.  "
X	@asld  -o fs -T. $l/head.s $(obj) $l/libc.a $l/end.s
X	@echo "FS done.  "
X
Xclean:
X	rm -f $(obj)
X
Xcache.s:	const.h type.h $h/const.h $h/type.h
Xcache.s:	$h/error.h
Xcache.s:	buf.h
Xcache.s:	file.h
Xcache.s:	fproc.h
Xcache.s:	glo.h
Xcache.s:	inode.h
Xcache.s:	super.h
X
Xdevice.s:	const.h type.h $h/const.h $h/type.h
Xdevice.s:	$h/com.h
Xdevice.s:	$h/error.h
Xdevice.s:	dev.h
Xdevice.s:	file.h
Xdevice.s:	fproc.h
Xdevice.s:	glo.h
Xdevice.s:	inode.h
Xdevice.s:	param.h
X
Xfiledes.s:	const.h type.h $h/const.h $h/type.h
Xfiledes.s:	$h/error.h
Xfiledes.s:	file.h
Xfiledes.s:	fproc.h
Xfiledes.s:	glo.h
Xfiledes.s:	inode.h
X
Xinode.s:	const.h type.h $h/const.h $h/type.h
Xinode.s:	$h/error.h
Xinode.s:	buf.h
Xinode.s:	file.h
Xinode.s:	fproc.h
Xinode.s:	glo.h
Xinode.s:	inode.h
Xinode.s:	super.h
X
Xlink.s:		const.h type.h $h/const.h $h/type.h
Xlink.s:		$h/error.h
Xlink.s:		buf.h
Xlink.s:		file.h
Xlink.s:		fproc.h
Xlink.s:		glo.h
Xlink.s:		inode.h
Xlink.s:		param.h
X
Xmain.s:		const.h type.h $h/const.h $h/type.h
Xmain.s:		$h/callnr.h
Xmain.s:		$h/com.h
Xmain.s:		$h/error.h
Xmain.s:		buf.h
Xmain.s:		file.h
Xmain.s:		fproc.h
Xmain.s:		glo.h
Xmain.s:		inode.h
Xmain.s:		param.h
Xmain.s:		super.h
X
Xmisc.s:		const.h type.h $h/const.h $h/type.h
Xmisc.s:		$h/callnr.h
Xmisc.s:		$h/com.h
Xmisc.s:		$h/error.h
Xmisc.s:		buf.h
Xmisc.s:		file.h
Xmisc.s:		fproc.h
Xmisc.s:		glo.h
Xmisc.s:		inode.h
Xmisc.s:		param.h
Xmisc.s:		super.h
X
Xmount.s:	const.h type.h $h/const.h $h/type.h
Xmount.s:	$h/error.h
Xmount.s:	buf.h
Xmount.s:	file.h
Xmount.s:	fproc.h
Xmount.s:	glo.h
Xmount.s:	inode.h
Xmount.s:	param.h
Xmount.s:	super.h
X
Xopen.s:		const.h type.h $h/const.h $h/type.h
Xopen.s:		$h/callnr.h
Xopen.s:		$h/error.h
Xopen.s:		buf.h
Xopen.s:		file.h
Xopen.s:		fproc.h
Xopen.s:		glo.h
Xopen.s:		inode.h
Xopen.s:		param.h
X
Xpath.s:		const.h type.h $h/const.h $h/type.h
Xpath.s:		$h/error.h
Xpath.s:		buf.h
Xpath.s:		file.h
Xpath.s:		fproc.h
Xpath.s:		glo.h
Xpath.s:		inode.h
Xpath.s:		super.h
X
Xpipe.s:		const.h type.h $h/const.h $h/type.h
Xpipe.s:		$h/callnr.h
Xpipe.s:		$h/com.h
Xpipe.s:		$h/error.h
Xpipe.s:		$h/signal.h
Xpipe.s:		file.h
Xpipe.s:		fproc.h
Xpipe.s:		glo.h
Xpipe.s:		inode.h
Xpipe.s:		param.h
X
Xprotect.s:	const.h type.h $h/const.h $h/type.h
Xprotect.s:	$h/error.h
Xprotect.s:	buf.h
Xprotect.s:	file.h
Xprotect.s:	fproc.h
Xprotect.s:	glo.h
Xprotect.s:	inode.h
Xprotect.s:	param.h
Xprotect.s:	super.h
X
Xputc.s:		const.h type.h $h/const.h $h/type.h
Xputc.s:		$h/com.h
X
Xread.s:		const.h type.h $h/const.h $h/type.h
Xread.s:		$h/com.h
Xread.s:		$h/error.h
Xread.s:		buf.h
Xread.s:		file.h
Xread.s:		fproc.h
Xread.s:		glo.h
Xread.s:		inode.h
Xread.s:		param.h
Xread.s:		super.h
X
Xstadir.s:	const.h type.h $h/const.h $h/type.h
Xstadir.s:	$h/error.h
Xstadir.s:	$h/stat.h
Xstadir.s:	file.h
Xstadir.s:	fproc.h
Xstadir.s:	glo.h
Xstadir.s:	inode.h
Xstadir.s:	param.h
X
Xsuper.s:	const.h type.h $h/const.h $h/type.h
Xsuper.s:	$h/error.h
Xsuper.s:	buf.h
Xsuper.s:	inode.h
Xsuper.s:	super.h
X
Xtable.s:	const.h type.h $h/const.h $h/type.h
Xtable.s:	$h/com.h
Xtable.s:	$h/callnr.h
Xtable.s:	$h/error.h
Xtable.s:	$h/stat.h
Xtable.s:	buf.h
Xtable.s:	dev.h
Xtable.s:	file.h
Xtable.s:	fproc.h
Xtable.s:	glo.h
Xtable.s:	inode.h
Xtable.s:	super.h
X
Xtime.s:		const.h type.h $h/const.h $h/type.h
Xtime.s:		$h/callnr.h
Xtime.s:		$h/com.h
Xtime.s:		$h/error.h
Xtime.s:		file.h
Xtime.s:		fproc.h
Xtime.s:		glo.h
Xtime.s:		inode.h
Xtime.s:		param.h
X
Xutility.s:	const.h type.h $h/const.h $h/type.h
Xutility.s:	$h/com.h
Xutility.s:	$h/error.h
Xutility.s:	buf.h
Xutility.s:	file.h
Xutility.s:	fproc.h
Xutility.s:	glo.h
Xutility.s:	inode.h
Xutility.s:	param.h
Xutility.s:	super.h
X
Xwrite.s:	const.h type.h $h/const.h $h/type.h
Xwrite.s:	$h/error.h
Xwrite.s:	buf.h
Xwrite.s:	file.h
Xwrite.s:	fproc.h
Xwrite.s:	glo.h
Xwrite.s:	inode.h
Xwrite.s:	super.h
+ END-OF-FILE at_makefile
chmod 'u=rw,g=r,o=r' 'at_makefile'
set `wc -c 'at_makefile'`
count=$1
case $count in
4197)	:;;
*)	echo 'Bad character count in ''at_makefile' >&2
		echo 'Count should be 4197' >&2
esac
echo Extracting 'inode.c.cdif'
sed 's/^X//' > 'inode.c.cdif' << '+ END-OF-FILE ''inode.c.cdif'
X*** /local/ast/minix/tape3b/fs/inode.c	Tue Jul 12 23:42:51 1988
X--- inode.c	Mon Sep 26 13:04:05 1988
X***************
X*** 111,117 ****
X  
X    /* Acquire an inode from the bit map. */
X    sp = get_super(dev);		/* get pointer to super_block */
X!   b=alloc_bit(sp->s_imap, (bit_nr)sp->s_ninodes+1, sp->s_imap_blocks,(bit_nr)0);
X    if (b == NO_BIT) {
X  	err_code = ENFILE;
X  	major = (int) (sp->s_dev >> MAJOR) & BYTE;
X--- 111,117 ----
X  
X    /* Acquire an inode from the bit map. */
X    sp = get_super(dev);		/* get pointer to super_block */
X!   b=alloc_bit(sp->s_imap,(bit_nr)sp->s_ninodes+1, sp->s_imap_blocks,(bit_nr)0);
X    if (b == NO_BIT) {
X  	err_code = ENFILE;
X  	major = (int) (sp->s_dev >> MAJOR) & BYTE;
X***************
X*** 129,142 ****
X  	/* No inode table slots available.  Free the inode just allocated. */
X  	free_bit(sp->s_imap, b);
X    } else {
X! 	/* An inode slot is available.  Put the inode just allocated into it. */
X  	rip->i_mode = bits;
X  	rip->i_nlinks = (links) 0;
X  	rip->i_uid = fp->fp_effuid;
X  	rip->i_gid = fp->fp_effgid;
X  	rip->i_dev = dev;	/* was provisionally set to NO_DEV */
X  
X! 	/* The fields not cleared already are cleared in wipe_inode().  They have
X  	 * been put there because truncate() needs to clear the same fields if
X  	 * the file happens to be open while being truncated.  It saves space
X  	 * not to repeat the code twice.
X--- 129,142 ----
X  	/* No inode table slots available.  Free the inode just allocated. */
X  	free_bit(sp->s_imap, b);
X    } else {
X! 	/* An inode slot is available. Put the inode just allocated into it. */
X  	rip->i_mode = bits;
X  	rip->i_nlinks = (links) 0;
X  	rip->i_uid = fp->fp_effuid;
X  	rip->i_gid = fp->fp_effgid;
X  	rip->i_dev = dev;	/* was provisionally set to NO_DEV */
X  
X! 	/* Fields not cleared already are cleared in wipe_inode().  They have
X  	 * been put there because truncate() needs to clear the same fields if
X  	 * the file happens to be open while being truncated.  It saves space
X  	 * not to repeat the code twice.
X***************
X*** 212,220 ****
X  
X    /* Do the read or write. */
X    if (rw_flag == READING) {
X! 	copy((char *)rip, (char *) dip, INODE_SIZE); /* copy from blk to inode */
X    } else {
X! 	copy((char *)dip, (char *) rip, INODE_SIZE); /* copy from inode to blk */
X  	bp->b_dirt = DIRTY;
X    }
X  
X--- 212,220 ----
X  
X    /* Do the read or write. */
X    if (rw_flag == READING) {
X! 	copy((char *)rip, (char *)dip, INODE_SIZE); /* copy from blk to inode*/
X    } else {
X! 	copy((char *)dip, (char *)rip, INODE_SIZE); /* copy from inode to blk*/
X  	bp->b_dirt = DIRTY;
X    }
X  
+ END-OF-FILE inode.c.cdif
chmod 'u=rw,g=r,o=r' 'inode.c.cdif'
set `wc -c 'inode.c.cdif'`
count=$1
case $count in
2585)	:;;
*)	echo 'Bad character count in ''inode.c.cdif' >&2
		echo 'Count should be 2585' >&2
esac
echo Extracting 'link.c.cdif'
sed 's/^X//' > 'link.c.cdif' << '+ END-OF-FILE ''link.c.cdif'
X*** /local/ast/minix/tape3b/fs/link.c	Tue Jul 12 23:42:51 1988
X--- link.c	Mon Sep 26 13:04:06 1988
X***************
X*** 11,16 ****
X--- 11,17 ----
X  #include "../h/const.h"
X  #include "../h/type.h"
X  #include "../h/error.h"
X+ #include "../h/stat.h"
X  #include "const.h"
X  #include "type.h"
X  #include "buf.h"
X***************
X*** 144,159 ****
X  {
X  /* Remove all the zones from the inode 'rip' and mark it dirty. */
X  
X-   register file_pos position;
X-   register zone_type zone_size;
X    register block_nr b;
X    register zone_nr z, *iz;
X!   register int scale;
X!   register struct buf *bp;
X!   register dev_nr dev;
X    extern struct buf *get_block();
X    extern block_nr read_map();
X  
X    dev = rip->i_dev;		/* device on which inode resides */
X    scale = scale_factor(rip);
X    zone_size = (zone_type) BLOCK_SIZE << scale;
X--- 145,163 ----
X  {
X  /* Remove all the zones from the inode 'rip' and mark it dirty. */
X  
X    register block_nr b;
X    register zone_nr z, *iz;
X!   file_pos position;
X!   zone_type zone_size;
X!   int scale, file_type;
X!   struct buf *bp;
X!   dev_nr dev;
X!   unshort modewd;
X    extern struct buf *get_block();
X    extern block_nr read_map();
X  
X+   file_type = rip->i_mode & S_IFMT;	/* check to see if file is special */
X+   if (file_type == S_IFCHR || file_type == S_IFBLK) return;
X    dev = rip->i_dev;		/* device on which inode resides */
X    scale = scale_factor(rip);
X    zone_size = (zone_type) BLOCK_SIZE << scale;
+ END-OF-FILE link.c.cdif
chmod 'u=rw,g=r,o=r' 'link.c.cdif'
set `wc -c 'link.c.cdif'`
count=$1
case $count in
1449)	:;;
*)	echo 'Bad character count in ''link.c.cdif' >&2
		echo 'Count should be 1449' >&2
esac
echo Extracting 'pc_makefile'
sed 's/^X//' > 'pc_makefile' << '+ END-OF-FILE ''pc_makefile'
X# On a PC, cpp and cem are in /lib and will be removed to make space while
X# linking the kernel.  On an AT, they are in /usr/lib are are not removed.
X# This is because they have to be in /lib on a PC; the diskette is too small
X# for them to be in /usr/lib.
X
XCFLAGS= -Di8088 -F -T.
Xh=../h
Xl=/usr/lib
X
Xobj =	main.s open.s read.s write.s pipe.s device.s \
X	path.s mount.s link.s super.s inode.s cache.s filedes.s \
X	stadir.s protect.s time.s misc.s utility.s table.s putc.s
X
Xfs:	makefile   $l/head.s $(obj) $l/libc.a $l/end.s
X	@echo "Start linking FS.  "
X	@echo "If disk fills up, remove some files or use asld -Tsomething"
X	@asld  -o fs -T. $l/head.s $(obj) $l/libc.a $l/end.s
X	@echo "FS done.  "
X
Xclean:
X	rm -f $(obj)
X
Xcache.s:	const.h type.h $h/const.h $h/type.h
Xcache.s:	$h/error.h
Xcache.s:	buf.h
Xcache.s:	file.h
Xcache.s:	fproc.h
Xcache.s:	glo.h
Xcache.s:	inode.h
Xcache.s:	super.h
X
Xdevice.s:	const.h type.h $h/const.h $h/type.h
Xdevice.s:	$h/com.h
Xdevice.s:	$h/error.h
Xdevice.s:	dev.h
Xdevice.s:	file.h
Xdevice.s:	fproc.h
Xdevice.s:	glo.h
Xdevice.s:	inode.h
Xdevice.s:	param.h
X
Xfiledes.s:	const.h type.h $h/const.h $h/type.h
Xfiledes.s:	$h/error.h
Xfiledes.s:	file.h
Xfiledes.s:	fproc.h
Xfiledes.s:	glo.h
Xfiledes.s:	inode.h
X
Xinode.s:	const.h type.h $h/const.h $h/type.h
Xinode.s:	$h/error.h
Xinode.s:	buf.h
Xinode.s:	file.h
Xinode.s:	fproc.h
Xinode.s:	glo.h
Xinode.s:	inode.h
Xinode.s:	super.h
X
Xlink.s:		const.h type.h $h/const.h $h/type.h
Xlink.s:		$h/error.h
Xlink.s:		buf.h
Xlink.s:		file.h
Xlink.s:		fproc.h
Xlink.s:		glo.h
Xlink.s:		inode.h
Xlink.s:		param.h
X
Xmain.s:		const.h type.h $h/const.h $h/type.h
Xmain.s:		$h/callnr.h
Xmain.s:		$h/com.h
Xmain.s:		$h/error.h
Xmain.s:		buf.h
Xmain.s:		file.h
Xmain.s:		fproc.h
Xmain.s:		glo.h
Xmain.s:		inode.h
Xmain.s:		param.h
Xmain.s:		super.h
X
Xmisc.s:		const.h type.h $h/const.h $h/type.h
Xmisc.s:		$h/callnr.h
Xmisc.s:		$h/com.h
Xmisc.s:		$h/error.h
Xmisc.s:		buf.h
Xmisc.s:		file.h
Xmisc.s:		fproc.h
Xmisc.s:		glo.h
Xmisc.s:		inode.h
Xmisc.s:		param.h
Xmisc.s:		super.h
X
Xmount.s:	const.h type.h $h/const.h $h/type.h
Xmount.s:	$h/error.h
Xmount.s:	buf.h
Xmount.s:	file.h
Xmount.s:	fproc.h
Xmount.s:	glo.h
Xmount.s:	inode.h
Xmount.s:	param.h
Xmount.s:	super.h
X
Xopen.s:		const.h type.h $h/const.h $h/type.h
Xopen.s:		$h/callnr.h
Xopen.s:		$h/error.h
Xopen.s:		buf.h
Xopen.s:		file.h
Xopen.s:		fproc.h
Xopen.s:		glo.h
Xopen.s:		inode.h
Xopen.s:		param.h
X
Xpath.s:		const.h type.h $h/const.h $h/type.h
Xpath.s:		$h/error.h
Xpath.s:		buf.h
Xpath.s:		file.h
Xpath.s:		fproc.h
Xpath.s:		glo.h
Xpath.s:		inode.h
Xpath.s:		super.h
X
Xpipe.s:		const.h type.h $h/const.h $h/type.h
Xpipe.s:		$h/callnr.h
Xpipe.s:		$h/com.h
Xpipe.s:		$h/error.h
Xpipe.s:		$h/signal.h
Xpipe.s:		file.h
Xpipe.s:		fproc.h
Xpipe.s:		glo.h
Xpipe.s:		inode.h
Xpipe.s:		param.h
X
Xprotect.s:	const.h type.h $h/const.h $h/type.h
Xprotect.s:	$h/error.h
Xprotect.s:	buf.h
Xprotect.s:	file.h
Xprotect.s:	fproc.h
Xprotect.s:	glo.h
Xprotect.s:	inode.h
Xprotect.s:	param.h
Xprotect.s:	super.h
X
Xputc.s:		const.h type.h $h/const.h $h/type.h
Xputc.s:		$h/com.h
X
Xread.s:		const.h type.h $h/const.h $h/type.h
Xread.s:		$h/com.h
Xread.s:		$h/error.h
Xread.s:		buf.h
Xread.s:		file.h
Xread.s:		fproc.h
Xread.s:		glo.h
Xread.s:		inode.h
Xread.s:		param.h
Xread.s:		super.h
X
Xstadir.s:	const.h type.h $h/const.h $h/type.h
Xstadir.s:	$h/error.h
Xstadir.s:	$h/stat.h
Xstadir.s:	file.h
Xstadir.s:	fproc.h
Xstadir.s:	glo.h
Xstadir.s:	inode.h
Xstadir.s:	param.h
X
Xsuper.s:	const.h type.h $h/const.h $h/type.h
Xsuper.s:	$h/error.h
Xsuper.s:	buf.h
Xsuper.s:	inode.h
Xsuper.s:	super.h
X
Xtable.s:	const.h type.h $h/const.h $h/type.h
Xtable.s:	$h/com.h
Xtable.s:	$h/callnr.h
Xtable.s:	$h/error.h
Xtable.s:	$h/stat.h
Xtable.s:	buf.h
Xtable.s:	dev.h
Xtable.s:	file.h
Xtable.s:	fproc.h
Xtable.s:	glo.h
Xtable.s:	inode.h
Xtable.s:	super.h
X
Xtime.s:		const.h type.h $h/const.h $h/type.h
Xtime.s:		$h/callnr.h
Xtime.s:		$h/com.h
Xtime.s:		$h/error.h
Xtime.s:		file.h
Xtime.s:		fproc.h
Xtime.s:		glo.h
Xtime.s:		inode.h
Xtime.s:		param.h
X
Xutility.s:	const.h type.h $h/const.h $h/type.h
Xutility.s:	$h/com.h
Xutility.s:	$h/error.h
Xutility.s:	buf.h
Xutility.s:	file.h
Xutility.s:	fproc.h
Xutility.s:	glo.h
Xutility.s:	inode.h
Xutility.s:	param.h
Xutility.s:	super.h
X
Xwrite.s:	const.h type.h $h/const.h $h/type.h
Xwrite.s:	$h/error.h
Xwrite.s:	buf.h
Xwrite.s:	file.h
Xwrite.s:	fproc.h
Xwrite.s:	glo.h
Xwrite.s:	inode.h
Xwrite.s:	super.h
+ END-OF-FILE pc_makefile
chmod 'u=rw,g=r,o=r' 'pc_makefile'
set `wc -c 'pc_makefile'`
count=$1
case $count in
4266)	:;;
*)	echo 'Bad character count in ''pc_makefile' >&2
		echo 'Count should be 4266' >&2
esac
echo Extracting 'read.c.cdif'
sed 's/^X//' > 'read.c.cdif' << '+ END-OF-FILE ''read.c.cdif'
X*** /local/ast/minix/tape3b/fs/read.c	Tue Jul 12 23:42:55 1988
X--- read.c	Mon Sep 26 13:04:10 1988
X***************
X*** 143,164 ****
X  
X    /* On write, update file size and access time. */
X    if (rw_flag == WRITING) {
X! 	if (char_spec == 0 && block_spec == 0 && position > f_size)
X! 		rip->i_size = position;
X! 	rip->i_modtime = clock_time();
X! 	rip->i_dirt = DIRTY;
X    } else {
X  	if (rip->i_pipe && position >= rip->i_size) {
X  		/* Reset pipe pointers. */
X  		rip->i_size = 0;	/* no data left */
X  		position = 0;		/* reset reader(s) */
X! 		if ( (wf = find_filp(rip, W_BIT)) != NIL_FILP) wf->filp_pos = 0;
X  	}
X    }
X    f->filp_pos = position;
X  
X    /* Check to see if read-ahead is called for, and if so, set it up. */
X!   if (rw_flag == READING && rip->i_seek == NO_SEEK && position % BLOCK_SIZE == 0
X  		&& (mode_word == I_REGULAR || mode_word == I_DIRECTORY)) {
X  	rdahed_inode = rip;
X  	rdahedpos = position;
X--- 143,165 ----
X  
X    /* On write, update file size and access time. */
X    if (rw_flag == WRITING) {
X! 	if (char_spec == 0 && block_spec == 0) {
X! 		if (position > f_size) rip->i_size = position;
X! 		rip->i_modtime = clock_time();
X! 		rip->i_dirt = DIRTY;
X! 	}
X    } else {
X  	if (rip->i_pipe && position >= rip->i_size) {
X  		/* Reset pipe pointers. */
X  		rip->i_size = 0;	/* no data left */
X  		position = 0;		/* reset reader(s) */
X! 		if ( (wf = find_filp(rip, W_BIT)) != NIL_FILP) wf->filp_pos =0;
X  	}
X    }
X    f->filp_pos = position;
X  
X    /* Check to see if read-ahead is called for, and if so, set it up. */
X!   if (rw_flag == READING && rip->i_seek == NO_SEEK && position % BLOCK_SIZE== 0
X  		&& (mode_word == I_REGULAR || mode_word == I_DIRECTORY)) {
X  	rdahed_inode = rip;
X  	rdahedpos = position;
+ END-OF-FILE read.c.cdif
chmod 'u=rw,g=r,o=r' 'read.c.cdif'
set `wc -c 'read.c.cdif'`
count=$1
case $count in
1736)	:;;
*)	echo 'Bad character count in ''read.c.cdif' >&2
		echo 'Count should be 1736' >&2
esac
exit 0