bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 4/6] procfs: generalize the translator linkage code


From: Justus Winter
Subject: [PATCH 4/6] procfs: generalize the translator linkage code
Date: Sun, 21 Sep 2014 12:12:34 +0200

Generalize the translator linkage code previously introduced for the
`mounts' node.

* procfs/rootdir.c (struct procfs_translated_node_ops): New
specialized node operations structure for translated nodes.
(rootdir_mounts_make_node): Generalize and rename to
rootdir_make_translated_node.  Also, pass the entry_hook to
procfs_make_node so that...
(rootdir_mounts_get_translator): ... can be generalized to
rootdir_translated_node_get_translator and read the argz vector from
the hooked structure.
(ROOTDIR_DEFINE_TRANSLATED_NODE): New convenience macro to define
translated nodes.
(rootdir_entries): Use the new code for the `mounts' node.
---
 procfs/rootdir.c | 61 +++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 41 insertions(+), 20 deletions(-)

diff --git a/procfs/rootdir.c b/procfs/rootdir.c
index 81e36f7..32e46a0 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(ARGZ)                     \
+  &(struct procfs_translated_node_ops) {                         \
+    .node_ops = {                                                \
+      .get_translator = rootdir_translated_node_get_translator,          \
+    },                                                           \
+    .npp = &rootdir_mounts_node,                                 \
+    .argz = (ARGZ),                                              \
+    .argz_len = sizeof (ARGZ),                                   \
+  }
+
 static error_t
 rootdir_gc_slabinfo (void *hook, char **contents, ssize_t *contents_len)
 {
@@ -660,11 +683,9 @@ 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 (_HURD_MTAB "\0/"),
     .ops = {
-      .make_node = rootdir_mounts_make_node,
+      .make_node = rootdir_make_translated_node,
     }
   },
   {
-- 
2.1.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]