summaryrefslogtreecommitdiff
path: root/netfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'netfs.c')
-rw-r--r--netfs.c71
1 files changed, 67 insertions, 4 deletions
diff --git a/netfs.c b/netfs.c
index 024a097..c1057ab 100644
--- a/netfs.c
+++ b/netfs.c
@@ -64,9 +64,66 @@ netfs_append_args (char **argz, size_t *argz_len)
OPT_LONG (OPT_LONG_UNDERLYING));
}
}
+
return err;
}
+#ifndef __USE_FILE_OFFSET64
+#define OFFSET_T __off_t /* Size in bytes. */
+#else
+#define OFFSET_T __off64_t /* Size in bytes. */
+#endif
+
+static error_t
+_get_node_size (struct node *dir, OFFSET_T *off)
+{
+ size_t size = 0;
+ error_t err;
+ int count = 0;
+ node_dirent_t *dirent_start, *dirent_current;
+ node_dirent_t *dirent_list = NULL;
+ int first_entry = 2;
+
+ int bump_size (const char *name)
+ {
+ size_t new_size = size + DIRENT_LEN (strlen (name));
+
+ size = new_size;
+ count ++;
+ return 1;
+ }
+
+ err = node_entries_get (dir, &dirent_list);
+ if (err)
+ return err;
+
+ for (dirent_start = dirent_list, count = 2;
+ dirent_start && first_entry > count;
+ dirent_start = dirent_start->next, count++);
+
+ count = 0;
+
+ /* Make space for the `.' and `..' entries. */
+ if (first_entry == 0)
+ bump_size (".");
+ if (first_entry <= 1)
+ bump_size ("..");
+
+ /* See how much space we need for the result. */
+ for (dirent_current = dirent_start;
+ dirent_current;
+ dirent_current = dirent_current->next)
+ if (! bump_size (dirent_current->dirent->d_name))
+ break;
+
+ free (dirent_list);
+
+ *off = size;
+
+ return 0;
+}
+
+
/* Make sure that NP->nn_stat is filled with current information.
CRED identifies the user responsible for the operation. */
error_t
@@ -94,6 +151,11 @@ netfs_validate_stat (struct node *np, struct iouser *cred)
err = ENOENT; /* FIXME? */
}
}
+ else
+ {
+ _get_node_size (np, &np->nn_stat.st_size);
+ }
+
return err;
}
@@ -242,13 +304,13 @@ netfs_attempt_unlink (struct iouser *user, struct node *dir,
err = node_lookup_file (dir, name, 0, &p, &statbuf);
if (err)
- return err;
+ return err;
port_dealloc (p);
err = fshelp_checkdirmod (&dir->nn_stat, &statbuf, user);
if (err)
- return err;
+ return err;
err = node_unlink_file (dir, name);
@@ -310,6 +372,7 @@ netfs_attempt_mkdir (struct iouser *user, struct node *dir,
port_dealloc (p);
exit:
+
return err;
}
@@ -327,13 +390,13 @@ netfs_attempt_rmdir (struct iouser *user,
err = node_lookup_file (dir, name, 0, &p, &statbuf);
if (err)
- return err;
+ return err;
port_dealloc (p);
err = fshelp_checkdirmod (&dir->nn_stat, &statbuf, user);
if (err)
- return err;
+ return err;
err = node_dir_remove (dir, name);