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; }
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; }
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; }