aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/mount.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2010-04-29 08:47:44 +0000
committerCorinna Vinschen <corinna@vinschen.de>2010-04-29 08:47:44 +0000
commita11a07231b6b2012d7c6b5d8e52aea7d1fdc877e (patch)
treecc5e566032c02afe0d16771a2b4a161c9659243a /winsup/cygwin/mount.cc
parentf00bc469e2a13b2a966a51de7dc3c094829a6ea6 (diff)
downloadnewlib-a11a07231b6b2012d7c6b5d8e52aea7d1fdc877e.zip
newlib-a11a07231b6b2012d7c6b5d8e52aea7d1fdc877e.tar.gz
newlib-a11a07231b6b2012d7c6b5d8e52aea7d1fdc877e.tar.bz2
* external.cc (cygwin_internal): Add CW_CVT_MNT_OPTS to allow mount
flag parsing. Add CW_LST_MNT_OPTS case to allow mount flag listing. * mount.cc (fstab_read_flags): Rename from read_flags. Make externally available. Change input string to char ** to allow returning faulty option. Add flag for avoiding debug output. (fstab_list_flags): New function to create list of options. * include/sys/cygwin.h (cygwin_getinfo_types): Add CW_CVT_MNT_OPTS and CW_LST_MNT_OPTS.
Diffstat (limited to 'winsup/cygwin/mount.cc')
-rw-r--r--winsup/cygwin/mount.cc44
1 files changed, 34 insertions, 10 deletions
diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc
index 528c8b6..a11ed34 100644
--- a/winsup/cygwin/mount.cc
+++ b/winsup/cygwin/mount.cc
@@ -953,36 +953,60 @@ compare_flags (const void *a, const void *b)
return strcmp (oa->name, ob->name);
}
-static bool
-read_flags (char *options, unsigned &flags)
+extern "C" bool
+fstab_read_flags (char **options, unsigned &flags, bool external)
{
opt key;
- while (*options)
+ while (**options)
{
- char *p = strchr (options, ',');
+ char *p = strchr (*options, ',');
if (p)
*p++ = '\0';
else
- p = strchr (options, '\0');
+ p = strchr (*options, '\0');
- key.name = options;
- opt *o = (opt *) bsearch (&key, oopts, sizeof oopts / sizeof (opt),
+ key.name = *options;
+ opt *o = (opt *) bsearch (&key, oopts,
+ sizeof oopts / sizeof (opt),
sizeof (opt), compare_flags);
if (!o)
{
- system_printf ("invalid fstab option - '%s'", options);
+ if (!external)
+ system_printf ("invalid fstab option - '%s'", *options);
return false;
}
if (o->clear)
flags &= ~o->val;
else
flags |= o->val;
- options = p;
+ *options = p;
}
return true;
}
+extern "C" char *
+fstab_list_flags ()
+{
+ size_t len = 0;
+ opt *o;
+
+ for (o = oopts; o < (oopts + (sizeof (oopts) / sizeof (oopts[0]))); o++)
+ len += strlen (o->name) + 1;
+ char *buf = (char *) malloc (len);
+ if (buf)
+ {
+ char *bp = buf;
+ for (o = oopts; o < (oopts + (sizeof (oopts) / sizeof (oopts[0]))); o++)
+ {
+ bp = stpcpy (bp, o->name);
+ *bp++ = ',';
+ }
+ *--bp = '\0';
+ }
+ return buf;
+}
+
bool
mount_info::from_fstab_line (char *line, bool user)
{
@@ -1021,7 +1045,7 @@ mount_info::from_fstab_line (char *line, bool user)
unsigned mount_flags = MOUNT_SYSTEM | MOUNT_BINARY;
if (!strcmp (fs_type, "cygdrive"))
mount_flags |= MOUNT_NOPOSIX;
- if (!read_flags (c, mount_flags))
+ if (!fstab_read_flags (&c, mount_flags, false))
return true;
if (user)
mount_flags &= ~MOUNT_SYSTEM;