OSDN Git Service

* dcrt0.cc (dummy_autoload): Add load statement for RegDeleteValueA.
authorcgf <cgf>
Fri, 28 Jul 2000 22:33:43 +0000 (22:33 +0000)
committercgf <cgf>
Fri, 28 Jul 2000 22:33:43 +0000 (22:33 +0000)
* external.cc (get_cygdrive_prefixes): New function.
(cygwin_internal): Add CW_GET_CYGDRIVE_PREFIXES case.
* path.cc (mount_info::read_cygdrive_info_from_registry): Read system cygdrive
prefix if user one is undefined.
(mount_info::write_cygdrive_info_to_registry): Write cygdrive prefix to the
appropriate registry hive.  Overwrite in-memory copy of cygdrive, if
appropriate.
(mount_info::remove_cygdrive_info_from_registry): New method.
(mount_info::get_cygdrive_prefixes): New method.
(cygwin_umount): Remove cygdrive prefix, if appropriate.
* registry.cc (reg_key::killvalue): New method.
* shared.h (class reg_key): Add killvalue, remove_cygdrive_info_to_registry,
and get_cygdrive_prefixes declarations.
* include/sys/cygwin.h (cygwin_getinfo_types): Add CW_GET_CYGDRIVE_PREFIXES.

winsup/cygwin/ChangeLog
winsup/cygwin/dcrt0.cc
winsup/cygwin/external.cc
winsup/cygwin/include/sys/cygwin.h
winsup/cygwin/path.cc
winsup/cygwin/registry.cc
winsup/cygwin/shared.h

index c44dcbe..4785301 100644 (file)
@@ -1,3 +1,23 @@
+Thu Jul 27 22:54:28 2000  Jason Tishler <jt@dothill.com>
+
+       * dcrt0.cc (dummy_autoload): Add load statement for RegDeleteValueA.
+       * external.cc (get_cygdrive_prefixes): New function.
+       (cygwin_internal): Add CW_GET_CYGDRIVE_PREFIXES case.
+       * path.cc (mount_info::read_cygdrive_info_from_registry): Read system
+       cygdrive prefix if user one is undefined.
+       (mount_info::write_cygdrive_info_to_registry): Write cygdrive prefix to
+       the appropriate registry hive.  Overwrite in-memory copy of cygdrive,
+       if appropriate.
+       (mount_info::remove_cygdrive_info_from_registry): New method.
+       (mount_info::get_cygdrive_prefixes): New method.
+       (cygwin_umount): Remove cygdrive prefix, if appropriate.
+       * registry.cc (reg_key::killvalue): New method.
+       * shared.h (class reg_key): Add killvalue,
+       remove_cygdrive_info_to_registry, and get_cygdrive_prefixes
+       declarations.
+       * include/sys/cygwin.h (cygwin_getinfo_types): Add
+       CW_GET_CYGDRIVE_PREFIXES.
+
 Thu Jul 27 23:33:32 2000  Christopher Faylor <cgf@cygnus.com>
 
        * include/cygwin/version.h: Bump DLL minor version number to 4.
index 283c2f3..8a52406 100644 (file)
@@ -1217,6 +1217,7 @@ LoadDLLfunc (OpenProcessToken, 12, advapi32)
 LoadDLLfunc (RegCloseKey, 4, advapi32)
 LoadDLLfunc (RegCreateKeyExA, 36, advapi32)
 LoadDLLfunc (RegDeleteKeyA, 8, advapi32)
+LoadDLLfunc (RegDeleteValueA, 8, advapi32)
 LoadDLLfunc (RegLoadKeyA, 12, advapi32)
 LoadDLLfunc (RegEnumKeyExA, 32, advapi32)
 LoadDLLfunc (RegOpenKeyExA, 20, advapi32)
index e626cf5..f187d97 100644 (file)
@@ -63,6 +63,14 @@ fillout_pinfo (DWORD pid)
   return &ep;
 }
 
