diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2015-12-01 17:02:14 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-12-07 19:37:44 +0300 |
commit | fb71716d2c248de22ecd86dd8e3a1f4185eb8e87 (patch) | |
tree | e86a1fed507c62251bcfe17b7832c8d8fcde3dc1 /winsup/cygwin/mount.cc | |
parent | 5644f71428ba571b733db255e31dc39aba13ad8a (diff) |
Introduce the 'usertemp' filesystem type
* mount.cc (mount_info::from_fstab_line): Support mounting the current
user's temp folder as /tmp/. This is particularly useful a feature
when Cygwin's own files are write-protected.
* pathnames.xml: document the new usertemp file system type
Detailed explanation:
In the context of Windows, there is a per-user directory for temporary
files, by default specified via the environment variable %TEMP%. Let's
allow to use that directory for our /tmp/ directory.
With this patch, we introduce the special filesystem type "usertemp":
By specifying
none /tmp usertemp binary,posix=0 0 0
in /etc/fstab, the /tmp/ directory gets auto-mounted to the directory
specified by the %TEMP% variable.
This feature comes handy in particularly in scenarios where the
administrator might want to write-protect the entire Cygwin directory
yet still needs to allow users to write into the /tmp/ directory.
This is the case in the context of Git for Windows, where the
Cygwin (MSys2) root directory lives inside C:\Program Files and hence
/tmp/ would not be writable otherwise.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Diffstat (limited to 'winsup/cygwin/mount.cc')
-rw-r--r-- | winsup/cygwin/mount.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc index 68977fd58..df96c2dc2 100644 --- a/winsup/cygwin/mount.cc +++ b/winsup/cygwin/mount.cc @@ -1186,6 +1186,8 @@ 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 (!strcmp (fs_type, "usertemp")) + mount_flags |= MOUNT_IMMUTABLE; if (!fstab_read_flags (&c, mount_flags, false)) return true; if (mount_flags & MOUNT_BIND) @@ -1210,6 +1212,22 @@ mount_info::from_fstab_line (char *line, bool user) slashify (posix_path, cygdrive, 1); cygdrive_len = strlen (cygdrive); } + else if (!strcmp (fs_type, "usertemp")) + { + WCHAR tmp[PATH_MAX + 1]; + + if (GetTempPathW (PATH_MAX, tmp)) + { + tmp_pathbuf tp; + char *mb_tmp = tp.c_get (); + sys_wcstombs (mb_tmp, PATH_MAX, tmp); + + mount_flags |= MOUNT_USER_TEMP; + int res = mount_table->add_item (mb_tmp, posix_path, mount_flags); + if (res && get_errno () == EMFILE) + return false; + } + } else { int res = mount_table->add_item (native_path, posix_path, mount_flags); @@ -1667,6 +1685,9 @@ fillout_mntent (const char *native_path, const char *posix_path, unsigned flags) if (flags & (MOUNT_BIND)) strcat (_my_tls.locals.mnt_opts, (char *) ",bind"); + if (flags & (MOUNT_USER_TEMP)) + strcat (_my_tls.locals.mnt_opts, (char *) ",usertemp"); + ret.mnt_opts = _my_tls.locals.mnt_opts; ret.mnt_freq = 1; |