2 * get_pathname.c --- do directory/inode -> name translation
4 * Copyright (C) 1993, 1994, 1995 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Library
8 * General Public License, version 2.
14 * ext2fs_get_pathname(fs, dir, ino, name)
16 * This function translates takes two inode numbers into a
17 * string, placing the result in <name>. <dir> is the containing
18 * directory inode, and <ino> is the inode number itself. If
19 * <ino> is zero, then ext2fs_get_pathname will return pathname
20 * of the the directory <dir>.
34 struct get_pathname_struct
{
35 ext2_ino_t search_ino
;
44 static int get_pathname_proc(struct ext2_dir_entry
*dirent
,
45 int offset
EXT2FS_ATTR((unused
)),
46 int blocksize
EXT2FS_ATTR((unused
)),
47 char *buf
EXT2FS_ATTR((unused
)),
50 struct get_pathname_struct
*gp
;
52 int name_len
= ext2fs_dirent_name_len(dirent
);
54 gp
= (struct get_pathname_struct
*) priv_data
;
56 if ((name_len
== 2) && !strncmp(dirent
->name
, "..", 2))
57 gp
->parent
= dirent
->inode
;
58 if (dirent
->inode
== gp
->search_ino
) {
59 retval
= ext2fs_get_mem(name_len
+ 1, &gp
->name
);
64 strncpy(gp
->name
, dirent
->name
, name_len
);
65 gp
->name
[name_len
] = '\0';
71 static errcode_t
ext2fs_get_pathname_int(ext2_filsys fs
, ext2_ino_t dir
,
72 ext2_ino_t ino
, int maxdepth
,
73 char *buf
, char **name
)
75 struct get_pathname_struct gp
;
76 char *parent_name
= 0, *ret
;
80 retval
= ext2fs_get_mem(2, name
);
83 strcpy(*name
, (dir
== EXT2_ROOT_INO
) ? "/" : ".");
87 if (!dir
|| (maxdepth
< 0)) {
88 retval
= ext2fs_get_mem(4, name
);
100 retval
= ext2fs_dir_iterate(fs
, dir
, 0, buf
, get_pathname_proc
, &gp
);
101 if (retval
== EXT2_ET_NO_DIRECTORY
) {
105 snprintf(tmp
, sizeof(tmp
), "<%u>/<%u>", dir
, ino
);
107 snprintf(tmp
, sizeof(tmp
), "<%u>", dir
);
108 retval
= ext2fs_get_mem(strlen(tmp
)+1, name
);
120 retval
= ext2fs_get_pathname_int(fs
, gp
.parent
, dir
, maxdepth
-1,
130 retval
= ext2fs_get_mem(strlen(parent_name
)+strlen(gp
.name
)+2,
133 retval
= ext2fs_get_mem(strlen(parent_name
)+5, &ret
);
139 strcat(ret
, parent_name
);
142 strcat(ret
, gp
.name
);
149 ext2fs_free_mem(&parent_name
);
150 ext2fs_free_mem(&gp
.name
);
154 errcode_t
ext2fs_get_pathname(ext2_filsys fs
, ext2_ino_t dir
, ext2_ino_t ino
,
160 EXT2_CHECK_MAGIC(fs
, EXT2_ET_MAGIC_EXT2FS_FILSYS
);
162 retval
= ext2fs_get_mem(fs
->blocksize
, &buf
);
167 retval
= ext2fs_get_pathname_int(fs
, dir
, ino
, 32, buf
, name
);
168 ext2fs_free_mem(&buf
);