summaryrefslogtreecommitdiff
path: root/debian/patches/procfs-0006-procfs-reorganize-rootdir.c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/procfs-0006-procfs-reorganize-rootdir.c.patch')
-rw-r--r--debian/patches/procfs-0006-procfs-reorganize-rootdir.c.patch187
1 files changed, 187 insertions, 0 deletions
diff --git a/debian/patches/procfs-0006-procfs-reorganize-rootdir.c.patch b/debian/patches/procfs-0006-procfs-reorganize-rootdir.c.patch
new file mode 100644
index 00000000..34ffc9bc
--- /dev/null
+++ b/debian/patches/procfs-0006-procfs-reorganize-rootdir.c.patch
@@ -0,0 +1,187 @@
+From 57cc10fd45bec12e61a783e5ccced10be956483a Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Fri, 19 Sep 2014 10:10:24 +0200
+Subject: [PATCH 6/7] procfs: reorganize rootdir.c
+
+* procfs/rootdir.c: Move the translator linkage code to the
+appropriate location.
+---
+ procfs/rootdir.c | 153 ++++++++++++++++++++++++++++---------------------------
+ 1 file changed, 77 insertions(+), 76 deletions(-)
+
+diff --git a/procfs/rootdir.c b/procfs/rootdir.c
+index a04fb3e..d68645e 100644
+--- a/procfs/rootdir.c
++++ b/procfs/rootdir.c
+@@ -409,83 +409,7 @@ rootdir_gc_fakeself (void *hook, char **contents, ssize_t *contents_len)
+ }
+
+ static struct node *rootdir_mounts_node;
+-
+-/* 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_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_translated_node_lock);
+- np = *ops->npp;
+- pthread_spin_unlock (&rootdir_translated_node_lock);
+-
+- if (np != NULL)
+- {
+- netfs_nref (np);
+- return np;
+- }
+-
+- 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_translated_node_lock);
+- prev = *ops->npp;
+- if (*ops->npp == NULL)
+- *ops->npp = np;
+- pthread_spin_unlock (&rootdir_translated_node_lock);
+-
+- if (prev != NULL)
+- {
+- procfs_cleanup (np);
+- np = prev;
+- }
+-
+- return np;
+-}
+-
+-static error_t
+-rootdir_translated_node_get_translator (void *hook, char **argz,
+- size_t *argz_len)
+-{
+- const struct procfs_translated_node_ops *ops = hook;
+-
+- *argz = malloc (ops->argz_len);
+- if (! *argz)
+- return ENOMEM;
+-
+- 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)
+ {
+@@ -619,7 +543,84 @@ rootdir_symlink_make_node (void *dir_hook, const void *entry_hook)
+ procfs_node_chtype (np, S_IFLNK);
+ return np;
+ }
++
++/* 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_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_translated_node_lock);
++ np = *ops->npp;
++ pthread_spin_unlock (&rootdir_translated_node_lock);
++
++ if (np != NULL)
++ {
++ netfs_nref (np);
++ return np;
++ }
++
++ 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_translated_node_lock);
++ prev = *ops->npp;
++ if (*ops->npp == NULL)
++ *ops->npp = np;
++ pthread_spin_unlock (&rootdir_translated_node_lock);
++
++ if (prev != NULL)
++ {
++ procfs_cleanup (np);
++ np = prev;
++ }
++
++ return np;
++}
++
++static error_t
++rootdir_translated_node_get_translator (void *hook, char **argz,
++ size_t *argz_len)
++{
++ const struct procfs_translated_node_ops *ops = hook;
+
++ *argz = malloc (ops->argz_len);
++ if (! *argz)
++ return ENOMEM;
++
++ 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 const struct procfs_dir_entry rootdir_entries[] = {
+ {
+ .name = "self",
+--
+2.1.0
+