1c2f99d7cSDavid van Moolenbroek #include "inc.h"
2c2f99d7cSDavid van Moolenbroek
search_dir(struct inode * ldir_ptr,char string[NAME_MAX],ino_t * numb)3c2f99d7cSDavid van Moolenbroek static int search_dir(
4c2f99d7cSDavid van Moolenbroek struct inode *ldir_ptr, /* dir record parent */
5c2f99d7cSDavid van Moolenbroek char string[NAME_MAX], /* component to search for */
6c2f99d7cSDavid van Moolenbroek ino_t *numb /* pointer to new dir record */
7c2f99d7cSDavid van Moolenbroek ) {
8*b1d06847SJean-Baptiste Boric /*
9*b1d06847SJean-Baptiste Boric * The search_dir function performs the operation of searching for the
10c2f99d7cSDavid van Moolenbroek * component ``string" in ldir_ptr. It returns the response and the
11c2f99d7cSDavid van Moolenbroek * number of the inode in numb.
12c2f99d7cSDavid van Moolenbroek */
13*b1d06847SJean-Baptiste Boric int r, i;
14c2f99d7cSDavid van Moolenbroek
15c2f99d7cSDavid van Moolenbroek /*
16c2f99d7cSDavid van Moolenbroek * This function search a particular element (in string) in a inode and
17c2f99d7cSDavid van Moolenbroek * return its number.
18c2f99d7cSDavid van Moolenbroek */
19c2f99d7cSDavid van Moolenbroek
20c2f99d7cSDavid van Moolenbroek if ((ldir_ptr->i_stat.st_mode & S_IFMT) != S_IFDIR)
21c2f99d7cSDavid van Moolenbroek return ENOTDIR;
22c2f99d7cSDavid van Moolenbroek
23*b1d06847SJean-Baptiste Boric r = read_directory(ldir_ptr);
24*b1d06847SJean-Baptiste Boric if (r != OK)
25*b1d06847SJean-Baptiste Boric return r;
26*b1d06847SJean-Baptiste Boric
27*b1d06847SJean-Baptiste Boric if (strcmp(".", string) == 0) {
28c2f99d7cSDavid van Moolenbroek *numb = ldir_ptr->i_stat.st_ino;
29c2f99d7cSDavid van Moolenbroek return OK;
30c2f99d7cSDavid van Moolenbroek }
31c2f99d7cSDavid van Moolenbroek
32*b1d06847SJean-Baptiste Boric /* Walk the directory listing. */
33*b1d06847SJean-Baptiste Boric for (i = 0; i < ldir_ptr->dir_size; i++) {
34*b1d06847SJean-Baptiste Boric if (strcmp(string, ldir_ptr->dir_contents[i].name) == 0) {
35*b1d06847SJean-Baptiste Boric *numb = ldir_ptr->dir_contents[i].i_node->i_stat.st_ino;
36c2f99d7cSDavid van Moolenbroek return OK;
37c2f99d7cSDavid van Moolenbroek }
38*b1d06847SJean-Baptiste Boric }
39*b1d06847SJean-Baptiste Boric
40c2f99d7cSDavid van Moolenbroek return ENOENT;
41c2f99d7cSDavid van Moolenbroek }
42c2f99d7cSDavid van Moolenbroek
fs_lookup(ino_t dir_nr,char * name,struct fsdriver_node * node,int * is_mountpt)43c2f99d7cSDavid van Moolenbroek int fs_lookup(ino_t dir_nr, char *name, struct fsdriver_node *node,
44c2f99d7cSDavid van Moolenbroek int *is_mountpt)
45c2f99d7cSDavid van Moolenbroek {
46c2f99d7cSDavid van Moolenbroek /* Given a directory and a component of a path, look up the component
47c2f99d7cSDavid van Moolenbroek * in the directory, find the inode, open it, and return its details.
48c2f99d7cSDavid van Moolenbroek */
49c2f99d7cSDavid van Moolenbroek struct inode *dirp, *rip;
50c2f99d7cSDavid van Moolenbroek ino_t ino_nr;
51c2f99d7cSDavid van Moolenbroek int r;
52c2f99d7cSDavid van Moolenbroek
53c2f99d7cSDavid van Moolenbroek /* Find the starting inode. */
54*b1d06847SJean-Baptiste Boric if ((dirp = get_inode(dir_nr)) == NULL)
55c2f99d7cSDavid van Moolenbroek return EINVAL;
56c2f99d7cSDavid van Moolenbroek
57c2f99d7cSDavid van Moolenbroek /* Look up the directory entry. */
58c2f99d7cSDavid van Moolenbroek if ((r = search_dir(dirp, name, &ino_nr)) != OK)
59c2f99d7cSDavid van Moolenbroek return r;
60c2f99d7cSDavid van Moolenbroek
61c2f99d7cSDavid van Moolenbroek /* The component has been found in the directory. Get the inode. */
62*b1d06847SJean-Baptiste Boric if ((rip = open_inode(ino_nr)) == NULL)
63c2f99d7cSDavid van Moolenbroek return EIO; /* FIXME: this could have multiple causes */
64c2f99d7cSDavid van Moolenbroek
65c2f99d7cSDavid van Moolenbroek /* Return its details to the caller. */
66c2f99d7cSDavid van Moolenbroek node->fn_ino_nr = rip->i_stat.st_ino;
67c2f99d7cSDavid van Moolenbroek node->fn_mode = rip->i_stat.st_mode;
68c2f99d7cSDavid van Moolenbroek node->fn_size = rip->i_stat.st_size;
69c2f99d7cSDavid van Moolenbroek node->fn_uid = rip->i_stat.st_uid;
70c2f99d7cSDavid van Moolenbroek node->fn_gid = rip->i_stat.st_gid;
71c2f99d7cSDavid van Moolenbroek node->fn_dev = rip->i_stat.st_rdev;
72c2f99d7cSDavid van Moolenbroek
73c2f99d7cSDavid van Moolenbroek *is_mountpt = rip->i_mountpoint;
74c2f99d7cSDavid van Moolenbroek
75c2f99d7cSDavid van Moolenbroek return OK;
76c2f99d7cSDavid van Moolenbroek }
77