[packages] Add the libv4l package which adds a generally uniform abstraction layer for webcams, particularly buggy ones.
[openwrt.org/packages.git] / libs / libv4l / patches / 001-no-shm_open-fix.patch
blob:a/libs/libv4l/patches/001-no-shm_open-fix.patch -> blob:b/libs/libv4l/patches/001-no-shm_open-fix.patch
--- a/libs/libv4l/patches/001-no-shm_open-fix.patch
+++ b/libs/libv4l/patches/001-no-shm_open-fix.patch
@@ -1,44 +1,58 @@
-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 @@
+--- a/lib/libv4lconvert/control/libv4lcontrol.c
++++ b/lib/libv4lconvert/control/libv4lcontrol.c
+@@ -525,7 +525,7 @@ static void v4lcontrol_get_flags_from_db
  
  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 */
+-	int shm_fd;
++	int shm_fd, fdflags;
+ 	int i, rc, got_usb_info, speed, init = 0;
+ 	char *s, shm_name[256], pwd_buf[1024];
+ 	struct v4l2_capability cap;
+@@ -638,33 +638,38 @@ struct v4lcontrol_data *v4lcontrol_creat
  
-   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);
+ 	if (getpwuid_r(geteuid(), &pwd, pwd_buf, sizeof(pwd_buf), &pwd_p) == 0) {
+ 		if (got_usb_info)
+-			snprintf(shm_name, 256, "/libv4l-%s:%s:%04x:%04x:%s", pwd.pw_name,
++			snprintf(shm_name, 256, "/dev/shm/libv4l-%s:%s:%04x:%04x:%s", pwd.pw_name,
+ 					cap.bus_info, (int)vendor_id, (int)product_id, cap.card);
+ 		else
+-			snprintf(shm_name, 256, "/libv4l-%s:%s:%s", pwd.pw_name,
++			snprintf(shm_name, 256, "/dev/shm/libv4l-%s:%s:%s", pwd.pw_name,
+ 					cap.bus_info, cap.card);
+ 	} else {
+ 		perror("libv4lcontrol: error getting username using uid instead");
+ 		if (got_usb_info)
+-			snprintf(shm_name, 256, "/libv4l-%lu:%s:%04x:%04x:%s",
++			snprintf(shm_name, 256, "/dev/shm/libv4l-%lu:%s:%04x:%04x:%s",
+ 					(unsigned long)geteuid(), cap.bus_info,
+ 					(int)vendor_id, (int)product_id, cap.card);
+ 		else
+-			snprintf(shm_name, 256, "/libv4l-%lu:%s:%s", (unsigned long)geteuid(),
++			snprintf(shm_name, 256, "/dev/shm/libv4l-%lu:%s:%s", (unsigned long)geteuid(),
+ 					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] = '-';
+ 	/* / 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);
-+  }
+ 	/* Open the shared memory object identified by shm_name */
+-	shm_fd = shm_open(shm_name, (O_CREAT | O_EXCL | O_RDWR), (S_IREAD | S_IWRITE));
++	shm_fd = open(shm_name, (O_CREAT | O_EXCL | O_RDWR), (S_IREAD | S_IWRITE));
+ 	if (shm_fd >= 0)
+ 		init = 1;
+ 	else
+-		shm_fd = shm_open(shm_name, O_RDWR, (S_IREAD | S_IWRITE));
++		shm_fd = open(shm_name, O_RDWR, (S_IREAD | S_IWRITE));
++
++	/* 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);
+ 	if (shm_fd >= 0) {
+ 		/* Set the shared memory size */
 

comments