diff options
author | Jeremie Koenig <jk@jk.fr.eu.org> | 2010-08-17 10:26:12 +0000 |
---|---|---|
committer | Jeremie Koenig <jk@jk.fr.eu.org> | 2010-08-30 14:14:48 +0200 |
commit | 56ba0ac1e3a3f32763060ab862a6f0054c8a50bf (patch) | |
tree | 5d1c05531572f8eb9e3b6508714d66f4be7ae639 /procfs_dir.c | |
parent | 0a4c7a1ca8bff458eb11322d2c94ec9ffd832524 (diff) |
Implement simple directories
* procfs_dir.h: New file; declare the procfs_dir_make_node
function, based on the procfs_dir_entry structure.
* procfs_dir.c: New file; implement simple directories.
* Makefile: Add the procfs_dir module.
* main.c: Use it.
Diffstat (limited to 'procfs_dir.c')
-rw-r--r-- | procfs_dir.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/procfs_dir.c b/procfs_dir.c new file mode 100644 index 00000000..4d4faa28 --- /dev/null +++ b/procfs_dir.c @@ -0,0 +1,79 @@ +#include <stdlib.h> +#include <string.h> +#include "procfs.h" +#include "procfs_dir.h" + +struct procfs_dir_node +{ + const struct procfs_dir_entry *entries; + void *hook; +}; + +static error_t +procfs_dir_get_contents (void *hook, void **contents, size_t *contents_len) +{ + struct procfs_dir_node *dn = hook; + const struct procfs_dir_entry *ent; + char *pos; + + *contents_len = 0; + for (ent = dn->entries; ent->name; ent++) + *contents_len += strlen (ent->name) + 1; + + *contents = malloc (*contents_len); + if (! *contents) + return ENOMEM; + + pos = *contents; + for (ent = dn->entries; ent->name; ent++) + { + strcpy (pos, ent->name); + pos += strlen (ent->name) + 1; + } + + return 0; +} + +static error_t +procfs_dir_lookup (void *hook, const char *name, struct node **np) +{ + struct procfs_dir_node *dn = hook; + const struct procfs_dir_entry *ent; + + for (ent = dn->entries; ent->name && strcmp (name, ent->name); ent++); + if (! ent->name) + return ENOENT; + + *np = ent->make_node (dn->hook, ent->hook); + if (! *np) + return ENOMEM; + + return 0; +} + +struct node * +procfs_dir_make_node (const struct procfs_dir_entry *entries, 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, + }; + struct procfs_dir_node *dn; + struct node *np; + + dn = malloc (sizeof *dn); + if (! dn) + return NULL; + + dn->entries = entries; + dn->hook = dir_hook; + + np = procfs_make_node (&ops, dn); + if (! np) + free (dn); + + return np; +} + |