* 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

@ -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

@ -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