summaryrefslogtreecommitdiff
path: root/procfs_dir.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_dir.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_dir.c')
-rw-r--r--procfs_dir.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/procfs_dir.c b/procfs_dir.c
index 62a45b1..b7fb28f 100644
--- a/procfs_dir.c
+++ b/procfs_dir.c
@@ -7,6 +7,7 @@ struct procfs_dir_node
{
const struct procfs_dir_entry *entries;
void *hook;
+ void (*cleanup) (void *hook);
};
static error_t
@@ -51,23 +52,41 @@ procfs_dir_lookup (void *hook, const char *name, struct node **np)
return 0;
}
+static void
+procfs_dir_cleanup (void *hook)
+{
+ struct procfs_dir_node *dn = hook;
+
+ if (dn->cleanup)
+ dn->cleanup (dn->hook);
+
+ free (dn);
+}
+
struct node *
-procfs_dir_make_node (const struct procfs_dir_entry *entries, void *dir_hook)
+procfs_dir_make_node (const struct procfs_dir_entry *entries,
+ void *dir_hook, void (*cleanup) (void *dir_hook))
{
static const struct procfs_node_ops ops = {
.get_contents = procfs_dir_get_contents,
.lookup = procfs_dir_lookup,
- .cleanup_contents = free,
- .cleanup = free,
+ .cleanup_contents = procfs_cleanup_contents_with_free,
+ .cleanup = procfs_dir_cleanup,
};
struct procfs_dir_node *dn;
dn = malloc (sizeof *dn);
if (! dn)
- return NULL;
+ {
+ if (cleanup)
+ cleanup (dir_hook);
+
+ return NULL;
+ }
dn->entries = entries;
dn->hook = dir_hook;
+ dn->cleanup = cleanup;
return procfs_make_node (&ops, dn);
}