Date: Tue, 1 Feb 2011 13:30:54 +0100 From: Juergen Lock <nox@jelal.kn-bremen.de> To: Hans Petter Selasky <hselasky@freebsd.org> Cc: freebsd-multimedia@freebsd.org, Juergen Lock <nox@jelal.kn-bremen.de> Subject: Re: New dvb-s2 tuner, and a hack to get remaining remotes working Message-ID: <20110201123054.GA10962@triton8.kn-bremen.de> In-Reply-To: <201102011212.40488.hselasky@freebsd.org> References: <20110131212710.GA85739@triton8.kn-bremen.de> <201102010900.11121.hselasky@freebsd.org> <20110201110840.GA8591@triton8.kn-bremen.de> <201102011212.40488.hselasky@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 01, 2011 at 12:12:40PM +0100, Hans Petter Selasky wrote:
> On Tuesday 01 February 2011 12:08:40 Juergen Lock wrote:
> > F_SETFL
>
> Try to change FIONBIO with F_SETFL in the patch.
Turns out FIONBIO was correct but I had to allow for FIOASYNC too:
Index: webcamd.c
===================================================================
--- webcamd.c (revision 1701)
+++ webcamd.c (working copy)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
+ * Copyright (c) 2010-2011 Hans Petter Selasky. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,6 +27,7 @@
#include <sys/types.h>
#include <sys/param.h>
#include <sys/time.h>
+#include <sys/filio.h>
#include <fcntl.h>
#include <unistd.h>
@@ -237,14 +238,20 @@
handle = cuse_dev_get_per_file_handle(cdev);
+ /* we support blocking/non-blocking I/O */
+ if (cmd == FIONBIO || cmd == FIOASYNC)
+ return (0);
+
/* execute ioctl */
error = linux_ioctl(handle, fflags & CUSE_FFLAG_NONBLOCK,
cmd, peer_data);
- if (cmd == VIDIOC_QUERYBUF) {
+ if ((cmd == VIDIOC_QUERYBUF) && (error >= 0)) {
- if (copy_from_user(&buf, peer_data, sizeof(buf)) != 0)
+ if (copy_from_user(&buf, peer_data, sizeof(buf)) != 0) {
+ error = -EFAULT;
goto done;
+ }
ptr = linux_mmap(handle, fflags, NULL,
buf.length, buf.m.offset);
@@ -255,8 +262,10 @@
buf.m.offset = 0x80000000UL;
}
- if (copy_to_user(peer_data, &buf, sizeof(buf)) != 0)
+ if (copy_to_user(peer_data, &buf, sizeof(buf)) != 0) {
+ error = -EFAULT;
goto done;
+ }
}
done:
return (v4b_convert_error(error));
That allowed the ioctl to complete and irrecord to wait for the
first button press, but then select() seems to misbehave: (I get an
endless loop of "Really read -1 bytes from '/dev/lirc0', expected 3"
until I hit ^c.)
[...]
10950 irrecord CALL select(0x5,0x7fffffffe5d0,0,0,0x7fffffffe650)
10950 irrecord RET select 1
10950 irrecord CALL read(0x4,0x7fffffffe660,0x3)
10950 irrecord RET read -1 errno 22 Invalid argument
10950 irrecord CALL clock_gettime(0xd,0x7fffffffe550)
10950 irrecord RET clock_gettime 0
10950 irrecord CALL write(0x2,0x7fffffffdee0,0xa)
10950 irrecord GIO fd 2 wrote 10 bytes
"irrecord: "
10950 irrecord RET write 10/0xa
10950 irrecord CALL write(0x2,0x7fffffffdfc0,0x32)
10950 irrecord GIO fd 2 wrote 50 bytes
"Really read -1 bytes from '/dev/lirc0', expected 3"
10950 irrecord RET write 50/0x32
10950 irrecord CALL write(0x2,0x8008599d7,0x1)
10950 irrecord GIO fd 2 wrote 1 byte
"
"
10950 irrecord RET write 1
10950 irrecord CALL select(0x5,0x7fffffffe5d0,0,0,0x7fffffffe650)
10950 irrecord RET select 1
10950 irrecord CALL read(0x4,0x7fffffffe660,0x3)
10950 irrecord RET read -1 errno 22 Invalid argument
10950 irrecord CALL clock_gettime(0xd,0x7fffffffe550)
10950 irrecord RET clock_gettime 0
10950 irrecord CALL write(0x2,0x7fffffffdee0,0xa)
10950 irrecord GIO fd 2 wrote 10 bytes
"irrecord: "
10950 irrecord RET write 10/0xa
10950 irrecord CALL write(0x2,0x7fffffffdfc0,0x32)
10950 irrecord GIO fd 2 wrote 50 bytes
"Really read -1 bytes from '/dev/lirc0', expected 3"
10950 irrecord RET write 50/0x32
10950 irrecord CALL write(0x2,0x8008599d7,0x1)
10950 irrecord GIO fd 2 wrote 1 byte
"
"
10950 irrecord RET write 1
10950 irrecord PSIG SIGINT SIG_DFL
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110201123054.GA10962>
