Mercurial > hg > Papers > 2019 > mitsuki-master
view paper/src/readi.c @ 49:d3ed28a7964f
update
author | mir3636 |
---|---|
date | Mon, 11 Feb 2019 19:04:56 +0900 |
parents | 675cd2c69450 |
children |
line wrap: on
line source
int readi (struct inode *ip, char *dst, uint off, uint n) { uint tot, m; struct buf *bp; if (ip->type == T_DEV) { if (ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].read) { return -1; } return devsw[ip->major].read(ip, dst, n); } if (off > ip->size || off + n < off) { return -1; } if (off + n > ip->size) { n = ip->size - off; } for (tot = 0; tot < n; tot += m, off += m, dst += m) { bp = bread(ip->dev, bmap(ip, off / BSIZE)); m = min(n - tot, BSIZE - off%BSIZE); memmove(dst, bp->data + off % BSIZE, m); brelse(bp); } return n; }