cleanup
diff --git a/ChangeLog b/ChangeLog
index 54871d7..dff2600 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-02-07 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Cleaned up directory reading (temporary file is not used)
+
2005-02-02 Miklos Szeredi <miklos@szeredi.hu>
* Released 2.2
diff --git a/README b/README
index 14eed40..e14e37e 100644
--- a/README
+++ b/README
@@ -25,7 +25,10 @@
make install
modprobe fuse
-Also see the file 'INSTALL'
+You may also need to add '/usr/local/lib' to '/etc/ld.so.conf' and/or
+run ldconfig.
+
+For more details see the file 'INSTALL'
How To Use
==========
diff --git a/lib/fuse.c b/lib/fuse.c
index 0980388..104d654 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -60,7 +60,8 @@
struct fuse_dirhandle {
struct fuse *fuse;
- FILE *fp;
+ unsigned char *contents;
+ unsigned len;
int filled;
};
@@ -446,17 +447,18 @@
ino_t ino)
{
size_t namelen = strlen(name);
+ size_t entsize = sizeof(struct fuse_dirhandle) + namelen + 8;
struct fuse_dirent *dirent;
- size_t reclen;
- size_t res;
if (namelen > FUSE_NAME_MAX)
namelen = FUSE_NAME_MAX;
- dirent = calloc(1, sizeof(struct fuse_dirent) + namelen + 8);
- if (dirent == NULL)
+ dh->contents = realloc(dh->contents, dh->len + entsize);
+ if (dh->contents == NULL)
return -ENOMEM;
+ dirent = (struct fuse_dirent *) (dh->contents + dh->len);
+ memset(dirent, 0, entsize);
if ((dh->fuse->flags & FUSE_USE_INO))
dirent->ino = ino;
else
@@ -464,13 +466,7 @@
dirent->namelen = namelen;
strncpy(dirent->name, name, namelen);
dirent->type = type;
- reclen = FUSE_DIRENT_SIZE(dirent);
- res = fwrite(dirent, reclen, 1, dh->fp);
- free(dirent);
- if (res == 0) {
- perror("fuse: writing directory file");
- return -EIO;
- }
+ dh->len += FUSE_DIRENT_SIZE(dirent);
return 0;
}
@@ -832,30 +828,6 @@
return res;
}
-static void do_getdir(struct fuse *f, struct fuse_in_header *in)
-{
- int res;
- struct fuse_getdir_out arg;
- struct fuse_dirhandle dh;
-
- dh.fuse = f;
- dh.fp = tmpfile();
-
- res = -EIO;
- if (dh.fp == NULL)
- perror("fuse: failed to create temporary file");
- else {
- res = common_getdir(f, in, &dh);
- fflush(dh.fp);
- }
- memset(&arg, 0, sizeof(struct fuse_getdir_out));
- if (res == 0)
- arg.fd = fileno(dh.fp);
- send_reply(f, in, res, &arg, sizeof(arg));
- if (dh.fp != NULL)
- fclose(dh.fp);
-}
-
static void do_mknod(struct fuse *f, struct fuse_in_header *in,
struct fuse_mknod_in *inarg)
{
@@ -1556,17 +1528,11 @@
dh = (struct fuse_dirhandle *) malloc(sizeof(struct fuse_dirhandle));
if (dh != NULL) {
dh->fuse = f;
- dh->fp = tmpfile();
+ dh->contents = NULL;
+ dh->len = 0;
dh->filled = 0;
-
- res = -EIO;
- if (dh->fp == NULL) {
- perror("fuse: failed to create temporary file");
- free(dh);
- } else {
- outarg.fh = (unsigned long) dh;
- res = 0;
- }
+ outarg.fh = (unsigned long) dh;
+ res = 0;
}
send_reply(f, in, res, &outarg, sizeof(outarg));
}
@@ -1574,12 +1540,11 @@
static void do_readdir(struct fuse *f, struct fuse_in_header *in,
struct fuse_read_in *arg)
{
- int res;
char *outbuf;
struct fuse_dirhandle *dh = get_dirhandle(arg->fh);
if (!dh->filled) {
- res = common_getdir(f, in, dh);
+ int res = common_getdir(f, in, dh);
if (res) {
send_reply(f, in, res, NULL, 0);
return;
@@ -1594,17 +1559,16 @@
char *buf = outbuf + sizeof(struct fuse_out_header);
size_t size = 0;
size_t outsize;
- fseek(dh->fp, arg->offset, SEEK_SET);
- res = fread(buf, 1, arg->size, dh->fp);
- if (res == 0 && ferror(dh->fp))
- res = -EIO;
- else {
- size = res;
- res = 0;
+ if (arg->offset < dh->len) {
+ size = arg->size;
+ if (arg->offset + size > dh->len)
+ size = dh->len - arg->offset;
+
+ memcpy(buf, dh->contents + arg->offset, size);
}
memset(out, 0, sizeof(struct fuse_out_header));
out->unique = in->unique;
- out->error = res;
+ out->error = 0;
outsize = sizeof(struct fuse_out_header) + size;
send_reply_raw(f, outbuf, outsize);
@@ -1616,7 +1580,7 @@
struct fuse_release_in *arg)
{
struct fuse_dirhandle *dh = get_dirhandle(arg->fh);
- fclose(dh->fp);
+ free(dh->contents);
free(dh);
send_reply(f, in, 0, NULL, 0);
}
@@ -1674,10 +1638,6 @@
do_readlink(f, in);
break;
- case FUSE_GETDIR:
- do_getdir(f, in);
- break;
-
case FUSE_MKNOD:
do_mknod(f, in, (struct fuse_mknod_in *) inarg);
break;