+static DWORD
+get_cygdrive_prefixes (char *user, char *system)
+{
+  shared_info *info = cygwin_getshared();
+  int res = info->mount.get_cygdrive_prefixes(user, system);
+  return (res == ERROR_SUCCESS) ? 1 : 0;
+}
+
 extern "C" DWORD
 cygwin_internal (cygwin_getinfo_types t, ...)
 {
@@ -107,6 +115,13 @@ cygwin_internal (cygwin_getinfo_types t, ...)
        perfile_table = va_arg (arg, struct __cygwin_perfile *);
        return 0;
 
+      case CW_GET_CYGDRIVE_PREFIXES:
+       {
+         char *user = va_arg (arg, char *);
+         char *system = va_arg (arg, char *);
+         return get_cygdrive_prefixes (user, system);
+       }
+
       default:
        return (DWORD) -1;
     }
index d2cf948..978e976 100644 (file)
@@ -59,7 +59,8 @@ typedef enum
     CW_GETVERSIONINFO,
     CW_READ_V1_MOUNT_TABLES,
     CW_USER_DATA,
-    CW_PERFILE
+    CW_PERFILE,
+       CW_GET_CYGDRIVE_PREFIXES
   } cygwin_getinfo_types;
 
 #define CW_NEXTPID 0x80000000  // or with pid to get next one
