This is the mail archive of the
cygwin-developers@sources.redhat.com
mailing list for the Cygwin project.
setup.exe cygdrive patch
- To: Cygwin-Developers <cygwin-developers at sources dot redhat dot com>
- Subject: setup.exe cygdrive patch
- From: Jason Tishler <Jason dot Tishler at dothill dot com>
- Date: Mon, 6 Nov 2000 09:04:35 -0500
- Organization: Dot Hill Systems Corp.
See attached for the setup.exe patch that makes the cygdrive mount mode
consistent with the mount mode selected by the user during installation.
The following is the cinstall ChangeLog:
Sun Nov 5 12:51:42 2000 Jason Tishler <jt@dothill.com>
* install.cc (do_install): Add call to set_cygdrive_flags to sync
the mount modes.
* mount.cc (set_cygdrive_flags): New function.
* mount.cc (get_cygdrive_flags): Ditto.
* mount.cc (default_cygdrive): Ditto.
* mount.cc (set_cygdrive_flags): Ditto.
* mount.h: Add prototype for set_cygdrive_flags.
The following is the cygwin ChangeLog:
Sun Nov 5 12:51:42 2000 Jason Tishler <jt@dothill.com>
* path.cc (mount_info::read_cygdrive_info_from_registry): Use
CYGWIN_INFO_CYGDRIVE_PREFIX, CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX,
and CYGWIN_INFO_CYGDRIVE_FLAGS.
* path.cc (mount_info::write_cygdrive_info_to_registry): Use
CYGWIN_INFO_CYGDRIVE_PREFIX and CYGWIN_INFO_CYGDRIVE_FLAGS.
* path.cc (mount_info::remove_cygdrive_info_from_registry): Ditto.
* path.cc (mount_info::get_cygdrive_prefixes): Use
CYGWIN_INFO_CYGDRIVE_PREFIX.
* include/cygwin/version.h: Add CYGWIN_INFO_CYGDRIVE_FLAGS,
CYGWIN_INFO_CYGDRIVE_PREFIX, and CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX.
Thanks,
Jason
--
Jason Tishler
Director, Software Engineering Phone: +1 (732) 264-8770 x235
Dot Hill Systems Corporation Fax: +1 (732) 264-8798
82 Bethany Road, Suite 7 Email: Jason.Tishler@dothill.com
Hazlet, NJ 07730 USA WWW: http://www.dothill.com
Index: cinstall/install.cc
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/install.cc,v
retrieving revision 2.7
diff -u -p -r2.7 install.cc
--- install.cc 2000/10/23 19:46:01 2.7
+++ install.cc 2000/11/05 18:34:32
@@ -523,6 +523,7 @@ do_install (HINSTANCE h)
create_mount ("/", root_dir, istext, issystem);
create_mount ("/usr/bin", concat (root_dir, "/bin", 0), istext, issystem);
create_mount ("/usr/lib", concat (root_dir, "/lib", 0), istext, issystem);
+ set_cygdrive_flags (istext, issystem);
if (errors)
exit_msg = IDS_INSTALL_INCOMPLETE;
Index: cinstall/mount.cc
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/mount.cc,v
retrieving revision 2.1
diff -u -p -r2.1 mount.cc
--- mount.cc 2000/08/11 18:00:38 2.1
+++ mount.cc 2000/11/05 18:34:32
@@ -139,3 +139,90 @@ remove_mount (char *posix)
remove1 (HKEY_LOCAL_MACHINE, posix);
remove1 (HKEY_CURRENT_USER, posix);
}
+
+static void
+set_cygdrive_flags (HKEY key, int istext, DWORD cygdrive_flags)
+{
+ int cur_istext = (cygdrive_flags & MOUNT_BINARY) ? 0 : 1;
+ if (cur_istext != istext)
+ {
+ if (!istext)
+ cygdrive_flags |= MOUNT_BINARY;
+ else
+ cygdrive_flags &= ~MOUNT_BINARY;
+ RegSetValueEx (key, CYGWIN_INFO_CYGDRIVE_FLAGS, 0, REG_DWORD,
+ (BYTE *)&cygdrive_flags, sizeof (cygdrive_flags));
+ }
+}
+
+static LONG
+get_cygdrive_flags (HKEY key, DWORD *cygdrive_flags)
+{
+ DWORD retvallen = sizeof(*cygdrive_flags);
+ LONG status = RegQueryValueEx (key, CYGWIN_INFO_CYGDRIVE_FLAGS, 0, 0,
+ (BYTE *)cygdrive_flags, &retvallen);
+ return status;
+}
+
+static DWORD
+default_cygdrive(HKEY key)
+{
+ RegSetValueEx (key, CYGWIN_INFO_CYGDRIVE_PREFIX, 0, REG_SZ,
+ (BYTE *)CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX,
+ strlen (CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX) + 1);
+ DWORD cygdrive_flags = MOUNT_AUTO;
+ RegSetValueEx (key, CYGWIN_INFO_CYGDRIVE_FLAGS, 0, REG_DWORD,
+ (BYTE *)&cygdrive_flags, sizeof (cygdrive_flags));
+ return cygdrive_flags;
+}
+
+void
+set_cygdrive_flags (int istext, int issystem)
+{
+ int found_system = 0;
+
+ char buf[1000];
+ sprintf (buf, "Software\\%s\\%s\\%s",
+ CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME);
+
+ if (issystem)
+ {
+ HKEY key;
+ DWORD disposition;
+ LONG status = RegCreateKeyEx (HKEY_LOCAL_MACHINE, buf, 0, 0, 0,
+ KEY_ALL_ACCESS, 0, &key, &disposition);
+ if (status == ERROR_SUCCESS)
+ {
+ DWORD cygdrive_flags = 0;
+ status = get_cygdrive_flags (key, &cygdrive_flags);
+ if (status == ERROR_SUCCESS)
+ {
+ set_cygdrive_flags (key, istext, cygdrive_flags);
+ found_system = 1;
+ }
+ RegCloseKey(key);
+ }
+ }
+
+ HKEY key;
+ DWORD disposition;
+ LONG status = RegCreateKeyEx (HKEY_CURRENT_USER, buf, 0, 0, 0, KEY_ALL_ACCESS,
+ 0, &key, &disposition);
+ if (status != ERROR_SUCCESS)
+ fatal ("set_cygdrive_flags");
+
+ DWORD cygdrive_flags = 0;
+ status = get_cygdrive_flags (key, &cygdrive_flags);
+ if (status == ERROR_FILE_NOT_FOUND && !found_system)
+ {
+ cygdrive_flags = default_cygdrive(key);
+ status = ERROR_SUCCESS;
+ }
+
+ if (status == ERROR_SUCCESS)
+ set_cygdrive_flags (key, istext, cygdrive_flags);
+
+ RegCloseKey(key);
+}
Index: cinstall/mount.h
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/mount.h,v
retrieving revision 2.0
diff -u -p -r2.0 mount.h
--- mount.h 2000/08/08 00:27:54 2.0
+++ mount.h 2000/11/05 18:34:32
@@ -23,3 +23,8 @@ char * find_root_mount (int *istext, int
void create_mount (char *posix, char *win32, int istext, int issystem);
void remove_mount (char *posix);
+
+/* Sets the cygdrive flags. Used to make the automounted drives' binary/text
+mode consistent with the standard Cygwin mounts. */
+
+void set_cygdrive_flags (int istext, int issystem);
Index: cygwin/path.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/path.cc,v
retrieving revision 1.77
diff -u -p -r1.77 path.cc
--- path.cc 2000/11/02 02:15:02 1.77
+++ path.cc 2000/11/05 18:34:50
@@ -1502,7 +1502,8 @@ mount_info::read_cygdrive_info_from_regi
/* reg_key for user path prefix in HKEY_CURRENT_USER. */
reg_key r;
- if (r.get_string ("cygdrive prefix", cygdrive, sizeof (cygdrive), "") != 0)
+ if (r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, cygdrive, sizeof (cygdrive),
+ "") != 0)
{
/* Didn't find the user path prefix so check the system path prefix. */
@@ -1513,17 +1514,19 @@ mount_info::read_cygdrive_info_from_regi
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
NULL);
- if (r2.get_string ("cygdrive prefix", cygdrive, sizeof (cygdrive), "") != 0)
+ if (r2.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, cygdrive, sizeof (cygdrive),
+ "") != 0)
{
/* Didn't find either so write the default to the registry and use it.
NOTE: We are writing and using the user path prefix. */
- write_cygdrive_info_to_registry ("/cygdrive", MOUNT_AUTO);
+ write_cygdrive_info_to_registry (CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX,
+ MOUNT_AUTO);
}
else
{
/* Fetch system cygdrive_flags from registry; returns MOUNT_AUTO on
error. */
- cygdrive_flags = r2.get_int ("cygdrive flags", MOUNT_AUTO);
+ cygdrive_flags = r2.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_AUTO);
slashify (cygdrive, cygdrive, 1);
cygdrive_len = strlen(cygdrive);
}
@@ -1532,7 +1535,7 @@ mount_info::read_cygdrive_info_from_regi
{
/* Fetch user cygdrive_flags from registry; returns MOUNT_AUTO on
error. */
- cygdrive_flags = r.get_int ("cygdrive flags", MOUNT_AUTO);
+ cygdrive_flags = r.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_AUTO);
slashify (cygdrive, cygdrive, 1);
cygdrive_len = strlen(cygdrive);
}
@@ -1571,13 +1574,13 @@ mount_info::write_cygdrive_info_to_regis
nofinalslash (cygdrive_prefix, hold_cygdrive_prefix);
int res;
- res = r.set_string ("cygdrive prefix", hold_cygdrive_prefix);
+ res = r.set_string (CYGWIN_INFO_CYGDRIVE_PREFIX, hold_cygdrive_prefix);
if (res != ERROR_SUCCESS)
{
__seterrno_from_win_error (res);
return -1;
}
- r.set_int ("cygdrive flags", flags);
+ r.set_int (CYGWIN_INFO_CYGDRIVE_FLAGS, flags);
/* This also needs to go in the in-memory copy of "cygdrive", but only if
appropriate:
@@ -1609,8 +1612,8 @@ mount_info::remove_cygdrive_info_from_re
NULL);
/* Delete cygdrive prefix and flags. */
- int res = r.killvalue ("cygdrive prefix");
- int res2 = r.killvalue ("cygdrive flags");
+ int res = r.killvalue (CYGWIN_INFO_CYGDRIVE_PREFIX);
+ int res2 = r.killvalue (CYGWIN_INFO_CYGDRIVE_FLAGS);
/* Reinitialize the cygdrive path prefix to reflect to removal from the
registry. */
@@ -1624,7 +1627,7 @@ mount_info::get_cygdrive_prefixes (char
{
/* Get the user path prefix from HKEY_CURRENT_USER. */
reg_key r;
- int res = r.get_string ("cygdrive prefix", user, MAX_PATH, "");
+ int res = r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, user, MAX_PATH, "");
/* Get the system path prefix from HKEY_LOCAL_MACHINE. */
reg_key r2 (HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS, "SOFTWARE",
@@ -1632,7 +1635,7 @@ mount_info::get_cygdrive_prefixes (char
CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
NULL);
- int res2 = r2.get_string ("cygdrive prefix", system, MAX_PATH, "");
+ int res2 = r2.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, system, MAX_PATH, "");
return (res != ERROR_SUCCESS) ? res : res2;
}
Index: cygwin/include/cygwin/version.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/include/cygwin/version.h,v
retrieving revision 1.19
diff -u -p -r1.19 version.h
--- version.h 2000/10/30 01:53:02 1.19
+++ version.h 2000/11/05 18:34:56
@@ -156,6 +156,9 @@ details. */
#define CYGWIN_INFO_CYGWIN_REGISTRY_NAME "Cygwin"
#define CYGWIN_INFO_PROGRAM_OPTIONS_NAME "Program Options"
#define CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME "mounts v2"
+#define CYGWIN_INFO_CYGDRIVE_FLAGS "cygdrive flags"
+#define CYGWIN_INFO_CYGDRIVE_PREFIX "cygdrive prefix"
+#define CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX "/cygdrive"
/* In addition to the above version number strings, the build
process adds some strings that may be useful in