@ -159,11 +159,16 @@ struct v4l2_format32 {
} fmt ;
} ;
static int get_v4l2_format32 ( struct v4l2_format * kp , struct v4l2_format32 __user * up )
struct v4l2_create_buffers32 {
__u32 index ; /* output: buffers index...index + count - 1 have been created */
__u32 count ;
enum v4l2_memory memory ;
struct v4l2_format32 format ; /* filled in by the user, plane sizes calculated by the driver */
__u32 reserved [ 8 ] ;
} ;
static int __get_v4l2_format32 ( struct v4l2_format * kp , struct v4l2_format32 __user * up )
{
if ( ! access_ok ( VERIFY_READ , up , sizeof ( struct v4l2_format32 ) ) | |
get_user ( kp - > type , & up - > type ) )
return - EFAULT ;
switch ( kp - > type ) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE :
case V4L2_BUF_TYPE_VIDEO_OUTPUT :
@ -192,11 +197,24 @@ static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user
}
}
static int put_v4l2_format32 ( struct v4l2_format * kp , struct v4l2_format32 __user * up )
static int get_v4l2_format32 ( struct v4l2_format * kp , struct v4l2_format32 __user * up )
{
if ( ! access_ok ( VERIFY_READ , up , sizeof ( struct v4l2_format32 ) ) | |
get_user ( kp - > type , & up - > type ) )
return - EFAULT ;
return __get_v4l2_format32 ( kp , up ) ;
}
static int get_v4l2_create32 ( struct v4l2_create_buffers * kp , struct v4l2_create_buffers32 __user * up )
{
if ( ! access_ok ( VERIFY_READ , up , sizeof ( struct v4l2_create_buffers32 ) ) | |
copy_from_user ( kp , up , offsetof ( struct v4l2_create_buffers32 , format . fmt ) ) )
return - EFAULT ;
return __get_v4l2_format32 ( & kp - > format , & up - > format ) ;
}
static int __put_v4l2_format32 ( struct v4l2_format * kp , struct v4l2_format32 __user * up )
{
if ( ! access_ok ( VERIFY_WRITE , up , sizeof ( struct v4l2_format32 ) ) | |
put_user ( kp - > type , & up - > type ) )
return - EFAULT ;
switch ( kp - > type ) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE :
case V4L2_BUF_TYPE_VIDEO_OUTPUT :
@ -225,6 +243,22 @@ static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user
}
}
static int put_v4l2_format32 ( struct v4l2_format * kp , struct v4l2_format32 __user * up )
{
if ( ! access_ok ( VERIFY_WRITE , up , sizeof ( struct v4l2_format32 ) ) | |
put_user ( kp - > type , & up - > type ) )
return - EFAULT ;
return __put_v4l2_format32 ( kp , up ) ;
}
static int put_v4l2_create32 ( struct v4l2_create_buffers * kp , struct v4l2_create_buffers32 __user * up )
{
if ( ! access_ok ( VERIFY_WRITE , up , sizeof ( struct v4l2_create_buffers32 ) ) | |
copy_to_user ( up , kp , offsetof ( struct v4l2_create_buffers32 , format . fmt ) ) )
return - EFAULT ;
return __put_v4l2_format32 ( & kp - > format , & up - > format ) ;
}
struct v4l2_standard32 {
__u32 index ;
__u32 id [ 2 ] ; /* __u64 would get the alignment wrong */
@ -702,6 +736,8 @@ static int put_v4l2_event32(struct v4l2_event *kp, struct v4l2_event32 __user *u
# define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32)
# define VIDIOC_TRY_EXT_CTRLS32 _IOWR('V', 73, struct v4l2_ext_controls32)
# define VIDIOC_DQEVENT32 _IOR ('V', 89, struct v4l2_event32)
# define VIDIOC_CREATE_BUFS32 _IOWR('V', 92, struct v4l2_create_buffers32)
# define VIDIOC_PREPARE_BUF32 _IOWR('V', 93, struct v4l2_buffer32)
# define VIDIOC_OVERLAY32 _IOW ('V', 14, s32)
# define VIDIOC_STREAMON32 _IOW ('V', 18, s32)
@ -721,6 +757,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
struct v4l2_standard v2s ;
struct v4l2_ext_controls v2ecs ;
struct v4l2_event v2ev ;
struct v4l2_create_buffers v2crt ;
unsigned long vx ;
int vi ;
} karg ;
@ -751,6 +788,8 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
case VIDIOC_S_INPUT32 : cmd = VIDIOC_S_INPUT ; break ;
case VIDIOC_G_OUTPUT32 : cmd = VIDIOC_G_OUTPUT ; break ;
case VIDIOC_S_OUTPUT32 : cmd = VIDIOC_S_OUTPUT ; break ;
case VIDIOC_CREATE_BUFS32 : cmd = VIDIOC_CREATE_BUFS ; break ;
case VIDIOC_PREPARE_BUF32 : cmd = VIDIOC_PREPARE_BUF ; break ;
}
switch ( cmd ) {
@ -775,6 +814,12 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
compatible_arg = 0 ;
break ;
case VIDIOC_CREATE_BUFS :
err = get_v4l2_create32 ( & karg . v2crt , up ) ;
compatible_arg = 0 ;
break ;
case VIDIOC_PREPARE_BUF :
case VIDIOC_QUERYBUF :
case VIDIOC_QBUF :
case VIDIOC_DQBUF :
@ -860,6 +905,10 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
err = put_v4l2_format32 ( & karg . v2f , up ) ;
break ;
case VIDIOC_CREATE_BUFS :
err = put_v4l2_create32 ( & karg . v2crt , up ) ;
break ;
case VIDIOC_QUERYBUF :
case VIDIOC_QBUF :
case VIDIOC_DQBUF :
@ -959,6 +1008,8 @@ long v4l2_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
case VIDIOC_DQEVENT32 :
case VIDIOC_SUBSCRIBE_EVENT :
case VIDIOC_UNSUBSCRIBE_EVENT :
case VIDIOC_CREATE_BUFS32 :
case VIDIOC_PREPARE_BUF32 :
ret = do_video_ioctl ( file , cmd , arg ) ;
break ;