summaryrefslogtreecommitdiffstats
path: root/fs/cramfs
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-07-05 18:01:38 +0200
committerSascha Hauer <sha@octopus.labnet.pengutronix.de>2007-07-05 18:01:38 +0200
commit9b4dfd79953ffb79685a53a0821bd0a205e15088 (patch)
treeddb8b85bc241fa46df900d8262f299e2455674b4 /fs/cramfs
parent189579188bf79e176cc57a3b6d68f8306cfc7c60 (diff)
downloadbarebox-9b4dfd79953ffb79685a53a0821bd0a205e15088.tar.gz
barebox-9b4dfd79953ffb79685a53a0821bd0a205e15088.tar.xz
svn_rev_272
more FS work
Diffstat (limited to 'fs/cramfs')
-rw-r--r--fs/cramfs/cramfs.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/fs/cramfs/cramfs.c b/fs/cramfs/cramfs.c
index c8ef7d7ff0..8a57241350 100644
--- a/fs/cramfs/cramfs.c
+++ b/fs/cramfs/cramfs.c
@@ -293,8 +293,7 @@ static int cramfs_open(struct device_d *_dev, FILE *file, const char *filename)
if (offset <= 0)
return -ENOENT;
- file->pos = 0;
- file->inode = dev->map_base + offset;
+ file->inode = (void*)dev->map_base + offset;
return 0;
}
@@ -323,7 +322,7 @@ static int cramfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size)
unsigned long base;
int copy;
- blocknr = f->pos >> 12;
+ blocknr = (f->pos + outsize) >> 12;
if (blocknr != priv->curr_block || priv->inode != inode) {
if (blocknr)
base = CRAMFS_32 (block_ptrs[blocknr - 1]);
@@ -346,7 +345,6 @@ static int cramfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size)
memcpy(buf, priv->buf + ofs, copy);
ofs = 0;
- f->pos += copy;
outsize += copy;
size -= copy;
buf += copy;
@@ -364,13 +362,18 @@ static int cramfs_stat(struct device_d *_dev, const char *filename, struct stat
char *f;
unsigned long offset;
- f = strdup(filename);
- offset = cramfs_resolve (dev->map_base,
+ if (strlen (filename) == 0 || !strcmp (filename, "/")) {
+ /* Root directory. Use root inode in super block */
+ offset = CRAMFS_GET_OFFSET (&(priv->super.root)) << 2;
+ } else {
+ f = strdup(filename);
+ offset = cramfs_resolve (dev->map_base,
CRAMFS_GET_OFFSET (&(priv->super.root)) << 2,
CRAMFS_24 (priv->super.root.size), 1,
strtok (f, "/"));
- free(f);
+ free(f);
+ }
if (offset < 0)
return -ENOENT;