diff options
-rw-r--r-- | procfs/rootdir.c | 62 |
1 files changed, 42 insertions, 20 deletions
diff --git a/procfs/rootdir.c b/procfs/rootdir.c index 81e36f7e..a04fb3e3 100644 --- a/procfs/rootdir.c +++ b/procfs/rootdir.c @@ -409,17 +409,29 @@ rootdir_gc_fakeself (void *hook, char **contents, ssize_t *contents_len) } static struct node *rootdir_mounts_node; -static pthread_spinlock_t rootdir_mounts_node_lock = + +/* Translator linkage. */ +static pthread_spinlock_t rootdir_translated_node_lock = PTHREAD_SPINLOCK_INITIALIZER; +struct procfs_translated_node_ops +{ + struct procfs_node_ops node_ops; + + struct node **npp; + char *argz; + size_t argz_len; +}; + static struct node * -rootdir_mounts_make_node (void *dir_hook, const void *entry_hook) +rootdir_make_translated_node (void *dir_hook, const void *entry_hook) { + const struct procfs_translated_node_ops *ops = entry_hook; struct node *np, *prev; - pthread_spin_lock (&rootdir_mounts_node_lock); - np = rootdir_mounts_node; - pthread_spin_unlock (&rootdir_mounts_node_lock); + pthread_spin_lock (&rootdir_translated_node_lock); + np = *ops->npp; + pthread_spin_unlock (&rootdir_translated_node_lock); if (np != NULL) { @@ -427,18 +439,18 @@ rootdir_mounts_make_node (void *dir_hook, const void *entry_hook) return np; } - np = procfs_make_node (entry_hook, dir_hook); + np = procfs_make_node (entry_hook, entry_hook); if (np == NULL) return NULL; procfs_node_chtype (np, S_IFREG | S_IPTRANS); procfs_node_chmod (np, 0444); - pthread_spin_lock (&rootdir_mounts_node_lock); - prev = rootdir_mounts_node; - if (rootdir_mounts_node == NULL) - rootdir_mounts_node = np; - pthread_spin_unlock (&rootdir_mounts_node_lock); + pthread_spin_lock (&rootdir_translated_node_lock); + prev = *ops->npp; + if (*ops->npp == NULL) + *ops->npp = np; + pthread_spin_unlock (&rootdir_translated_node_lock); if (prev != NULL) { @@ -450,19 +462,30 @@ rootdir_mounts_make_node (void *dir_hook, const void *entry_hook) } static error_t -rootdir_mounts_get_translator (void *hook, char **argz, size_t *argz_len) +rootdir_translated_node_get_translator (void *hook, char **argz, + size_t *argz_len) { - static const char const mtab_argz[] = _HURD_MTAB "\0/"; + const struct procfs_translated_node_ops *ops = hook; - *argz = malloc (sizeof mtab_argz); + *argz = malloc (ops->argz_len); if (! *argz) return ENOMEM; - memcpy (*argz, mtab_argz, sizeof mtab_argz); - *argz_len = sizeof mtab_argz; + memcpy (*argz, ops->argz, ops->argz_len); + *argz_len = ops->argz_len; return 0; } +#define ROOTDIR_DEFINE_TRANSLATED_NODE(NPP, ARGZ) \ + &(struct procfs_translated_node_ops) { \ + .node_ops = { \ + .get_translator = rootdir_translated_node_get_translator, \ + }, \ + .npp = NPP, \ + .argz = (ARGZ), \ + .argz_len = sizeof (ARGZ), \ + } + static error_t rootdir_gc_slabinfo (void *hook, char **contents, ssize_t *contents_len) { @@ -660,11 +683,10 @@ static const struct procfs_dir_entry rootdir_entries[] = { }, { .name = "mounts", - .hook = & (struct procfs_node_ops) { - .get_translator = rootdir_mounts_get_translator, - }, + .hook = ROOTDIR_DEFINE_TRANSLATED_NODE (&rootdir_mounts_node, + _HURD_MTAB "\0/"), .ops = { - .make_node = rootdir_mounts_make_node, + .make_node = rootdir_make_translated_node, } }, { |