Re: ioctl, compat_ioctl and ioctl32
James Hansen wrote:
I'm having trouble inserting a module into the kernel. It was
originally written for a 32bit architecture, as were the binaries that
use it, and the kernel seems to be calling ioctl32 rather than ioctl.
ioctl32(app:2342): Unknown cmd fd(7) etc etc.
I imagine this is to allow the 32bit binaries (and libraries) to use
the 64bit kernel, allowing for some conversion to take place.
The problem is when building the module, if I add an entry to my fops
struct for ioctl32 (or from a little bit of research 'compat_ioctl'),
it complains that this is an unknown field in the kernel's fops struct.
I'm using the default kernel btw. Would anyone know why I'm unable to
add this field to the struct? Or could anyone refer me to anything
that might explain things?
Thanks a lot
James
I've just had a look in the kernel-headers directory for the default
kernel. There is definately no entry for ioctl32 or compat_ioctl in the
file_operations struct.
How come it's calling ioctl32, when I'm unable to specify anything for it?
Thanks
James
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
ssize_t (*write) (struct file *, const char __user *, size_t,
loff_t *);
ssize_t (*aio_write) (struct kiocb *, const char __user *,
size_t, loff_t);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int,
unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *, int datasync);
int (*aio_fsync) (struct kiocb *, int datasync);
int (*fasync) (int, struct file *, int);
int (*lock) (struct file *, int, struct file_lock *);
ssize_t (*readv) (struct file *, const struct iovec *, unsigned
long, loff_t *);
ssize_t (*writev) (struct file *, const struct iovec *, unsigned
long, loff_t *);
ssize_t (*sendfile) (struct file *, loff_t *, size_t,
read_actor_t, void *);
ssize_t (*sendpage) (struct file *, struct page *, int, size_t,
loff_t *, int);
unsigned long (*get_unmapped_area)(struct file *, unsigned long,
unsigned long, unsigned long, unsigned long);
int (*check_flags)(int);
int (*dir_notify)(struct file *filp, unsigned long arg);
};
Reply to: