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? 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