diff --git a/.gitignore b/.gitignore index 146d9d6..fc71eb1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ /iguanaIR-1.0.3.tar.bz2 +/iguanaIR-1.1.0.tar.bz2 +clog +/iguanaIR-1.0.5.tar.bz2 +/iguanaIR-1.1.0-5.fc22.src.rpm +bak +/iguanair-lirc-e23b9d3.tar.gz +/iguanaIR-1.1.0.tar.gz diff --git a/0001-Remove-trailing-whitespace.patch b/0001-Remove-trailing-whitespace.patch deleted file mode 100644 index 09fd357..0000000 --- a/0001-Remove-trailing-whitespace.patch +++ /dev/null @@ -1,275 +0,0 @@ -From 93d9206499bab837dccb5d864a875829c3dc057c Mon Sep 17 00:00:00 2001 -From: Alec Leamas -Date: Tue, 25 Dec 2012 11:44:48 +0100 -Subject: [PATCH 1/8] Remove trailing whitespace. - -It makes the patches harder to read. ---- - Makefile.in | 2 +- - client-interface.c | 2 +- - client.c | 8 ++++---- - dataPackets.c | 2 +- - device-interface.c | 10 +++++----- - drivers/libusb.c | 6 +++--- - drivers/libusbpre1.c | 6 +++--- - iguanaIR.h | 2 +- - osx/daemonosx.c | 4 ++-- - server.h | 4 ++-- - udev/iguanaIR.rules | 2 +- - 11 files changed, 24 insertions(+), 24 deletions(-) - -diff --git a/Makefile.in b/Makefile.in -index 71f59cf..e62b6fa 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -187,7 +187,7 @@ endif - .PHONY: dist devel-cleaner - dist: configure - devel-clean: distclean -- rm -rf autoconf/autom4te.cache autoconf/aclocal.m4 -+ rm -rf autoconf/autom4te.cache autoconf/aclocal.m4 - - # rules to rebuild the configure script - M4S=$(filter-out $(srcdir)/autoconf/aclocal.m4, $(wildcard $(srcdir)/autoconf/*.m4)) -diff --git a/client-interface.c b/client-interface.c -index 6c45e0d..6052206 100644 ---- a/client-interface.c -+++ b/client-interface.c -@@ -80,7 +80,7 @@ static int pulsesToIguanaSend(int carrier, - fprintf(stderr, "%5d ", sendCode[x] & IG_PULSE_MASK); - #endif - -- cycles = (uint32_t)((sendCode[x] & IG_PULSE_MASK) / -+ cycles = (uint32_t)((sendCode[x] & IG_PULSE_MASK) / - 1000000.0 * carrier + 0.5); - numBytes = (cycles / MAX_DATA_BYTE) + 1; - cycles %= MAX_DATA_BYTE; -diff --git a/client.c b/client.c -index 13d0053..af0b30e 100644 ---- a/client.c -+++ b/client.c -@@ -162,7 +162,7 @@ bool parseNumber(const char *text, unsigned int *value) - retval = false; - break; - } -- else -+ else - *value = (*value << 1) + text[x] - '0'; - } - else -@@ -432,7 +432,7 @@ static bool handleInternalTask(igtask *cmd, PIPE_PTR conn) - else if ((cmd->spec->code & INTERNAL_SETCONFIG) == INTERNAL_SETCONFIG) - { - setSetting(cmd->spec->bit, cmd->arg, pinState); -- message(LOG_NORMAL, "%s: success\n", cmd->command); -+ message(LOG_NORMAL, "%s: success\n", cmd->command); - retval = true; - } - else -@@ -451,7 +451,7 @@ static bool performTask(PIPE_PTR conn, igtask *cmd) - { - int result = 0; - void *data = NULL; -- -+ - switch(cmd->spec->code) - { - case IG_DEV_RECVON: -@@ -593,7 +593,7 @@ static bool performTask(PIPE_PTR conn, igtask *cmd) - b[3] = (c & 0x0F) << 4 | 0x0C; - } - ((unsigned char*)data)[0] = (unsigned char)(x * 4); -- -+ - break; - } - } -diff --git a/dataPackets.c b/dataPackets.c -index f7900e2..a57574d 100644 ---- a/dataPackets.c -+++ b/dataPackets.c -@@ -75,7 +75,7 @@ bool readDataPacket(dataPacket *packet, PIPE_PTR fd, unsigned int timeout) - - if (result == 0) - errno = ETIMEDOUT; -- -+ - return retval; - } - -diff --git a/device-interface.c b/device-interface.c -index afb1d96..29c104b 100644 ---- a/device-interface.c -+++ b/device-interface.c -@@ -139,7 +139,7 @@ static void queueDataPacket(iguanaDev *idev, dataPacket *current, bool fromDev) - { - insertItem(&idev->recvList, NULL, (itemHeader*)current); - if (! notify(idev->readerPipe[WRITE])) -- message(LOG_ERROR, "Failed to signal primary thread.\n"); -+ message(LOG_ERROR, "Failed to signal primary thread.\n"); - } - else - { -@@ -543,7 +543,7 @@ bool oldPinConfig(iguanaDev *idev, /* required */ - } - } - } -- -+ - if (code == IG_DEV_SETPINCONFIG) - request->data = data; - if (x == 2) -@@ -561,7 +561,7 @@ bool deviceTransaction(iguanaDev *idev, /* required */ - /* For old devices setting pin configs actually becomes 2 - requests, awkward, but the way it has to be to support old - firmware. */ -- if (idev->version <= 3 && -+ if (idev->version <= 3 && - (request->code == IG_DEV_SETPINCONFIG || - request->code == IG_DEV_GETPINCONFIG)) - return oldPinConfig(idev, request, response); -@@ -583,7 +583,7 @@ bool deviceTransaction(iguanaDev *idev, /* required */ - case IG_DEV_GETID: - msg[CODE_OFFSET] = IG_DEV_EXECUTE; - break; -- -+ - case IG_DEV_SETID: - { - unsigned char *block; -@@ -911,7 +911,7 @@ void handleIncomingPackets(iguanaDev *idev) - /* NOTE: last byte is the fill level */ - current->dataLen = length - 1; - dataStart = buffer; -- -+ - message(LOG_DEBUG2, - "Data without ctl header assuming IG_DEV_RECV.\n"); - /* TODO: DEBUG: sleep here to test overflow on the device -diff --git a/drivers/libusb.c b/drivers/libusb.c -index 4993fef..ff2e667 100644 ---- a/drivers/libusb.c -+++ b/drivers/libusb.c -@@ -2,7 +2,7 @@ - ** libusb.c **************************************************************** - **************************************************************************** - * -- * Lowest level interface to the USB devices. -+ * Lowest level interface to the USB devices. - * - * Copyright (C) 2007, IguanaWorks Incorporated (http://iguanaworks.net) - * Author: Joseph Dunn -@@ -519,11 +519,11 @@ static int clearHalt(deviceInfo *info, unsigned int ep) - switch (ep) - { - case EP_IN: -- return libusb_clear_halt(handle->device, -+ return libusb_clear_halt(handle->device, - handle->epIn->bEndpointAddress); - - case EP_OUT: -- return libusb_clear_halt(handle->device, -+ return libusb_clear_halt(handle->device, - handle->epOut->bEndpointAddress); - } - return -1; -diff --git a/drivers/libusbpre1.c b/drivers/libusbpre1.c -index a0fe8d7..0303aa4 100644 ---- a/drivers/libusbpre1.c -+++ b/drivers/libusbpre1.c -@@ -2,7 +2,7 @@ - ** usbclient.c ************************************************************* - **************************************************************************** - * -- * Lowest level interface to the USB devices. -+ * Lowest level interface to the USB devices. - * - * Copyright (C) 2007, IguanaWorks Incorporated (http://iguanaworks.net) - * Author: Joseph Dunn -@@ -435,11 +435,11 @@ static int clearHalt(deviceInfo *info, unsigned int ep) - switch (ep) - { - case EP_IN: -- return usb_clear_halt(handle->device, -+ return usb_clear_halt(handle->device, - handle->epIn->bEndpointAddress); - - case EP_OUT: -- return usb_clear_halt(handle->device, -+ return usb_clear_halt(handle->device, - handle->epOut->bEndpointAddress); - } - return -1; -diff --git a/iguanaIR.h b/iguanaIR.h -index 0d0236d..bbc27ae 100644 ---- a/iguanaIR.h -+++ b/iguanaIR.h -@@ -170,7 +170,7 @@ IGUANAIR_API unsigned char iguanaDataToPinSpec(const void *data, - * below (all default to 0): - * - * bit: name: notes -- * 0 output enable -+ * 0 output enable - * 1 pullup enable - * 2 open drain - * 3 high sink only pins 0 and 1, ignored elsewhere -diff --git a/osx/daemonosx.c b/osx/daemonosx.c -index e425f2b..2397ac8 100644 ---- a/osx/daemonosx.c -+++ b/osx/daemonosx.c -@@ -6,7 +6,7 @@ - Mac OS X. It spawns a thread and waits for notification that an - iguanaIR device has been plugged in at which point it raises a SIGHUP - so that the standard igdaemon hot plug in processing will take place. -- -+ - @note - Without this support the reflasher will not work as the reset operation - during programming results in a disconnect and a reconnect on Mac OS X. -@@ -66,7 +66,7 @@ int daemon_osx_support(const usbId *ids) - static void arm_notification(io_iterator_t iterator) - { - io_object_t object; -- -+ - while ((object = IOIteratorNext(iterator)) != 0) { - IOObjectRelease(object); - } -diff --git a/server.h b/server.h -index 3d1d0ce..c127d5b 100644 ---- a/server.h -+++ b/server.h -@@ -14,7 +14,7 @@ - #ifndef _DAEMON_BASE_H_ - #define _DAEMON_BASE_H_ - --typedef struct -+typedef struct - { - /* driver location and prefered driver information */ - bool onlyPreferred; -@@ -31,7 +31,7 @@ typedef struct - /* whether the server should ask devices for their labels */ - bool readLabels; - -- /* should the server rescan the usb bus after a disconnect */ -+ /* should the server rescan the usb bus after a disconnect */ - bool autoRescan; - - /* a method for children to communicate back to the list owner */ -diff --git a/udev/iguanaIR.rules b/udev/iguanaIR.rules -index 5e49ebf..e43aa91 100644 ---- a/udev/iguanaIR.rules -+++ b/udev/iguanaIR.rules -@@ -6,7 +6,7 @@ - # - # So if someone is using an old version of udev they may need to use a - # different first line like: --# SYSFS{manufacturer} == "IguanaWorks", -+# SYSFS{manufacturer} == "IguanaWorks", - - ATTR{manufacturer} == "IguanaWorks", ATTR{product} == "USB IR Transceiver", \ - OWNER = "iguanair", MODE = "0664", \ --- -1.7.11.7 - diff --git a/0002-Don-t-hardcode-iguanair-UID.patch b/0002-Don-t-hardcode-iguanair-UID.patch deleted file mode 100644 index 969407d..0000000 --- a/0002-Don-t-hardcode-iguanair-UID.patch +++ /dev/null @@ -1,27 +0,0 @@ -From b428df7fbbc6bbf492f40431bc488b24637e142b Mon Sep 17 00:00:00 2001 -From: Alec Leamas -Date: Tue, 25 Dec 2012 11:45:48 +0100 -Subject: [PATCH 2/8] Don't hardcode iguanair UID. - -Using a hardcoded UID will cause all sorts of problems when -already used or not obeying distro conventions. ---- - Makefile.in | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Makefile.in b/Makefile.in -index e62b6fa..9a9cdfa 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -85,7 +85,7 @@ ifeq ($(RPM_OS)$(DARWIN),) - install: adduser - .PHONY: adduser - adduser: -- /usr/sbin/useradd -u 213 -c "Iguanaworks IR Daemon" -d / -s /sbin/nologin iguanair 2>/dev/null || true -+ /usr/sbin/useradd -c "Iguanaworks IR Daemon" -d / -s /sbin/nologin iguanair 2>/dev/null || true - - uninstall: deluser - .PHONY: deluser --- -1.7.11.7 - diff --git a/0003-Use-platform-specific-python-extension-dir.patch b/0003-Use-platform-specific-python-extension-dir.patch deleted file mode 100644 index 0ca7949..0000000 --- a/0003-Use-platform-specific-python-extension-dir.patch +++ /dev/null @@ -1,27 +0,0 @@ -From d6a24ca3d0a0f583d21926d4d9d3890f5958ba67 Mon Sep 17 00:00:00 2001 -From: Alec Leamas -Date: Tue, 25 Dec 2012 11:54:55 +0100 -Subject: [PATCH 3/8] Use platform specific python extension dir - -Although this is just an issue for (multi-arch) Fedora, it should -always be correct to use get_python_lib(1,0) instead of (0,0). ---- - configure | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configure b/configure -index f901211..1a51327 100755 ---- a/configure -+++ b/configure -@@ -5167,7 +5167,7 @@ $as_echo "$PYTHON_LDFLAGS" >&6; } - $as_echo_n "checking for Python site-packages path... " >&6; } - if test -z "$PYTHON_SITE_PKG"; then - PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \ -- print distutils.sysconfig.get_python_lib(0,0);"` -+ print distutils.sysconfig.get_python_lib(1,0);"` - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SITE_PKG" >&5 - $as_echo "$PYTHON_SITE_PKG" >&6; } --- -1.7.11.7 - diff --git a/0004-Don-t-exit-3-in-library-calls.patch b/0004-Don-t-exit-3-in-library-calls.patch deleted file mode 100644 index 87afa35..0000000 --- a/0004-Don-t-exit-3-in-library-calls.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 15f72105f52e1a4ecaf47e2951af6a2536a6f913 Mon Sep 17 00:00:00 2001 -From: Alec Leamas -Date: Tue, 25 Dec 2012 13:45:32 +0100 -Subject: [PATCH 4/9] Don't exit(3) in library calls - -Basically, it's a bad idea to call exit(3) in a daemon for -whatever reason. - -Signed-off-by: Alec Leamas ---- - support.c | 13 ++++++------- - 1 file changed, 6 insertions(+), 7 deletions(-) - -diff --git a/support.c b/support.c -index 35724e6..a458bd9 100644 ---- a/support.c -+++ b/support.c -@@ -96,12 +96,12 @@ int message(int level, char *format, ...) - va_list list; - int retval = 0; - FILE *out; -+ char *buffer = NULL; - - va_start(list, format); - out = pickStream(level); - if (out != NULL) - { -- char *buffer; - if (level != LOG_ALWAYS && level != LOG_NORMAL) - { - char when[22]; -@@ -120,12 +120,15 @@ int message(int level, char *format, ...) - if (buffer == NULL) - { - perror("FATAL: message format malloc failedx"); -- exit(2); -+ return -ENOMEM; - } - sprintf(buffer, "%s%s%s", when, msgPrefixes[level], format); - } - else -+ { - buffer = format; -+ perror("Can't select output log stream (configuration error?)"); -+ } - - retval = vfprintf(out, buffer, list); - /* flushing the log file after each write */ -@@ -136,11 +139,7 @@ int message(int level, char *format, ...) - free(buffer); - } - va_end(list); -- -- if (level <= LOG_FATAL) -- exit(1); -- -- return retval; -+ return buffer == format ? -EINVAL : retval; - } - - void appendHex(int level, void *location, unsigned int length) --- -1.7.11.4 - diff --git a/0005-Improve-driver-dir-detection.patch b/0005-Improve-driver-dir-detection.patch deleted file mode 100644 index b01f147..0000000 --- a/0005-Improve-driver-dir-detection.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 2c05db3a37f916a2637745cd603cb8e63c8a6ab7 Mon Sep 17 00:00:00 2001 -From: Alec Leamas -Date: Wed, 26 Dec 2012 08:13:56 +0100 -Subject: [PATCH 5/8] Improve driver dir detection. - -Add a rpath to the private directory so the dynamic loader finds it; -also add a trace output for detected dir. - -Although using rpaths is frowned upon in the general case, using it -for a private library directory like this is perfectly OK. ---- - Makefile.in | 1 + - server.c | 7 ++++++- - 2 files changed, 7 insertions(+), 1 deletion(-) - -diff --git a/Makefile.in b/Makefile.in -index 9a9cdfa..89433f2 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -6,6 +6,7 @@ BINDIR=@bindir@ - - - CFLAGS += -I. -fvisibility=hidden -DIGUANAIR_EXPORTS -+CFLAGS += -Wl,-rpath,$(LIBDIR)/iguanaIR - - ifdef DARWIN - LINKARGS = -Wl,-dylib_current_version,1.0.0,-dylib_compatibility_version,1.0.0 -install_name $(DESTDIR)/$(LIBDIR)/$(LIBNAME) -diff --git a/server.c b/server.c -index 141ee54..3493100 100644 ---- a/server.c -+++ b/server.c -@@ -93,8 +93,13 @@ deviceList* initServer() - #ifdef _WIN32 - srvSettings.driverDir = "."; - #else -- srvSettings.driverDir = "/usr/lib/iguanaIR"; -+ if (access("/usr/lib64", F_OK)) -+ srvSettings.driverDir = "/usr/lib64/iguanaIR"; -+ else -+ srvSettings.driverDir = "/usr/lib/iguanaIR"; - #endif -+ message(LOG_DEBUG, " driverDir: %s\n", srvSettings.driverDir); -+ - } - - /* initialize the commPipe, driver, and device list */ --- -1.7.11.7 - diff --git a/0006-make-options-file-work-w-systemd.patch b/0006-make-options-file-work-w-systemd.patch deleted file mode 100644 index 4f13fdb..0000000 --- a/0006-make-options-file-work-w-systemd.patch +++ /dev/null @@ -1,61 +0,0 @@ -From ea8f3436c24f579b8fdea4aac0fea5ab1d6b5b42 Mon Sep 17 00:00:00 2001 -From: Alec Leamas -Date: Tue, 25 Dec 2012 16:57:07 +0100 -Subject: [PATCH 6/8] make options file work w systemd - -Systemd uses an option file format which is almost identical -to the standard sh format used by sysV. However, it requires -the values to be quoted. This patch quots all values making -it work for systemd without breaking anything for the sysV -initscript. ---- - iguanaIR.options | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/iguanaIR.options b/iguanaIR.options -index 4dc6e8f..2263787 100644 ---- a/iguanaIR.options -+++ b/iguanaIR.options -@@ -7,7 +7,7 @@ - ## 2 = log debug1 - ## 3 = log debug2 (excessive) - ## 4 = log debug3 (excessively excessive) --LOGLEVEL=0 -+LOGLEVEL="0" - - ## Because of a bug in libusb, using threads when communicating with - ## our device can cause the device to hang. As a work around, we have -@@ -26,26 +26,26 @@ LOGLEVEL=0 - ## how quickly you can quit the daemon. With threads enabled, we set - ## this timeout to 1000ms. With threads disabled, we put the timeout - ## at 50ms. You can use a larger value if you want to save a little --## amount of cpu time, but it may cause problems with sends, -+## amount of cpu time, but it may cause problems with sends, - ## particularly long send. - - ## With the --no-threads option used - #RECEIVETIMEOUT=50 - - ## When threads are used (and not --no-threads) --RECEIVETIMEOUT=1000 -+RECEIVETIMEOUT="1000" - - ## the igdaemon can use different backend USB drivers and should be - ## told which to try first since we prefer the libusb driver to the - ## libusbpre1.0 --DRIVERS=--driver=libusb -+DRIVERS="--driver=libusb" - - ## You can set the timeout value for sendings IR signals. This set how - ## long to wait for send to successfully complete before assuming that - ## the send failed and returning an error. Time is measured in ms and - ## the default is 1000. Do not change this unless you have good - ## reason. --SENDTIMEOUT=1000 -+SENDTIMEOUT="1000" - - ## The init.d script for igdaemon auto detects what distro you are - ## using (fedora, debian, ubuntu, gentoo). You can overwrite this --- -1.7.11.7 - diff --git a/0007-Use-fedora-specific-default-socket-directory.patch b/0007-Use-fedora-specific-default-socket-directory.patch deleted file mode 100644 index 8225383..0000000 --- a/0007-Use-fedora-specific-default-socket-directory.patch +++ /dev/null @@ -1,82 +0,0 @@ -From fa0085b8773ed9f69d70ce617ac824d52a4f8dff Mon Sep 17 00:00:00 2001 -From: Alec Leamas -Date: Tue, 25 Dec 2012 13:26:05 +0100 -Subject: [PATCH 7/8] Use fedora-specific default socket directory. - -Fedora conventions requires the use of /var/run (or, after 17, just /run) -for the temporary socket directory. Fixed in this patch. - -Using this means that docs need an update, fix: sed -i -'s|/dev/iguanaIR|/var/run/iguanaIR|g' docs/TroubleShooting docs/driver docs/lirc - -Note that the reasoning behind this probably is valid for all Linux -distributions: it's simply that Filesystem Hierarchy Standard (FHS) -assumes that these kind of directories goes into /run. A more complete -but also untested patch is in https://bugzilla.redhat.com/show_bug.cgi?id=642773, -fixes.patch bundled in the source rpm. - -For the time being /var/run is used for historical reasons. On recent -platforms it's a symlink to /run. Over time, using just /run should be -better. - -Signed-off-by: Alec Leamas ---- - iguanaIR.h | 2 ++ - reflasher/looper | 5 ++++- - udev/iguanaIR.rules | 4 ++-- - 3 files changed, 8 insertions(+), 3 deletions(-) - -diff --git a/iguanaIR.h b/iguanaIR.h -index bbc27ae..e3301b0 100644 ---- a/iguanaIR.h -+++ b/iguanaIR.h -@@ -53,6 +53,8 @@ - - #ifdef __APPLE__ - #define IGSOCK_NAME "/tmp/iguanaIR/" -+ #elif FEDORA -+ #define IGSOCK_NAME "/var/run/iguanaIR/" - #else - #define IGSOCK_NAME "/dev/iguanaIR/" - #endif -diff --git a/reflasher/looper b/reflasher/looper -index 15c3e20..c0db224 100755 ---- a/reflasher/looper -+++ b/reflasher/looper -@@ -7,6 +7,7 @@ import stat - import sys - import os - import errno -+import platform - - #versions = [3, 4, 0x0101, 0x0102] - versions = [4] -@@ -16,7 +17,9 @@ import iguanaIR - - if sys.platform == 'darwin': - deviceDir = '/tmp/iguanaIR' --else: -+elif sys.platform == 'linux2' and platform.linux_distribution()[0] == 'Fedora': -+ deviceDir = '/var/run/iguanaIR' -+else - deviceDir = '/dev/iguanaIR' - - def listDevices(path = deviceDir): -diff --git a/udev/iguanaIR.rules b/udev/iguanaIR.rules -index e43aa91..79d6573 100644 ---- a/udev/iguanaIR.rules -+++ b/udev/iguanaIR.rules -@@ -10,8 +10,8 @@ - - ATTR{manufacturer} == "IguanaWorks", ATTR{product} == "USB IR Transceiver", \ - OWNER = "iguanair", MODE = "0664", \ -- RUN = "/bin/mkdir -p /dev/iguanaIR", \ -- RUN += "/bin/chown iguanair /dev/iguanaIR", \ -+ RUN = "/bin/mkdir -p /var/run/iguanaIR", \ -+ RUN += "/bin/chown iguanair /var/run/iguanaIR", \ - RUN += "/etc/init.d/iguanaIR rescan" - - # FOR DEBUGGING TRY ADDING TO THE RUN LINES: --- -1.7.11.4 - diff --git a/0008-udev-invoke-systemd-support-not-sysV-init-file.patch b/0008-udev-invoke-systemd-support-not-sysV-init-file.patch deleted file mode 100644 index c1357b7..0000000 --- a/0008-udev-invoke-systemd-support-not-sysV-init-file.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 4d74cf146fb53514f6b3b71684d6b8232d522e44 Mon Sep 17 00:00:00 2001 -From: Alec Leamas -Date: Tue, 25 Dec 2012 14:04:40 +0100 -Subject: [PATCH 8/8] udev: invoke systemd support, not sysV init file. - -Signed-off-by: Alec Leamas ---- - udev/iguanaIR.rules | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/udev/iguanaIR.rules b/udev/iguanaIR.rules -index 79d6573..7f72f1c 100644 ---- a/udev/iguanaIR.rules -+++ b/udev/iguanaIR.rules -@@ -10,9 +10,7 @@ - - ATTR{manufacturer} == "IguanaWorks", ATTR{product} == "USB IR Transceiver", \ - OWNER = "iguanair", MODE = "0664", \ -- RUN = "/bin/mkdir -p /var/run/iguanaIR", \ -- RUN += "/bin/chown iguanair /var/run/iguanaIR", \ -- RUN += "/etc/init.d/iguanaIR rescan" -+ RUN = "/usr/share/iguanaIR/rescan" - - # FOR DEBUGGING TRY ADDING TO THE RUN LINES: - #RUN += "/bin/bash -c 'echo $major $minor r=$result i=$id n=$number k=$kernel p=$parent r=$root >> /tmp/udev.txt'" --- -1.7.11.7 - diff --git a/0010-Change-iguanaIR.-iguanair.-to-match-other-plugins.patch b/0010-Change-iguanaIR.-iguanair.-to-match-other-plugins.patch new file mode 100644 index 0000000..f07fd13 --- /dev/null +++ b/0010-Change-iguanaIR.-iguanair.-to-match-other-plugins.patch @@ -0,0 +1,853 @@ +From 7e0aca378b95b8618c1adc936e7988be165fcc13 Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Thu, 1 Sep 2016 02:51:03 +0200 +Subject: [PATCH 10/13] Change iguanaIR.* -> iguanair.* to match other + plugins. + +The mixed casing is only used by iguanair, causing some problems +when handling plugin. Also, using lowercase creates a visible +difference to the mixed-case driver file. +--- + iguanaIR.c | 364 ---------------------------------------------------------- + iguanaIR.conf | 13 --- + iguanaIR.html | 18 --- + iguanair.c | 364 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + iguanair.conf | 13 +++ + iguanair.html | 18 +++ + 6 files changed, 395 insertions(+), 395 deletions(-) + delete mode 100755 iguanaIR.c + delete mode 100755 iguanaIR.conf + delete mode 100755 iguanaIR.html + create mode 100755 iguanair.c + create mode 100755 iguanair.conf + create mode 100755 iguanair.html + +diff --git a/iguanaIR.c b/iguanaIR.c +deleted file mode 100755 +index f2e5794..0000000 +--- a/iguanaIR.c ++++ /dev/null +@@ -1,364 +0,0 @@ +-/**************************************************************************** +-** hw_iguanaIR.c *********************************************************** +-**************************************************************************** +-* +-* routines for interfacing with Iguanaworks USB IR devices +-* +-* Copyright (C) 2006, Joseph Dunn +-* +-* Distribute under GPL version 2. +-* +-*/ +- +-#ifdef HAVE_CONFIG_H +-# include +-#endif +- +-#include +-#include +-#include +-#include +-#include +-#include +-#if defined __APPLE__ +-#include +-#include +-#else +-#include +-#endif +-#include +- +-#include "lirc_driver.h" +- +-#include "iguanaIR.h" +-static const logchannel_t logchannel = LOG_DRIVER; +- +-static int sendConn = -1; +-static pid_t child = 0; +-static int recvDone = 0; +-static int currentCarrier = -1; +- +-static void quitHandler(int sig) +-{ +- recvDone = 1; +-} +- +-static void recv_loop(int fd, int notify) +-{ +- int conn; +- +- alarm(0); +- signal(SIGTERM, quitHandler); +- /* signal(SIGPIPE, SIG_DFL); */ +- signal(SIGINT, quitHandler); +- signal(SIGHUP, SIG_IGN); +- signal(SIGALRM, SIG_IGN); +- +- /* notify parent by closing notify */ +- close(notify); +- +- conn = iguanaConnect(drv.device); +- if (conn != -1) { +- iguanaPacket request, response; +- lirc_t prevCode = -1; +- +- request = iguanaCreateRequest(IG_DEV_RECVON, 0, NULL); +- if (iguanaWriteRequest(request, conn)) { +- while (!recvDone) { +- /* read from device */ +- do +- response = iguanaReadResponse(conn, 1000); +- while (!recvDone && ((response == NULL && errno == ETIMEDOUT) +- || (iguanaResponseIsError(response) && errno == ETIMEDOUT))); +- +- if (iguanaResponseIsError(response)) { +- /* be quiet during exit */ +- if (!recvDone) +- log_error("error response: %s\n", strerror(errno)); +- break; +- } else if (iguanaCode(response) == IG_DEV_RECV) { +- uint32_t* code; +- unsigned int length, x, y = 0; +- lirc_t buffer[8]; /* we read 8 bytes max at a time +- * from the device, i.e. packet +- * can only contain 8 +- * signals. */ +- +- /* pull the data off the packet */ +- code = (uint32_t*)iguanaRemoveData(response, &length); +- length /= sizeof(uint32_t); +- +- /* translate the code into lirc_t pulses (and make +- * sure they don't split across iguana packets. */ +- for (x = 0; x < length; x++) { +- if (prevCode == -1) { +- prevCode = (code[x] & IG_PULSE_MASK); +- if (prevCode > PULSE_MASK) +- prevCode = PULSE_MASK; +- if (code[x] & IG_PULSE_BIT) +- prevCode |= PULSE_BIT; +- } else if (((prevCode & PULSE_BIT) && (code[x] & IG_PULSE_BIT)) +- || (!(prevCode & PULSE_BIT) && !(code[x] & IG_PULSE_BIT))) { +- /* can overflow pulse mask, so just set to +- * largest possible */ +- if ((prevCode & PULSE_MASK) + (code[x] & IG_PULSE_MASK) > +- PULSE_MASK) +- prevCode = (prevCode & PULSE_BIT) | PULSE_MASK; +- else +- prevCode += code[x] & IG_PULSE_MASK; +- } else { +- buffer[y] = prevCode; +- y++; +- +- prevCode = (code[x] & IG_PULSE_MASK); +- if (prevCode > PULSE_MASK) +- prevCode = PULSE_MASK; +- if (code[x] & IG_PULSE_BIT) +- prevCode |= PULSE_BIT; +- } +- } +- +- /* write the data and free it */ +- if (y > 0) { +- chk_write(fd, +- buffer, +- sizeof(lirc_t) * y); +- } +- free(code); +- } +- +- iguanaFreePacket(response); +- } +- } +- +- iguanaFreePacket(request); +- } +- +- iguanaClose(conn); +- close(fd); +-} +- +-static int iguana_init(void) +-{ +- int recv_pipe[2], retval = 0; +- +- rec_buffer_init(); +- +- if (pipe(recv_pipe) != 0) { +- log_error("couldn't open pipe: %s", strerror(errno)); +- } else { +- int notify[2]; +- +- if (pipe(notify) != 0) { +- log_error("couldn't open pipe: %s", strerror(errno)); +- close(recv_pipe[0]); +- close(recv_pipe[1]); +- } else { +- drv.fd = recv_pipe[0]; +- +- child = fork(); +- if (child == -1) { +- log_error("couldn't fork child process: %s", strerror(errno)); +- } else if (child == 0) { +- close(recv_pipe[0]); +- close(notify[0]); +- recv_loop(recv_pipe[1], notify[1]); +- _exit(0); +- } else { +- int dummy; +- +- close(recv_pipe[1]); +- close(notify[1]); +- /* make sure child has set its signal handler to avoid race with iguana_deinit() */ +- chk_read(notify[0], &dummy, 1); +- close(notify[0]); +- sendConn = iguanaConnect(drv.device); +- if (sendConn == -1) { +- log_error("couldn't open connection to iguanaIR daemon: %s", +- strerror(errno)); +- } else { +- retval = 1; +- } +- } +- } +- } +- +- return retval; +-} +- +-static pid_t dowaitpid(pid_t pid, int* stat_loc, int options) +-{ +- pid_t retval; +- +- do +- retval = waitpid(pid, stat_loc, options); +- while (retval == (pid_t)-1 && errno == EINTR); +- +- return retval; +-} +- +-static int iguana_deinit(void) +-{ +- /* close the connection to the iguana daemon */ +- if (sendConn != -1) { +- iguanaClose(sendConn); +- sendConn = -1; +- } +- +- /* signal the child process to exit */ +- if (child > 0 && (kill(child, SIGTERM) == -1 || dowaitpid(child, NULL, 0) != (pid_t)-1)) +- child = 0; +- +- /* close drv.fd since otherwise we leak open files */ +- close(drv.fd); +- drv.fd = -1; +- +- return child == 0; +-} +- +-static char* iguana_rec(struct ir_remote* remotes) +-{ +- char* retval = NULL; +- +- if (rec_buffer_clear()) +- retval = decode_all(remotes); +- return retval; +-} +- +-static bool daemonTransaction(unsigned char code, void* value, size_t size) +-{ +- uint8_t* data; +- bool retval = false; +- +- data = (uint8_t*)malloc(size); +- if (data != NULL) { +- iguanaPacket request, response = NULL; +- +- memcpy(data, value, size); +- request = iguanaCreateRequest(code, size, data); +- if (request) { +- if (iguanaWriteRequest(request, sendConn)) +- response = iguanaReadResponse(sendConn, 10000); +- iguanaFreePacket(request); +- } else { +- free(data); +- } +- +- /* handle success */ +- if (!iguanaResponseIsError(response)) +- retval = true; +- iguanaFreePacket(response); +- } +- return retval; +-} +- +-static int iguana_send(struct ir_remote* remote, struct ir_ncode* code) +-{ +- int retval = 0; +- uint32_t freq; +- +- /* set the carrier frequency if necessary */ +- freq = htonl(remote->freq); +- if (remote->freq != currentCarrier && remote->freq >= 25000 && remote->freq <= 100000 +- && daemonTransaction(IG_DEV_SETCARRIER, &freq, sizeof(freq))) +- currentCarrier = remote->freq; +- +- if (send_buffer_put(remote, code)) { +- int length, x; +- const lirc_t* signals; +- uint32_t* igsignals; +- +- length = send_buffer_length(); +- signals = send_buffer_data(); +- +- igsignals = (uint32_t*)malloc(sizeof(uint32_t) * length); +- if (igsignals != NULL) { +- iguanaPacket request, response = NULL; +- +- /* must pack the data into a unit32_t array */ +- for (x = 0; x < length; x++) { +- igsignals[x] = signals[x] & PULSE_MASK; +- if (signals[x] & PULSE_BIT) +- igsignals[x] |= IG_PULSE_BIT; +- } +- +- /* construct a request and send it to the daemon +- * TRICKY: IguanaFreePacket free()'s both the +- * igsignals chunk and the request packet, but +- * iguanaCreateRequest does not malloc that chunk. +- */ +- request = iguanaCreateRequest(IG_DEV_SEND, sizeof(uint32_t) * length, igsignals); +- if (iguanaWriteRequest(request, sendConn)) { +- /* response will only come back after the device has +- * transmitted */ +- response = iguanaReadResponse(sendConn, 10000); +- if (!iguanaResponseIsError(response)) +- retval = 1; +- +- iguanaFreePacket(response); +- } +- +- /* free the packet and the data */ +- iguanaFreePacket(request); +- } +- } +- +- return retval; +-} +- +-static int iguana_ioctl(unsigned int code, void* arg) +-{ +- int retcode = -1; +- uint8_t channels = *(uint8_t*)arg; +- +- /* set the transmit channels: return 0 on success, 4 if +- * out-of-range (see ioctl) */ +- if (code == LIRC_SET_TRANSMITTER_MASK) { +- if (channels > 0x0F) +- retcode = 4; +- else if (daemonTransaction(IG_DEV_SETCHANNELS, &channels, sizeof(channels))) +- retcode = 0; +- } +- +- return retcode; +-} +- +-static lirc_t readdata(lirc_t timeout) +-{ +- lirc_t code = 0; +- struct pollfd pfd = {.fd = drv.fd, .events = POLLIN, .revents = 0}; +- /* attempt a read with a timeout using select */ +- if (poll(&pfd, 1, timeout / 1000) > 0) { +- /* if we failed to get data return 0 */ +- if (read(drv.fd, &code, sizeof(lirc_t)) <= 0) +- iguana_deinit(); +- } +- return code; +-} +- +-const struct driver hw_iguanaIR = { +- .name = "iguanaIR", +- .device = "0", +- .features = LIRC_CAN_REC_MODE2 | \ +- LIRC_CAN_SEND_PULSE | \ +- LIRC_CAN_SET_SEND_CARRIER | \ +- LIRC_CAN_SET_TRANSMITTER_MASK, +- .send_mode = LIRC_MODE_PULSE, +- .rec_mode = LIRC_MODE_MODE2, +- .code_length = sizeof(int), +- .init_func = iguana_init, +- .deinit_func = iguana_deinit, +- .open_func = default_open, +- .close_func = default_close, +- .send_func = iguana_send, +- .rec_func = iguana_rec, +- .decode_func = receive_decode, +- .drvctl_func = iguana_ioctl, +- .readdata = readdata, +- .api_version = 3, +- .driver_version = "0.9.3", +- .info = "See file://" PLUGINDOCS "/iguanair.html", +- .device_hint = "/var/run/iguanaIR/*", +-}; +- +-const struct driver* hardwares[] = { &hw_iguanaIR, (const struct driver*)NULL }; +diff --git a/iguanaIR.conf b/iguanaIR.conf +deleted file mode 100755 +index 12e9523..0000000 +--- a/iguanaIR.conf ++++ /dev/null +@@ -1,13 +0,0 @@ +-# This is a lirc configuration for a capture device. +-# See README for more. +- +-config: +- driver: iguanaIR +- id: iguanaIR +- label: Iguanaworks USB IR Transceiver +- menu: usb +- note: This is the user-space driver from Iguanaworks, Inc. +- There is also a built-in kernel driver. Both can be used +- but not concurrently. +- product_driver: 1781:0938 +- modprobe: [blacklist iguanair] +diff --git a/iguanaIR.html b/iguanaIR.html +deleted file mode 100755 +index 99609c3..0000000 +--- a/iguanaIR.html ++++ /dev/null +@@ -1,18 +0,0 @@ +-

