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