V4/nsys/ken/rdwri.c

Compare this file to the similar file:
Show the results in this format:

#include "/sys/nsys/param.h"
#include "/sys/nsys/inode.h"
#include "/sys/nsys/user.h"
#include "/sys/nsys/buf.h"
#include "/sys/nsys/conf.h"

readi(ip)
struct inode *ip;
{
	int *bp;
	int dn, bn, on;
	int n, i;
	char *cp;

	if(u.u_count == 0)
		return;
	ip->i_flag =| IACC;
	if((ip->i_mode&IFMT) == IFCHR) {
		(*cdevsw[ip->i_addr[0].d_major].d_read)(ip->i_addr[0]);
		return;
	}

loop:
	bn = ldiv(u.u_offset[0], u.u_offset[1], 512);
	on = lrem(u.u_offset[0], u.u_offset[1], 512);
	n = min(512-on, u.u_count);
	if((ip->i_mode&IFMT) != IFBLK) {
		dn = dpcmp(ip->i_size0, ip->i_size1,
			u.u_offset[0], u.u_offset[1]);
		if(dn <= 0)
			return;
		n = min(n, dn);
		if ((bn = bmap(ip, bn)) == 0)
			return;
		dn = ip->i_dev;
	} else
		dn = ip->i_addr[0];
	bp = bread(dn, bn);
	cp = bp->b_addr + on;
	if(u.u_segflg==0 && (n&1)==0 && (on&1)==0 && (u.u_base&1)==0) {
		if(copyout(cp, u.u_base, n))
			u.u_error = EFAULT;
		u.u_base =+ n;
		goto incr;
	} else
	if(u.u_segflg != 0) {
		for(i=0; i<n; i++) {
			*u.u_base = *cp;
			u.u_base++;
			cp++;
		}

	incr:
		dpadd(u.u_offset, n);
		u.u_count =- n;
	} else
	for(i=0; i<n; i++)
		if(passc(*cp++) < 0)
			break;
	brelse(bp);
	if(u.u_error==0 && u.u_count!=0)
		goto loop;
}

writei(ip)
struct inode *ip;
{
	int *bp;
	int dn, bn, on;
	int n, i;
	char *cp;

	if(u.u_count == 0)
		return;
	ip->i_flag =| IACC;
	if((ip->i_mode&IFMT) == IFCHR) {
		(*cdevsw[ip->i_addr[0].d_major].d_write)(ip->i_addr[0]);
		return;
	}

loop:
	bn = ldiv(u.u_offset[0], u.u_offset[1], 512);
	on = lrem(u.u_offset[0], u.u_offset[1], 512);
	n = min(512-on, u.u_count);
	if((ip->i_mode&IFMT) != IFBLK) {
		if ((bn = bmap(ip, bn)) == 0)
			return;
		dn = ip->i_dev;
	} else
		dn = ip->i_addr[0];
	if(n == 512) 
		bp = getblk(dn, bn); else
		bp = bread(dn, bn);
	cp = bp->b_addr + on;
	if(u.u_segflg==0 && (n&1)==0 && (on&1)==0 && (u.u_base&1)==0) {
		if(copyin(u.u_base, cp, n))
			u.u_error = EFAULT;
		u.u_base =+ n;
		goto incr;
	} else
	if(u.u_segflg != 0) {
		for(i=0; i<n; i++) {
			*cp = *u.u_base;
			cp++;
			u.u_base++;
		}

	incr:
		dpadd(u.u_offset, n);
		u.u_count =- n;
	} else
	for(i=0; i<n; i++)
		if(cpass(cp++) < 0)
			break;
	if(lrem(u.u_offset[0], u.u_offset[1], 512) == 0)
		bawrite(bp); else
		bdwrite(bp);
	if(dpcmp(ip->i_size0, ip->i_size1,
	  u.u_offset[0], u.u_offset[1]) < 0 &&
	  (ip->i_mode&(IFBLK&IFCHR)) == 0) {
		ip->i_size0 = u.u_offset[0];
		ip->i_size1 = u.u_offset[1];
	}
	ip->i_flag =| IUPD;
	if(u.u_error==0 && u.u_count!=0)
		goto loop;
}

max(a, b)
char *a, *b;
{

	if(a > b)
		return(a);
	return(b);
}

min(a, b)
char *a, *b;
{

	if(a < b)
		return(a);
	return(b);
}