bug-hurd
[Top][All Lists]
Advanced

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

[PATCH 1/2] libdiskfs: track file name in struct peropen


From: Justus Winter
Subject: [PATCH 1/2] libdiskfs: track file name in struct peropen
Date: Mon, 2 Sep 2013 11:37:05 +0200

Track the relative path used to obtain a file handle in the
struct peropen.

* libdiskfs/diskfs.h (struct peropen): New field path.
* libdiskfs/peropen-make.c (diskfs_make_peropen): Initialize path.
* libdiskfs/peropen-rele.c (diskfs_release_peropen): Free path.
* libdiskfs/fsys-getroot.c (diskfs_S_fsys_getroot): Initialize path.
* libdiskfs/dir-lookup.c (diskfs_S_dir_lookup): Preserve the path.
---
 libdiskfs/dir-lookup.c   |   26 +++++++++++++++++++++++++-
 libdiskfs/diskfs.h       |    3 +++
 libdiskfs/fsys-getroot.c |    3 ++-
 libdiskfs/peropen-make.c |    8 ++++++++
 libdiskfs/peropen-rele.c |    1 +
 5 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c
index 923be03..15a9b0c 100644
--- a/libdiskfs/dir-lookup.c
+++ b/libdiskfs/dir-lookup.c
@@ -1,6 +1,6 @@
 /* libdiskfs implementation of fs.defs:dir_lookup
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-     2002, 2008 Free Software Foundation, Inc.
+     2002, 2008, 2013 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -41,6 +41,7 @@ diskfs_S_dir_lookup (struct protid *dircred,
   struct node *np;
   int nsymlink = 0;
   char *nextname;
+  char *relpath;
   int nextnamelen;
   error_t error = 0;
   char *pathbuf = 0;
@@ -68,6 +69,11 @@ diskfs_S_dir_lookup (struct protid *dircred,
   while (path[0] == '/')
     path++;
 
+  /* Preserve the path relative to diruser->po->path.  */
+  relpath = strdup (path);
+  if (! relpath)
+    return ENOMEM;
+
   *returned_port_poly = MACH_MSG_TYPE_MAKE_SEND;
   *retry = FS_RETRY_NORMAL;
   retryname[0] = '\0';
@@ -479,6 +485,22 @@ diskfs_S_dir_lookup (struct protid *dircred,
 
   if (! error)
     {
+      free (newpi->po->path);
+      if (dircred->po->path == NULL)
+       {
+         /* dircred is the root directory.  */
+         newpi->po->path = relpath;
+         relpath = NULL; /* Do not free relpath.  */
+       }
+      else
+       {
+         newpi->po->path = NULL;
+         asprintf (&newpi->po->path, "%s/%s", dircred->po->path, relpath);
+       }
+
+      if (! newpi->po->path)
+       error = errno;
+
       *returned_port = ports_get_right (newpi);
       ports_port_deref (newpi);
       newpi = 0;
@@ -500,5 +522,7 @@ diskfs_S_dir_lookup (struct protid *dircred,
   if (newpo)
     diskfs_release_peropen (newpo);
 
+  free (relpath);
+
   return error;
 }
diff --git a/libdiskfs/diskfs.h b/libdiskfs/diskfs.h
index 0f9c1d3..2489517 100644
--- a/libdiskfs/diskfs.h
+++ b/libdiskfs/diskfs.h
@@ -69,6 +69,9 @@ struct peropen
   mach_port_t shadow_root_parent;
   /* If in a shadow tree, its root node in this translator.  */
   struct node *shadow_root;
+
+  /* Path relative to the root of the translator. */
+  char *path;
 };
 
 /* A unique one of these exists for each node currently in use (and
diff --git a/libdiskfs/fsys-getroot.c b/libdiskfs/fsys-getroot.c
index 2e11da4..39973a8 100644
--- a/libdiskfs/fsys-getroot.c
+++ b/libdiskfs/fsys-getroot.c
@@ -51,7 +51,8 @@ diskfs_S_fsys_getroot (fsys_t controlport,
   {
     root_parent: dotdot,
     shadow_root_parent: MACH_PORT_NULL,
-    shadow_root: _diskfs_chroot_directory ? diskfs_root_node : NULL /* XXX */
+    shadow_root: _diskfs_chroot_directory ? diskfs_root_node : NULL, /* XXX */
+    path: NULL,
   };
 
   if (!pt)
diff --git a/libdiskfs/peropen-make.c b/libdiskfs/peropen-make.c
index d37516c..b11b2ad 100644
--- a/libdiskfs/peropen-make.c
+++ b/libdiskfs/peropen-make.c
@@ -34,6 +34,7 @@ diskfs_make_peropen (struct node *np, int flags, struct 
peropen *context,
   po->refcnt = 0;
   po->openstat = flags;
   po->np = np;
+  po->path = NULL;
 
   if (context)
     {
@@ -50,6 +51,13 @@ diskfs_make_peropen (struct node *np, int flags, struct 
peropen *context,
       if (po->shadow_root_parent != MACH_PORT_NULL)
        mach_port_mod_refs (mach_task_self (), po->shadow_root_parent, 
                            MACH_PORT_RIGHT_SEND, 1);
+
+      if (context->path)
+       {
+         po->path = strdup (context->path);
+         if (! po->path)
+           return ENOMEM;
+       }
     }
   else
     {
diff --git a/libdiskfs/peropen-rele.c b/libdiskfs/peropen-rele.c
index 08276ec..d3f7492 100644
--- a/libdiskfs/peropen-rele.c
+++ b/libdiskfs/peropen-rele.c
@@ -45,5 +45,6 @@ diskfs_release_peropen (struct peropen *po)
 
   diskfs_nput (po->np);
 
+  free (po->path);
   free (po);
 }
-- 
1.7.10.4




reply via email to

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