diff -ruN libv4l-0.6.0.orig/libv4lconvert/control/libv4lcontrol.c libv4l-0.6.0/libv4lconvert/control/libv4lcontrol.c --- libv4l-0.6.0.orig/libv4lconvert/control/libv4lcontrol.c 2009-07-09 04:59:01.000000000 -0400 +++ libv4l-0.6.0/libv4lconvert/control/libv4lcontrol.c 2009-08-29 03:23:06.000000000 -0400 @@ -265,7 +265,7 @@ struct v4lcontrol_data *v4lcontrol_create(int fd, int always_needs_conversion) { - int shm_fd; + int shm_fd, fdflags; int i, rc, init = 0; char *s, shm_name[256]; struct v4l2_capability cap; @@ -311,19 +311,26 @@ return data; /* No need to create a shared memory segment */ SYS_IOCTL(fd, VIDIOC_QUERYCAP, &cap); - snprintf(shm_name, 256, "/%s:%s", cap.bus_info, cap.card); + snprintf(shm_name, 256, "/dev/shm/%s:%s", cap.bus_info, cap.card); /* / is not allowed inside shm names */ - for (i = 1; shm_name[i]; i++) + for (i = 9; shm_name[i]; i++) //start after "/dev/shm", i = 9 if (shm_name[i] == '/') shm_name[i] = '-'; /* Open the shared memory object identified by shm_name */ - if ((shm_fd = shm_open(shm_name, (O_CREAT | O_EXCL | O_RDWR), + if ((shm_fd = open(shm_name, (O_CREAT | O_EXCL | O_RDWR), (S_IREAD | S_IWRITE))) >= 0) init = 1; - else if ((shm_fd = shm_open(shm_name, O_RDWR, (S_IREAD | S_IWRITE))) < 0) + else if ((shm_fd = open(shm_name, O_RDWR, (S_IREAD | S_IWRITE))) < 0) goto error; + + /* This is all uClibc > 0.9.30 seems to do for shm_open() in librt/shm.c */ + fdflags = fcntl(shm_fd, F_GETFD, 0); + + if (fdflags >= 0) { + fdflags = fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC); + } /* Set the shared memory size */ ftruncate(shm_fd, V4LCONTROL_SHM_SIZE);