4 * Copyright (C) 1991, 1992 Linus Torvalds
8 #include <linux/smp_lock.h>
9 #include <linux/file.h>
11 #include <asm/uaccess.h>
13 static int file_ioctl(struct file
*filp
,unsigned int cmd
,unsigned long arg
)
17 struct inode
* inode
= filp
->f_dentry
->d_inode
;
21 if (inode
->i_op
== NULL
)
23 if (inode
->i_op
->bmap
== NULL
)
25 if ((error
= get_user(block
, (int *) arg
)) != 0)
27 block
= inode
->i_op
->bmap(inode
,block
);
28 return put_user(block
, (int *) arg
);
30 if (inode
->i_sb
== NULL
)
32 return put_user(inode
->i_sb
->s_blocksize
, (int *) arg
);
34 return put_user(inode
->i_size
- filp
->f_pos
, (int *) arg
);
36 if (filp
->f_op
&& filp
->f_op
->ioctl
)
37 return filp
->f_op
->ioctl(inode
, filp
, cmd
, arg
);
42 asmlinkage
int sys_ioctl(unsigned int fd
, unsigned int cmd
, unsigned long arg
)
46 int on
, error
= -EBADF
;
55 FD_SET(fd
, ¤t
->files
->close_on_exec
);
59 FD_CLR(fd
, ¤t
->files
->close_on_exec
);
63 if ((error
= get_user(on
, (int *)arg
)) != 0)
67 /* SunOS compatibility item. */
68 if(O_NONBLOCK
!= O_NDELAY
)
72 filp
->f_flags
|= flag
;
74 filp
->f_flags
&= ~flag
;
78 if ((error
= get_user(on
, (int *)arg
)) != 0)
80 flag
= on
? FASYNC
: 0;
82 /* Did FASYNC state change ? */
83 if ((flag
^ filp
->f_flags
) & FASYNC
) {
84 if (filp
->f_op
&& filp
->f_op
->fasync
)
85 filp
->f_op
->fasync(fd
, filp
, on
);
88 filp
->f_flags
|= FASYNC
;
90 filp
->f_flags
&= ~FASYNC
;
95 if (!filp
->f_dentry
|| !filp
->f_dentry
->d_inode
)
97 else if (S_ISREG(filp
->f_dentry
->d_inode
->i_mode
))
98 error
= file_ioctl(filp
, cmd
, arg
);
99 else if (filp
->f_op
&& filp
->f_op
->ioctl
)
100 error
= filp
->f_op
->ioctl(filp
->f_dentry
->d_inode
, filp
, cmd
, arg
);