Index: cygwin/path.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/path.cc,v retrieving revision 1.434 diff -u -p -r1.434 path.cc --- cygwin/path.cc 1 Mar 2007 15:13:47 -0000 1.434 +++ cygwin/path.cc 19 Mar 2007 05:01:10 -0000 @@ -461,6 +461,7 @@ fs_info::update (const char *win32_path) && FS_IS_NETAPP_DATAONTAP); is_ntfs (strcmp (fsname, "NTFS") == 0 && !is_samba () && !is_netapp ()); is_nfs (strcmp (fsname, "NFS") == 0); + is_cdrom (drive_type () == DRIVE_CDROM); has_ea (is_ntfs ()); has_acls ((flags () & FS_PERSISTENT_ACLS) @@ -474,8 +475,7 @@ fs_info::update (const char *win32_path) has_buggy_open (!strcmp (fsname, "SUNWNFS")); /* Only append non-removable drives to the global fsinfo storage */ - if (drive_type () != DRIVE_REMOVABLE && drive_type () != DRIVE_CDROM - && idx < MAX_FS_INFO_CNT) + if (drive_type () != DRIVE_REMOVABLE && !is_cdrom() && idx < MAX_FS_INFO_CNT) { LONG exc_cnt; while ((exc_cnt = InterlockedExchange (&fsinfo_cnt, -1)) == -1) @@ -2552,10 +2552,27 @@ fillout_mntent (const char *native_path, strcpy (_my_tls.locals.mnt_dir, posix_path); ret.mnt_dir = _my_tls.locals.mnt_dir; - if (!(flags & MOUNT_SYSTEM)) /* user mount */ - strcpy (_my_tls.locals.mnt_type, (char *) "user"); - else /* system mount */ - strcpy (_my_tls.locals.mnt_type, (char *) "system"); + /* Try to give a filesystem type that matches what a Linux application might + expect. Naturally, this is a moving target, but we can make some + reasonable guesses for popular types. */ + + fs_info mntinfo; + mntinfo.update(native_path); /* this pulls from a cache, usually. */ + + if (mntinfo.is_samba()) + strcpy (_my_tls.locals.mnt_type, (char *) "smbfs"); + else if (mntinfo.is_nfs()) + strcpy (_my_tls.locals.mnt_type, (char *) "nfs"); + else if (mntinfo.is_fat()) + strcpy (_my_tls.locals.mnt_type, (char *) "vfat"); + else if (mntinfo.is_ntfs()) + strcpy (_my_tls.locals.mnt_type, (char *) "ntfs"); + else if (mntinfo.is_netapp()) + strcpy (_my_tls.locals.mnt_type, (char *) "netapp"); + else if (mntinfo.is_cdrom()) + strcpy (_my_tls.locals.mnt_type, (char *) "iso9660"); + else + strcpy (_my_tls.locals.mnt_type, (char *) "unknown"); ret.mnt_type = _my_tls.locals.mnt_type; @@ -2579,6 +2596,12 @@ fillout_mntent (const char *native_path, if ((flags & MOUNT_CYGDRIVE)) /* cygdrive */ strcat (_my_tls.locals.mnt_opts, (char *) ",noumount"); + + if (!(flags & MOUNT_SYSTEM)) /* user mount */ + strcat (_my_tls.locals.mnt_opts, (char *) ",user"); + else /* system mount */ + strcat (_my_tls.locals.mnt_opts, (char *) ",system"); + ret.mnt_opts = _my_tls.locals.mnt_opts; ret.mnt_freq = 1; Index: cygwin/path.h =================================================================== RCS file: /cvs/src/src/winsup/cygwin/path.h,v retrieving revision 1.97 diff -u -p -r1.97 path.h --- cygwin/path.h 17 Jan 2007 19:26:58 -0000 1.97 +++ cygwin/path.h 19 Mar 2007 05:01:10 -0000 @@ -111,6 +111,7 @@ struct fs_info unsigned is_samba : 1; unsigned is_nfs : 1; unsigned is_netapp : 1; + unsigned is_cdrom : 1; } status; public: void clear () @@ -129,6 +130,7 @@ struct fs_info is_samba (false); is_nfs (false); is_netapp (false); + is_cdrom (false); } inline DWORD& flags () {return status.flags;}; inline DWORD& serial () {return status.serial;}; @@ -145,6 +147,7 @@ struct fs_info IMPLEMENT_STATUS_FLAG (bool, is_samba) IMPLEMENT_STATUS_FLAG (bool, is_nfs) IMPLEMENT_STATUS_FLAG (bool, is_netapp) + IMPLEMENT_STATUS_FLAG (bool, is_cdrom) bool update (const char *); }; @@ -274,6 +277,8 @@ class path_conv bool fs_is_ntfs () const {return fs.is_ntfs ();} bool fs_is_samba () const {return fs.is_samba ();} bool fs_is_nfs () const {return fs.is_nfs ();} + bool fs_is_netapp () const {return fs.is_netapp ();} + bool fs_is_cdrom () const {return fs.is_cdrom ();} void set_path (const char *p) {strcpy (path, p);} DWORD volser () { return fs.serial (); } void fillin (HANDLE h);