From 3023f1af531cf38e7e546ad9f04d73cf43fd2735 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Thu, 24 Jul 2008 01:44:45 +0000 Subject: [PATCH] Manage one level software link --- libext2/ext2_open.c | 26 ++++++++++++++++++++++++++ libext2/ext2_utils.c | 11 +++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/libext2/ext2_open.c b/libext2/ext2_open.c index fdcdf14..29f87c4 100644 --- a/libext2/ext2_open.c +++ b/libext2/ext2_open.c @@ -5,6 +5,12 @@ */ #include +#include +#include +#include +#include + +#include #include "libext2.h" #include "ext2.h" @@ -30,6 +36,26 @@ stream_FILE* ext2_open(stream_VOLUME *volume, char* pathname) free(inode); return NULL; } + if (S_ISLNK(inode->i_mode)) { + static char buffer[1024]; + int i, last = 0; + strcpy(buffer, pathname); + for (i = 0; buffer[i]; i++) + if (buffer[i] == '/') + last = i; + buffer[last] = '/'; + strcpy(buffer + last + 1, (char*)inode->i_block); + ino = ext2_seek_name((ext2_VOLUME*)volume, buffer); + if (ino == 0) { + free(inode); + return NULL; + } + ret = ext2_get_inode((ext2_VOLUME*)volume, ino, inode); + if (ret == -1) { + free(inode); + return NULL; + } + } file = (ext2_FILE*)malloc(sizeof(ext2_FILE)); if (file == NULL) { diff --git a/libext2/ext2_utils.c b/libext2/ext2_utils.c index 338723e..eb03785 100644 --- a/libext2/ext2_utils.c +++ b/libext2/ext2_utils.c @@ -4,6 +4,9 @@ * */ +#include +#include +#include #include #include @@ -137,8 +140,12 @@ int ext2_get_inode(ext2_VOLUME* volume, inode->i_links_count = __le16_to_cpu(le_inode->i_links_count); inode->i_blocks = __le32_to_cpu(le_inode->i_blocks); inode->i_flags = __le32_to_cpu(le_inode->i_flags); - for (i = 0; i < EXT2_N_BLOCKS; i++) - inode->i_block[i] = __le32_to_cpu(le_inode->i_block[i]); + if (S_ISLNK(inode->i_mode)) { + memcpy(inode->i_block, le_inode->i_block, EXT2_N_BLOCKS * 4); + } else { + for (i = 0; i < EXT2_N_BLOCKS; i++) + inode->i_block[i] = __le32_to_cpu(le_inode->i_block[i]); + } inode->i_generation = __le32_to_cpu(le_inode->i_generation); inode->i_file_acl = __le32_to_cpu(le_inode->i_file_acl); inode->i_dir_acl = __le32_to_cpu(le_inode->i_dir_acl);