summaryrefslogtreecommitdiffstats
path: root/sys/i386/linux/linux_ioctl.c
diff options
context:
space:
mode:
authornsayer <nsayer@FreeBSD.org>2000-03-09 15:14:14 +0000
committernsayer <nsayer@FreeBSD.org>2000-03-09 15:14:14 +0000
commit1ed48e03edb7a3a5fdf30c86c348d76918682802 (patch)
tree9f2700e504084f7e81f75454bf94252e393b8a9e /sys/i386/linux/linux_ioctl.c
parent4bd515c32ffabb15de94b74baf8b0f8667f7af57 (diff)
downloadFreeBSD-src-1ed48e03edb7a3a5fdf30c86c348d76918682802.zip
FreeBSD-src-1ed48e03edb7a3a5fdf30c86c348d76918682802.tar.gz
Implement Linux BLKGETSIZE ioctl, and open the door to implementing
other BLK.* ioctls should the desire arize. Approved by: jkh (via dufault)
Diffstat (limited to 'sys/i386/linux/linux_ioctl.c')
-rw-r--r--sys/i386/linux/linux_ioctl.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sys/i386/linux/linux_ioctl.c b/sys/i386/linux/linux_ioctl.c
index a4747c6..cd532e6 100644
--- a/sys/i386/linux/linux_ioctl.c
+++ b/sys/i386/linux/linux_ioctl.c
@@ -46,6 +46,7 @@
#include <net/if_types.h>
#include <sys/sockio.h>
#include <sys/soundcard.h>
+#include <sys/disklabel.h>
#include <machine/console.h>
@@ -55,12 +56,15 @@
#include <i386/linux/linux_proto.h>
#include <i386/linux/linux_util.h>
+static linux_ioctl_function_t linux_ioctl_disk;
static linux_ioctl_function_t linux_ioctl_cdrom;
static linux_ioctl_function_t linux_ioctl_console;
static linux_ioctl_function_t linux_ioctl_socket;
static linux_ioctl_function_t linux_ioctl_sound;
static linux_ioctl_function_t linux_ioctl_termio;
+static struct linux_ioctl_handler disk_handler =
+{ linux_ioctl_disk, LINUX_IOCTL_DISK_MIN, LINUX_IOCTL_DISK_MAX };
static struct linux_ioctl_handler cdrom_handler =
{ linux_ioctl_cdrom, LINUX_IOCTL_CDROM_MIN, LINUX_IOCTL_CDROM_MAX };
static struct linux_ioctl_handler console_handler =
@@ -72,6 +76,7 @@ static struct linux_ioctl_handler sound_handler =
static struct linux_ioctl_handler termio_handler =
{ linux_ioctl_termio, LINUX_IOCTL_TERMIO_MIN, LINUX_IOCTL_TERMIO_MAX };
+DATA_SET(linux_ioctl_handler_set, disk_handler);
DATA_SET(linux_ioctl_handler_set, cdrom_handler);
DATA_SET(linux_ioctl_handler_set, console_handler);
DATA_SET(linux_ioctl_handler_set, socket_handler);
@@ -88,6 +93,24 @@ struct handler_element
static TAILQ_HEAD(, handler_element) handlers =
TAILQ_HEAD_INITIALIZER(handlers);
+static int
+linux_ioctl_disk(struct proc *p, struct linux_ioctl_args *args)
+{
+ struct file *fp = p->p_fd->fd_ofiles[args->fd];
+ int error;
+ struct disklabel dl;
+
+ switch (args->cmd & 0xffff) {
+ case LINUX_BLKGETSIZE:
+ error = fo_ioctl(fp, DIOCGDINFO, (caddr_t)&dl, p);
+ if (error)
+ return (error);
+ return copyout(&(dl.d_secperunit), (caddr_t)args->arg, sizeof(dl.d_secperunit));
+ break;
+ }
+ return (ENOIOCTL);
+}
+
/*
* termio related ioctls
*/
OpenPOWER on IntegriCloud