* dir.cc (readdir_worker): Minor code cleanup.

* fhandler_console.cc (beep): Use a more Windows-generic wav file if the beep
is missing.  Use a more foolproof way to find out whether we should be
recreating the missing key.
* registry.h (reg_key::_disposition): New field.
(reg_key::created): New function.
* registry.cc (reg_key::reg_key): Set _disposition to zero by default.
(reg_key::build_key): Fill in _disposition field.
This commit is contained in:
Christopher Faylor 2006-01-03 17:44:26 +00:00
parent 825d0b9385
commit adcff8d159
5 changed files with 85 additions and 62 deletions

View File

@ -1,6 +1,19 @@
2006-01-03 Christopher Faylor <cgf@timesys.com>
* dir.cc (readdir_worker): Minor code cleanup.
* fhandler_console.cc (beep): Use a more Windows-generic wav file if
the beep is missing. Use a more foolproof way to find out whether we
should be recreating the missing key.
* registry.h (reg_key::_disposition): New field.
(reg_key::created): New function.
* registry.cc (reg_key::reg_key): Set _disposition to zero by default.
(reg_key::build_key): Fill in _disposition field.
2006-01-03 Eric Blake <ebb9@byu.net>
* dir.cc (readdir_worker): Ensure that saw_dot flags are updated when
* dir.cc (readdir_worker): Ensure that saw_dot* flags are updated when
not handling inodes.
2006-01-02 Christopher Faylor <cgf@timesys.com>

View File

@ -100,57 +100,58 @@ readdir_worker (DIR *dir, dirent *de)
}
}
if (!res)
if (!CYGWIN_VERSION_CHECK_FOR_NEEDS_D_INO)
{
de->__invalid_d_ino = 0;
de->__ino32 = 0;
if (de->d_name[0] == '.')
{
if (de->d_name[1] == '\0')
dir->__flags |= dirent_saw_dot;
else if (de->d_name[1] == '.' && de->d_name[2] == '\0')
dir->__flags |= dirent_saw_dot_dot;
}
}
else
{
/* Compute d_ino by combining filename hash with the directory hash
(which was stored in dir->__d_dirhash when opendir was called). */
if (de->d_name[0] == '.')
{
if (de->d_name[1] == '\0')
{
de->__invalid_d_ino = dir->__d_dirhash;
dir->__flags |= dirent_saw_dot;
}
else if (de->d_name[1] != '.' || de->d_name[2] != '\0')
goto hashit;
else
{
dir->__flags |= dirent_saw_dot_dot;
char *p, up[strlen (dir->__d_dirname) + 1];
strcpy (up, dir->__d_dirname);
if (!(p = strrchr (up, '\\')))
goto hashit;
*p = '\0';
if (!(p = strrchr (up, '\\')))
de->__invalid_d_ino = hash_path_name (0, ".");
else
{
*p = '\0';
de->__invalid_d_ino = hash_path_name (0, up);
}
}
}
else
{
hashit:
__ino64_t dino = hash_path_name (dir->__d_dirhash, "\\");
de->__invalid_d_ino = hash_path_name (dino, de->d_name);
}
de->__ino32 = de->__invalid_d_ino; // for legacy applications
}
if (res)
/* error return */;
else if (!CYGWIN_VERSION_CHECK_FOR_NEEDS_D_INO)
{
de->__invalid_d_ino = 0;
de->__ino32 = 0;
if (de->d_name[0] == '.')
{
if (de->d_name[1] == '\0')
dir->__flags |= dirent_saw_dot;
else if (de->d_name[1] == '.' && de->d_name[2] == '\0')
dir->__flags |= dirent_saw_dot_dot;
}
}
else
{
/* Compute d_ino by combining filename hash with the directory hash
(which was stored in dir->__d_dirhash when opendir was called). */
if (de->d_name[0] == '.')
{
if (de->d_name[1] == '\0')
{
de->__invalid_d_ino = dir->__d_dirhash;
dir->__flags |= dirent_saw_dot;
}
else if (de->d_name[1] != '.' || de->d_name[2] != '\0')
goto hashit;
else
{
dir->__flags |= dirent_saw_dot_dot;
char *p, up[strlen (dir->__d_dirname) + 1];
strcpy (up, dir->__d_dirname);
if (!(p = strrchr (up, '\\')))
goto hashit;
*p = '\0';
if (!(p = strrchr (up, '\\')))
de->__invalid_d_ino = hash_path_name (0, ".");
else
{
*p = '\0';
de->__invalid_d_ino = hash_path_name (0, up);
}
}
}
else
{
hashit:
__ino64_t dino = hash_path_name (dir->__d_dirhash, "\\");
de->__invalid_d_ino = hash_path_name (dino, de->d_name);
}
de->__ino32 = de->__invalid_d_ino; // for legacy applications
}
return res;
}

View File

@ -1,6 +1,7 @@
/* fhandler_console.cc
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006 Red Hat, Inc.
This file is part of Cygwin.
@ -1416,11 +1417,17 @@ bad_escape:
static void
beep ()
{
char buf[4096];
reg_key r (HKEY_CURRENT_USER, KEY_ALL_ACCESS, "AppEvents", "Schemes", "Apps",
".Default", ".Default", ".current", NULL);
if (r.get_string ("", buf, sizeof (buf), "") != 0)
r.set_string ("", "Windows XP Ding.wav");
".Default", ".Default", ".Current", NULL);
if (r.created ())
{
char *buf = NULL;
UINT len = GetWindowsDirectory (buf, 0);
buf = (char *) alloca (len += sizeof ("\\media\\ding.wav"));
UINT res = GetWindowsDirectory (buf, len);
if (res && res <= len)
r.set_string ("", strcat (buf, "\\media\\ding.wav"));
}
MessageBeep (0xFFFFFFFF);
}

View File

@ -1,7 +1,7 @@
/* registry.cc: registry interface
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005 Red Hat, Inc.
2005, 2006 Red Hat, Inc.
This file is part of Cygwin.
@ -21,7 +21,7 @@ details. */
#include "cygheap.h"
static const char cygnus_class[] = "cygnus";
reg_key::reg_key (HKEY top, REGSAM access, ...)
reg_key::reg_key (HKEY top, REGSAM access, ...): _disposition (0)
{
va_list av;
va_start (av, access);
@ -32,7 +32,7 @@ reg_key::reg_key (HKEY top, REGSAM access, ...)
/* Opens a key under the appropriate Cygwin key.
Do not use HKCU per MS KB 199190 */
reg_key::reg_key (bool isHKLM, REGSAM access, ...)
reg_key::reg_key (bool isHKLM, REGSAM access, ...): _disposition (0)
{
va_list av;
HKEY top;
@ -91,7 +91,7 @@ reg_key::build_reg (HKEY top, REGSAM access, va_list av)
access,
&sec_none_nih,
&key,
NULL);
&_disposition);
if (r != top)
RegCloseKey (r);
r = key;

View File

@ -1,6 +1,6 @@
/* registry.h: shared info for cygwin
Copyright 2000, 2001 Red Hat, Inc.
Copyright 2000, 2001, 2004, 2006 Red Hat, Inc.
This file is part of Cygwin.
@ -14,6 +14,7 @@ private:
HKEY key;
LONG key_is_invalid;
DWORD _disposition;
public:
@ -33,6 +34,7 @@ public:
int get_string (const char *, char *buf, size_t len, const char *def);
int set_string (const char *,const char *);
int set_int (const char *, int val);
bool created () const {return _disposition & REG_CREATED_NEW_KEY;}
~reg_key ();
};