bug-hurd
[Top][All Lists]
Advanced

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

[PATCH] utils/mount: add mount options to create firmlinks.


From: Gabriele Giacone
Subject: [PATCH] utils/mount: add mount options to create firmlinks.
Date: Sat, 24 May 2014 12:39:38 +0200

* utils/mount.c (parse_opt): Add -B/--bind/--firmlink/-o bind mount
  options.  (do_mount): Do not pass bind mount option to settrans, set
  firmlink fstype.  (main): Likewise.
---
 utils/mount.c | 38 +++++++++++++++++++++++++++++++-------
 1 file changed, 31 insertions(+), 7 deletions(-)

diff --git a/utils/mount.c b/utils/mount.c
index df77c66..e6893cb 100644
--- a/utils/mount.c
+++ b/utils/mount.c
@@ -64,6 +64,8 @@ static const struct argp_option argp_opts[] =
   {"no-mtab", 'n', 0, 0, "Do not update /etc/mtab"},
   {"test-opts", 'O', "OPTIONS", 0,
    "Only mount fstab entries matching the given set of options"},
+  {"bind", 'B', 0, 0, "Bind mount, firmlink"},
+  {"firmlink", 0, 0, OPTION_ALIAS},
   {"fake", 'f', 0, 0, "Do not actually mount, just pretend"},
   {0, 0}
 };
@@ -87,6 +89,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
     case 'r': ARGZ (add (&options, &options_len, "ro"));
     case 'w': ARGZ (add (&options, &options_len, "rw"));
     case 'u': ARGZ (add (&options, &options_len, "update"));
+    case 'B': ARGZ (add (&options, &options_len, "bind"));
     case 'o': ARGZ (add_sep (&options, &options_len, arg, ','));
     case 'v': ++verbose; break;
 #undef ARGZ
@@ -250,12 +253,20 @@ do_mount (struct fs *fs, int remount)
       /* Append the fstab options to any specified on the command line.  */
       ARGZ (create_sep (fs->mntent.mnt_opts, ',', &mntopts, &mntopts_len));
 
-      /* Remove the `noauto' option, since it's for us not the filesystem.  */
+      /* Remove the `noauto' and `bind' options, since they're for us not the
+         filesystem.  */
       for (o = mntopts; o; o = argz_next (mntopts, mntopts_len, o))
-       if (!strcmp (o, MNTOPT_NOAUTO))
-         break;
-      if (o)
-       argz_delete (&mntopts, &mntopts_len, o);
+        {
+          if (strcmp (o, MNTOPT_NOAUTO) == 0)
+            argz_delete (&mntopts, &mntopts_len, o);
+          if (strcmp (o, "bind") == 0)
+            {
+              fs->mntent.mnt_type = strdup ("firmlink");
+              if (! fs->mntent.mnt_type)
+                error (3, ENOMEM, "failed to allocate memory");
+              argz_delete (&mntopts, &mntopts_len, o);
+            }
+        }
 
       ARGZ (append (&mntopts, &mntopts_len, options, options_len));
     }
@@ -273,7 +284,7 @@ do_mount (struct fs *fs, int remount)
       {
        ARGZ (add (&fsopts, &fsopts_len, o));
       }
-    else if (strcmp (o, "defaults") != 0)
+    else if ((strcmp (o, "defaults") != 0) && (strlen (o) != 0))
       {
        /* Prepend `--' to the option to make a long option switch,
           e.g. `--ro' or `--rsize=1024'.  */
@@ -572,7 +583,7 @@ do_query (struct fs *fs)
 int
 main (int argc, char **argv)
 {
-  unsigned int remount;
+  unsigned int remount, firmlink;
   struct fstab *fstab;
   struct fs *fs;
   error_t err;
@@ -598,6 +609,15 @@ main (int argc, char **argv)
   if (err)
     error (3, ENOMEM, "collecting mount options");
 
+  /* Do not pass `bind' option to firmlink translator */
+  char *opt = NULL;
+  while ((opt = argz_next (options, options_len, opt)))
+    if (strcmp (opt, "bind") == 0)
+      {
+        firmlink = 1;
+        argz_delete(&options, &options_len, opt);
+      }
+
   if (device)                  /* two-argument form */
     {
       struct mntent m =
@@ -608,6 +628,8 @@ main (int argc, char **argv)
        mnt_opts: 0,
        mnt_freq: 0, mnt_passno: 0
       };
+      if (firmlink)
+        m.mnt_type = strdup ("firmlink");
 
       err = fstab_add_mntent (fstab, &m, &fs);
       if (err)
@@ -625,6 +647,8 @@ main (int argc, char **argv)
        mnt_opts: 0,
        mnt_freq: 0, mnt_passno: 0
       };
+      if (firmlink)
+        m.mnt_type = strdup ("firmlink");
 
       err = fstab_add_mntent (fstab, &m, &fs);
       if (err)
-- 
2.0.0.rc2




reply via email to

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