* fhandler.h (fhandler_cygdrive:DRVSZ): New enum.

(pdrive_buf): New place to hold information about cygdrive.
* fhandler_disk_file.cc (fhandler_cygdrive::set_drives): Store drive info in
pdrive_buf since get_win32_name() could now be too small to hold everything.
(fhandler_cygdrive::rewinddir): Reset pdrive to pdrive_buf.
(fhandler_cygdrive::closedir): Ditto.
* pipe.cc (fhandler_pipe::init): Be more defensive when referencing
get_win32_name().  Rework logic which made a copy of the POSIX path and then
never used it.
This commit is contained in:
Christopher Faylor 2009-08-04 04:20:36 +00:00
parent ff7b364c12
commit 824d851859
8 changed files with 35 additions and 18 deletions

View File

@ -1,3 +1,16 @@
2009-08-04 Christopher Faylor <me+cygwin@cgf.cx>
* fhandler.h (fhandler_cygdrive:DRVSZ): New enum.
(pdrive_buf): New place to hold information about cygdrive.
* fhandler_disk_file.cc (fhandler_cygdrive::set_drives): Store drive
info in pdrive_buf since get_win32_name() could now be too small to
hold everything.
(fhandler_cygdrive::rewinddir): Reset pdrive to pdrive_buf.
(fhandler_cygdrive::closedir): Ditto.
* pipe.cc (fhandler_pipe::init): Be more defensive when referencing
get_win32_name(). Rework logic which made a copy of the POSIX path and
then never used it.
2009-08-02 Christopher Faylor <me+cygwin@cgf.cx>
* sigproc.cc (stopped_or_terminated): Don't return a match when stopsig

View File

@ -89,7 +89,7 @@ __cxa_guard_release ()
/* These routines are made available as last-resort fallbacks
for the application. Should not be used in practice. */
struct per_process_cxx_malloc default_cygwin_cxx_malloc =
struct per_process_cxx_malloc default_cygwin_cxx_malloc =
{
&(operator new),
&(operator new[]),

View File

@ -994,7 +994,7 @@ extern "C" void
__main (void)
{
/* Ordering is critical here. DLL ctors have already been
run as they were being loaded, so we should stack the
run as they were being loaded, so we should stack the
queued call to DLL dtors now. */
atexit (dll_global_dtors);
do_global_ctors (user_data->ctors, false);

View File

@ -753,8 +753,13 @@ class fhandler_disk_file: public fhandler_base
class fhandler_cygdrive: public fhandler_disk_file
{
enum
{
DRVSZ = sizeof ("x:\\")
};
int ndrives;
const char *pdrive;
char pdrive_buf[2 * 26 * DRVSZ];
void set_drives ();
public:
fhandler_cygdrive ();

View File

@ -2123,14 +2123,11 @@ fhandler_cygdrive::close ()
return 0;
}
#define DRVSZ sizeof ("x:\\")
void
fhandler_cygdrive::set_drives ()
{
const int len = 2 + 26 * DRVSZ;
char *p = const_cast<char *> (get_win32_name ());
pdrive = p;
ndrives = GetLogicalDriveStrings (len, p) / DRVSZ;
pdrive = pdrive_buf;
ndrives = GetLogicalDriveStrings (sizeof pdrive_buf, pdrive_buf) / DRVSZ;
}
int
@ -2146,7 +2143,7 @@ fhandler_cygdrive::fstat (struct __stat64 *buf)
for (const char *p = pdrive; p && *p; p = strchr (p, '\0') + 1)
if (is_floppy ((flptst[0] = *p, flptst))
|| GetFileAttributes (p) == INVALID_FILE_ATTRIBUTES)
--n;
n--;
buf->st_nlink = n + 2;
return 0;
}
@ -2198,13 +2195,13 @@ fhandler_cygdrive::readdir (DIR *dir, dirent *de)
void
fhandler_cygdrive::rewinddir (DIR *dir)
{
pdrive = get_win32_name ();
pdrive = pdrive_buf;
dir->__d_position = 0;
}
int
fhandler_cygdrive::closedir (DIR *dir)
{
pdrive = get_win32_name ();
pdrive = pdrive_buf;
return 0;
}

View File

@ -76,13 +76,13 @@ operator new[](std::size_t sz, const std::nothrow_t &nt) throw()
return (*user_data->cxx_malloc->oper_new___nt) (sz, nt);
}
extern void
extern void
operator delete(void *p, const std::nothrow_t &nt) throw()
{
(*user_data->cxx_malloc->oper_delete_nt) (p, nt);
}
extern void
extern void
operator delete[](void *p, const std::nothrow_t &nt) throw()
{
(*user_data->cxx_malloc->oper_delete___nt) (p, nt);

View File

@ -211,7 +211,7 @@ class path_conv
PWCHAR get_wide_win32_path (PWCHAR wc);
operator DWORD &() {return fileattr;}
operator int () {return fileattr; }
path_conv &operator =(path_conv &pc)
path_conv &operator =(path_conv& pc)
{
memcpy (this, &pc, sizeof pc);
path = cstrdup (pc.path);

View File

@ -32,13 +32,15 @@ fhandler_pipe::fhandler_pipe ()
int
fhandler_pipe::init (HANDLE f, DWORD a, mode_t mode)
{
// FIXME: Have to clean this up someday
if (!*get_win32_name () && get_name ())
/* FIXME: Have to clean this up someday
FIXME: Do we have to check for both !get_win32_name() and
!*get_win32_name()? */
if ((!get_win32_name () || !*get_win32_name ()) && get_name ())
{
char *d;
const char *s;
char *hold_normalized_name = (char *) alloca (strlen (get_name ()) + 1);
strcpy (hold_normalized_name, get_name ());
char *s, *d;
for (s = hold_normalized_name, d = (char *) get_win32_name (); *s; s++, d++)
for (s = get_name (), d = hold_normalized_name; *s; s++, d++)
if (*s == '/')
*d = '\\';
else