+- This driver supports both receiving and sending (blasting) using +- the IguanaIR devices from +- http://iguanaworks.net/ir.

+-

+- The LIRC driver works on top of the IguanaIR low-level userspace +- driver which provides a socket interface. It is available from +- the same source, and also packaged for many distributions +- including Debian, Fedora and Arch Linux. +-

+- The --device argument to the driver is a socket designator created +- by the low-level driveri. It defaults to '0' which implies +- /run/iguanair/0. +-

+- The kernel has built-in support for these devices in the +- iguanair module. This can be used instead of this driver in +- many cases. If the userspace driver should be used, the +- kernel driver must be blacklisted.

+diff --git a/iguanair.c b/iguanair.c +new file mode 100755 +index 0000000..f2e5794 +--- /dev/null ++++ b/iguanair.c +@@ -0,0 +1,364 @@ ++/**************************************************************************** ++** hw_iguanaIR.c *********************************************************** ++**************************************************************************** ++* ++* routines for interfacing with Iguanaworks USB IR devices ++* ++* Copyright (C) 2006, Joseph Dunn ++* ++* Distribute under GPL version 2. ++* ++*/ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#if defined __APPLE__ ++#include ++#include ++#else ++#include ++#endif ++#include ++ ++#include "lirc_driver.h" ++ ++#include "iguanaIR.h" ++static const logchannel_t logchannel = LOG_DRIVER; ++ ++static int sendConn = -1; ++static pid_t child = 0; ++static int recvDone = 0; ++static int currentCarrier = -1; ++ ++static void quitHandler(int sig) ++{ ++ recvDone = 1; ++} ++ ++static void recv_loop(int fd, int notify) ++{ ++ int conn; ++ ++ alarm(0); ++ signal(SIGTERM, quitHandler); ++ /* signal(SIGPIPE, SIG_DFL); */ ++ signal(SIGINT, quitHandler); ++ signal(SIGHUP, SIG_IGN); ++ signal(SIGALRM, SIG_IGN); ++ ++ /* notify parent by closing notify */ ++ close(notify); ++ ++ conn = iguanaConnect(drv.device); ++ if (conn != -1) { ++ iguanaPacket request, response; ++ lirc_t prevCode = -1; ++ ++ request = iguanaCreateRequest(IG_DEV_RECVON, 0, NULL); ++ if (iguanaWriteRequest(request, conn)) { ++ while (!recvDone) { ++ /* read from device */ ++ do ++ response = iguanaReadResponse(conn, 1000); ++ while (!recvDone && ((response == NULL && errno == ETIMEDOUT) ++ || (iguanaResponseIsError(response) && errno == ETIMEDOUT))); ++ ++ if (iguanaResponseIsError(response)) { ++ /* be quiet during exit */ ++ if (!recvDone) ++ log_error("error response: %s\n", strerror(errno)); ++ break; ++ } else if (iguanaCode(response) == IG_DEV_RECV) { ++ uint32_t* code; ++ unsigned int length, x, y = 0; ++ lirc_t buffer[8]; /* we read 8 bytes max at a time ++ * from the device, i.e. packet ++ * can only contain 8 ++ * signals. */ ++ ++ /* pull the data off the packet */ ++ code = (uint32_t*)iguanaRemoveData(response, &length); ++ length /= sizeof(uint32_t); ++ ++ /* translate the code into lirc_t pulses (and make ++ * sure they don't split across iguana packets. */ ++ for (x = 0; x < length; x++) { ++ if (prevCode == -1) { ++ prevCode = (code[x] & IG_PULSE_MASK); ++ if (prevCode > PULSE_MASK) ++ prevCode = PULSE_MASK; ++ if (code[x] & IG_PULSE_BIT) ++ prevCode |= PULSE_BIT; ++ } else if (((prevCode & PULSE_BIT) && (code[x] & IG_PULSE_BIT)) ++ || (!(prevCode & PULSE_BIT) && !(code[x] & IG_PULSE_BIT))) { ++ /* can overflow pulse mask, so just set to ++ * largest possible */ ++ if ((prevCode & PULSE_MASK) + (code[x] & IG_PULSE_MASK) > ++ PULSE_MASK) ++ prevCode = (prevCode & PULSE_BIT) | PULSE_MASK; ++ else ++ prevCode += code[x] & IG_PULSE_MASK; ++ } else { ++ buffer[y] = prevCode; ++ y++; ++ ++ prevCode = (code[x] & IG_PULSE_MASK); ++ if (prevCode > PULSE_MASK) ++ prevCode = PULSE_MASK; ++ if (code[x] & IG_PULSE_BIT) ++ prevCode |= PULSE_BIT; ++ } ++ } ++ ++ /* write the data and free it */ ++ if (y > 0) { ++ chk_write(fd, ++ buffer, ++ sizeof(lirc_t) * y); ++ } ++ free(code); ++ } ++ ++ iguanaFreePacket(response); ++ } ++ } ++ ++ iguanaFreePacket(request); ++ } ++ ++ iguanaClose(conn); ++ close(fd); ++} ++ ++static int iguana_init(void) ++{ ++ int recv_pipe[2], retval = 0; ++ ++ rec_buffer_init(); ++ ++ if (pipe(recv_pipe) != 0) { ++ log_error("couldn't open pipe: %s", strerror(errno)); ++ } else { ++ int notify[2]; ++ ++ if (pipe(notify) != 0) { ++ log_error("couldn't open pipe: %s", strerror(errno)); ++ close(recv_pipe[0]); ++ close(recv_pipe[1]); ++ } else { ++ drv.fd = recv_pipe[0]; ++ ++ child = fork(); ++ if (child == -1) { ++ log_error("couldn't fork child process: %s", strerror(errno)); ++ } else if (child == 0) { ++ close(recv_pipe[0]); ++ close(notify[0]); ++ recv_loop(recv_pipe[1], notify[1]); ++ _exit(0); ++ } else { ++ int dummy; ++ ++ close(recv_pipe[1]); ++ close(notify[1]); ++ /* make sure child has set its signal handler to avoid race with iguana_deinit() */ ++ chk_read(notify[0], &dummy, 1); ++ close(notify[0]); ++ sendConn = iguanaConnect(drv.device); ++ if (sendConn == -1) { ++ log_error("couldn't open connection to iguanaIR daemon: %s", ++ strerror(errno)); ++ } else { ++ retval = 1; ++ } ++ } ++ } ++ } ++ ++ return retval; ++} ++ ++static pid_t dowaitpid(pid_t pid, int* stat_loc, int options) ++{ ++ pid_t retval; ++ ++ do ++ retval = waitpid(pid, stat_loc, options); ++ while (retval == (pid_t)-1 && errno == EINTR); ++ ++ return retval; ++} ++ ++static int iguana_deinit(void) ++{ ++ /* close the connection to the iguana daemon */ ++ if (sendConn != -1) { ++ iguanaClose(sendConn); ++ sendConn = -1; ++ } ++ ++ /* signal the child process to exit */ ++ if (child > 0 && (kill(child, SIGTERM) == -1 || dowaitpid(child, NULL, 0) != (pid_t)-1)) ++ child = 0; ++ ++ /* close drv.fd since otherwise we leak open files */ ++ close(drv.fd); ++ drv.fd = -1; ++ ++ return child == 0; ++} ++ ++static char* iguana_rec(struct ir_remote* remotes) ++{ ++ char* retval = NULL; ++ ++ if (rec_buffer_clear()) ++ retval = decode_all(remotes); ++ return retval; ++} ++ ++static bool daemonTransaction(unsigned char code, void* value, size_t size) ++{ ++ uint8_t* data; ++ bool retval = false; ++ ++ data = (uint8_t*)malloc(size); ++ if (data != NULL) { ++ iguanaPacket request, response = NULL; ++ ++ memcpy(data, value, size); ++ request = iguanaCreateRequest(code, size, data); ++ if (request) { ++ if (iguanaWriteRequest(request, sendConn)) ++ response = iguanaReadResponse(sendConn, 10000); ++ iguanaFreePacket(request); ++ } else { ++ free(data); ++ } ++ ++ /* handle success */ ++ if (!iguanaResponseIsError(response)) ++ retval = true; ++ iguanaFreePacket(response); ++ } ++ return retval; ++} ++ ++static int iguana_send(struct ir_remote* remote, struct ir_ncode* code) ++{ ++ int retval = 0; ++ uint32_t freq; ++ ++ /* set the carrier frequency if necessary */ ++ freq = htonl(remote->freq); ++ if (remote->freq != currentCarrier && remote->freq >= 25000 && remote->freq <= 100000 ++ && daemonTransaction(IG_DEV_SETCARRIER, &freq, sizeof(freq))) ++ currentCarrier = remote->freq; ++ ++ if (send_buffer_put(remote, code)) { ++ int length, x; ++ const lirc_t* signals; ++ uint32_t* igsignals; ++ ++ length = send_buffer_length(); ++ signals = send_buffer_data(); ++ ++ igsignals = (uint32_t*)malloc(sizeof(uint32_t) * length); ++ if (igsignals != NULL) { ++ iguanaPacket request, response = NULL; ++ ++ /* must pack the data into a unit32_t array */ ++ for (x = 0; x < length; x++) { ++ igsignals[x] = signals[x] & PULSE_MASK; ++ if (signals[x] & PULSE_BIT) ++ igsignals[x] |= IG_PULSE_BIT; ++ } ++ ++ /* construct a request and send it to the daemon ++ * TRICKY: IguanaFreePacket free()'s both the ++ * igsignals chunk and the request packet, but ++ * iguanaCreateRequest does not malloc that chunk. ++ */ ++ request = iguanaCreateRequest(IG_DEV_SEND, sizeof(uint32_t) * length, igsignals); ++ if (iguanaWriteRequest(request, sendConn)) { ++ /* response will only come back after the device has ++ * transmitted */ ++ response = iguanaReadResponse(sendConn, 10000); ++ if (!iguanaResponseIsError(response)) ++ retval = 1; ++ ++ iguanaFreePacket(response); ++ } ++ ++ /* free the packet and the data */ ++ iguanaFreePacket(request); ++ } ++ } ++ ++ return retval; ++} ++ ++static int iguana_ioctl(unsigned int code, void* arg) ++{ ++ int retcode = -1; ++ uint8_t channels = *(uint8_t*)arg; ++ ++ /* set the transmit channels: return 0 on success, 4 if ++ * out-of-range (see ioctl) */ ++ if (code == LIRC_SET_TRANSMITTER_MASK) { ++ if (channels > 0x0F) ++ retcode = 4; ++ else if (daemonTransaction(IG_DEV_SETCHANNELS, &channels, sizeof(channels))) ++ retcode = 0; ++ } ++ ++ return retcode; ++} ++ ++static lirc_t readdata(lirc_t timeout) ++{ ++ lirc_t code = 0; ++ struct pollfd pfd = {.fd = drv.fd, .events = POLLIN, .revents = 0}; ++ /* attempt a read with a timeout using select */ ++ if (poll(&pfd, 1, timeout / 1000) > 0) { ++ /* if we failed to get data return 0 */ ++ if (read(drv.fd, &code, sizeof(lirc_t)) <= 0) ++ iguana_deinit(); ++ } ++ return code; ++} ++ ++const struct driver hw_iguanaIR = { ++ .name = "iguanaIR", ++ .device = "0", ++ .features = LIRC_CAN_REC_MODE2 | \ ++ LIRC_CAN_SEND_PULSE | \ ++ LIRC_CAN_SET_SEND_CARRIER | \ ++ LIRC_CAN_SET_TRANSMITTER_MASK, ++ .send_mode = LIRC_MODE_PULSE, ++ .rec_mode = LIRC_MODE_MODE2, ++ .code_length = sizeof(int), ++ .init_func = iguana_init, ++ .deinit_func = iguana_deinit, ++ .open_func = default_open, ++ .close_func = default_close, ++ .send_func = iguana_send, ++ .rec_func = iguana_rec, ++ .decode_func = receive_decode, ++ .drvctl_func = iguana_ioctl, ++ .readdata = readdata, ++ .api_version = 3, ++ .driver_version = "0.9.3", ++ .info = "See file://" PLUGINDOCS "/iguanair.html", ++ .device_hint = "/var/run/iguanaIR/*", ++}; ++ ++const struct driver* hardwares[] = { &hw_iguanaIR, (const struct driver*)NULL }; +diff --git a/iguanair.conf b/iguanair.conf +new file mode 100755 +index 0000000..12e9523 +--- /dev/null ++++ b/iguanair.conf +@@ -0,0 +1,13 @@ ++# This is a lirc configuration for a capture device. ++# See README for more. ++ ++config: ++ driver: iguanaIR ++ id: iguanaIR ++ label: Iguanaworks USB IR Transceiver ++ menu: usb ++ note: This is the user-space driver from Iguanaworks, Inc. ++ There is also a built-in kernel driver. Both can be used ++ but not concurrently. ++ product_driver: 1781:0938 ++ modprobe: [blacklist iguanair] +diff --git a/iguanair.html b/iguanair.html +new file mode 100755 +index 0000000..99609c3 +--- /dev/null ++++ b/iguanair.html +@@ -0,0 +1,18 @@ ++

