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>
This commit is contained in:
Johannes Schindelin 2015-12-01 15:02:14 +01:00 committed by Corinna Vinschen
parent 5644f71428
commit fb71716d2c
5 changed files with 54 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2015-12-07 Johannes Schindelin <johannes.schindelin@gmx.de>
* 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 <corinna@vinschen.de> 2015-12-07 Corinna Vinschen <corinna@vinschen.de>
* include/sys/select.h: Move select(2) macros from newlib's sys/types.h * include/sys/select.h: Move select(2) macros from newlib's sys/types.h

View File

@ -44,7 +44,8 @@ enum
MOUNT_DOS = 0x40000, /* convert leading spaces and trailing MOUNT_DOS = 0x40000, /* convert leading spaces and trailing
dots and spaces to private use area */ dots and spaces to private use area */
MOUNT_IHASH = 0x80000, /* Enforce hash values for inode numbers */ 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); int mount (const char *, const char *, unsigned __flags);

View File

@ -1186,6 +1186,8 @@ mount_info::from_fstab_line (char *line, bool user)
unsigned mount_flags = MOUNT_SYSTEM | MOUNT_BINARY; unsigned mount_flags = MOUNT_SYSTEM | MOUNT_BINARY;
if (!strcmp (fs_type, "cygdrive")) if (!strcmp (fs_type, "cygdrive"))
mount_flags |= MOUNT_NOPOSIX; mount_flags |= MOUNT_NOPOSIX;
if (!strcmp (fs_type, "usertemp"))
mount_flags |= MOUNT_IMMUTABLE;
if (!fstab_read_flags (&c, mount_flags, false)) if (!fstab_read_flags (&c, mount_flags, false))
return true; return true;
if (mount_flags & MOUNT_BIND) if (mount_flags & MOUNT_BIND)
@ -1210,6 +1212,22 @@ mount_info::from_fstab_line (char *line, bool user)
slashify (posix_path, cygdrive, 1); slashify (posix_path, cygdrive, 1);
cygdrive_len = strlen (cygdrive); 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 else
{ {
int res = mount_table->add_item (native_path, posix_path, mount_flags); 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)) if (flags & (MOUNT_BIND))
strcat (_my_tls.locals.mnt_opts, (char *) ",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_opts = _my_tls.locals.mnt_opts;
ret.mnt_freq = 1; ret.mnt_freq = 1;

View File

@ -1,3 +1,7 @@
2015-12-07 Johannes Schindelin <johannes.schindelin@gmx.de>
* pathnames.xml: Document the new usertemp file system type.
2015-12-06 Corinna Vinschen <corinna@vinschen.de> 2015-12-06 Corinna Vinschen <corinna@vinschen.de>
* new-features.xml (ov-new2.4): Document cygpath -U option. * new-features.xml (ov-new2.4): Document cygpath -U option.

View File

@ -74,9 +74,10 @@ doesn't matter if you write <literal>FAT</literal> into this field even if
the filesystem is NTFS. Cygwin figures out the filesystem type and its the filesystem is NTFS. Cygwin figures out the filesystem type and its
capabilities by itself.</para> capabilities by itself.</para>
<para>The only exception is the file system type cygdrive. This type is <para>The only two exceptions are the file system types cygdrive and usertemp.
used to set the cygdrive prefix. For a description of the cygdrive prefix The cygdrive type is used to set the cygdrive prefix. For a description of
see <xref linkend="cygdrive"></xref></para> the cygdrive prefix see <xref linkend="cygdrive"></xref>, for a description of
the usertemp file system type see <xref linkend="usertemp"></xref></para>
<para>The fourth field describes the mount options associated <para>The fourth field describes the mount options associated
with the filesystem. It is formatted as a comma separated list of with the filesystem. It is formatted as a comma separated list of
@ -354,6 +355,23 @@ independently from the current cygdrive prefix:</para>
</sect2> </sect2>
<sect2 id="usertemp"><title>The usertemp file system type</title>
<para>On Windows, the environment variable <literal>TEMP</literal> 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:</para>
<screen>
none /tmp usertemp binary,posix=0 0 0
</screen>
</sect2>
<sect2 id="pathnames-symlinks"><title>Symbolic links</title> <sect2 id="pathnames-symlinks"><title>Symbolic links</title>
<para>Symbolic links are not present and supported on Windows until Windows <para>Symbolic links are not present and supported on Windows until Windows