Manage one level software link

This commit is contained in:
Laurent Vivier 2008-07-24 01:44:45 +00:00
parent 27f4864fac
commit 3023f1af53
2 changed files with 35 additions and 2 deletions

View File

@ -5,6 +5,12 @@
*/
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#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) {

View File

@ -4,6 +4,9 @@
*
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <asm/byteorder.h>
@ -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);