diff options
author | Jeremie Koenig <jk@jk.fr.eu.org> | 2010-08-17 10:10:22 +0000 |
---|---|---|
committer | Jeremie Koenig <jk@jk.fr.eu.org> | 2010-08-30 14:14:48 +0200 |
commit | 0a4c7a1ca8bff458eb11322d2c94ec9ffd832524 (patch) | |
tree | 645506d2f687121d88e8012d7d21f68b6de872b0 /procfs_file.c | |
parent | d938e96e59a41d5eaa11040513815b757e58eb0c (diff) |
Add a helper module for simple regular files
* procfs_file.h: New file, declares procfs_file_make_node.
* procfs_file.c: New file, implements procfs_file_make_node.
* main.c: Use them.
* Makefile: Add the procfs_file module.
Diffstat (limited to 'procfs_file.c')
-rw-r--r-- | procfs_file.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/procfs_file.c b/procfs_file.c new file mode 100644 index 0000000..62419ee --- /dev/null +++ b/procfs_file.c @@ -0,0 +1,59 @@ +#include <hurd/hurd_types.h> +#include <stdlib.h> +#include <string.h> +#include "procfs.h" +#include "procfs_file.h" + +struct procfs_file +{ + void *contents; + size_t len; + void (*cleanup)(void *contents); +}; + +error_t +procfs_file_getcontents (void *hook, void **contents, size_t *contents_len) +{ + struct procfs_file *f = hook; + + *contents = f->contents; + *contents_len = f->len; + return 0; +} + +void +procfs_file_cleanup (void *hook) +{ + struct procfs_file *f = hook; + + if (f->cleanup) + f->cleanup (f->contents); + + free (f); +} + +struct node * +procfs_file_make_node (void *contents, ssize_t len, void (*cleanup)(void *)) +{ + static const struct procfs_node_ops ops = { + .get_contents = procfs_file_getcontents, + .cleanup = procfs_file_cleanup, + }; + struct procfs_file *f; + struct node *np; + + f = malloc (sizeof *f); + if (! f) + return NULL; + + f->contents = contents; + f->len = (len >= 0) ? len : strlen (f->contents); + f->cleanup = cleanup; + + np = procfs_make_node (&ops, f); + if (! np) + free (f); + + return np; +} + |