++ This driver supports both receiving and sending (blasting) using ++ the IguanaIR devices from ++ http://iguanaworks.net/ir.

++

++ The LIRC driver works on top of the IguanaIR low-level userspace ++ driver which provides a socket interface. It is available from ++ the same source, and also packaged for many distributions ++ including Debian, Fedora and Arch Linux. ++

++ The --device argument to the driver is a socket designator created ++ by the low-level driveri. It defaults to '0' which implies ++ /run/iguanair/0. ++

++ The kernel has built-in support for these devices in the ++ iguanair module. This can be used instead of this driver in ++ many cases. If the userspace driver should be used, the ++ kernel driver must be blacklisted.

+-- +2.5.5 + diff --git a/0010-build-Remove-cmake-dist-generation.patch b/0010-build-Remove-cmake-dist-generation.patch new file mode 100644 index 0000000..0384a9a --- /dev/null +++ b/0010-build-Remove-cmake-dist-generation.patch @@ -0,0 +1,39 @@ +From ac541ea506a82ab699bff42829f697e46755eb12 Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Mon, 30 Jan 2017 10:56:33 +0100 +Subject: [PATCH 10/14] build: Remove cmake dist generation. + +The cmake code is worse in at least two ways: It includes whatever +junk it finds in the source directory, and it isn't aware of the +lirc-driver-iguanair in the parent directory. The make-dist.sh +script just is better, so drop the cmake code. +--- + software/usb_ir/CMakeLists.txt | 12 ------------ + 1 file changed, 12 deletions(-) + +diff --git a/software/usb_ir/CMakeLists.txt b/software/usb_ir/CMakeLists.txt +index e056483..8a55372 100644 +--- a/software/usb_ir/CMakeLists.txt ++++ b/software/usb_ir/CMakeLists.txt +@@ -15,18 +15,6 @@ Set(SO_AGE 3) + + Set(SOVERSION 0) + +-# Source dist setup +-set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${FULLVER}") +-set(CPACK_SOURCE_IGNORE_FILES +- "/build/;/.git/;~$;${CPACK_SOURCE_IGNORE_FILES}") +-set(CPACK_SOURCE_GENERATOR TGZ) +-include(CPack) +- +-add_custom_target(check_git ${CMAKE_COMMAND} +- -P ${CMAKE_SOURCE_DIR}/check_git_status.cmake) +-add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source +- DEPENDS check_git) +- + #Set(TARGET_ANDROID true) + + If(TARGET_ANDROID) +-- +2.9.3 + diff --git a/0011-Rename-link-README-files-to-match-modified-install-r.patch b/0011-Rename-link-README-files-to-match-modified-install-r.patch new file mode 100644 index 0000000..2d2f602 --- /dev/null +++ b/0011-Rename-link-README-files-to-match-modified-install-r.patch @@ -0,0 +1,94 @@ +From 889ff6716f40c5abca23bbfed9660e29903cc009 Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Thu, 1 Sep 2016 02:52:51 +0200 +Subject: [PATCH 11/13] Rename/link README files to match modified install + routines. + +--- + README | 28 ---------------------------- + README.md | 1 + + iguanair.txt | 28 ++++++++++++++++++++++++++++ + 3 files changed, 29 insertions(+), 28 deletions(-) + delete mode 100755 README + create mode 120000 README.md + create mode 100755 iguanair.txt + +diff --git a/README b/README +deleted file mode 100755 +index 843baf6..0000000 +--- a/README ++++ /dev/null +@@ -1,28 +0,0 @@ +-IguanaIR LIRC driver README +-=========================== +- +-This driver used to be part of the LIRC sources. In order to improve +-the maintenance it has been moved to Iguanaworks, Inc which is the +-primary hardware and software vendor. +- +-From 0.9.4 the driver is available at: https://github.com/iguanaworks/iguanair-lirc +- +-As a transition step the same files are available here during the 0.9.4 +-cycle. These files are a complete lirc driver for iguanair. Building requires +-lirc >= 0.9.4. If you are using a packaged version you probably need to +-have the -devel and -doc packages installed. Note that the downstream +-sources at https://github.com/iguanaworks/iguanair-lirc are preferred and +-will be the only option in next release. +- +-To build and install the driver together with the support files: +- +- $ make +- $ sudo make install +- +-Verifying the driver after make install: +- +- $ lirc-lsplugins -q iguanair +- --- /usr/lib64/lirc/plugins/iguanair.so +- +-You could also find the driver docs in the manual. The path varies, but +-in a packaged version typically /usr/share/doc/lirc/lirc.org/html/index.html. +diff --git a/README.md b/README.md +new file mode 120000 +index 0000000..b471562 +--- /dev/null ++++ b/README.md +@@ -0,0 +1 @@ ++iguanair.txt +\ No newline at end of file +diff --git a/iguanair.txt b/iguanair.txt +new file mode 100755 +index 0000000..843baf6 +--- /dev/null ++++ b/iguanair.txt +@@ -0,0 +1,28 @@ ++IguanaIR LIRC driver README ++=========================== ++ ++This driver used to be part of the LIRC sources. In order to improve ++the maintenance it has been moved to Iguanaworks, Inc which is the ++primary hardware and software vendor. ++ ++From 0.9.4 the driver is available at: https://github.com/iguanaworks/iguanair-lirc ++ ++As a transition step the same files are available here during the 0.9.4 ++cycle. These files are a complete lirc driver for iguanair. Building requires ++lirc >= 0.9.4. If you are using a packaged version you probably need to ++have the -devel and -doc packages installed. Note that the downstream ++sources at https://github.com/iguanaworks/iguanair-lirc are preferred and ++will be the only option in next release. ++ ++To build and install the driver together with the support files: ++ ++ $ make ++ $ sudo make install ++ ++Verifying the driver after make install: ++ ++ $ lirc-lsplugins -q iguanair ++ --- /usr/lib64/lirc/plugins/iguanair.so ++ ++You could also find the driver docs in the manual. The path varies, but ++in a packaged version typically /usr/share/doc/lirc/lirc.org/html/index.html. +-- +2.5.5 + diff --git a/0011-lirc-drv-Fix-missing-linker-flag.patch b/0011-lirc-drv-Fix-missing-linker-flag.patch new file mode 100644 index 0000000..d4127e5 --- /dev/null +++ b/0011-lirc-drv-Fix-missing-linker-flag.patch @@ -0,0 +1,25 @@ +From db05b2629b6b5a5972a51e2d2fbbf04e45e56cc8 Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Fri, 3 Feb 2017 00:01:08 +0100 +Subject: [PATCH 11/14] lirc-drv: Fix missing linker flag. + +--- + software/lirc-drv-iguanair/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/software/lirc-drv-iguanair/Makefile b/software/lirc-drv-iguanair/Makefile +index 3bae4e9..6aff458 100755 +--- a/software/lirc-drv-iguanair/Makefile ++++ b/software/lirc-drv-iguanair/Makefile +@@ -17,7 +17,7 @@ driver = iguanair + + all: $(driver).so + +-LDFLAGS += -liguanaIR -L../usb_ir/build ++LDFLAGS += -lusb -liguanaIR -L../usb_ir/build + CFLAGS += -I../usb_ir + MODPROBE_CONF = 60-blacklist-kernel-iguanair.conf + +-- +2.9.3 + diff --git a/0012-Makefile-Add-DESTDIR-support.patch b/0012-Makefile-Add-DESTDIR-support.patch new file mode 100644 index 0000000..4a2ff0f --- /dev/null +++ b/0012-Makefile-Add-DESTDIR-support.patch @@ -0,0 +1,59 @@ +From 4d692f097e5c556f47404c97a5ce2c0b2180ee3a Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Thu, 1 Sep 2016 03:17:27 +0200 +Subject: [PATCH 12/13] Makefile: Add DESTDIR support + +--- + Makefile | 21 +++++++++++++++------ + 1 file changed, 15 insertions(+), 6 deletions(-) + +diff --git a/Makefile b/Makefile +index c6a7f7a..4db147a 100755 +--- a/Makefile ++++ b/Makefile +@@ -8,7 +8,7 @@ + # + + +-driver = iguanaIR ++driver = iguanair + + all: $(driver).so + +@@ -18,7 +18,13 @@ PLUGINDIR ?= $(shell pkg-config --variable=plugindir lirc-driver) + CONFIGDIR ?= $(shell pkg-config --variable=configdir lirc-driver) + PLUGINDOCS ?= $(shell pkg-config --variable=plugindocs lirc-driver) + +-include $(PLUGINDOCS)/plugindocs.mk ++PLUGINDOCS_MK = $(PLUGINDOCS)/plugindocs.mk ++MODPROBE_CONF = 60-blacklist-kernel-iguanair.conf ++ ++ifneq ($(wildcard $(PLUGINDOCS_MK)),) ++ include $(PLUGINDOCS_MK) ++endif ++ + + $(driver).o: $(driver).c + +@@ -26,11 +32,14 @@ $(driver).so: $(driver).o + gcc --shared -fpic $(LDFLAGS) -o $@ $< + + install: $(driver).so +- install $< $(PLUGINDIR) +- install $(driver).conf $(CONFIGDIR) +- install $(driver).html $(PLUGINDOCS) +- install -m 644 60-blacklist-kernel-iguanair.conf /etc/modprobe.d ++ install -pDm 755 $< $(DESTDIR)$(PLUGINDIR)/$< ++ install -pDm 644 $(driver).html $(DESTDIR)$(PLUGINDOCS)/$(driver).html ++ install -pDm 644 $(driver).conf $(DESTDIR)$(CONFIGDIR)/$(driver).conf ++ install -pDm 644 $(MODPROBE_CONF) \ ++ $(DESTDIR)/etc/modprobe.d/$(MODPROBE_CONF) ++ifneq ($(wildcard $(PLUGINDOCS_MK)),) + $(MAKE) update ++endif + + clean: + rm -f *.o *.so +-- +2.5.5 + diff --git a/0012-build-cmake-Use-correct-permissions-when-installing.patch b/0012-build-cmake-Use-correct-permissions-when-installing.patch new file mode 100644 index 0000000..1f5a353 --- /dev/null +++ b/0012-build-cmake-Use-correct-permissions-when-installing.patch @@ -0,0 +1,51 @@ +From 4264b5d65c012fdbe4e2b676ef1987ab4a0778dd Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Sat, 4 Feb 2017 10:56:21 +0100 +Subject: [PATCH 12/14] build: cmake: Use correct permissions when installing. + +--- + software/usb_ir/CMakeLists.txt | 2 ++ + software/usb_ir/files/systemd/usr/bin/iguanaIR-rescan | 12 ++++++------ + 2 files changed, 8 insertions(+), 6 deletions(-) + +diff --git a/software/usb_ir/CMakeLists.txt b/software/usb_ir/CMakeLists.txt +index 8a55372..665ae82 100644 +--- a/software/usb_ir/CMakeLists.txt ++++ b/software/usb_ir/CMakeLists.txt +@@ -245,9 +245,11 @@ install(FILES iguanaIR.h + DESTINATION /usr/include) + if (${SYSTEMD_FOUND} EQUAL 1) + install(DIRECTORY files/systemd/usr ++ USE_SOURCE_PERMISSIONS + DESTINATION /) + else() + install(DIRECTORY files/sysV/usr files/sysV/etc ++ USE_SOURCE_PERMISSIONS + DESTINATION /) + endif() + +diff --git a/software/usb_ir/files/systemd/usr/bin/iguanaIR-rescan b/software/usb_ir/files/systemd/usr/bin/iguanaIR-rescan +index a41a59d..9d0a700 100755 +--- a/software/usb_ir/files/systemd/usr/bin/iguanaIR-rescan ++++ b/software/usb_ir/files/systemd/usr/bin/iguanaIR-rescan +@@ -4,11 +4,11 @@ + # signal fails, restart daemon. + + if systemctl --quiet is-active iguanaIR.service; then +- pid=$( systemctl --property=MainPID show iguanaIR.service ) || \ +- pid='' +- pid=${pid##*=} +- [ -n "$pid" ] && kill -HUP $pid &>/dev/null && exit 0 ++ pid=$( systemctl --property=MainPID show iguanaIR.service ) || \ ++ pid='' ++ pid=${pid##*=} ++ [ -n "$pid" ] && kill -HUP $pid &>/dev/null && exit 0 + fi + systemctl show --property=UnitFileState iguanaIR.service | +- grep -q enabled && \ +- systemctl restart iguanaIR.service ++ grep -q enabled && \ ++ systemctl restart iguanaIR.service +-- +2.9.3 + diff --git a/0013-Convert-all-files-to-LF-line-endings-like-main-drive.patch b/0013-Convert-all-files-to-LF-line-endings-like-main-drive.patch new file mode 100644 index 0000000..107a0a4 --- /dev/null +++ b/0013-Convert-all-files-to-LF-line-endings-like-main-drive.patch @@ -0,0 +1,988 @@ +From c75c2561ae65c711a80136e96fcba0f0fbb00294 Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Thu, 1 Sep 2016 03:25:23 +0200 +Subject: [PATCH 13/13] Convert all files to LF line endings (like main driver + files). + +--- + 60-blacklist-kernel-iguanair.conf | 4 +- + Makefile | 90 ++--- + iguanair.c | 728 +++++++++++++++++++------------------- + iguanair.conf | 26 +- + iguanair.html | 36 +- + iguanair.txt | 56 +-- + 6 files changed, 470 insertions(+), 470 deletions(-) + +diff --git a/60-blacklist-kernel-iguanair.conf b/60-blacklist-kernel-iguanair.conf +index 1cf1cfa..1888c18 100755 +--- a/60-blacklist-kernel-iguanair.conf ++++ b/60-blacklist-kernel-iguanair.conf +@@ -1,2 +1,2 @@ +-# kernel iguanair module conflicts with userspace IguanaIR daemon +-blacklist iguanair ++# kernel iguanair module conflicts with userspace IguanaIR daemon ++blacklist iguanair +diff --git a/Makefile b/Makefile +index 4db147a..dd093eb 100755 +--- a/Makefile ++++ b/Makefile +@@ -1,45 +1,45 @@ +-# +-# Template for building a lirc userspace driver out of tree. +-# Requires that lirc is installed in system locations, in +-# particular that the /usr/lib[64]/pkgconfig/lirc-driver.pc +-# is in place (/usr/local/lib/pkgconfig/... is also OK). +-# The required file plugindocs.mk might live in a -doc +-# package which then is needed. +-# +- +- +-driver = iguanair +- +-all: $(driver).so +- +-CFLAGS += $(shell pkg-config --cflags lirc-driver) +-LDFLAGS += $(shell pkg-config --libs lirc-driver) +-PLUGINDIR ?= $(shell pkg-config --variable=plugindir lirc-driver) +-CONFIGDIR ?= $(shell pkg-config --variable=configdir lirc-driver) +-PLUGINDOCS ?= $(shell pkg-config --variable=plugindocs lirc-driver) +- +-PLUGINDOCS_MK = $(PLUGINDOCS)/plugindocs.mk +-MODPROBE_CONF = 60-blacklist-kernel-iguanair.conf +- +-ifneq ($(wildcard $(PLUGINDOCS_MK)),) +- include $(PLUGINDOCS_MK) +-endif +- +- +-$(driver).o: $(driver).c +- +-$(driver).so: $(driver).o +- gcc --shared -fpic $(LDFLAGS) -o $@ $< +- +-install: $(driver).so +- install -pDm 755 $< $(DESTDIR)$(PLUGINDIR)/$< +- install -pDm 644 $(driver).html $(DESTDIR)$(PLUGINDOCS)/$(driver).html +- install -pDm 644 $(driver).conf $(DESTDIR)$(CONFIGDIR)/$(driver).conf +- install -pDm 644 $(MODPROBE_CONF) \ +- $(DESTDIR)/etc/modprobe.d/$(MODPROBE_CONF) +-ifneq ($(wildcard $(PLUGINDOCS_MK)),) +- $(MAKE) update +-endif +- +-clean: +- rm -f *.o *.so ++# ++# Template for building a lirc userspace driver out of tree. ++# Requires that lirc is installed in system locations, in ++# particular that the /usr/lib[64]/pkgconfig/lirc-driver.pc ++# is in place (/usr/local/lib/pkgconfig/... is also OK). ++# The required file plugindocs.mk might live in a -doc ++# package which then is needed. ++# ++ ++ ++driver = iguanair ++ ++all: $(driver).so ++ ++CFLAGS += $(shell pkg-config --cflags lirc-driver) ++LDFLAGS += $(shell pkg-config --libs lirc-driver) ++PLUGINDIR ?= $(shell pkg-config --variable=plugindir lirc-driver) ++CONFIGDIR ?= $(shell pkg-config --variable=configdir lirc-driver) ++PLUGINDOCS ?= $(shell pkg-config --variable=plugindocs lirc-driver) ++ ++PLUGINDOCS_MK = $(PLUGINDOCS)/plugindocs.mk ++MODPROBE_CONF = 60-blacklist-kernel-iguanair.conf ++ ++ifneq ($(wildcard $(PLUGINDOCS_MK)),) ++ include $(PLUGINDOCS_MK) ++endif ++ ++ ++$(driver).o: $(driver).c ++ ++$(driver).so: $(driver).o ++ gcc --shared -fpic $(LDFLAGS) -o $@ $< ++ ++install: $(driver).so ++ install -pDm 755 $< $(DESTDIR)$(PLUGINDIR)/$< ++ install -pDm 644 $(driver).html $(DESTDIR)$(PLUGINDOCS)/$(driver).html ++ install -pDm 644 $(driver).conf $(DESTDIR)$(CONFIGDIR)/$(driver).conf ++ install -pDm 644 $(MODPROBE_CONF) \ ++ $(DESTDIR)/etc/modprobe.d/$(MODPROBE_CONF) ++ifneq ($(wildcard $(PLUGINDOCS_MK)),) ++ $(MAKE) update ++endif ++ ++clean: ++ rm -f *.o *.so +diff --git a/iguanair.c b/iguanair.c +index f2e5794..a43665f 100755 +--- a/iguanair.c ++++ b/iguanair.c +@@ -1,364 +1,364 @@ +-/**************************************************************************** +-** hw_iguanaIR.c *********************************************************** +-**************************************************************************** +-* +-* routines for interfacing with Iguanaworks USB IR devices +-* +-* Copyright (C) 2006, Joseph Dunn +-* +-* Distribute under GPL version 2. +-* +-*/ +- +-#ifdef HAVE_CONFIG_H +-# include +-#endif +- +-#include +-#include +-#include +-#include +-#include +-#include +-#if defined __APPLE__ +-#include +-#include +-#else +-#include +-#endif +-#include +- +-#include "lirc_driver.h" +- +-#include "iguanaIR.h" +-static const logchannel_t logchannel = LOG_DRIVER; +- +-static int sendConn = -1; +-static pid_t child = 0; +-static int recvDone = 0; +-static int currentCarrier = -1; +- +-static void quitHandler(int sig) +-{ +- recvDone = 1; +-} +- +-static void recv_loop(int fd, int notify) +-{ +- int conn; +- +- alarm(0); +- signal(SIGTERM, quitHandler); +- /* signal(SIGPIPE, SIG_DFL); */ +- signal(SIGINT, quitHandler); +- signal(SIGHUP, SIG_IGN); +- signal(SIGALRM, SIG_IGN); +- +- /* notify parent by closing notify */ +- close(notify); +- +- conn = iguanaConnect(drv.device); +- if (conn != -1) { +- iguanaPacket request, response; +- lirc_t prevCode = -1; +- +- request = iguanaCreateRequest(IG_DEV_RECVON, 0, NULL); +- if (iguanaWriteRequest(request, conn)) { +- while (!recvDone) { +- /* read from device */ +- do +- response = iguanaReadResponse(conn, 1000); +- while (!recvDone && ((response == NULL && errno == ETIMEDOUT) +- || (iguanaResponseIsError(response) && errno == ETIMEDOUT))); +- +- if (iguanaResponseIsError(response)) { +- /* be quiet during exit */ +- if (!recvDone) +- log_error("error response: %s\n", strerror(errno)); +- break; +- } else if (iguanaCode(response) == IG_DEV_RECV) { +- uint32_t* code; +- unsigned int length, x, y = 0; +- lirc_t buffer[8]; /* we read 8 bytes max at a time +- * from the device, i.e. packet +- * can only contain 8 +- * signals. */ +- +- /* pull the data off the packet */ +- code = (uint32_t*)iguanaRemoveData(response, &length); +- length /= sizeof(uint32_t); +- +- /* translate the code into lirc_t pulses (and make +- * sure they don't split across iguana packets. */ +- for (x = 0; x < length; x++) { +- if (prevCode == -1) { +- prevCode = (code[x] & IG_PULSE_MASK); +- if (prevCode > PULSE_MASK) +- prevCode = PULSE_MASK; +- if (code[x] & IG_PULSE_BIT) +- prevCode |= PULSE_BIT; +- } else if (((prevCode & PULSE_BIT) && (code[x] & IG_PULSE_BIT)) +- || (!(prevCode & PULSE_BIT) && !(code[x] & IG_PULSE_BIT))) { +- /* can overflow pulse mask, so just set to +- * largest possible */ +- if ((prevCode & PULSE_MASK) + (code[x] & IG_PULSE_MASK) > +- PULSE_MASK) +- prevCode = (prevCode & PULSE_BIT) | PULSE_MASK; +- else +- prevCode += code[x] & IG_PULSE_MASK; +- } else { +- buffer[y] = prevCode; +- y++; +- +- prevCode = (code[x] & IG_PULSE_MASK); +- if (prevCode > PULSE_MASK) +- prevCode = PULSE_MASK; +- if (code[x] & IG_PULSE_BIT) +- prevCode |= PULSE_BIT; +- } +- } +- +- /* write the data and free it */ +- if (y > 0) { +- chk_write(fd, +- buffer, +- sizeof(lirc_t) * y); +- } +- free(code); +- } +- +- iguanaFreePacket(response); +- } +- } +- +- iguanaFreePacket(request); +- } +- +- iguanaClose(conn); +- close(fd); +-} +- +-static int iguana_init(void) +-{ +- int recv_pipe[2], retval = 0; +- +- rec_buffer_init(); +- +- if (pipe(recv_pipe) != 0) { +- log_error("couldn't open pipe: %s", strerror(errno)); +- } else { +- int notify[2]; +- +- if (pipe(notify) != 0) { +- log_error("couldn't open pipe: %s", strerror(errno)); +- close(recv_pipe[0]); +- close(recv_pipe[1]); +- } else { +- drv.fd = recv_pipe[0]; +- +- child = fork(); +- if (child == -1) { +- log_error("couldn't fork child process: %s", strerror(errno)); +- } else if (child == 0) { +- close(recv_pipe[0]); +- close(notify[0]); +- recv_loop(recv_pipe[1], notify[1]); +- _exit(0); +- } else { +- int dummy; +- +- close(recv_pipe[1]); +- close(notify[1]); +- /* make sure child has set its signal handler to avoid race with iguana_deinit() */ +- chk_read(notify[0], &dummy, 1); +- close(notify[0]); +- sendConn = iguanaConnect(drv.device); +- if (sendConn == -1) { +- log_error("couldn't open connection to iguanaIR daemon: %s", +- strerror(errno)); +- } else { +- retval = 1; +- } +- } +- } +- } +- +- return retval; +-} +- +-static pid_t dowaitpid(pid_t pid, int* stat_loc, int options) +-{ +- pid_t retval; +- +- do +- retval = waitpid(pid, stat_loc, options); +- while (retval == (pid_t)-1 && errno == EINTR); +- +- return retval; +-} +- +-static int iguana_deinit(void) +-{ +- /* close the connection to the iguana daemon */ +- if (sendConn != -1) { +- iguanaClose(sendConn); +- sendConn = -1; +- } +- +- /* signal the child process to exit */ +- if (child > 0 && (kill(child, SIGTERM) == -1 || dowaitpid(child, NULL, 0) != (pid_t)-1)) +- child = 0; +- +- /* close drv.fd since otherwise we leak open files */ +- close(drv.fd); +- drv.fd = -1; +- +- return child == 0; +-} +- +-static char* iguana_rec(struct ir_remote* remotes) +-{ +- char* retval = NULL; +- +- if (rec_buffer_clear()) +- retval = decode_all(remotes); +- return retval; +-} +- +-static bool daemonTransaction(unsigned char code, void* value, size_t size) +-{ +- uint8_t* data; +- bool retval = false; +- +- data = (uint8_t*)malloc(size); +- if (data != NULL) { +- iguanaPacket request, response = NULL; +- +- memcpy(data, value, size); +- request = iguanaCreateRequest(code, size, data); +- if (request) { +- if (iguanaWriteRequest(request, sendConn)) +- response = iguanaReadResponse(sendConn, 10000); +- iguanaFreePacket(request); +- } else { +- free(data); +- } +- +- /* handle success */ +- if (!iguanaResponseIsError(response)) +- retval = true; +- iguanaFreePacket(response); +- } +- return retval; +-} +- +-static int iguana_send(struct ir_remote* remote, struct ir_ncode* code) +-{ +- int retval = 0; +- uint32_t freq; +- +- /* set the carrier frequency if necessary */ +- freq = htonl(remote->freq); +- if (remote->freq != currentCarrier && remote->freq >= 25000 && remote->freq <= 100000 +- && daemonTransaction(IG_DEV_SETCARRIER, &freq, sizeof(freq))) +- currentCarrier = remote->freq; +- +- if (send_buffer_put(remote, code)) { +- int length, x; +- const lirc_t* signals; +- uint32_t* igsignals; +- +- length = send_buffer_length(); +- signals = send_buffer_data(); +- +- igsignals = (uint32_t*)malloc(sizeof(uint32_t) * length); +- if (igsignals != NULL) { +- iguanaPacket request, response = NULL; +- +- /* must pack the data into a unit32_t array */ +- for (x = 0; x < length; x++) { +- igsignals[x] = signals[x] & PULSE_MASK; +- if (signals[x] & PULSE_BIT) +- igsignals[x] |= IG_PULSE_BIT; +- } +- +- /* construct a request and send it to the daemon +- * TRICKY: IguanaFreePacket free()'s both the +- * igsignals chunk and the request packet, but +- * iguanaCreateRequest does not malloc that chunk. +- */ +- request = iguanaCreateRequest(IG_DEV_SEND, sizeof(uint32_t) * length, igsignals); +- if (iguanaWriteRequest(request, sendConn)) { +- /* response will only come back after the device has +- * transmitted */ +- response = iguanaReadResponse(sendConn, 10000); +- if (!iguanaResponseIsError(response)) +- retval = 1; +- +- iguanaFreePacket(response); +- } +- +- /* free the packet and the data */ +- iguanaFreePacket(request); +- } +- } +- +- return retval; +-} +- +-static int iguana_ioctl(unsigned int code, void* arg) +-{ +- int retcode = -1; +- uint8_t channels = *(uint8_t*)arg; +- +- /* set the transmit channels: return 0 on success, 4 if +- * out-of-range (see ioctl) */ +- if (code == LIRC_SET_TRANSMITTER_MASK) { +- if (channels > 0x0F) +- retcode = 4; +- else if (daemonTransaction(IG_DEV_SETCHANNELS, &channels, sizeof(channels))) +- retcode = 0; +- } +- +- return retcode; +-} +- +-static lirc_t readdata(lirc_t timeout) +-{ +- lirc_t code = 0; +- struct pollfd pfd = {.fd = drv.fd, .events = POLLIN, .revents = 0}; +- /* attempt a read with a timeout using select */ +- if (poll(&pfd, 1, timeout / 1000) > 0) { +- /* if we failed to get data return 0 */ +- if (read(drv.fd, &code, sizeof(lirc_t)) <= 0) +- iguana_deinit(); +- } +- return code; +-} +- +-const struct driver hw_iguanaIR = { +- .name = "iguanaIR", +- .device = "0", +- .features = LIRC_CAN_REC_MODE2 | \ +- LIRC_CAN_SEND_PULSE | \ +- LIRC_CAN_SET_SEND_CARRIER | \ +- LIRC_CAN_SET_TRANSMITTER_MASK, +- .send_mode = LIRC_MODE_PULSE, +- .rec_mode = LIRC_MODE_MODE2, +- .code_length = sizeof(int), +- .init_func = iguana_init, +- .deinit_func = iguana_deinit, +- .open_func = default_open, +- .close_func = default_close, +- .send_func = iguana_send, +- .rec_func = iguana_rec, +- .decode_func = receive_decode, +- .drvctl_func = iguana_ioctl, +- .readdata = readdata, +- .api_version = 3, +- .driver_version = "0.9.3", +- .info = "See file://" PLUGINDOCS "/iguanair.html", +- .device_hint = "/var/run/iguanaIR/*", +-}; +- +-const struct driver* hardwares[] = { &hw_iguanaIR, (const struct driver*)NULL }; ++/**************************************************************************** ++** hw_iguanaIR.c *********************************************************** ++**************************************************************************** ++* ++* routines for interfacing with Iguanaworks USB IR devices ++* ++* Copyright (C) 2006, Joseph Dunn ++* ++* Distribute under GPL version 2. ++* ++*/ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#if defined __APPLE__ ++#include ++#include ++#else ++#include ++#endif ++#include ++ ++#include "lirc_driver.h" ++ ++#include "iguanaIR.h" ++static const logchannel_t logchannel = LOG_DRIVER; ++ ++static int sendConn = -1; ++static pid_t child = 0; ++static int recvDone = 0; ++static int currentCarrier = -1; ++ ++static void quitHandler(int sig) ++{ ++ recvDone = 1; ++} ++ ++static void recv_loop(int fd, int notify) ++{ ++ int conn; ++ ++ alarm(0); ++ signal(SIGTERM, quitHandler); ++ /* signal(SIGPIPE, SIG_DFL); */ ++ signal(SIGINT, quitHandler); ++ signal(SIGHUP, SIG_IGN); ++ signal(SIGALRM, SIG_IGN); ++ ++ /* notify parent by closing notify */ ++ close(notify); ++ ++ conn = iguanaConnect(drv.device); ++ if (conn != -1) { ++ iguanaPacket request, response; ++ lirc_t prevCode = -1; ++ ++ request = iguanaCreateRequest(IG_DEV_RECVON, 0, NULL); ++ if (iguanaWriteRequest(request, conn)) { ++ while (!recvDone) { ++ /* read from device */ ++ do ++ response = iguanaReadResponse(conn, 1000); ++ while (!recvDone && ((response == NULL && errno == ETIMEDOUT) ++ || (iguanaResponseIsError(response) && errno == ETIMEDOUT))); ++ ++ if (iguanaResponseIsError(response)) { ++ /* be quiet during exit */ ++ if (!recvDone) ++ log_error("error response: %s\n", strerror(errno)); ++ break; ++ } else if (iguanaCode(response) == IG_DEV_RECV) { ++ uint32_t* code; ++ unsigned int length, x, y = 0; ++ lirc_t buffer[8]; /* we read 8 bytes max at a time ++ * from the device, i.e. packet ++ * can only contain 8 ++ * signals. */ ++ ++ /* pull the data off the packet */ ++ code = (uint32_t*)iguanaRemoveData(response, &length); ++ length /= sizeof(uint32_t); ++ ++ /* translate the code into lirc_t pulses (and make ++ * sure they don't split across iguana packets. */ ++ for (x = 0; x < length; x++) { ++ if (prevCode == -1) { ++ prevCode = (code[x] & IG_PULSE_MASK); ++ if (prevCode > PULSE_MASK) ++ prevCode = PULSE_MASK; ++ if (code[x] & IG_PULSE_BIT) ++ prevCode |= PULSE_BIT; ++ } else if (((prevCode & PULSE_BIT) && (code[x] & IG_PULSE_BIT)) ++ || (!(prevCode & PULSE_BIT) && !(code[x] & IG_PULSE_BIT))) { ++ /* can overflow pulse mask, so just set to ++ * largest possible */ ++ if ((prevCode & PULSE_MASK) + (code[x] & IG_PULSE_MASK) > ++ PULSE_MASK) ++ prevCode = (prevCode & PULSE_BIT) | PULSE_MASK; ++ else ++ prevCode += code[x] & IG_PULSE_MASK; ++ } else { ++ buffer[y] = prevCode; ++ y++; ++ ++ prevCode = (code[x] & IG_PULSE_MASK); ++ if (prevCode > PULSE_MASK) ++ prevCode = PULSE_MASK; ++ if (code[x] & IG_PULSE_BIT) ++ prevCode |= PULSE_BIT; ++ } ++ } ++ ++ /* write the data and free it */ ++ if (y > 0) { ++ chk_write(fd, ++ buffer, ++ sizeof(lirc_t) * y); ++ } ++ free(code); ++ } ++ ++ iguanaFreePacket(response); ++ } ++ } ++ ++ iguanaFreePacket(request); ++ } ++ ++ iguanaClose(conn); ++ close(fd); ++} ++ ++static int iguana_init(void) ++{ ++ int recv_pipe[2], retval = 0; ++ ++ rec_buffer_init(); ++ ++ if (pipe(recv_pipe) != 0) { ++ log_error("couldn't open pipe: %s", strerror(errno)); ++ } else { ++ int notify[2]; ++ ++ if (pipe(notify) != 0) { ++ log_error("couldn't open pipe: %s", strerror(errno)); ++ close(recv_pipe[0]); ++ close(recv_pipe[1]); ++ } else { ++ drv.fd = recv_pipe[0]; ++ ++ child = fork(); ++ if (child == -1) { ++ log_error("couldn't fork child process: %s", strerror(errno)); ++ } else if (child == 0) { ++ close(recv_pipe[0]); ++ close(notify[0]); ++ recv_loop(recv_pipe[1], notify[1]); ++ _exit(0); ++ } else { ++ int dummy; ++ ++ close(recv_pipe[1]); ++ close(notify[1]); ++ /* make sure child has set its signal handler to avoid race with iguana_deinit() */ ++ chk_read(notify[0], &dummy, 1); ++ close(notify[0]); ++ sendConn = iguanaConnect(drv.device); ++ if (sendConn == -1) { ++ log_error("couldn't open connection to iguanaIR daemon: %s", ++ strerror(errno)); ++ } else { ++ retval = 1; ++ } ++ } ++ } ++ } ++ ++ return retval; ++} ++ ++static pid_t dowaitpid(pid_t pid, int* stat_loc, int options) ++{ ++ pid_t retval; ++ ++ do ++ retval = waitpid(pid, stat_loc, options); ++ while (retval == (pid_t)-1 && errno == EINTR); ++ ++ return retval; ++} ++ ++static int iguana_deinit(void) ++{ ++ /* close the connection to the iguana daemon */ ++ if (sendConn != -1) { ++ iguanaClose(sendConn); ++ sendConn = -1; ++ } ++ ++ /* signal the child process to exit */ ++ if (child > 0 && (kill(child, SIGTERM) == -1 || dowaitpid(child, NULL, 0) != (pid_t)-1)) ++ child = 0; ++ ++ /* close drv.fd since otherwise we leak open files */ ++ close(drv.fd); ++ drv.fd = -1; ++ ++ return child == 0; ++} ++ ++static char* iguana_rec(struct ir_remote* remotes) ++{ ++ char* retval = NULL; ++ ++ if (rec_buffer_clear()) ++ retval = decode_all(remotes); ++ return retval; ++} ++ ++static bool daemonTransaction(unsigned char code, void* value, size_t size) ++{ ++ uint8_t* data; ++ bool retval = false; ++ ++ data = (uint8_t*)malloc(size); ++ if (data != NULL) { ++ iguanaPacket request, response = NULL; ++ ++ memcpy(data, value, size); ++ request = iguanaCreateRequest(code, size, data); ++ if (request) { ++ if (iguanaWriteRequest(request, sendConn)) ++ response = iguanaReadResponse(sendConn, 10000); ++ iguanaFreePacket(request); ++ } else { ++ free(data); ++ } ++ ++ /* handle success */ ++ if (!iguanaResponseIsError(response)) ++ retval = true; ++ iguanaFreePacket(response); ++ } ++ return retval; ++} ++ ++static int iguana_send(struct ir_remote* remote, struct ir_ncode* code) ++{ ++ int retval = 0; ++ uint32_t freq; ++ ++ /* set the carrier frequency if necessary */ ++ freq = htonl(remote->freq); ++ if (remote->freq != currentCarrier && remote->freq >= 25000 && remote->freq <= 100000 ++ && daemonTransaction(IG_DEV_SETCARRIER, &freq, sizeof(freq))) ++ currentCarrier = remote->freq; ++ ++ if (send_buffer_put(remote, code)) { ++ int length, x; ++ const lirc_t* signals; ++ uint32_t* igsignals; ++ ++ length = send_buffer_length(); ++ signals = send_buffer_data(); ++ ++ igsignals = (uint32_t*)malloc(sizeof(uint32_t) * length); ++ if (igsignals != NULL) { ++ iguanaPacket request, response = NULL; ++ ++ /* must pack the data into a unit32_t array */ ++ for (x = 0; x < length; x++) { ++ igsignals[x] = signals[x] & PULSE_MASK; ++ if (signals[x] & PULSE_BIT) ++ igsignals[x] |= IG_PULSE_BIT; ++ } ++ ++ /* construct a request and send it to the daemon ++ * TRICKY: IguanaFreePacket free()'s both the ++ * igsignals chunk and the request packet, but ++ * iguanaCreateRequest does not malloc that chunk. ++ */ ++ request = iguanaCreateRequest(IG_DEV_SEND, sizeof(uint32_t) * length, igsignals); ++ if (iguanaWriteRequest(request, sendConn)) { ++ /* response will only come back after the device has ++ * transmitted */ ++ response = iguanaReadResponse(sendConn, 10000); ++ if (!iguanaResponseIsError(response)) ++ retval = 1; ++ ++ iguanaFreePacket(response); ++ } ++ ++ /* free the packet and the data */ ++ iguanaFreePacket(request); ++ } ++ } ++ ++ return retval; ++} ++ ++static int iguana_ioctl(unsigned int code, void* arg) ++{ ++ int retcode = -1; ++ uint8_t channels = *(uint8_t*)arg; ++ ++ /* set the transmit channels: return 0 on success, 4 if ++ * out-of-range (see ioctl) */ ++ if (code == LIRC_SET_TRANSMITTER_MASK) { ++ if (channels > 0x0F) ++ retcode = 4; ++ else if (daemonTransaction(IG_DEV_SETCHANNELS, &channels, sizeof(channels))) ++ retcode = 0; ++ } ++ ++ return retcode; ++} ++ ++static lirc_t readdata(lirc_t timeout) ++{ ++ lirc_t code = 0; ++ struct pollfd pfd = {.fd = drv.fd, .events = POLLIN, .revents = 0}; ++ /* attempt a read with a timeout using select */ ++ if (poll(&pfd, 1, timeout / 1000) > 0) { ++ /* if we failed to get data return 0 */ ++ if (read(drv.fd, &code, sizeof(lirc_t)) <= 0) ++ iguana_deinit(); ++ } ++ return code; ++} ++ ++const struct driver hw_iguanaIR = { ++ .name = "iguanaIR", ++ .device = "0", ++ .features = LIRC_CAN_REC_MODE2 | \ ++ LIRC_CAN_SEND_PULSE | \ ++ LIRC_CAN_SET_SEND_CARRIER | \ ++ LIRC_CAN_SET_TRANSMITTER_MASK, ++ .send_mode = LIRC_MODE_PULSE, ++ .rec_mode = LIRC_MODE_MODE2, ++ .code_length = sizeof(int), ++ .init_func = iguana_init, ++ .deinit_func = iguana_deinit, ++ .open_func = default_open, ++ .close_func = default_close, ++ .send_func = iguana_send, ++ .rec_func = iguana_rec, ++ .decode_func = receive_decode, ++ .drvctl_func = iguana_ioctl, ++ .readdata = readdata, ++ .api_version = 3, ++ .driver_version = "0.9.3", ++ .info = "See file://" PLUGINDOCS "/iguanair.html", ++ .device_hint = "/var/run/iguanaIR/*", ++}; ++ ++const struct driver* hardwares[] = { &hw_iguanaIR, (const struct driver*)NULL }; +diff --git a/iguanair.conf b/iguanair.conf +index 12e9523..6d17d77 100755 +--- a/iguanair.conf ++++ b/iguanair.conf +@@ -1,13 +1,13 @@ +-# This is a lirc configuration for a capture device. +-# See README for more. +- +-config: +- driver: iguanaIR +- id: iguanaIR +- label: Iguanaworks USB IR Transceiver +- menu: usb +- note: This is the user-space driver from Iguanaworks, Inc. +- There is also a built-in kernel driver. Both can be used +- but not concurrently. +- product_driver: 1781:0938 +- modprobe: [blacklist iguanair] ++# This is a lirc configuration for a capture device. ++# See README for more. ++ ++config: ++ driver: iguanaIR ++ id: iguanaIR ++ label: Iguanaworks USB IR Transceiver ++ menu: usb ++ note: This is the user-space driver from Iguanaworks, Inc. ++ There is also a built-in kernel driver. Both can be used ++ but not concurrently. ++ product_driver: 1781:0938 ++ modprobe: [blacklist iguanair] +diff --git a/iguanair.html b/iguanair.html +index 99609c3..a62cdb1 100755 +--- a/iguanair.html ++++ b/iguanair.html +@@ -1,18 +1,18 @@ +-

