From fb71716d2c248de22ecd86dd8e3a1f4185eb8e87 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 1 Dec 2015 15:02:14 +0100 Subject: [PATCH] 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 --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/include/sys/mount.h | 3 ++- winsup/cygwin/mount.cc | 21 +++++++++++++++++++++ winsup/doc/ChangeLog | 4 ++++ winsup/doc/pathnames.xml | 24 +++++++++++++++++++++--- 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index f378f1672..b08525496 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2015-12-07 Johannes Schindelin + + * 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. + 2015-12-07 Corinna Vinschen * include/sys/select.h: Move select(2) macros from newlib's sys/types.h diff --git a/winsup/cygwin/include/sys/mount.h b/winsup/cygwin/include/sys/mount.h index 458cf801f..ec927945b 100644 --- a/winsup/cygwin/include/sys/mount.h +++ b/winsup/cygwin/include/sys/mount.h @@ -44,7 +44,8 @@ enum MOUNT_DOS = 0x40000, /* convert leading spaces and trailing dots and spaces to private use area */ MOUNT_IHASH = 0x80000, /* Enforce hash values for inode numbers */ - MOUNT_BIND = 0x100000 /* Allows bind syntax in fstab file. */ + MOUNT_BIND = 0x100000, /* Allows bind syntax in fstab file. */ + MOUNT_USER_TEMP = 0x200000 /* Mount the user's $TMP. */ }; int mount (const char *, const char *, unsigned __flags); 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; diff --git a/winsup/doc/ChangeLog b/winsup/doc/ChangeLog index f9ae2b54e..4bdeb5fce 100644 --- a/winsup/doc/ChangeLog +++ b/winsup/doc/ChangeLog @@ -1,3 +1,7 @@ +2015-12-07 Johannes Schindelin + + * pathnames.xml: Document the new usertemp file system type. + 2015-12-06 Corinna Vinschen * new-features.xml (ov-new2.4): Document cygpath -U option. diff --git a/winsup/doc/pathnames.xml b/winsup/doc/pathnames.xml index 9077303b4..9941633c4 100644 --- a/winsup/doc/pathnames.xml +++ b/winsup/doc/pathnames.xml @@ -74,9 +74,10 @@ doesn't matter if you write FAT into this field even if the filesystem is NTFS. Cygwin figures out the filesystem type and its capabilities by itself. -The only exception is the file system type cygdrive. This type is -used to set the cygdrive prefix. For a description of the cygdrive prefix -see +The only two exceptions are the file system types cygdrive and usertemp. +The cygdrive type is used to set the cygdrive prefix. For a description of +the cygdrive prefix see , for a description of +the usertemp file system type see The fourth field describes the mount options associated with the filesystem. It is formatted as a comma separated list of @@ -354,6 +355,23 @@ independently from the current cygdrive prefix: +The usertemp file system type + +On Windows, the environment variable TEMP specifies +the location of the temp folder. It serves the same purpose as the /tmp/ +directory in Unix systems. In contrast to /tmp/, it is by default a +different folder for every Windows. By using the special purpose usertemp +file system, that temp folder can be mapped to /tmp/. This is particularly +useful in setups where the administrator wants to write-protect the entire +Cygwin directory. The usertemp file system can be configured in /etc/fstab +like this: + + + none /tmp usertemp binary,posix=0 0 0 + + + + Symbolic links Symbolic links are not present and supported on Windows until Windows