diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-09 16:03:58 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-09 16:03:58 -0500 |
| commit | f17578decc40df8fceff82b106582e30bdfb3189 (patch) | |
| tree | 911a435a2094ac03ae649f020237674224e4124a /fs | |
| parent | 682e852e2638ed0aff84aa51181c9e5d2f939562 (diff) | |
| parent | cec418346e5a411e907293aba7cc21ac53c95834 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/compat_ioctl.c | 246 |
1 files changed, 0 insertions, 246 deletions
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index 43a2508ac696..55d9a3a954cf 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
| @@ -207,244 +207,6 @@ static int do_ext3_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) | |||
| 207 | return sys_ioctl(fd, cmd, (unsigned long)compat_ptr(arg)); | 207 | return sys_ioctl(fd, cmd, (unsigned long)compat_ptr(arg)); |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | struct video_tuner32 { | ||
| 211 | compat_int_t tuner; | ||
| 212 | char name[32]; | ||
| 213 | compat_ulong_t rangelow, rangehigh; | ||
| 214 | u32 flags; /* It is really u32 in videodev.h */ | ||
| 215 | u16 mode, signal; | ||
| 216 | }; | ||
| 217 | |||
| 218 | static int get_video_tuner32(struct video_tuner *kp, struct video_tuner32 __user *up) | ||
| 219 | { | ||
| 220 | int i; | ||
| 221 | |||
| 222 | if(get_user(kp->tuner, &up->tuner)) | ||
| 223 | return -EFAULT; | ||
| 224 | for(i = 0; i < 32; i++) | ||
| 225 | __get_user(kp->name[i], &up->name[i]); | ||
| 226 | __get_user(kp->rangelow, &up->rangelow); | ||
| 227 | __get_user(kp->rangehigh, &up->rangehigh); | ||
| 228 | __get_user(kp->flags, &up->flags); | ||
| 229 | __get_user(kp->mode, &up->mode); | ||
| 230 | __get_user(kp->signal, &up->signal); | ||
| 231 | return 0; | ||
| 232 | } | ||
| 233 | |||
| 234 | static int put_video_tuner32(struct video_tuner *kp, struct video_tuner32 __user *up) | ||
| 235 | { | ||
| 236 | int i; | ||
| 237 | |||
| 238 | if(put_user(kp->tuner, &up->tuner)) | ||
| 239 | return -EFAULT; | ||
| 240 | for(i = 0; i < 32; i++) | ||
| 241 | __put_user(kp->name[i], &up->name[i]); | ||
| 242 | __put_user(kp->rangelow, &up->rangelow); | ||
| 243 | __put_user(kp->rangehigh, &up->rangehigh); | ||
| 244 | __put_user(kp->flags, &up->flags); | ||
| 245 | __put_user(kp->mode, &up->mode); | ||
| 246 | __put_user(kp->signal, &up->signal); | ||
| 247 | return 0; | ||
| 248 | } | ||
| 249 | |||
| 250 | struct video_buffer32 { | ||
| 251 | compat_caddr_t base; | ||
| 252 | compat_int_t height, width, depth, bytesperline; | ||
| 253 | }; | ||
| 254 | |||
| 255 | static int get_video_buffer32(struct video_buffer *kp, struct video_buffer32 __user *up) | ||
| 256 | { | ||
| 257 | u32 tmp; | ||
| 258 | |||
| 259 | if (get_user(tmp, &up->base)) | ||
| 260 | return -EFAULT; | ||
| 261 | |||
| 262 | /* This is actually a physical address stored | ||
| 263 | * as a void pointer. | ||
| 264 | */ | ||
| 265 | kp->base = (void *)(unsigned long) tmp; | ||
| 266 | |||
| 267 | __get_user(kp->height, &up->height); | ||
| 268 | __get_user(kp->width, &up->width); | ||
| 269 | __get_user(kp->depth, &up->depth); | ||
| 270 | __get_user(kp->bytesperline, &up->bytesperline); | ||
| 271 | return 0; | ||
| 272 | } | ||
| 273 | |||
| 274 | static int put_video_buffer32(struct video_buffer *kp, struct video_buffer32 __user *up) | ||
| 275 | { | ||
| 276 | u32 tmp = (u32)((unsigned long)kp->base); | ||
| 277 | |||
| 278 | if(put_user(tmp, &up->base)) | ||
| 279 | return -EFAULT; | ||
| 280 | __put_user(kp->height, &up->height); | ||
| 281 | __put_user(kp->width, &up->width); | ||
| 282 | __put_user(kp->depth, &up->depth); | ||
| 283 | __put_user(kp->bytesperline, &up->bytesperline); | ||
| 284 | return 0; | ||
| 285 | } | ||
| 286 | |||
| 287 | struct video_clip32 { | ||
| 288 | s32 x, y, width, height; /* Its really s32 in videodev.h */ | ||
| 289 | compat_caddr_t next; | ||
| 290 | }; | ||
| 291 | |||
| 292 | struct video_window32 { | ||
| 293 | u32 x, y, width, height, chromakey, flags; | ||
| 294 | compat_caddr_t clips; | ||
| 295 | compat_int_t clipcount; | ||
| 296 | }; | ||
| 297 | |||
| 298 | /* You get back everything except the clips... */ | ||
| 299 | static int put_video_window32(struct video_window *kp, struct video_window32 __user *up) | ||
| 300 | { | ||
| 301 | if(put_user(kp->x, &up->x)) | ||
| 302 | return -EFAULT; | ||
| 303 | __put_user(kp->y, &up->y); | ||
| 304 | __put_user(kp->width, &up->width); | ||
| 305 | __put_user(kp->height, &up->height); | ||
| 306 | __put_user(kp->chromakey, &up->chromakey); | ||
| 307 | __put_user(kp->flags, &up->flags); | ||
| 308 | __put_user(kp->clipcount, &up->clipcount); | ||
| 309 | return 0; | ||
| 310 | } | ||
| 311 | |||
| 312 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) | ||
| 313 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) | ||
| 314 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) | ||
| 315 | #define VIDIOCSWIN32 _IOW('v',10, struct video_window32) | ||
| 316 | #define VIDIOCGFBUF32 _IOR('v',11, struct video_buffer32) | ||
| 317 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) | ||
| 318 | #define VIDIOCGFREQ32 _IOR('v',14, u32) | ||
| 319 | #define VIDIOCSFREQ32 _IOW('v',15, u32) | ||
| 320 | |||
| 321 | enum { | ||
| 322 | MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip) | ||
| 323 | }; | ||
| 324 | |||
| 325 | static int do_set_window(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
| 326 | { | ||
| 327 | struct video_window32 __user *up = compat_ptr(arg); | ||
| 328 | struct video_window __user *vw; | ||
| 329 | struct video_clip __user *p; | ||
| 330 | int nclips; | ||
| 331 | u32 n; | ||
| 332 | |||
| 333 | if (get_user(nclips, &up->clipcount)) | ||
| 334 | return -EFAULT; | ||
| 335 | |||
| 336 | /* Peculiar interface... */ | ||
| 337 | if (nclips < 0) | ||
| 338 | nclips = VIDEO_CLIPMAP_SIZE; | ||
| 339 | |||
| 340 | if (nclips > MaxClips) | ||
| 341 | return -ENOMEM; | ||
| 342 | |||
| 343 | vw = compat_alloc_user_space(sizeof(struct video_window) + | ||
| 344 | nclips * sizeof(struct video_clip)); | ||
| 345 | |||
| 346 | p = nclips ? (struct video_clip __user *)(vw + 1) : NULL; | ||
| 347 | |||
| 348 | if (get_user(n, &up->x) || put_user(n, &vw->x) || | ||
| 349 | get_user(n, &up->y) || put_user(n, &vw->y) || | ||
| 350 | get_user(n, &up->width) || put_user(n, &vw->width) || | ||
| 351 | get_user(n, &up->height) || put_user(n, &vw->height) || | ||
| 352 | get_user(n, &up->chromakey) || put_user(n, &vw->chromakey) || | ||
| 353 | get_user(n, &up->flags) || put_user(n, &vw->flags) || | ||
| 354 | get_user(n, &up->clipcount) || put_user(n, &vw->clipcount) || | ||
| 355 | get_user(n, &up->clips) || put_user(p, &vw->clips)) | ||
| 356 | return -EFAULT; | ||
| 357 | |||
| 358 | if (nclips) { | ||
| 359 | struct video_clip32 __user *u = compat_ptr(n); | ||
| 360 | int i; | ||
| 361 | if (!u) | ||
| 362 | return -EINVAL; | ||
| 363 | for (i = 0; i < nclips; i++, u++, p++) { | ||
| 364 | s32 v; | ||
| 365 | if (get_user(v, &u->x) || | ||
| 366 | put_user(v, &p->x) || | ||
| 367 | get_user(v, &u->y) || | ||
| 368 | put_user(v, &p->y) || | ||
| 369 | get_user(v, &u->width) || | ||
| 370 | put_user(v, &p->width) || | ||
| 371 | get_user(v, &u->height) || | ||
| 372 | put_user(v, &p->height) || | ||
| 373 | put_user(NULL, &p->next)) | ||
| 374 | return -EFAULT; | ||
| 375 | } | ||
| 376 | } | ||
| 377 | |||
| 378 | return sys_ioctl(fd, VIDIOCSWIN, (unsigned long)p); | ||
| 379 | } | ||
| 380 | |||
| 381 | static int do_video_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
| 382 | { | ||
| 383 | union { | ||
| 384 | struct video_tuner vt; | ||
| 385 | struct video_buffer vb; | ||
| 386 | struct video_window vw; | ||
| 387 | unsigned long vx; | ||
| 388 | } karg; | ||
| 389 | mm_segment_t old_fs = get_fs(); | ||
| 390 | void __user *up = compat_ptr(arg); | ||
| 391 | int err = 0; | ||
| 392 | |||
| 393 | /* First, convert the command. */ | ||
| 394 | switch(cmd) { | ||
| 395 | case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break; | ||
| 396 | case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break; | ||
| 397 | case VIDIOCGWIN32: cmd = VIDIOCGWIN; break; | ||
| 398 | case VIDIOCGFBUF32: cmd = VIDIOCGFBUF; break; | ||
| 399 | case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break; | ||
| 400 | case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break; | ||
| 401 | case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break; | ||
| 402 | }; | ||
| 403 | |||
| 404 | switch(cmd) { | ||
| 405 | case VIDIOCSTUNER: | ||
| 406 | case VIDIOCGTUNER: | ||
| 407 | err = get_video_tuner32(&karg.vt, up); | ||
| 408 | break; | ||
| 409 | |||
| 410 | case VIDIOCSFBUF: | ||
| 411 | err = get_video_buffer32(&karg.vb, up); | ||
| 412 | break; | ||
| 413 | |||
| 414 | case VIDIOCSFREQ: | ||
| 415 | err = get_user(karg.vx, (u32 __user *)up); | ||
| 416 | break; | ||
| 417 | }; | ||
| 418 | if(err) | ||
| 419 | goto out; | ||
| 420 | |||
| 421 | set_fs(KERNEL_DS); | ||
| 422 | err = sys_ioctl(fd, cmd, (unsigned long)&karg); | ||
| 423 | set_fs(old_fs); | ||
| 424 | |||
| 425 | if(err == 0) { | ||
| 426 | switch(cmd) { | ||
| 427 | case VIDIOCGTUNER: | ||
| 428 | err = put_video_tuner32(&karg.vt, up); | ||
| 429 | break; | ||
| 430 | |||
| 431 | case VIDIOCGWIN: | ||
| 432 | err = put_video_window32(&karg.vw, up); | ||
| 433 | break; | ||
| 434 | |||
| 435 | case VIDIOCGFBUF: | ||
| 436 | err = put_video_buffer32(&karg.vb, up); | ||
| 437 | break; | ||
| 438 | |||
| 439 | case VIDIOCGFREQ: | ||
| 440 | err = put_user(((u32)karg.vx), (u32 __user *)up); | ||
| 441 | break; | ||
| 442 | }; | ||
| 443 | } | ||
| 444 | out: | ||
| 445 | return err; | ||
| 446 | } | ||
| 447 | |||
| 448 | struct compat_dmx_event { | 210 | struct compat_dmx_event { |
| 449 | dmx_event_t event; | 211 | dmx_event_t event; |
| 450 | compat_time_t timeStamp; | 212 | compat_time_t timeStamp; |
| @@ -3015,14 +2777,6 @@ COMPATIBLE_IOCTL(EXT3_IOC_GROUP_ADD) | |||
| 3015 | #ifdef CONFIG_JBD_DEBUG | 2777 | #ifdef CONFIG_JBD_DEBUG |
| 3016 | HANDLE_IOCTL(EXT3_IOC32_WAIT_FOR_READONLY, do_ext3_ioctl) | 2778 | HANDLE_IOCTL(EXT3_IOC32_WAIT_FOR_READONLY, do_ext3_ioctl) |
| 3017 | #endif | 2779 | #endif |
| 3018 | HANDLE_IOCTL(VIDIOCGTUNER32, do_video_ioctl) | ||
| 3019 | HANDLE_IOCTL(VIDIOCSTUNER32, do_video_ioctl) | ||
| 3020 | HANDLE_IOCTL(VIDIOCGWIN32, do_video_ioctl) | ||
| 3021 | HANDLE_IOCTL(VIDIOCSWIN32, do_set_window) | ||
| 3022 | HANDLE_IOCTL(VIDIOCGFBUF32, do_video_ioctl) | ||
| 3023 | HANDLE_IOCTL(VIDIOCSFBUF32, do_video_ioctl) | ||
| 3024 | HANDLE_IOCTL(VIDIOCGFREQ32, do_video_ioctl) | ||
| 3025 | HANDLE_IOCTL(VIDIOCSFREQ32, do_video_ioctl) | ||
| 3026 | /* One SMB ioctl needs translations. */ | 2780 | /* One SMB ioctl needs translations. */ |
| 3027 | #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t) | 2781 | #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t) |
| 3028 | HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid) | 2782 | HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid) |