index 7995747..a46ac4f 100644 (file)
@@ -1497,17 +1497,39 @@ mount_info::del_reg_mount (const char * posix_path, unsigned flags)
 void
 mount_info::read_cygdrive_info_from_registry ()
 {
-  /* reg_key for user mounts in HKEY_CURRENT_USER. */
+  /* reg_key for user path prefix in HKEY_CURRENT_USER. */
   reg_key r;
 
   if (r.get_string ("cygdrive prefix", cygdrive, sizeof (cygdrive), "") != 0)
     {
-      /* Didn't find it so write the default to the registry and use it. */
-      write_cygdrive_info_to_registry ("/cygdrive", MOUNT_AUTO);
+      /* Didn't find the user path prefix so check the system path prefix. */
+
+      /* reg_key for system path prefix in HKEY_LOCAL_MACHINE.  */
+      reg_key r2 (HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS, "SOFTWARE",
+                CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+                CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+                CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
+                NULL);
+
+    if (r2.get_string ("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);
+      }
+    else
+      {
+        /* Fetch system cygdrive_flags from registry; returns MOUNT_AUTO on
+          error. */
+        cygdrive_flags = r2.get_int ("cygdrive flags", MOUNT_AUTO);
+        slashify (cygdrive, cygdrive, 1);
+        cygdrive_len = strlen(cygdrive);
+      }
     }
   else
     {
-      /* Fetch cygdrive_flags from registry; returns MOUNT_AUTO on error. */
+      /* Fetch user cygdrive_flags from registry; returns MOUNT_AUTO on
+         error. */
       cygdrive_flags = r.get_int ("cygdrive flags", MOUNT_AUTO);
       slashify (cygdrive, cygdrive, 1);
       cygdrive_len = strlen(cygdrive);
@@ -1521,8 +1543,16 @@ mount_info::read_cygdrive_info_from_registry ()
 int
 mount_info::write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsigned flags)
 {
-  /* reg_key for user mounts in HKEY_CURRENT_USER. */
-  reg_key r;
+  /* Determine whether to modify user or system cygdrive path prefix. */
+  HKEY top = (flags & MOUNT_SYSTEM) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+
+  /* reg_key for user path prefix in HKEY_CURRENT_USER or system path prefix in
+     HKEY_LOCAL_MACHINE.  */
+  reg_key r (top, KEY_ALL_ACCESS, "SOFTWARE",
+            CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+            CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+            CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
+            NULL);
 
   /* Verify cygdrive prefix starts with a forward slash and if there's
      another character, it's not a slash. */
@@ -1541,14 +1571,64 @@ mount_info::write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsign
   r.set_string ("cygdrive prefix", hold_cygdrive_prefix);
   r.set_int ("cygdrive flags", flags);
 
-  /* This also needs to go in the in-memory copy of "cygdrive" */
-  slashify (cygdrive_prefix, cygwin_shared->mount.cygdrive, 1);
-  cygwin_shared->mount.cygdrive_flags = flags;
-  cygwin_shared->mount.cygdrive_len = strlen(cygwin_shared->mount.cygdrive);
+  /* This also needs to go in the in-memory copy of "cygdrive", but only if
+     appropriate:
+       1. setting user path prefix, or
+       2. overwriting (a previous) system path prefix */
+  if ((flags & MOUNT_SYSTEM) == 0 ||
+      (cygwin_shared->mount.cygdrive_flags & MOUNT_SYSTEM) != 0)
+    {
+      slashify (cygdrive_prefix, cygwin_shared->mount.cygdrive, 1);
+      cygwin_shared->mount.cygdrive_flags = flags;
+      cygwin_shared->mount.cygdrive_len = strlen(cygwin_shared->mount.cygdrive);
+    }
 
   return 0;
 }
 
+int
+mount_info::remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags)
+{
+  /* Determine whether to modify user or system cygdrive path prefix. */
+  HKEY top = (flags & MOUNT_SYSTEM) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+
+  /* reg_key for user path prefix in HKEY_CURRENT_USER or system path prefix in
+     HKEY_LOCAL_MACHINE.  */
+  reg_key r (top, KEY_ALL_ACCESS, "SOFTWARE",
+            CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+            CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+            CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
+            NULL);
+
+  /* Delete cygdrive prefix and flags. */
+  int res = r.killvalue ("cygdrive prefix");
+  int res2 = r.killvalue ("cygdrive flags");
+
+  /* Reinitialize the cygdrive path prefix to reflect to removal from the
+     registry. */
+  read_cygdrive_info_from_registry ();
+
+  return (res != ERROR_SUCCESS) ? res : res2;
+}
+
+int
+mount_info::get_cygdrive_prefixes (char *user, char *system)
+{
+  /* Get the user path prefix from HKEY_CURRENT_USER. */
+  reg_key r;
+  int res = r.get_string ("cygdrive prefix", user, MAX_PATH, "");
+
+  /* Get the system path prefix from HKEY_LOCAL_MACHINE. */
+  reg_key r2 (HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS, "SOFTWARE",
+             CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+             CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+             CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
+             NULL);
+  int res2 = r2.get_string ("cygdrive prefix", system, MAX_PATH, "");
+
+  return (res != ERROR_SUCCESS) ? res : res2;
+}
+
 struct mntent *
 mount_info::getmntent (int x)
 {
@@ -1982,7 +2062,19 @@ extern "C"
 int
 cygwin_umount (const char *path, unsigned flags)
 {
-  int res = cygwin_shared->mount.del_item (path, flags, TRUE);
+  int res = -1;
+
+  if (flags & MOUNT_AUTO)
+    {
+      /* When flags include MOUNT_AUTO, take this to mean that we actually want
+         to remove the cygdrive prefix and flags without actually unmounting
+        anything. */
+      res = cygwin_shared->mount.remove_cygdrive_info_from_registry (path, flags);
+    }
+  else
+    {
+      res = cygwin_shared->mount.del_item (path, flags, TRUE);
+    }
 
   syscall_printf ("%d = cygwin_umount (%s, %d)", res,  path, flags);
   return res;
index e443966..af543ba 100644 (file)
@@ -171,6 +171,17 @@ reg_key::kill (const char *name)
   return RegDeleteKeyA (key, name);
 }
 
+/* Delete the value specified by name of current key.  Returns the error code
+   from the RegDeleteValueA invocation. */
+
+int
+reg_key::killvalue (const char *name)
+{
+  if (key_is_invalid)
+    return key_is_invalid;
+  return RegDeleteValueA (key, name);
+}
+
 reg_key::~reg_key ()
 {
   if (!key_is_invalid)
index d6e4655..fa14492 100644 (file)
@@ -247,6 +247,7 @@ public:
   int error () {return key == (HKEY) INVALID_HANDLE_VALUE;}
 
   int kill (const char *child);
+  int killvalue (const char *name);
 
   HKEY get_key ();
   int get_int (const char *,int def);
@@ -336,6 +337,8 @@ public:
   struct mntent *getmntent (int x);
 
   int write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsigned flags);
+  int remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags);
+  int get_cygdrive_prefixes (char *user, char *system);
 
   void import_v1_mounts ();