1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
From ce21071c13ce02ef168674e5ee4be1040322fc46 Mon Sep 17 00:00:00 2001
From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Fri, 19 Sep 2014 10:01:57 +0200
Subject: [PATCH 5/7] procfs: generalize the translator linkage code
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 | 62 ++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 42 insertions(+), 20 deletions(-)
diff --git a/procfs/rootdir.c b/procfs/rootdir.c
index 81e36f7..a04fb3e 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,
}
},
{
--
2.1.0
|