mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-19 04:49:25 +08:00
* 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:
parent
ff7b364c12
commit
824d851859
@ -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
|
||||
|
@ -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[]),
|
||||
|
@ -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);
|
||||
|
@ -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 ();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user