cygwin ChangeLog
2009-05-13 Corinna Vinschen <corinna@vinschen.de> Christopher Faylor <me+cygwin@cgf.cx> * mount.cc (mount_info::got_usr_bin): Define. (mount_info::got_usr_lib): Ditto. (mount_info::root_idx): Ditto. (mount_info::create_root_entry): Create root entry as immutable and flag as automatic. (mount_info::init): Remove "Huh? No /etc/fstab..." warning. Unconditionally call from_fstab for user and system tables. Fill in /usr/bin and /usr/lib if they have not been specified in /etc/fstab. (oopts): Alphabetize. Add "override" option to allow overriding immutable mount points. (mount_info::add_item): Accommodate new MOUNT_IMMUTABLE flag intended for root mount. (mount_info::add_item): Detect "/usr/bin", "/usr/lib", and "/" and set appropriate global state. (fillout_mntent): Add ,auto to mount points added by Cygwin DLL. (mount): Remove masking of MOUNT_SYSTEM. Allow user to shoot themselves. Add comment. * mount.h (mount_info::got_usr_bin): Declare. (mount_info::got_usr_lib): Ditto. (mount_info::root_idx): Ditto. * include/sys/mount.h: Reformat enum. Add MOUNT_{OVERRIDE,IMMUTABLE,AUTOMATIC}. doc ChangeLog 2009-05-13 Corinna Vinschen <corinna@vinschen.de> Christopher Faylor <me+cygwin@cgf.cx> * pathnames.sgml (mount-table): Sort mount options and add override option. Add description of root mount handling. utils ChangeLog 2009-05-13 Corinna Vinschen <corinna@vinschen.de> Christopher Faylor <me+cygwin@cgf.cx> * mount.cc (oopts): Sort. Add override option. Add dummy "auto" option for consistency. (mount_entries): Avoid adding auto-mounted entries to -m output. * utils.sgml: Sort mount options. Add description of override option.
This commit is contained in:
@@ -31,6 +31,7 @@ details. */
|
||||
#include <ntdll.h>
|
||||
#include <wchar.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
/* Determine if path prefix matches current cygdrive */
|
||||
#define iscygdrive(path) \
|
||||
@@ -44,6 +45,10 @@ details. */
|
||||
#define isproc(path) \
|
||||
(path_prefix_p (proc, (path), proc_len, false))
|
||||
|
||||
bool mount_info::got_usr_bin;
|
||||
bool mount_info::got_usr_lib;
|
||||
int mount_info::root_idx = -1;
|
||||
|
||||
/* is_unc_share: Return non-zero if PATH begins with //server/share
|
||||
or with one of the native prefixes //./ or //?/
|
||||
This function is only used to test for valid input strings.
|
||||
@@ -298,10 +303,12 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
|
||||
inline void
|
||||
mount_info::create_root_entry (const PWCHAR root)
|
||||
{
|
||||
/* Create a default root dir from the path the Cygwin DLL is in. */
|
||||
/* Create a default root dir derived from the location of the Cygwin DLL.
|
||||
The entry is immutable, unless the "override" option is given in /etc/fstab. */
|
||||
char native_root[PATH_MAX];
|
||||
sys_wcstombs (native_root, PATH_MAX, root);
|
||||
mount_table->add_item (native_root, "/", MOUNT_SYSTEM | MOUNT_BINARY);
|
||||
mount_table->add_item (native_root, "/",
|
||||
MOUNT_SYSTEM | MOUNT_BINARY | MOUNT_OVERRIDE | MOUNT_AUTOMATIC);
|
||||
/* Create a default cygdrive entry. Note that this is a user entry.
|
||||
This allows to override it with mount, unless the sysadmin created
|
||||
a cygdrive entry in /etc/fstab. */
|
||||
@@ -322,12 +329,28 @@ mount_info::init ()
|
||||
pathend = wcpcpy (path, cygwin_shared->installation_root);
|
||||
create_root_entry (path);
|
||||
pathend = wcpcpy (pathend, L"\\etc\\fstab");
|
||||
if (from_fstab (false, path, pathend) /* The single | is correct! */
|
||||
| from_fstab (true, path, pathend))
|
||||
return;
|
||||
|
||||
/* FIXME: Remove warning message before releasing 1.7.0. */
|
||||
small_printf ("Huh? No /etc/fstab file in %W? Using default root and cygdrive prefix...\n", path);
|
||||
from_fstab (false, path, pathend);
|
||||
from_fstab (true, path, pathend);
|
||||
|
||||
if (!got_usr_bin || !got_usr_lib)
|
||||
{
|
||||
char native[PATH_MAX];
|
||||
assert (root_idx != -1);
|
||||
char *p = stpcpy (native, mount[root_idx].native_path);
|
||||
if (!got_usr_bin)
|
||||
{
|
||||
stpcpy (p, "\\bin");
|
||||
mount_table->add_item (native, "/usr/bin",
|
||||
MOUNT_SYSTEM | MOUNT_BINARY | MOUNT_AUTOMATIC | MOUNT_CYGWIN_EXEC);
|
||||
}
|
||||
if (!got_usr_lib)
|
||||
{
|
||||
stpcpy (p, "\\lib");
|
||||
mount_table->add_item (native, "/usr/lib",
|
||||
MOUNT_SYSTEM | MOUNT_BINARY | MOUNT_AUTOMATIC);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -835,18 +858,19 @@ struct opt
|
||||
bool clear;
|
||||
} oopts[] =
|
||||
{
|
||||
{"user", MOUNT_SYSTEM, 1},
|
||||
{"nouser", MOUNT_SYSTEM, 0},
|
||||
{"binary", MOUNT_BINARY, 0},
|
||||
{"text", MOUNT_BINARY, 1},
|
||||
{"exec", MOUNT_EXEC, 0},
|
||||
{"notexec", MOUNT_NOTEXEC, 0},
|
||||
{"cygexec", MOUNT_CYGWIN_EXEC, 0},
|
||||
{"nosuid", 0, 0},
|
||||
{"acl", MOUNT_NOACL, 1},
|
||||
{"binary", MOUNT_BINARY, 0},
|
||||
{"cygexec", MOUNT_CYGWIN_EXEC, 0},
|
||||
{"exec", MOUNT_EXEC, 0},
|
||||
{"noacl", MOUNT_NOACL, 0},
|
||||
{"nosuid", 0, 0},
|
||||
{"notexec", MOUNT_NOTEXEC, 0},
|
||||
{"nouser", MOUNT_SYSTEM, 0},
|
||||
{"override", MOUNT_OVERRIDE, 0},
|
||||
{"posix=0", MOUNT_NOPOSIX, 0},
|
||||
{"posix=1", MOUNT_NOPOSIX, 1},
|
||||
{"posix=0", MOUNT_NOPOSIX, 0}
|
||||
{"text", MOUNT_BINARY, 1},
|
||||
{"user", MOUNT_SYSTEM, 1}
|
||||
};
|
||||
|
||||
static bool
|
||||
@@ -1054,7 +1078,7 @@ mount_info::write_cygdrive_info (const char *cygdrive_prefix, unsigned flags)
|
||||
set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
/* Don't allow to override a system cygdrive prefix. */
|
||||
/* Don't allow overriding of a system cygdrive prefix. */
|
||||
if (cygdrive_flags & MOUNT_SYSTEM)
|
||||
{
|
||||
set_errno (EPERM);
|
||||
@@ -1238,14 +1262,26 @@ mount_info::add_item (const char *native, const char *posix,
|
||||
{
|
||||
if (!strcmp (mount[i].posix_path, posixtmp))
|
||||
{
|
||||
/* Don't allow to override a system mount with a user mount. */
|
||||
/* Don't allow overriding of a system mount with a user mount. */
|
||||
if ((mount[i].flags & MOUNT_SYSTEM) && !(mountflags & MOUNT_SYSTEM))
|
||||
{
|
||||
set_errno (EPERM);
|
||||
return -1;
|
||||
}
|
||||
if ((mount[i].flags & MOUNT_SYSTEM) == (mountflags & MOUNT_SYSTEM))
|
||||
if ((mount[i].flags & MOUNT_SYSTEM) != (mountflags & MOUNT_SYSTEM))
|
||||
continue;
|
||||
else if (!(mount[i].flags & MOUNT_IMMUTABLE))
|
||||
break;
|
||||
else if (mountflags & MOUNT_OVERRIDE)
|
||||
{
|
||||
mountflags |= MOUNT_IMMUTABLE;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
set_errno (EPERM);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1257,6 +1293,16 @@ mount_info::add_item (const char *native, const char *posix,
|
||||
|
||||
if (i == nmounts)
|
||||
nmounts++;
|
||||
|
||||
if (strcmp (posixtmp, "/usr/bin") == 0)
|
||||
got_usr_bin = true;
|
||||
|
||||
if (strcmp (posixtmp, "/usr/lib") == 0)
|
||||
got_usr_lib = true;
|
||||
|
||||
if (posixtmp[0] == '/' && posixtmp[1] == '\0')
|
||||
root_idx = i;
|
||||
|
||||
mount[i].init (nativetmp, posixtmp, mountflags);
|
||||
sort ();
|
||||
|
||||
@@ -1301,8 +1347,8 @@ mount_info::del_item (const char *path, unsigned flags)
|
||||
? !strcmp (mount[ent].posix_path, pathtmp)
|
||||
: strcasematch (mount[ent].native_path, pathtmp)))
|
||||
{
|
||||
/* Don't allow to remove a system mount. */
|
||||
if ((mount[ent].flags & MOUNT_SYSTEM))
|
||||
/* Don't allow removal of a system mount. */
|
||||
if (mount[ent].flags & MOUNT_SYSTEM)
|
||||
{
|
||||
set_errno (EPERM);
|
||||
return -1;
|
||||
@@ -1407,9 +1453,12 @@ fillout_mntent (const char *native_path, const char *posix_path, unsigned flags)
|
||||
if (!(flags & MOUNT_SYSTEM)) /* user mount */
|
||||
strcat (_my_tls.locals.mnt_opts, (char *) ",user");
|
||||
|
||||
if ((flags & MOUNT_CYGDRIVE)) /* cygdrive */
|
||||
if (flags & MOUNT_CYGDRIVE) /* cygdrive */
|
||||
strcat (_my_tls.locals.mnt_opts, (char *) ",noumount");
|
||||
|
||||
if (flags & (MOUNT_AUTOMATIC | MOUNT_CYGDRIVE))
|
||||
strcat (_my_tls.locals.mnt_opts, (char *) ",auto");
|
||||
|
||||
ret.mnt_opts = _my_tls.locals.mnt_opts;
|
||||
|
||||
ret.mnt_freq = 1;
|
||||
@@ -1487,8 +1536,9 @@ mount_item::init (const char *native, const char *posix, unsigned mountflags)
|
||||
extern "C" int
|
||||
mount (const char *win32_path, const char *posix_path, unsigned flags)
|
||||
{
|
||||
/* FIXME: Should we disallow setting MOUNT_SYSTEM in flags since it
|
||||
isn't really supported except from fstab? */
|
||||
int res = -1;
|
||||
flags &= ~MOUNT_SYSTEM;
|
||||
|
||||
myfault efault;
|
||||
if (efault.faulted (EFAULT))
|
||||
|
||||
Reference in New Issue
Block a user