u32 addr, int adopt, u32 *next);
u32 lafs_dir_lookup(struct lafs_ino *dir, char *name, int len);
struct lafs_ino *lafs_lookup_path(struct lafs_ino *root, struct lafs_ino *cwd,
- char *path);
+ char *path, char **remainder);
#include <lafs/lafs.h>
struct lafs_ino *lafs_lookup_path(struct lafs_ino *root, struct lafs_ino *cwd,
- char *path)
+ char *path, char **remainder)
{
if (!path)
return cwd;
while (cwd && *path) {
char *p = path;
int len;
- u32 inum;
+ u32 inum = 0;
while (*path && *path != '/')
path++;
len = path - p;
while (*path == '/')
path++;
- inum = lafs_dir_lookup(cwd, p, len);
- if (!inum)
- return NULL;
+ if (cwd->type == TypeDir)
+ inum = lafs_dir_lookup(cwd, p, len);
+ if (!inum) {
+ if (!remainder)
+ return NULL;
+ *remainder = p;
+ return cwd;
+ }
cwd = lafs_get_inode(cwd->filesys, inum);
}
return cwd;
/*pre is the directory, prefix is the component prefix */
inode = lafs_get_itable(gen_state->lafs);
inode = lafs_get_inode(inode, 2);
- inode = lafs_lookup_path(inode, inode, pre);
+ inode = lafs_lookup_path(inode, inode, pre, NULL);
index = -1;
} else {
if (index + 1 == 0) {
} else {
char *path = args[2];
inode = lafs_get_inode(inode, 2);
- inode = lafs_lookup_path(inode, inode, path);
+ inode = lafs_lookup_path(inode, inode, path, NULL);
if (!inode) {
printf("show inode: cannot find inode for %s\n", path);
ino = lafs_get_itable(st->lafs);
ino = lafs_get_inode(ino, 2);
if (path)
- ino = lafs_lookup_path(ino, ino, path);
+ ino = lafs_lookup_path(ino, ino, path, NULL);
if (!ino) {
printf("ls: cannot find inode for %s\n", path?:"/");