summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2002-11-07 14:16:29 +0000
committerCorinna Vinschen <corinna@vinschen.de>2002-11-07 14:16:29 +0000
commitcad2c685b4096ba830e32a5fe0c6e9cfa4f890e3 (patch)
tree8f8cc171f5db0bcbd399218a74058d6bc2548ff8 /winsup/cygwin
parent963fb8837db5ebd121df2b459439078fa6374e2a (diff)
downloadcygnal-cad2c685b4096ba830e32a5fe0c6e9cfa4f890e3.tar.gz
cygnal-cad2c685b4096ba830e32a5fe0c6e9cfa4f890e3.tar.bz2
cygnal-cad2c685b4096ba830e32a5fe0c6e9cfa4f890e3.zip
* 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.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/fhandler_floppy.cc123
-rw-r--r--winsup/cygwin/include/cygwin/fs.h22
-rw-r--r--winsup/cygwin/include/cygwin/hdreg.h24
4 files changed, 175 insertions, 1 deletions
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 <chris@atomice.net>
+
+ * 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 <Gilles.Courcoux@col.bsf.alcatel.fr>
* 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 <errno.h>
#include <unistd.h>
#include <winioctl.h>
+#include <asm/socket.h>
+#include <cygwin/hdreg.h>
+#include <cygwin/fs.h>
#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 <chris@atomice.net>
+
+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 <cygwin/types.h>
+
+#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 <chris@atomice.net>
+
+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