Пример #1
0
static struct buffer * find_entry(struct inode *dir_inode, char *filename,
		struct dir_entry **res_de)
{
	struct buffer *buf;
	struct dir_entry *de;

	for (int i = 0; i < 7 + 512; i++) {
		buf = bread(dir_inode->i_dev, minix1_rbmap(dir_inode, i));
		if (!buf)
			panic("add_entry:can not read buf");

		de = (struct dir_entry *) buf->b_data;
		for (int j = 0; j < 1024 / sizeof(struct dir_entry); j++) {
			if (i * 1024 + j * sizeof(struct dir_entry)
					> dir_inode->i_size) {

				brelse(buf);
				*res_de = NULL;
				return NULL;
			}

			if (!strncmp(de->name, filename, NAME_LEN)) {
				*res_de = de;
				return buf;
			}
			de++;
		}
		brelse(buf);
	}
	*res_de = NULL;
	return NULL;
}
Пример #2
0
int count_entry(struct inode *inode)
{
	struct buffer *buf;
	struct dir_entry *de;
	int count=0;

	for (int i = 0; i < 7 + 512; i++) {
		buf = bread(inode->i_dev, minix1_rbmap(inode, i));
		if (!buf)
			panic("add_entry:can not read buf");

		de = (struct dir_entry *) buf->b_data;
		for (int j = 0; j < 1024 / sizeof(struct dir_entry); j++) {

			if (i * 1024 + j * sizeof(struct dir_entry)
					> inode->i_size) {

				brelse(buf);
				return count;
			}

			if(!de->ino){
				de++;
				continue;
			}
			count++;
			de++;
		}
		brelse(buf);
	}
	return count;
}
Пример #3
0
int minix1_file_read(struct inode *inode, char * buf, size_t size, off_t off,
		int rw_flag)
{
	struct buffer *bh;
	int block, chars, left;

	if (off >= inode->i_size)
		return 0;
	if (off + size >= inode->i_size)
		size = inode->i_size - off;

	left = size;
	while (left > 0) {
		bh = bread(inode->i_dev, minix1_rbmap(inode, off / 1024));
		if (!bh) {
			panic("read file error");
		}
		chars = min(left, 1024 - off % 1024);
		memcpy(buf, bh->b_data + off % 1024, chars);
		brelse(bh);
		buf += chars;
		off += chars;
		left -= chars;
	}
	return size - left;
}