Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-02-01 19:49:13 +0300
committerChristopher Faylor <me@cgf.cx>2005-02-01 19:49:13 +0300
commit74d8e12e16d5d5416ce37100f8767ff0affa90ec (patch)
treed10e1a02e7ba0ff1322cd3f3dd68c101aaf646f5 /winsup/cygwin/fhandler_proc.cc
parent01a94cf8662ffe333b0b75fc98aa44ada4320aeb (diff)
* cygthread.cc (cygthread::terminate_thread): Wait briefly for notification
event in the event that the thread was actually in the process of exiting. * pipe.cc (fhandler_pipe::dup): read_state is not supposed to be inheritable. Fix that. * path.cc (path_conv::check): Set symlen = 0 to avoid a compiler warning. * devices.h (devices::parsedisk): Declare new function. * devices.in (devices::parsedisk): Define new function. * dtable.cc (dtable::init_std_file_from_handle): Use device numbers rather than name. * fhandler_proc.cc (format_proc_partitions): Use parsedisk to generate disk names from numeric codes. (This was broken on two of my systems previously and is still broken now)
Diffstat (limited to 'winsup/cygwin/fhandler_proc.cc')
-rw-r--r--winsup/cygwin/fhandler_proc.cc56
1 files changed, 28 insertions, 28 deletions
diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc
index 95817b929..bd6ff03bb 100644
--- a/winsup/cygwin/fhandler_proc.cc
+++ b/winsup/cygwin/fhandler_proc.cc
@@ -387,7 +387,7 @@ fhandler_proc::fill_filebuf ()
}
case PROC_SELF:
{
- filebuf = (char *) realloc (filebuf, bufalloc = 32);
+ filebuf = (char *) realloc (filebuf, bufalloc = 32);
filesize = __small_sprintf (filebuf, "%d", getpid ());
}
}
@@ -967,8 +967,6 @@ format_proc_partitions (char *destbuf, size_t maxsize)
{
DWORD dwBytesReturned, dwRetCode;
DISK_GEOMETRY dg;
- int buf_size = 4096;
- char buf[buf_size];
dwRetCode = DeviceIoControl (hDevice,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,
@@ -981,49 +979,51 @@ format_proc_partitions (char *destbuf, size_t maxsize)
debug_printf ("DeviceIoControl %E");
else
{
- char devname[16];
- __small_sprintf (devname, "/dev/sd%c", drive_number + 'a');
device dev;
- dev.parse (devname);
+ dev.parsedisk (drive_number, 0);
bufptr += __small_sprintf (bufptr, "%5d %5d %9U %s\n",
dev.major,
dev.minor,
(long long)((dg.Cylinders.QuadPart * dg.TracksPerCylinder *
dg.SectorsPerTrack * dg.BytesPerSector) >> 10),
- devname + 5);
+ dev.name + 5);
}
- while (dwRetCode = DeviceIoControl (hDevice,
- IOCTL_DISK_GET_DRIVE_LAYOUT,
- NULL,
- 0,
- (DRIVE_LAYOUT_INFORMATION *) buf,
- buf_size,
- &dwBytesReturned,
- NULL),
- !dwRetCode && GetLastError () == ERROR_INSUFFICIENT_BUFFER)
- buf_size *= 2;
- if (!dwRetCode)
- debug_printf ("DeviceIoControl %E");
- else
+ size_t buf_size = 8192;
+ DWORD rc;
+ while (1)
{
+ char buf[buf_size];
+ memset (buf, 0, buf_size);
+ rc = DeviceIoControl (hDevice, IOCTL_DISK_GET_DRIVE_LAYOUT,
+ NULL, 0, (DRIVE_LAYOUT_INFORMATION *) buf,
+ buf_size, &dwBytesReturned, NULL);
+ if (rc)
+ /* fall through */;
+ else if (GetLastError () == ERROR_INSUFFICIENT_BUFFER)
+ {
+ buf_size *= 2;
+ continue;
+ }
+ else
+ {
+ debug_printf ("DeviceIoControl %E");
+ break;
+ }
DRIVE_LAYOUT_INFORMATION *dli = (DRIVE_LAYOUT_INFORMATION *) buf;
for (unsigned partition = 0; partition < dli->PartitionCount; partition++)
{
- if (dli->PartitionEntry[partition].PartitionLength.QuadPart == 0)
+ if (!dli->PartitionEntry[partition].PartitionLength.QuadPart
+ || !dli->PartitionEntry[partition].PartitionType)
continue;
- char devname[16];
- __small_sprintf (devname, "/dev/sd%c%d",
- drive_number + 'a',
- partition + 1);
device dev;
- dev.parse (devname);
+ dev.parsedisk (drive_number, partition + 1);
bufptr += __small_sprintf (bufptr, "%5d %5d %9U %s\n",
dev.major, dev.minor,
(long long)(dli->PartitionEntry[partition].PartitionLength.QuadPart >> 10),
- devname + 5);
+ dev.name + 5);
}
+ break;
}
-
CloseHandle (hDevice);
}
}