/* open file and return fd; to make our life easier, always open RW */ int fs_open(const char *filename, int flags, int mode) { int flag, fd; struct inode_s *ino, *dir; ino = dir = NULL; flag = (flags & O_CREAT) ? FS_SEARCH_CREAT : FS_SEARCH_GET; dir = current_dir(); if ( (ino = find_inode(dir, filename, flag)) == NULL) goto err; release_inode(dir); if (ino->i_zone[0] == 0 && (flags & O_CREAT)) fill_inode(ino, mode); if (flags & O_TRUNC) { ino->i_size = 0; ino->i_dirty = 1; } if ( (fd = get_fd(ino, (flags & O_APPEND) ? ino->i_size : 0)) == ERROR) goto err; return fd; err: release_inode(dir); release_inode(ino); return ERROR; }
static struct inode *ext2_iget_by_inr(struct fs_info *fs, uint32_t inr) { const struct ext2_inode *e_inode; struct inode *inode; e_inode = ext2_get_inode(fs, inr); if (!e_inode) return NULL; if (!(inode = alloc_inode(fs, inr, sizeof(struct ext2_pvt_inode)))) return NULL; fill_inode(inode, e_inode); return inode; }
/* create new directory */ int fs_mkdir(const char *pathname, mode_t mode) { struct inode_s *ino, *dir, *tmpdir; char path[MAX_PATH], name[MAX_NAME]; ino = dir = tmpdir = NULL; process_path(pathname, path, name); tmpdir = current_dir(); /* get inode numbers from parent and new dir */ if ( (dir = find_inode(tmpdir, path, FS_SEARCH_GET)) == NULL) goto err; release_inode(tmpdir); if ( (ino = find_inode(dir, name, FS_SEARCH_ADD)) == NULL) goto err; /* fill new dir inode */ fill_inode(ino, mode); ino->i_mode = (ino->i_mode & ~I_TYPE) | I_DIRECTORY; /* add '.' */ empty_entry(ino, ino->i_num, "."); ino->i_nlinks++; /* and '..' */ empty_entry(ino, dir->i_num, ".."); dir->i_nlinks++; dir->i_dirty = 1; /* update dir size */ ino->i_size = DIRENTRY_SIZE * 2; release_inode(dir); release_inode(ino); return OK; err: release_inode(tmpdir); release_inode(dir); release_inode(ino); return ERROR; }
/* Set the uid, gid, mode and time for the inode */ static errcode_t set_inode_extra(ext2_filsys fs, ext2_ino_t cwd, ext2_ino_t ino, struct stat *st) { errcode_t retval; struct ext2_inode inode; retval = ext2fs_read_inode(fs, ino, &inode); if (retval) { com_err(__func__, retval, "while reading inode %u", ino); return retval; } fill_inode(&inode, st); retval = ext2fs_write_inode(fs, ino, &inode); if (retval) com_err(__func__, retval, "while writing inode %u", ino); return retval; }