Research V4 release
[unix-history] / sys / ken / rdwri.c
#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);
}