From cad2c685b4096ba830e32a5fe0c6e9cfa4f890e3 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 7 Nov 2002 14:16:29 +0000 Subject: [PATCH] * include/cygwin/fs.h: New file. * include/cygwin/hdreg.h: New file. * fhandler_floppy.cc (fhandler_floppy::ioctl): Add implementation for HDIO_GETGEO, BLKGETSIZE, BLKGETSIZE64, BLKRRPART and BLKSSZGET ioctls. --- winsup/cygwin/ChangeLog | 7 ++ winsup/cygwin/fhandler_floppy.cc | 123 ++++++++++++++++++++++++++- winsup/cygwin/include/cygwin/fs.h | 22 +++++ winsup/cygwin/include/cygwin/hdreg.h | 24 ++++++ 4 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 winsup/cygwin/include/cygwin/fs.h create mode 100644 winsup/cygwin/include/cygwin/hdreg.h diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index d5594b77e..ed345d0f6 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2002-11-07 Christopher January + + * include/cygwin/fs.h: New file. + * include/cygwin/hdreg.h: New file. + * fhandler_floppy.cc (fhandler_floppy::ioctl): Add implementation for + HDIO_GETGEO, BLKGETSIZE, BLKGETSIZE64, BLKRRPART and BLKSSZGET ioctls. + 2002-11-07 Gilles Courcoux * fhandler_socket.cc (fhandler_socket::ioctl): Return correct flags diff --git a/winsup/cygwin/fhandler_floppy.cc b/winsup/cygwin/fhandler_floppy.cc index f0380dc88..c1df34ada 100644 --- a/winsup/cygwin/fhandler_floppy.cc +++ b/winsup/cygwin/fhandler_floppy.cc @@ -14,6 +14,9 @@ details. */ #include #include #include +#include +#include +#include #include "security.h" #include "fhandler.h" #include "cygerrno.h" @@ -186,6 +189,124 @@ fhandler_dev_floppy::lseek (__off64_t offset, int whence) int fhandler_dev_floppy::ioctl (unsigned int cmd, void *buf) { - return fhandler_dev_raw::ioctl (cmd, buf); + DISK_GEOMETRY di; + PARTITION_INFORMATION pi; + DWORD bytes_read; + __off64_t drive_size = 0; + __off64_t start = 0; + switch (cmd) + { + case HDIO_GETGEO: + { + debug_printf ("HDIO_GETGEO"); + if (!DeviceIoControl (get_handle (), + IOCTL_DISK_GET_DRIVE_GEOMETRY, + NULL, 0, + &di, sizeof (di), + &bytes_read, NULL)) + { + __seterrno (); + return -1; + } + debug_printf ("disk geometry: (%ld cyl)*(%ld trk)*(%ld sec)*(%ld bps)", + di.Cylinders.LowPart, + di.TracksPerCylinder, + di.SectorsPerTrack, + di.BytesPerSector); + if (DeviceIoControl (get_handle (), + IOCTL_DISK_GET_PARTITION_INFO, + NULL, 0, + &pi, sizeof (pi), + &bytes_read, NULL)) + { + debug_printf ("partition info: %ld (%ld)", + pi.StartingOffset.LowPart, + pi.PartitionLength.LowPart); + start = pi.StartingOffset.QuadPart >> 9ULL; + } + struct hd_geometry *geo = (struct hd_geometry *) buf; + geo->heads = di.TracksPerCylinder; + geo->sectors = di.SectorsPerTrack; + geo->cylinders = di.Cylinders.LowPart; + geo->start = start; + return 0; + } + case BLKGETSIZE: + case BLKGETSIZE64: + { + debug_printf ("BLKGETSIZE"); + if (!DeviceIoControl (get_handle (), + IOCTL_DISK_GET_DRIVE_GEOMETRY, + NULL, 0, + &di, sizeof (di), + &bytes_read, NULL)) + { + __seterrno (); + return -1; + } + debug_printf ("disk geometry: (%ld cyl)*(%ld trk)*(%ld sec)*(%ld bps)", + di.Cylinders.LowPart, + di.TracksPerCylinder, + di.SectorsPerTrack, + di.BytesPerSector); + if (DeviceIoControl (get_handle (), + IOCTL_DISK_GET_PARTITION_INFO, + NULL, 0, + &pi, sizeof (pi), + &bytes_read, NULL)) + { + debug_printf ("partition info: %ld (%ld)", + pi.StartingOffset.LowPart, + pi.PartitionLength.LowPart); + drive_size = pi.PartitionLength.QuadPart; + } + else + { + drive_size = di.Cylinders.QuadPart * di.TracksPerCylinder * + di.SectorsPerTrack * di.BytesPerSector; + } + if (cmd == BLKGETSIZE) + *(long *)buf = drive_size >> 9UL; + else + *(__off64_t *)buf = drive_size; + return 0; + } + case BLKRRPART: + { + debug_printf ("BLKRRPART"); + if (!DeviceIoControl (get_handle (), + IOCTL_DISK_UPDATE_DRIVE_SIZE, + NULL, 0, + &di, sizeof (di), + &bytes_read, NULL)) + { + __seterrno (); + return -1; + } + return 0; + } + case BLKSSZGET: + { + debug_printf ("BLKSSZGET"); + if (!DeviceIoControl (get_handle (), + IOCTL_DISK_GET_DRIVE_GEOMETRY, + NULL, 0, + &di, sizeof (di), + &bytes_read, NULL)) + { + __seterrno (); + return -1; + } + debug_printf ("disk geometry: (%ld cyl)*(%ld trk)*(%ld sec)*(%ld bps)", + di.Cylinders.LowPart, + di.TracksPerCylinder, + di.SectorsPerTrack, + di.BytesPerSector); + *(int *)buf = di.BytesPerSector; + return 0; + } + default: + return fhandler_dev_raw::ioctl (cmd, buf); + } } diff --git a/winsup/cygwin/include/cygwin/fs.h b/winsup/cygwin/include/cygwin/fs.h new file mode 100644 index 000000000..5909c21b6 --- /dev/null +++ b/winsup/cygwin/include/cygwin/fs.h @@ -0,0 +1,22 @@ +/* cygwin/fs.h + + Copyright 2002 Red Hat Inc. + Written by Chris January + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#ifndef _CYGWIN_FS_H_ +#define _CYGWIN_FS_H_ + +#include + +#define BLKRRPART 0x0000125f +#define BLKGETSIZE 0x00001260 +#define BLKSSZGET 0x00001268 +#define BLKGETSIZE64 0x00041268 + +#endif diff --git a/winsup/cygwin/include/cygwin/hdreg.h b/winsup/cygwin/include/cygwin/hdreg.h new file mode 100644 index 000000000..dc8157838 --- /dev/null +++ b/winsup/cygwin/include/cygwin/hdreg.h @@ -0,0 +1,24 @@ +/* cygwin/hdreg.h + + Copyright 2002 Red Hat Inc. + Written by Chris January + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#ifndef _CYGWIN_HDREG_H_ +#define _CYGWIN_HDREG_H_ + +struct hd_geometry { + unsigned char heads; + unsigned char sectors; + unsigned short cylinders; + unsigned long start; +}; + +#define HDIO_GETGEO 0x301 + +#endif