+- This driver supports both receiving and sending (blasting) using +- the IguanaIR devices from +- http://iguanaworks.net/ir.

+-

+- The LIRC driver works on top of the IguanaIR low-level userspace +- driver which provides a socket interface. It is available from +- the same source, and also packaged for many distributions +- including Debian, Fedora and Arch Linux. +-

+- The --device argument to the driver is a socket designator created +- by the low-level driveri. It defaults to '0' which implies +- /run/iguanair/0. +-

+- The kernel has built-in support for these devices in the +- iguanair module. This can be used instead of this driver in +- many cases. If the userspace driver should be used, the +- kernel driver must be blacklisted.

++

++ This driver supports both receiving and sending (blasting) using ++ the IguanaIR devices from ++ http://iguanaworks.net/ir.

++

++ The LIRC driver works on top of the IguanaIR low-level userspace ++ driver which provides a socket interface. It is available from ++ the same source, and also packaged for many distributions ++ including Debian, Fedora and Arch Linux. ++

++ The --device argument to the driver is a socket designator created ++ by the low-level driveri. It defaults to '0' which implies ++ /run/iguanair/0. ++

++ The kernel has built-in support for these devices in the ++ iguanair module. This can be used instead of this driver in ++ many cases. If the userspace driver should be used, the ++ kernel driver must be blacklisted.

