Whamcloud - gitweb
tst_libext2fs: Avoid multiple definition of global variables
[tools/e2fsprogs.git] / lib / ext2fs / get_pathname.c
index e259eee..8cfaf6e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * get_pathname.c --- do directry/inode -> name translation
+ * get_pathname.c --- do directory/inode -> name translation
  *
  * Copyright (C) 1993, 1994, 1995 Theodore Ts'o.
  *
@@ -49,21 +49,20 @@ static int get_pathname_proc(struct ext2_dir_entry *dirent,
 {
        struct get_pathname_struct      *gp;
        errcode_t                       retval;
+       int name_len = ext2fs_dirent_name_len(dirent);
 
        gp = (struct get_pathname_struct *) priv_data;
 
-       if (((dirent->name_len & 0xFF) == 2) &&
-           !strncmp(dirent->name, "..", 2))
+       if ((name_len == 2) && !strncmp(dirent->name, "..", 2))
                gp->parent = dirent->inode;
        if (dirent->inode == gp->search_ino) {
-               retval = ext2fs_get_mem((dirent->name_len & 0xFF) + 1,
-                                       &gp->name);
+               retval = ext2fs_get_mem(name_len + 1, &gp->name);
                if (retval) {
                        gp->errcode = retval;
                        return DIRENT_ABORT;
                }
-               strncpy(gp->name, dirent->name, (dirent->name_len & 0xFF));
-               gp->name[dirent->name_len & 0xFF] = '\0';
+               strncpy(gp->name, dirent->name, name_len);
+               gp->name[name_len] = '\0';
                return DIRENT_ABORT;
        }
        return 0;
@@ -74,7 +73,7 @@ static errcode_t ext2fs_get_pathname_int(ext2_filsys fs, ext2_ino_t dir,
                                         char *buf, char **name)
 {
        struct get_pathname_struct gp;
-       char    *parent_name, *ret;
+       char    *parent_name = 0, *ret;
        errcode_t       retval;
 
        if (dir == ino) {
@@ -99,7 +98,19 @@ static errcode_t ext2fs_get_pathname_int(ext2_filsys fs, ext2_ino_t dir,
        gp.errcode = 0;
 
        retval = ext2fs_dir_iterate(fs, dir, 0, buf, get_pathname_proc, &gp);
-       if (retval)
+       if (retval == EXT2_ET_NO_DIRECTORY) {
+               char tmp[32];
+
+               if (ino)
+                       snprintf(tmp, sizeof(tmp), "<%u>/<%u>", dir, ino);
+               else
+                       snprintf(tmp, sizeof(tmp), "<%u>", dir);
+               retval = ext2fs_get_mem(strlen(tmp)+1, name);
+               if (retval)
+                       goto cleanup;
+               strcpy(*name, tmp);
+               return 0;
+       } else if (retval)
                goto cleanup;
        if (gp.errcode) {
                retval = gp.errcode;
@@ -132,12 +143,11 @@ static errcode_t ext2fs_get_pathname_int(ext2_filsys fs, ext2_ino_t dir,
        else
                strcat(ret, "???");
        *name = ret;
-       ext2fs_free_mem(&parent_name);
        retval = 0;
 
 cleanup:
-       if (gp.name)
-               ext2fs_free_mem(&gp.name);
+       ext2fs_free_mem(&parent_name);
+       ext2fs_free_mem(&gp.name);
        return retval;
 }