* 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> 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. not handling inodes.
2006-01-02 Christopher Faylor <cgf@timesys.com> 2006-01-02 Christopher Faylor <cgf@timesys.com>

View File

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

View File

@ -1,6 +1,7 @@
/* fhandler_console.cc /* 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. This file is part of Cygwin.
@ -1416,11 +1417,17 @@ bad_escape:
static void static void
beep () beep ()
{ {
char buf[4096];
reg_key r (HKEY_CURRENT_USER, KEY_ALL_ACCESS, "AppEvents", "Schemes", "Apps", reg_key r (HKEY_CURRENT_USER, KEY_ALL_ACCESS, "AppEvents", "Schemes", "Apps",
".Default", ".Default", ".current", NULL); ".Default", ".Default", ".Current", NULL);
if (r.get_string ("", buf, sizeof (buf), "") != 0) if (r.created ())
r.set_string ("", "Windows XP Ding.wav"); {
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); MessageBeep (0xFFFFFFFF);
} }

View File

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

View File

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