+diff --git a/iguanair.txt b/iguanair.txt +index 843baf6..4494163 100755 +--- a/iguanair.txt ++++ b/iguanair.txt +@@ -1,28 +1,28 @@ +-IguanaIR LIRC driver README +-=========================== +- +-This driver used to be part of the LIRC sources. In order to improve +-the maintenance it has been moved to Iguanaworks, Inc which is the +-primary hardware and software vendor. +- +-From 0.9.4 the driver is available at: https://github.com/iguanaworks/iguanair-lirc +- +-As a transition step the same files are available here during the 0.9.4 +-cycle. These files are a complete lirc driver for iguanair. Building requires +-lirc >= 0.9.4. If you are using a packaged version you probably need to +-have the -devel and -doc packages installed. Note that the downstream +-sources at https://github.com/iguanaworks/iguanair-lirc are preferred and +-will be the only option in next release. +- +-To build and install the driver together with the support files: +- +- $ make +- $ sudo make install +- +-Verifying the driver after make install: +- +- $ lirc-lsplugins -q iguanair +- --- /usr/lib64/lirc/plugins/iguanair.so +- +-You could also find the driver docs in the manual. The path varies, but +-in a packaged version typically /usr/share/doc/lirc/lirc.org/html/index.html. ++IguanaIR LIRC driver README ++=========================== ++ ++This driver used to be part of the LIRC sources. In order to improve ++the maintenance it has been moved to Iguanaworks, Inc which is the ++primary hardware and software vendor. ++ ++From 0.9.4 the driver is available at: https://github.com/iguanaworks/iguanair-lirc ++ ++As a transition step the same files are available here during the 0.9.4 ++cycle. These files are a complete lirc driver for iguanair. Building requires ++lirc >= 0.9.4. If you are using a packaged version you probably need to ++have the -devel and -doc packages installed. Note that the downstream ++sources at https://github.com/iguanaworks/iguanair-lirc are preferred and ++will be the only option in next release. ++ ++To build and install the driver together with the support files: ++ ++ $ make ++ $ sudo make install ++ ++Verifying the driver after make install: ++ ++ $ lirc-lsplugins -q iguanair ++ --- /usr/lib64/lirc/plugins/iguanair.so ++ ++You could also find the driver docs in the manual. The path varies, but ++in a packaged version typically /usr/share/doc/lirc/lirc.org/html/index.html. +-- +2.5.5 + diff --git a/0016-reflasher-Move-to-python3.patch b/0016-reflasher-Move-to-python3.patch new file mode 100644 index 0000000..516c9bd --- /dev/null +++ b/0016-reflasher-Move-to-python3.patch @@ -0,0 +1,106 @@ +From ad3c951d613fd8926f2afc4ce219dee592418fad Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Thu, 22 Aug 2019 18:42:11 +0200 +Subject: [PATCH] reflasher: Move to python3. + +--- + files/python/usr/bin/iguanaIR-reflasher | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/files/python/usr/share/iguanaIR-reflasher/iguanaIR-reflasher b/files/python/usr/bin/iguanaIR-reflasher/iguanaIR-reflasher +index 97cacc2..abfbc50 100755 +--- a/files/python/usr/share/iguanaIR-reflasher/iguanaIR-reflasher ++++ b/files/python/usr/share/iguanaIR-reflasher/iguanaIR-reflasher +@@ -1,4 +1,4 @@ +-#!/usr/bin/python2.7 -tt ++#!/usr/bin/python3 + # + # ************************************************************************** + # ** upgrade-usb *********************************************************** +@@ -215,7 +215,7 @@ def listDevices(path = iguanaIR.IGSOCK_NAME): + if device != 'ctl' and \ + not stat.S_ISLNK(os.lstat(os.path.join(path, device)).st_mode): + devices.append(device) +- except Exception, inst: ++ except Exception as inst: + devices = ['0'] + if MessageCannotlistdevice == False: + message(LOG_WARN,"""Guessing device "0", failed to list devices:\n %s\n""" % inst) +@@ -466,7 +466,7 @@ def writePagesToDevice(pages): + count += 1 + if count == rebootPage: + sys.stdout.write('\n Rebooting device') +- print deviceTransaction(iguanaIR.IG_DEV_RESET) ++ print(deviceTransaction(iguanaIR.IG_DEV_RESET)) + if deviceVersion() != version: + message(LOG_WARN, "Mid-write reboot unsuccessful.\n") + +@@ -506,7 +506,7 @@ def writeHexFile(filename, blank_pages = False, setFeatures = False): + pages = readPages(open(filename, 'r')) + + if blank_pages: +- blanks = range(128) ++ blanks = list(range(128)) + for page in pages: + blanks.remove(page['start'] / 64) + +@@ -538,7 +538,7 @@ def writeHexFile(filename, blank_pages = False, setFeatures = False): + def checkFileExists(path): + try: + os.stat(path) +- except OSError, inst: ++ except OSError as inst: + if inst[0] != errno.ENOENT: + raise + return False +-- +2.20.1 + +diff --git a/files/python/usr/bin/iguanaIR-reflasher b/files/python/usr/bin/iguanaIR-reflasher +index 97cacc2..abfbc50 100755 +--- a/files/python/usr/bin/iguanaIR-reflasher ++++ b/files/python/usr/bin/iguanaIR-reflasher +@@ -1,4 +1,4 @@ +-#!/usr/bin/python2.7 -tt ++#!/usr/bin/python3 + # + # ************************************************************************** + # ** upgrade-usb *********************************************************** +@@ -215,7 +215,7 @@ def listDevices(path = iguanaIR.IGSOCK_NAME): + if device != 'ctl' and \ + not stat.S_ISLNK(os.lstat(os.path.join(path, device)).st_mode): + devices.append(device) +- except Exception, inst: ++ except Exception as inst: + devices = ['0'] + if MessageCannotlistdevice == False: + message(LOG_WARN,"""Guessing device "0", failed to list devices:\n %s\n""" % inst) +@@ -466,7 +466,7 @@ def writePagesToDevice(pages): + count += 1 + if count == rebootPage: + sys.stdout.write('\n Rebooting device') +- print deviceTransaction(iguanaIR.IG_DEV_RESET) ++ print(deviceTransaction(iguanaIR.IG_DEV_RESET)) + if deviceVersion() != version: + message(LOG_WARN, "Mid-write reboot unsuccessful.\n") + +@@ -506,7 +506,7 @@ def writeHexFile(filename, blank_pages = False, setFeatures = False): + pages = readPages(open(filename, 'r')) + + if blank_pages: +- blanks = range(128) ++ blanks = list(range(128)) + for page in pages: + blanks.remove(page['start'] / 64) + +@@ -538,7 +538,7 @@ def writeHexFile(filename, blank_pages = False, setFeatures = False): + def checkFileExists(path): + try: + os.stat(path) +- except OSError, inst: ++ except OSError as inst: + if inst[0] != errno.ENOENT: + raise + return False +-- +2.20.1 diff --git a/0020-build-Fix-DESTDIR-dont-update-docs.patch b/0020-build-Fix-DESTDIR-dont-update-docs.patch new file mode 100644 index 0000000..c31d14c --- /dev/null +++ b/0020-build-Fix-DESTDIR-dont-update-docs.patch @@ -0,0 +1,60 @@ +From 89f10c5f0c4374fb8ac51f1878b8b79329123c5b Mon Sep 17 00:00:00 2001 +From: Alec Leamas +Date: Wed, 25 Jan 2017 16:35:50 +0100 +Subject: [PATCH] fix + +--- + .../Makefile | 22 +++++----------------- + 1 file changed, 5 insertions(+), 17 deletions(-) + +diff --git a/iguanair-lirc-e23b9d3726b010c9e747786ffe72e38debc8cfef/Makefile b/iguanair-lirc-e23b9d3726b010c9e747786ffe72e38debc8cfef/Makefile +index dd093eb..be86c43 100755 +--- a/iguanair-lirc-e23b9d3726b010c9e747786ffe72e38debc8cfef/Makefile ++++ b/iguanair-lirc-e23b9d3726b010c9e747786ffe72e38debc8cfef/Makefile +@@ -3,9 +3,6 @@ + # Requires that lirc is installed in system locations, in + # particular that the /usr/lib[64]/pkgconfig/lirc-driver.pc + # is in place (/usr/local/lib/pkgconfig/... is also OK). +-# The required file plugindocs.mk might live in a -doc +-# package which then is needed. +-# + + + driver = iguanair +@@ -18,13 +15,7 @@ PLUGINDIR ?= $(shell pkg-config --variable=plugindir lirc-driver) + CONFIGDIR ?= $(shell pkg-config --variable=configdir lirc-driver) + PLUGINDOCS ?= $(shell pkg-config --variable=plugindocs lirc-driver) + +-PLUGINDOCS_MK = $(PLUGINDOCS)/plugindocs.mk +-MODPROBE_CONF = 60-blacklist-kernel-iguanair.conf +- +-ifneq ($(wildcard $(PLUGINDOCS_MK)),) +- include $(PLUGINDOCS_MK) +-endif +- ++MODPROBE_CONF = 60-blacklist-kernel-iguanair.conf + + $(driver).o: $(driver).c + +@@ -32,14 +23,11 @@ $(driver).so: $(driver).o + gcc --shared -fpic $(LDFLAGS) -o $@ $< + + install: $(driver).so +- install -pDm 755 $< $(DESTDIR)$(PLUGINDIR)/$< +- install -pDm 644 $(driver).html $(DESTDIR)$(PLUGINDOCS)/$(driver).html +- install -pDm 644 $(driver).conf $(DESTDIR)$(CONFIGDIR)/$(driver).conf +- install -pDm 644 $(MODPROBE_CONF) \ ++ install -D $< $(DESTDIR)$(PLUGINDIR)/$< ++ install -D $(driver).conf $(DESTDIR)$(CONFIGDIR)/$(driver).conf ++ install -D $(driver).html $(DESTDIR)$(PLUGINDOCS)/$(driver).html ++ install -Dm 644 $(MODPROBE_CONF) \ + $(DESTDIR)/etc/modprobe.d/$(MODPROBE_CONF) +-ifneq ($(wildcard $(PLUGINDOCS_MK)),) +- $(MAKE) update +-endif + + clean: + rm -f *.o *.so +-- +2.9.3 + diff --git a/README.fedora b/README.fedora new file mode 100644 index 0000000..f277f65 --- /dev/null +++ b/README.fedora @@ -0,0 +1,13 @@ +Fedora README +============= + +On recent kernels (F17+) you will need to disable the kernel ir stuff +to make the iguanaIR driver work. Basically, blacklist all rc_* +modules using a file in /etc/modprobe.d. The list varies, my +own file is: + + blacklist rc_medion_x10_or2x + blacklist rc_pinnacle_pctv_hd + blacklist ati_remote + blacklist rc_core + diff --git a/changeset_2710.patch b/changeset_2710.patch new file mode 100644 index 0000000..395037a --- /dev/null +++ b/changeset_2710.patch @@ -0,0 +1,24 @@ +Index: /trunk/software/usb_ir/CMakeLists.txt +=================================================================== +--- trunk/software/usb_ir/CMakeLists.txt (revision 2709) ++++ trunk/software/usb_ir/CMakeLists.txt (revision 2710) +@@ -1,4 +1,7 @@ + cmake_minimum_required(VERSION 2.6) + project(IguanaIR C) ++ ++Set(SOVERSION 0) ++Set(FULLVER 0.3) + + #Set(TARGET_ANDROID true) +@@ -98,9 +101,10 @@ + iguanaIR.c dataPackets.c ${PIPESRC} + ${BASESRC}) ++set_target_properties(iguanaIR PROPERTIES ++ VERSION ${SOVERSION} SOVERSION ${FULLVER}) + set_property(TARGET iguanaIR + APPEND PROPERTY COMPILE_DEFINITIONS IGUANAIR_EXPORTS) + install(TARGETS iguanaIR + DESTINATION ${LIBDIR}) +- + + # build the service/server that controls hardware diff --git a/cmake-args.patch b/cmake-args.patch new file mode 100644 index 0000000..9f4031d --- /dev/null +++ b/cmake-args.patch @@ -0,0 +1,11 @@ +diff --git a/runCmake b/runCmake +index f37873c..6d19253 100755 +--- a/runCmake ++++ b/runCmake +@@ -40,5 +40,5 @@ fi + # create the build path + mkdir -p $BUILDDIR + cd $BUILDDIR +-PATH=${QTPATH}:${PYPATH}:${PATH} ARCH=${ARCH} CSPATH=${CSPATH} ${CMAKE} ${CHAIN} .. ++PATH=${QTPATH}:${PYPATH}:${PATH} ARCH=${ARCH} CSPATH=${CSPATH} ${CMAKE} ${CHAIN} $@ .. + cd .. diff --git a/iguanaIR-rescan b/iguanaIR-rescan index 6565144..a41a59d 100755 --- a/iguanaIR-rescan +++ b/iguanaIR-rescan @@ -1,7 +1,7 @@ #!/bin/bash # # If iguanaIR runs, signal HUP to start a rescan. If not started, or -# signal fails, try-restart daemon. +# signal fails, restart daemon. if systemctl --quiet is-active iguanaIR.service; then pid=$( systemctl --property=MainPID show iguanaIR.service ) || \ @@ -9,4 +9,6 @@ if systemctl --quiet is-active iguanaIR.service; then pid=${pid##*=} [ -n "$pid" ] && kill -HUP $pid &>/dev/null && exit 0 fi -systemctl try-restart iguanaIR.service +systemctl show --property=UnitFileState iguanaIR.service | + grep -q enabled && \ + systemctl restart iguanaIR.service diff --git a/iguanaIR.logrotate b/iguanaIR.logrotate index ce609ad..e84b43f 100644 --- a/iguanaIR.logrotate +++ b/iguanaIR.logrotate @@ -1,4 +1,5 @@ -/var/log/iguanaIR { +/var/log/iguanaIR/*.log { + su iguanair iguanair missingok notifempty postrotate diff --git a/iguanaIR.spec b/iguanaIR.spec index 3f95e16..b57c995 100644 --- a/iguanaIR.spec +++ b/iguanaIR.spec @@ -1,239 +1,427 @@ +%global commit6 e23b9d3726b010c9e747786ffe72e38debc8cfef +%global shortcommit %(c=%{commit6}; echo ${c:0:7}) +%global repo https://github.com/iguanaworks/iguanair-lirc/archive +%global __python %{__python3} + Name: iguanaIR -Version: 1.0.3 -Release: 2%{?dist} +Version: 1.1.0 +Release: 44%{?dist} +Epoch: 2 Summary: Driver for Iguanaworks USB IR transceiver -Group: System Environment/Daemons - -# Following files are LGPL2.1, remaining GPLv2: -# ./support.h ./iguanaIR.h ./support.c ./pipes.c ./compat.h ./pipes.h -# ./iguanaIR.c ./dataPackets.h ./compat-unix.c ./dataPackets.c -License: GPLv2 and LGPLv2 +# Automatically converted from old format: GPLv2 and LGPLv2 - review is highly recommended. +License: GPL-2.0-only AND LicenseRef-Callaway-LGPLv2 URL: http://iguanaworks.net/ir -Source0: http://iguanaworks.net/downloads/iguanaIR-%{version}.tar.bz2 +Source0: http://iguanaworks.net/downloads/%{name}-%{version}.tar.bz2 Source1: iguanaIR.service Source2: iguanaIR-rescan -Source3: iguanaIR.logrotate -Patch1: 0001-Remove-trailing-whitespace.patch -# http://iguanaworks.net/projects/IguanaIR/ticket/279 -Patch2: 0002-Don-t-hardcode-iguanair-UID.patch -# http://iguanaworks.net/projects/IguanaIR/ticket/280 -Patch3: 0003-Use-platform-specific-python-extension-dir.patch -# http://iguanaworks.net/projects/IguanaIR/ticket/281 -Patch4: 0004-Don-t-exit-3-in-library-calls.patch -# http://iguanaworks.net/projects/IguanaIR/ticket/282 -Patch5: 0005-Improve-driver-dir-detection.patch -# http://iguanaworks.net/projects/IguanaIR/ticket/283 -Patch6: 0006-make-options-file-work-w-systemd.patch -# http://iguanaworks.net/projects/IguanaIR/ticket/284 -Patch7: 0007-Use-fedora-specific-default-socket-directory.patch -# Fedora only, not acceptable upstream. -Patch8: 0008-udev-invoke-systemd-support-not-sysV-init-file.patch +Source3: README.fedora +Source4: patch-soname +Source5: iguanaIR.logrotate +Source6: %{repo}/%{commit6}/iguanair-lirc-%{shortcommit}.tar.gz +# https://iguanaworks.net/projects/IguanaIR/ticket/317 +Patch1: changeset_2710.patch +Patch2: rpath.patch +Patch3: cmake-args.patch + +# https://github.com/iguanaworks/iguanair-lirc/pull/1 (Patch10..Patch13) +Source10: 0010-Change-iguanaIR.-iguanair.-to-match-other-plugins.patch +Source11: 0011-Rename-link-README-files-to-match-modified-install-r.patch +Source12: 0012-Makefile-Add-DESTDIR-support.patch +Source13: 0013-Convert-all-files-to-LF-line-endings-like-main-drive.patch + +Source20: 0020-build-Fix-DESTDIR-dont-update-docs.patch +Source21: 0016-reflasher-Move-to-python3.patch -Requires: lirc -Requires: logrotate Requires: udev +BuildRequires: cmake gcc +BuildRequires: dos2unix +BuildRequires: git BuildRequires: libusb1-devel -BuildRequires: libusb-devel +%if 0%{?fedora} < 37 +libusb-devel +%endif BuildRequires: popt-devel -BuildRequires: python2-devel -BuildRequires: systemd-units - -Requires(pre): shadow-utils -Requires(post): systemd-units -Requires(post): systemd-sysv -Requires(preun): systemd-units -Requires(postun): systemd-units +BuildRequires: systemd +%{?systemd_requires} +Requires(post): systemd-sysv # some features can be disabled during the rpm build -%{?_without_clock_gettime: %global _disable_clock_gettime --disable-clock_gettime} +%{?_without_clock_gettime: %define _disable_clock_gettime --disable-clock_gettime} -# Don't add provides for python .so and private lib so-files -%global __provides_exclude _iguanaIR.so -%global __provides_exclude_from %{_libdir}/iguanaIR/.*[.]so - -# Don't require private libs in /usr/lib[64]/iguanaIR -%global __requires_exclude libusbpre1.so|libusb.so +# Filter away versioned plugin deps (they only depend on ABI): +%global __provides_exclude_from ^%{_libdir}/lirc/plugins/.*$ %description This package provides igdaemon and igclient, the programs necessary to control the Iguanaworks USB IR transceiver. + %package devel Summary: Library and header files for iguanaIR -Group: Development/Libraries -Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name} = %{epoch}:%{version}-%{release} %description devel The development files needed to interact with the iguanaIR igdaemon are included in this package. -%package -n python-iguanaIR -Group: System Environment/Daemons -Summary: Python module for Iguanaworks USB IR transceiver -Requires: %{name}%{?_isa} = %{version}-%{release} -Requires: python -BuildRequires: python2-devel swig -%description -n python-iguanaIR -This package provides the swig-generated Python module for interfacing -with the Iguanaworks USB IR transceiver. - -%package firmware -Group: System Environment/Daemons -Summary: Firmware and reflasher for Iguanaworks USB IR transceiver -Requires: %{name} = %{version}-%{release} +%package reflasher +Summary: Reflasher for Iguanaworks USB IR transceiver BuildArch: noarch -%description firmware +%description reflasher This package provides the reflasher/testing script and assorted firmware versions for the Iguanaworks USB IR transceiver. If you have no idea what this means, you don't need it. + +%if 0%{fedora} > 23 +%package -n lirc-drv-iguanair +Summary: lirc plugin for iguanair user-space driver +Requires: lirc >= 0.9.4 +BuildRequires: lirc-devel >= 0.9.4 +BuildRequires: make + +%description -n lirc-drv-iguanair +lirc plugin providing full support for the iguanaIR userspace driver, +the same as was built in into the lirc releases up to 0.9.3. +%endif + + %prep -%setup -q -n iguanaIR-%{version} -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 -%patch7 -p1 -%patch8 -p1 +%setup -q -n %{name}-%{version} +%setup -q -T -D -a 6 +%patch -P1 -p3 +%patch -P2 -p1 +%patch -P3 -p1 +cp %{SOURCE3} README.fedora +cd iguanair-lirc-%{commit6} +patch -p1 < %{SOURCE10} +patch -p1 < %{SOURCE11} +patch -p1 < %{SOURCE12} +git apply --whitespace=fix %{SOURCE13} +dos2unix Makefile +patch -l -p2 --fuzz 2 < %{SOURCE20} +cd .. +patch -p1 --fuzz 2 < %{SOURCE21} -# docs: bad EOL, remove script, fix /dev/iguanaIR -> /var/run/iguanaIR -sed -i 's/\r//' docs/* -rm docs/pullDocs -sed -i 's|/dev/iguanaIR|/var/run/iguanaIR|g' \ - docs/TroubleShooting docs/driver docs/lirc +# Create a sysusers.d config file +cat >iguanair.sysusers.conf < 23 +cd iguanair-lirc-%{commit6} +PLUGINDOCS=$(pkg-config --variable=plugindocs lirc-driver) +make LDFLAGS="-liguanaIR -L../build" CFLAGS="%{optflags} \ + -fpic -I.. -DHAVE_KERNEL_LIRC_H=1 -DPLUGINDOCS=\\\"$PLUGINDOCS\\\"" \ + DESTDIR=$RPM_BUILD_ROOT install +cd .. +%endif + + +mkdir -p $RPM_BUILD_ROOT/%{_datadir} || : +cp -ar files/python/usr/share/iguanaIR-reflasher $RPM_BUILD_ROOT/%{_datadir} +mkdir -p $RPM_BUILD_ROOT/%{_bindir} || : +cp -ar files/python/usr/bin/* $RPM_BUILD_ROOT/%{_bindir} + +cd build +make install PREFIX=$RPM_BUILD_ROOT/usr DESTDIR=$RPM_BUILD_ROOT \ + INLIBDIR=$RPM_BUILD_ROOT%{_libdir} +rm -rf $RPM_BUILD_ROOT/%{_libdir}/python%{python_version}/site-packages + +install -m755 -d $RPM_BUILD_ROOT%{_localstatedir}/run/%{name} + +%if 0%{fedora} > 30 +rm -rf $RPM_BUILD_ROOT/%{_libdir}/python2.7/site-packages +%endif + +# fix missing links +pushd $RPM_BUILD_ROOT%{_libdir} +rm libiguanaIR.so.0.3 +mv libiguanaIR.so.0 libiguanaIR.so.0.3 +ln -sf libiguanaIR.so.0.3 libiguanaIR.so.0 # Use /etc/sysconfig instead of /etc/default -mkdir $RPM_BUILD_ROOT/etc/sysconfig +mkdir $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig || : mv $RPM_BUILD_ROOT/etc/default/iguanaIR \ - $RPM_BUILD_ROOT/etc/sysconfig + $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig # Fix up some stray file permissions issues -chmod -x $RPM_BUILD_ROOT%{python_sitearch}/*.py \ - $RPM_BUILD_ROOT%{_includedir}/iguanaIR.h \ - $RPM_BUILD_ROOT%{_datadir}/iguanaIR-reflasher/hex/* + chmod a-x $RPM_BUILD_ROOT%{_includedir}/%{name}.h \ + $RPM_BUILD_ROOT%{_datadir}/%{name}-reflasher/hex/* # Remove the installed initfile and install the systemd support instead. -rm -rf $RPM_BUILD_ROOT/etc/init.d/ -install -m644 -pD %{SOURCE1} $RPM_BUILD_ROOT%{_unitdir}/iguanaIR.service -install -m755 -pD %{SOURCE2} $RPM_BUILD_ROOT%{_datadir}/iguanaIR/rescan +rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/init.d/ +install -m644 -D %{SOURCE1} $RPM_BUILD_ROOT%{_unitdir}/%{name}.service +install -m755 -D %{SOURCE2} $RPM_BUILD_ROOT%{_libexecdir}/iguanaIR/rescan -# Install private log dir. -install -m755 -pd $RPM_BUILD_ROOT/var/log/iguanaIR -install -m644 -pD %SOURCE3 $RPM_BUILD_ROOT/etc/logrotate.d/%name +# Install private log dir, tmpfiles.d setup. +install -m755 -d $RPM_BUILD_ROOT%{_localstatedir}/log/iguanaIR -# Handle the tempfiles.d and /var/run stuff. -install -m755 -pd $RPM_BUILD_ROOT/run/iguanaIR -install -m755 -pd $RPM_BUILD_ROOT/etc/tmpfiles.d -cat > $RPM_BUILD_ROOT/etc/tmpfiles.d/iguanaIR.conf < $RPM_BUILD_ROOT/%{_tmpfilesdir}/%{name}.conf < $RPM_BUILD_ROOT/etc/modprobe.d/blacklist-iguanair.conf << EOF -# iguanaIR user space driver blacklisting the kernel driver -blacklist iguanair -EOF +install -m0644 -D iguanair.sysusers.conf %{buildroot}%{_sysusersdir}/iguanair.conf -%pre -getent group iguanair >/dev/null || groupadd -r iguanair -getent passwd iguanair >/dev/null || \ - useradd -r -g iguanair -d /var/run/iguanaIR -s /sbin/nologin \ - -c "Iguanaworks IR Daemon" iguanair -exit 0 %post -if [ $1 -eq 1 ] ; then - # Initial installation - /bin/systemctl daemon-reload >/dev/null 2>&1 || : -fi -/sbin/ldconfig +%systemd_post %{name}.service %preun -if [ $1 -eq 0 ] ; then - # Package removal, not upgrade - /bin/systemctl --no-reload disable iguanaIR.service > /dev/null 2>&1 || : - /bin/systemctl stop iguanaIR.service > /dev/null 2>&1 || : -fi +%systemd_preun %{name}.service %postun -/bin/systemctl daemon-reload >/dev/null 2>&1 || : -if [ $1 -ge 1 ] ; then - # Package upgrade, not uninstall - /bin/systemctl try-restart iguanaIR.service >/dev/null 2>&1 || : -fi -/sbin/ldconfig +%systemd_postun_with_restart %{name}.service %files -%doc AUTHORS LICENSE LICENSE-LGPL WHY protocols.txt README.txt notes.txt ChangeLog -%doc docs +%license LICENSE LICENSE-LGPL +%doc README.txt WHY ChangeLog AUTHORS +%doc README.fedora %{_bindir}/igdaemon %{_bindir}/igclient -%{_libdir}/libiguanaIR.so.* -%{_libdir}/iguanaIR/ -%{_datadir}/iguanaIR/ -%{_unitdir}/iguanaIR.service -/lib/udev/rules.d/80-iguanaIR.rules -%config(noreplace) /etc/modprobe.d/blacklist-iguanair.conf -%config(noreplace) /etc/sysconfig/iguanaIR -%config(noreplace) /etc/tmpfiles.d/iguanaIR.conf -%config(noreplace) /etc/logrotate.d/iguanaIR -%attr(755, iguanair, iguanair) /lib/udev/devices/iguanaIR -%attr(755, iguanair, iguanair) /run/iguanaIR -%attr(755, iguanair, iguanair) /var/log/iguanaIR +%{_bindir}/iguanaIR-rescan +%{_libdir}/lib%{name}.so.* +%{_libdir}/%{name}/*.so +%{_libexecdir}/%{name}/ +%{_unitdir}/%{name}.service +%config(noreplace) /etc/logrotate.d/%{name} +/lib/udev/rules.d/80-%{name}.rules +%config(noreplace) /etc/sysconfig/%{name} +%{_tmpfilesdir}/%{name}.conf +%ghost %attr(755, iguanair, iguanair) /run/%{name} +%attr(775, iguanair, iguanair) %{_localstatedir}/log/%{name} + +%if 0%{fedora} < 30 +%{_libdir}/python2.7/* +%endif +%{_sysusersdir}/iguanair.conf %files devel -%doc examples -%{_includedir}/iguanaIR.h -%{_libdir}/libiguanaIR.so +%{_includedir}/%{name}.h +%{_libdir}/lib%{name}.so -%files -n python-iguanaIR -%{python_sitearch}/* +%files reflasher +%{_datadir}/%{name}-reflasher/ +%{_bindir}/%{name}-reflasher -%files firmware -%{_bindir}/iguanaIR-reflasher -%{_datadir}/iguanaIR-reflasher/ +%if 0%{fedora} > 23 +%files -n lirc-drv-iguanair +%config /etc/modprobe.d/60-blacklist-kernel-iguanair.conf +%{_libdir}/lirc/plugins/iguanair.so +%{_docdir}/lirc/plugindocs/iguanair.html +%{_datadir}/lirc/configs/iguanair.conf +%endif %changelog -* Thu Feb 14 2013 Fedora Release Engineering - 1.0.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild +* Thu Jul 24 2025 Fedora Release Engineering - 2:1.1.0-44 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild -* Tue Jan 15 2013 Alec Leamas - 1.0.3-1 -- Handle review remarks: -- Revert license to GPLv2 + LGPLv2, -- Preserve timestamps, unowned dirs, missing Requires. +* Tue Feb 11 2025 Zbigniew Jędrzejewski-Szmek - 2:1.1.0-43 +- Add sysusers.d config file to allow rpm to create users/groups automatically -* Wed Jan 2 2013 Alec Leamas - 1.0.3-1 -- Initial release based on work by Joseph Dunn, Jarod Wilson and - Jason Tibbits in bug 642773 -- Set license to GPLv2, can't find any LGPL files. +* Fri Jan 17 2025 Fedora Release Engineering - 2:1.1.0-42 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + +* Mon Sep 02 2024 Miroslav Suchý - 2:1.1.0-41 +- convert license to SPDX + +* Thu Jul 18 2024 Fedora Release Engineering - 2:1.1.0-40 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Wed Jan 24 2024 Fedora Release Engineering - 2:1.1.0-39 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Sat Jan 20 2024 Fedora Release Engineering - 2:1.1.0-38 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Thu Jul 20 2023 Fedora Release Engineering - 2:1.1.0-37 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Thu Jan 19 2023 Fedora Release Engineering - 2:1.1.0-36 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Thu Jul 21 2022 Fedora Release Engineering - 2:1.1.0-35 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Thu Jan 20 2022 Fedora Release Engineering - 2:1.1.0-34 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Jul 22 2021 Fedora Release Engineering - 2:1.1.0-33 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek - 2:1.1.0-32 +- Rebuilt for updated systemd-rpm-macros + See https://pagure.io/fesco/issue/2583. + +* Tue Jan 26 2021 Fedora Release Engineering - 2:1.1.0-31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Jul 28 2020 Fedora Release Engineering - 2:1.1.0-30 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jan 29 2020 Fedora Release Engineering - 2:1.1.0-29 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Aug 22 2019 Alec Leamas - 2:1.1.0-28 +- Move to python3 (Closes: #1737981). +- Drop the SWIG-generated python bindings. +- Update ancient systemd scriptlets. + +* Thu Jul 25 2019 Fedora Release Engineering - 2:1.1.0-27 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Fri Feb 01 2019 Fedora Release Engineering - 2:1.1.0-26 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Fri Jul 13 2018 Fedora Release Engineering - 2:1.1.0-25 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Feb 07 2018 Fedora Release Engineering - 2:1.1.0-24 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Wed Aug 02 2017 Fedora Release Engineering - 2:1.1.0-23 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 2:1.1.0-22 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 2:1.1.0-21 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Fri Jan 27 2017 Alec Leamas - 2:1.1.0-20 +- Fix bad linkage for dynamic lirc-drv-iguanair module. + +* Wed Jan 25 2017 Alec Leamas - 2:1.1.0-19 +- -18 was a COPR release only. +- Drop the python package which does not compile cleanly any more. +- Add lirc plugin generation. +- Fix %%license usage for license files - #1413263. +- Use %%tmpfilesdir as required - #1413263. +- Remove horrible hacks from -10 to break circular dep lirc <=> iguanaIR. +- Filter away plugin deps - they only depend on ABI. +- Fix so-file links - #1409065 + +* Tue Jul 19 2016 Fedora Release Engineering - 2:1.1.0-17 +- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages + +* Thu Feb 04 2016 Fedora Release Engineering - 2:1.1.0-16 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jun 17 2015 Fedora Release Engineering - 2:1.1.0-15 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Mon Dec 22 2014 Alec Leamas - 2:1.1.0-14 +- Fixing #1176627: Update logrotate conf. + +* Thu Dec 11 2014 Alec Leamas - 2:1.1.0-13 +- Filter away bogus, patched so-name from Requires: + +* Wed Dec 10 2014 Alec Leamas - 2:1.1.0-12 +- Fixes #1159618. +- Re-install logrotate file, mysteriously dropped sometime. + +* Wed Sep 10 2014 Alec Leamas - 2:1.1.0-11 +- Fixed 64-bit provides tweak. + +* Tue Sep 09 2014 Alec Leamas - 2:1.1.0-10 +- Added 64-bit provides tweak. + +* Wed Sep 03 2014 Alec Leamas - 2:1.1.0-9 +- Remove needless and circular dependency on lirc. + +* Wed Sep 03 2014 Alec Leamas - 2:1.1.0-8 +- patch soname + add virtual compatibility Provides: + +* Wed Sep 3 2014 Alec Leamas - 1:1.1.0-4 +- New attempt to introduce 1.1.0 (ABI bump) + +* Wed Aug 20 2014 Alec Leamas - 1:1.0.5-5 +- Updating dependencies with epoch (sigh...). + +* Tue Aug 19 2014 Alec Leamas - 1:1.0.5-4 +- Backing out 1.1.0 due to ABI problems. +- Purged old changelog dating to 2006, partly outside Fedora. + +* Mon Aug 18 2014 Alec Leamas - 1.1.0-3 +- Add missing patch (how did this ever build?). + +* Sat Aug 16 2014 Fedora Release Engineering - 1.1.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Mon Aug 11 2014 Alec Leamas - 1.1.0-1 +- Updating to latest version +- Old patches now upstreamed, new patches for cmake required. LIBDIR handling + needs cleanup (not required part in rpath.patch). + +* Sat Jun 07 2014 Fedora Release Engineering - 1.0.5-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sat Aug 03 2013 Fedora Release Engineering - 1.0.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Sun Apr 21 2013 Alec Leamas - 1.0.5-1 +- Update to latest upstream 1.0.5 +- Most patches merged upstream. + +* Tue Dec 25 2012 Alec Leamas - 1.0.3-1 +- Updated to 1.0.3 +- Moved most of fixes.patch to spec file, split rest to smaller ones. +- Support sysconfig configuration file. +- Include documentation files +- Install udev rule in /lib/udev, not /etc/udev. +- Fixed udev issue invoking '/etc/init.d/iguanaIR rescan'. + +* Wed Apr 18 2012 Jason L Tibbitts III - 1.0.1-3 +- Some systemd and dependency filtering suggestions. + +* Fri Jan 28 2011 Jarod Wilson 1.0.1-2 +- Address Fedora package review concerns (#642773) + +* Thu Jan 20 2011 Jarod Wilson 1.0.1-1 +- Update to 1.0.1 release + +* Wed Oct 13 2010 Jarod Wilson 1.0-0.2.pre2.svn1419 +- Update to 1.0pre2 snapshot plus svn rev 1419 additions +- Patch in additional changes to use more suitable locations for + plugins, socket directory and reflasher files + +* Wed Jul 21 2010 Jarod Wilson 1.0-0.1.pre2 +- Update to 1.0pre2 snapshot +- Revamp spec to be more compliant with Fedora packaging guidelines diff --git a/patch-soname b/patch-soname new file mode 100755 index 0000000..7a57143 --- /dev/null +++ b/patch-soname @@ -0,0 +1,46 @@ +#!/bin/bash + +function patch_strings_in_file() +{ + local FILE="$1" + local PATTERN="$2" + local REPLACEMENT="$3" + + # Find all unique strings in FILE that contain the pattern + STRINGS=$(strings ${FILE} | grep ${PATTERN} | sort -u -r) + + if [ "${STRINGS}" != "" ] ; then + echo "File '${FILE}' contain strings with '${PATTERN}' in them:" + + for OLD_STRING in ${STRINGS} ; do + # Create the new string with a simple bash-replacement + NEW_STRING=${OLD_STRING//${PATTERN}/${REPLACEMENT}} + + # Create null terminated ASCII HEX representations of the strings + OLD_STRING_HEX="$(echo -n ${OLD_STRING} | xxd -g 0 -u -ps -c 256)00" + NEW_STRING_HEX="$(echo -n ${NEW_STRING} | xxd -g 0 -u -ps -c 256)00" + + if [ ${#NEW_STRING_HEX} -le ${#OLD_STRING_HEX} ] ; then + # Pad the replacement string with null terminations so the + # length matches the original string + while [ ${#NEW_STRING_HEX} -lt ${#OLD_STRING_HEX} ] ; do + NEW_STRING_HEX="${NEW_STRING_HEX}00" + done + + # Now, replace every occurrence of OLD_STRING with NEW_STRING + echo -n "Replacing ${OLD_STRING} with ${NEW_STRING}... " + hexdump -ve '1/1 "%.2X"' ${FILE} | \ + sed "s/${OLD_STRING_HEX}/${NEW_STRING_HEX}/g" | \ + xxd -r -p > ${FILE}.tmp + chmod --reference ${FILE} ${FILE}.tmp + mv ${FILE}.tmp ${FILE} + echo "Done!" + else + echo "New string '${NEW_STRING}' is longer than old" \ + "string '${OLD_STRING}'. Skipping." + fi + done + fi +} + +patch_strings_in_file $@ diff --git a/rpath.patch b/rpath.patch new file mode 100644 index 0000000..e3b54de --- /dev/null +++ b/rpath.patch @@ -0,0 +1,15 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 6bdf24d..7ca5c4b 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -71,6 +71,9 @@ ElseIf("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") + Set(DAEMONLIBS pthread dl) + EndIf() + ++ Set(CMAKE_SKIP_RPATH True) ++ Set(INSTALL_LIBDIR @libdir@) ++ + Set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O2 -Wall -pedantic") + + # see if we have clock_gettime in time.h + diff --git a/sources b/sources index 7c21b4a..30c49ff 100644 --- a/sources +++ b/sources @@ -1 +1,2 @@ -172b897083f014c9b5ade296ccc48298 iguanaIR-1.0.3.tar.bz2 +SHA512 (iguanaIR-1.1.0.tar.bz2) = 19d793598043c203192c7de0066794629ef64cefe901beca4e894e2090a3d0a91d813de1ae5440a8d51c1f94ad4a960278dbe625302564dcc39c38a668cf18f2 +SHA512 (iguanair-lirc-e23b9d3.tar.gz) = ad116c16ea9f18259e2b915f1e1589d08e4ddc787459bc8595876ec0cc2ea36265a2dcb6b7792e3d1e9faab8e8ad680fdf9f0f59fac6d87148464aeb0aba86fb