summaryrefslogtreecommitdiff
path: root/procfs.c
diff options
context:
space:
mode:
authorJeremie Koenig <jk@jk.fr.eu.org>2010-08-17 17:27:54 +0000
committerJeremie Koenig <jk@jk.fr.eu.org>2010-08-30 14:14:48 +0200
commitba139824fa06a97f2a3b1cc4c6085d10a83ec2b9 (patch)
treecab204b860507636bf9a42fb5cc3368b29f9ba99 /procfs.c
parentac75e3648e6a9c3a8cf45d5fa491abd3a3ab3613 (diff)
More cleanup possibilities
* procfs.c, procfs.h: Extend the signature of the cleanup_contents callback in the procfs_node_ops structure to include the hook and contents_len. (cleanup_contents_with_free, cleanup_contents_with_vm_deallocate): New functions, can be used as a cleanup_contents callback for simple cases. * procfs_dir.c, procfs_dir.h (procfs_dir_make_node): Update, add a cleanup callback, make sure the cleanup callback is invoked if there is an error. * proclist.c (proclist_make_node), main.c (main): Update to match the new interfaces.
Diffstat (limited to 'procfs.c')
-rw-r--r--procfs.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/procfs.c b/procfs.c
index 0c57686..755e051 100644
--- a/procfs.c
+++ b/procfs.c
@@ -1,6 +1,7 @@
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
+#include <mach.h>
#include <hurd/netfs.h>
#include <hurd/fshelp.h>
#include "procfs.h"
@@ -15,6 +16,18 @@ struct netnode
size_t contents_len;
};
+void
+procfs_cleanup_contents_with_free (void *hook, void *cont, size_t len)
+{
+ free (cont);
+}
+
+void
+procfs_cleanup_contents_with_vm_deallocate (void *hook, void *cont, size_t len)
+{
+ vm_deallocate (mach_task_self (), (vm_address_t) cont, (vm_size_t) len);
+}
+
struct node *procfs_make_node (const struct procfs_node_ops *ops, void *hook)
{
struct netnode *nn;
@@ -85,7 +98,7 @@ error_t procfs_lookup (struct node *np, const char *name, struct node **npp)
void procfs_cleanup (struct node *np)
{
if (np->nn->contents && np->nn->ops->cleanup_contents)
- np->nn->ops->cleanup_contents (np->nn->contents);
+ np->nn->ops->cleanup_contents (np->nn->hook, np->nn->contents, np->nn->contents_len);
if (np->nn->ops->cleanup)
np->nn->ops->cleanup (np->nn->hook);