Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / fs / ext2 / ext2_open.c
1 /*
2  *
3  * (c) 2008-2009 Laurent Vivier <Laurent@lvivier.info>
4  *
5  * This file has been copied from EMILE, http://emile.sf.net
6  *
7  */
8
9 #include "libext2.h"
10 #include "ext2.h"
11 #include "ext2_utils.h"
12
13 ext2_FILE* ext2_open(ext2_VOLUME *volume, const char* pathname)
14 {
15         ext2_FILE *file;
16         struct ext2_inode *inode;
17         int ino;
18         int ret;
19
20         ino = ext2_seek_name(volume, pathname);
21         if (ino == 0)
22                 return NULL;
23
24         inode = (struct ext2_inode*)malloc(sizeof(struct ext2_inode));
25         if (inode == NULL)
26                 return NULL;
27
28         ret = ext2_get_inode(volume, ino, inode);
29         if (ret == -1) {
30                 free(inode);
31                 return NULL;
32         }
33         if (S_ISLNK(inode->i_mode)) {
34                 static char buffer[1024];
35                 int i, last = 0;
36                 strcpy(buffer, pathname);
37                 for (i = 0; buffer[i]; i++)
38                         if (buffer[i] == '\\')
39                                 last = i;
40                 buffer[last] = '\\';
41                 strcpy(buffer + last + 1, (char*)inode->i_block);
42                 ino = ext2_seek_name((ext2_VOLUME*)volume, buffer);
43                 if (ino == 0) {
44                         free(inode);
45                         return NULL;
46                 }
47                 ret = ext2_get_inode((ext2_VOLUME*)volume, ino, inode);
48                 if (ret == -1) {
49                         free(inode);
50                         return NULL;
51                 }
52         }
53
54         file = (ext2_FILE*)malloc(sizeof(ext2_FILE));
55         if (file == NULL) {
56                 free(inode);
57                 return NULL;
58         }
59         file->volume = volume;
60         file->inode = inode;
61         file->offset = 0;
62         file->path = strdup(pathname);
63
64         return file;
65 }