[packages] Add the libv4l package which adds a generally uniform abstraction layer...
[openwrt/svn-archive/archive.git] / libs / libv4l / patches / 001-no-shm_open-fix.patch
1 diff -ruN libv4l-0.6.0.orig/libv4lconvert/control/libv4lcontrol.c libv4l-0.6.0/libv4lconvert/control/libv4lcontrol.c
2 --- libv4l-0.6.0.orig/libv4lconvert/control/libv4lcontrol.c 2009-07-09 04:59:01.000000000 -0400
3 +++ libv4l-0.6.0/libv4lconvert/control/libv4lcontrol.c 2009-08-29 03:23:06.000000000 -0400
4 @@ -265,7 +265,7 @@
5
6 struct v4lcontrol_data *v4lcontrol_create(int fd, int always_needs_conversion)
7 {
8 - int shm_fd;
9 + int shm_fd, fdflags;
10 int i, rc, init = 0;
11 char *s, shm_name[256];
12 struct v4l2_capability cap;
13 @@ -311,19 +311,26 @@
14 return data; /* No need to create a shared memory segment */
15
16 SYS_IOCTL(fd, VIDIOC_QUERYCAP, &cap);
17 - snprintf(shm_name, 256, "/%s:%s", cap.bus_info, cap.card);
18 + snprintf(shm_name, 256, "/dev/shm/%s:%s", cap.bus_info, cap.card);
19
20 /* / is not allowed inside shm names */
21 - for (i = 1; shm_name[i]; i++)
22 + for (i = 9; shm_name[i]; i++) //start after "/dev/shm", i = 9
23 if (shm_name[i] == '/')
24 shm_name[i] = '-';
25
26 /* Open the shared memory object identified by shm_name */
27 - if ((shm_fd = shm_open(shm_name, (O_CREAT | O_EXCL | O_RDWR),
28 + if ((shm_fd = open(shm_name, (O_CREAT | O_EXCL | O_RDWR),
29 (S_IREAD | S_IWRITE))) >= 0)
30 init = 1;
31 - else if ((shm_fd = shm_open(shm_name, O_RDWR, (S_IREAD | S_IWRITE))) < 0)
32 + else if ((shm_fd = open(shm_name, O_RDWR, (S_IREAD | S_IWRITE))) < 0)
33 goto error;
34 +
35 + /* This is all uClibc > 0.9.30 seems to do for shm_open() in librt/shm.c */
36 + fdflags = fcntl(shm_fd, F_GETFD, 0);
37 +
38 + if (fdflags >= 0) {
39 + fdflags = fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
40 + }
41
42 /* Set the shared memory size */
43 ftruncate(shm_fd, V4LCONTROL_SHM_SIZE);