summaryrefslogtreecommitdiff
path: root/v4l2-apps/libv4l
diff options
context:
space:
mode:
authorhans@rhel5-devel.localdomain <hans@rhel5-devel.localdomain>2009-08-20 11:28:51 +0200
committerhans@rhel5-devel.localdomain <hans@rhel5-devel.localdomain>2009-08-20 11:28:51 +0200
commit571db9ea44fcb35c1bc260eb98f3d085de5d132a (patch)
tree294478ea0c8c69409a2644a8284035a3d162cc7b /v4l2-apps/libv4l
parentaa2c3496f93b8a3765dabc4c1159129a874c217c (diff)
downloadmediapointer-dvb-s2-571db9ea44fcb35c1bc260eb98f3d085de5d132a.tar.gz
mediapointer-dvb-s2-571db9ea44fcb35c1bc260eb98f3d085de5d132a.tar.bz2
libv4l: Change controls shm segment name to include the username
From: Gregor Jasny <gjasny@googlemail.com> Change controls shm segment name to include the username, as it is only writable by the user (this means libv4l controls are per user) Priority: normal Signed-off-by: Gregor Jasny <gjasny@googlemail.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'v4l2-apps/libv4l')
-rw-r--r--v4l2-apps/libv4l/ChangeLog2
-rw-r--r--v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol-priv.h1
-rw-r--r--v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol.c72
-rw-r--r--v4l2-apps/libv4l/libv4lconvert/libv4lconvert.c4
-rw-r--r--v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c4
5 files changed, 63 insertions, 20 deletions
diff --git a/v4l2-apps/libv4l/ChangeLog b/v4l2-apps/libv4l/ChangeLog
index 8614df14e..56a9714bd 100644
--- a/v4l2-apps/libv4l/ChangeLog
+++ b/v4l2-apps/libv4l/ChangeLog
@@ -7,6 +7,8 @@ libv4l-0.6.1
* Bugfix: fix reqbuf Device or Resource busy error when using v4l2_read()
* Some applications want to use jpg format if possible, so do not hide
it from the apps (do not assume it always needs conversion)
+* Change controls shm segment name to include the username, as it is only
+ writable by the user (this means libv4l controls are per user) (Gregor Jasny)
libv4l-0.6.0
------------
diff --git a/v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol-priv.h b/v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol-priv.h
index 834dee2ab..632e9338a 100644
--- a/v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol-priv.h
+++ b/v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol-priv.h
@@ -25,6 +25,7 @@
#define V4LCONTROL_SHM_SIZE 4096
#define V4LCONTROL_SUPPORTS_NEXT_CTRL 0x01
+#define V4LCONTROL_MEMORY_IS_MALLOCED 0x02
struct v4lcontrol_flags_info;
diff --git a/v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol.c b/v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol.c
index 6614c0d43..eaab3b46e 100644
--- a/v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol.c
+++ b/v4l2-apps/libv4l/libv4lconvert/control/libv4lcontrol.c
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
+#include <pwd.h>
#include "libv4lcontrol.h"
#include "libv4lcontrol-priv.h"
#include "../libv4lsyscall-priv.h"
@@ -323,14 +324,17 @@ struct v4lcontrol_data *v4lcontrol_create(int fd, int always_needs_conversion)
{
int shm_fd;
int i, rc, init = 0;
- char *s, shm_name[256];
+ char *s, shm_name[256], pwd_buf[1024];
struct v4l2_capability cap;
struct v4l2_queryctrl ctrl;
+ struct passwd pwd, *pwd_p;
struct v4lcontrol_data *data = calloc(1, sizeof(struct v4lcontrol_data));
- if (!data)
+ if (!data) {
+ fprintf(stderr, "libv4lcontrol: error: out of memory!\n");
return NULL;
+ }
data->fd = fd;
@@ -366,8 +370,19 @@ struct v4lcontrol_data *v4lcontrol_create(int fd, int always_needs_conversion)
if (data->controls == 0)
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);
+ if (SYS_IOCTL(fd, VIDIOC_QUERYCAP, &cap)) {
+ perror("libv4lcontrol: error querying device capabilities");
+ goto error;
+ }
+
+ if (getpwuid_r(geteuid(), &pwd, pwd_buf, sizeof(pwd_buf), &pwd_p) == 0) {
+ snprintf(shm_name, 256, "/libv4l-%s:%s:%s", pwd.pw_name,
+ cap.bus_info, cap.card);
+ } else {
+ perror("libv4lcontrol: error getting username using uid instead");
+ snprintf(shm_name, 256, "/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++)
@@ -378,23 +393,41 @@ struct v4lcontrol_data *v4lcontrol_create(int fd, int always_needs_conversion)
if ((shm_fd = shm_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)
- goto error;
+ else
+ shm_fd = shm_open(shm_name, O_RDWR, (S_IREAD | S_IWRITE));
- /* Set the shared memory size */
- ftruncate(shm_fd, V4LCONTROL_SHM_SIZE);
+ if (shm_fd >= 0) {
+ /* Set the shared memory size */
+ ftruncate(shm_fd, V4LCONTROL_SHM_SIZE);
- /* Retreive a pointer to the shm object */
- data->shm_values = mmap(NULL, V4LCONTROL_SHM_SIZE, (PROT_READ | PROT_WRITE),
- MAP_SHARED, shm_fd, 0);
- close(shm_fd);
+ /* Retreive a pointer to the shm object */
+ data->shm_values = mmap(NULL, V4LCONTROL_SHM_SIZE, (PROT_READ | PROT_WRITE),
+ MAP_SHARED, shm_fd, 0);
+ close(shm_fd);
- if (data->shm_values == MAP_FAILED)
- goto error;
+ if (data->shm_values == MAP_FAILED) {
+ perror("libv4lcontrol: error shm mmap failed");
+ data->shm_values = NULL;
+ }
+ } else
+ perror("libv4lcontrol: error creating shm segment failed");
+
+ /* Fall back to malloc */
+ if (data->shm_values == NULL) {
+ fprintf(stderr,
+ "libv4lcontrol: falling back to malloc-ed memory for controls\n");
+ data->shm_values = malloc(V4LCONTROL_SHM_SIZE);
+ if (!data->shm_values) {
+ fprintf(stderr, "libv4lcontrol: error: out of memory!\n");
+ goto error;
+ }
+ init = 1;
+ data->priv_flags |= V4LCONTROL_MEMORY_IS_MALLOCED;
+ }
if (init) {
/* Initialize the new shm object we created */
- memset(data->shm_values, 0, sizeof(V4LCONTROL_SHM_SIZE));
+ memset(data->shm_values, 0, V4LCONTROL_SHM_SIZE);
for (i = 0; i < V4LCONTROL_COUNT; i++)
data->shm_values[i] = fake_controls[i].default_value;
@@ -415,12 +448,15 @@ error:
void v4lcontrol_destroy(struct v4lcontrol_data *data)
{
- if (data->controls)
- munmap(data->shm_values, V4LCONTROL_SHM_SIZE);
+ if (data->controls) {
+ if (data->priv_flags & V4LCONTROL_MEMORY_IS_MALLOCED)
+ free(data->shm_values);
+ else
+ munmap(data->shm_values, V4LCONTROL_SHM_SIZE);
+ }
free(data);
}
-/* FIXME get better CID's for normalize */
static const struct v4l2_queryctrl fake_controls[V4LCONTROL_COUNT] = {
{
.id = V4L2_CID_AUTO_WHITE_BALANCE,
diff --git a/v4l2-apps/libv4l/libv4lconvert/libv4lconvert.c b/v4l2-apps/libv4l/libv4lconvert/libv4lconvert.c
index f5e9d9762..be4553cc7 100644
--- a/v4l2-apps/libv4l/libv4lconvert/libv4lconvert.c
+++ b/v4l2-apps/libv4l/libv4lconvert/libv4lconvert.c
@@ -95,8 +95,10 @@ struct v4lconvert_data *v4lconvert_create(int fd)
processing controls without a performance impact. */
int always_needs_conversion = 1;
- if (!data)
+ if (!data) {
+ fprintf(stderr, "libv4lconvert: error: out of memory!\n");
return NULL;
+ }
data->fd = fd;
data->decompress_pid = -1;
diff --git a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c
index af0056e94..424173ec5 100644
--- a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c
+++ b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c
@@ -38,8 +38,10 @@ struct v4lprocessing_data *v4lprocessing_create(int fd, struct v4lcontrol_data*
struct v4lprocessing_data *data =
calloc(1, sizeof(struct v4lprocessing_data));
- if (!data)
+ if (!data) {
+ fprintf(stderr, "libv4lprocessing: error: out of memory!\n");
return NULL;
+ }
data->fd = fd;
data->control = control;