Re: [PATCH] v4l2-compliance: fix function pointer prototype

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

On Tue, Apr 1, 2014 at 8:12 PM, Hans Verkuil <hverkuil@xxxxxxxxx> wrote:
> On 04/01/14 16:26, Hans Verkuil wrote:
>>
>>
>> On 04/01/14 16:06, Prabhakar Lad wrote:
>>> Hi Hans,
>>>
>>> On Tue, Apr 1, 2014 at 7:20 PM, Hans Verkuil <hansverk@xxxxxxxxx> wrote:
>>>> Hi Prabhakar,
>>>>
>>>> On 04/01/14 15:45, Lad, Prabhakar wrote:
>>>>> From: "Lad, Prabhakar" <prabhakar.csengg@xxxxxxxxx>
>>>>>
>>>>> There was a conflict between the mmap function pointer prototype of
>>>>> struct v4l_fd and the actual function used. Make sure it is in sync
>>>>> with the prototype of v4l2_mmap.
>>>>
>>>> The prototype of v4l2_mmap uses int64_t, so I don't understand this
>>>> patch.
>>>>
>>> Actual prototype of mmap is,
>>>
>>>   void *mmap(void *addr, size_t length, int prot, int flags, int fd,
>>> off_t offset);
>>>
>>> But where as the prototype in v4l_fd mmap the last parameter type is int64_t
>>> but that should have been off_t and same applies with test_mmap().
>>
>> The problem is that v4l2_mmap (in lib/include/libv4l2.h) uses int64_t.
>> So the function pointer uses int64_t as well as does test_mmap.
>>
>> I don't see how the current v4l-utils tree can cause a compile error.
>>
>> For the record, I know you can't assign mmap to fd->mmap, you would
>> have to make a wrapper. Unfortunately mmap and v4l2_mmap do not have
>> the same prototype and I had to pick one (I'm not sure why they don't
>> use the same prototype).
>>
>> Most applications would typically have to use v4l2_mmap, so I went with
>> that one.
>>
>
> I missed that mmap is assigned to v4l_fd_init(). Since mmap and v4l2_mmap
> have different prototypes the only solution is to make a wrapper.
>
> Does this work?
>
Yes it compiles now with the below patch.

Thanks,
--Prabhakar Lad

> diff --git a/utils/v4l2-compliance/v4l-helpers.h b/utils/v4l2-compliance/v4l-helpers.h
> index 48ea602..e718a24 100644
> --- a/utils/v4l2-compliance/v4l-helpers.h
> +++ b/utils/v4l2-compliance/v4l-helpers.h
> @@ -14,11 +14,21 @@ struct v4l_fd {
>         int (*munmap)(void *addr, size_t length);
>  };
>
> +/*
> + * mmap has a different prototype compared to v4l2_mmap. Because of
> + * this we have to make a wrapper for it.
> + */
> +static inline void *v4l_fd_mmap(void *addr, size_t length, int prot, int flags,
> +                                     int fd, int64_t offset)
> +{
> +       return mmap(addr, length, prot, flags, fd, offset);
> +}
> +
>  static inline void v4l_fd_init(struct v4l_fd *f, int fd)
>  {
>         f->fd = fd;
>         f->ioctl = ioctl;
> -       f->mmap = mmap;
> +       f->mmap = v4l_fd_mmap;
>         f->munmap = munmap;
>  }
>
>
> On a 64-bit system the types are the same, it's only on a 32-bit system that
> this will fail.
>
> Regards,
>
>         Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux