You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.5 KiB
97 lines
2.5 KiB
From 62b9172bf52584e0c621d0163052ccca9a240846 Mon Sep 17 00:00:00 2001
|
|
From: Helen Foster <helen-foster@users.sourceforge.net>
|
|
Date: Sun, 14 Aug 2016 14:00:30 +0100
|
|
Subject: [PATCH 03/10] irtoy: improve error handling (#220).
|
|
|
|
Avoid double init. Avoid calling setPin or trying to send if irtoy
|
|
is not initialized (segfault).
|
|
---
|
|
plugins/irtoy.c | 28 ++++++++++++++++++++--------
|
|
1 file changed, 20 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/plugins/irtoy.c b/plugins/irtoy.c
|
|
index f6e81d7..f7a6feb 100644
|
|
--- a/plugins/irtoy.c
|
|
+++ b/plugins/irtoy.c
|
|
@@ -467,6 +467,9 @@ static int init_device(void)
|
|
IRTOY_MINFWVERSION,
|
|
dev->swVersion);
|
|
free(dev);
|
|
+ dev = NULL;
|
|
+ close(drv.fd);
|
|
+ tty_delete_lock();
|
|
return 0;
|
|
}
|
|
rec_buffer_init();
|
|
@@ -490,10 +493,15 @@ static int init(void)
|
|
"Additional irtoy device found: %s (ignored)";
|
|
const char* const MSG_FOUND = "irtoy device found on %s";
|
|
|
|
+ log_trace("irtoy: init");
|
|
if (drv.device == NULL) {
|
|
log_error("irtoy: NULL device.");
|
|
return 0;
|
|
}
|
|
+ if (dev != NULL) {
|
|
+ log_debug("irtoy: init: irtoy already initialized");
|
|
+ return 1;
|
|
+ }
|
|
if (strcmp(drv.device, "auto") != 0)
|
|
return init_device();
|
|
for (found = 0, i = 0; i <= 9; i++) {
|
|
@@ -516,6 +524,8 @@ static int init(void)
|
|
|
|
static int deinit(void)
|
|
{
|
|
+ log_trace("irtoy: deinit");
|
|
+
|
|
// IMPORTANT do not remove this reset. it is vital to return the
|
|
// irtoy to IRMAN mode.
|
|
// If we leave the irtoy in sample mode while no-one has the
|
|
@@ -527,14 +537,14 @@ static int deinit(void)
|
|
// sending the next one, while sample mode will keep streaming
|
|
// (and under fluorescent light it WILL stream..)
|
|
// triggering the problem
|
|
- setPin(openPin, 0);
|
|
- setPin(sendingPin, 0);
|
|
- setPin(receivePin, 0);
|
|
if (dev != NULL) {
|
|
+ setPin(openPin, 0);
|
|
+ setPin(sendingPin, 0);
|
|
+ setPin(receivePin, 0);
|
|
irtoy_reset(dev);
|
|
free(dev);
|
|
+ dev = NULL;
|
|
}
|
|
- dev = NULL;
|
|
|
|
close(drv.fd);
|
|
drv.fd = -1;
|
|
@@ -562,10 +572,6 @@ static int irtoy_send_double_buffered(unsigned char* signals, int length)
|
|
unsigned char reply[16];
|
|
int irtoyXmit;
|
|
|
|
- if (dev == NULL) {
|
|
- log_error("irtoy_send: irtoy not initialized");
|
|
- return 0;
|
|
- }
|
|
res = write(dev->fd, IRTOY_COMMAND_TXSTART, sizeof(IRTOY_COMMAND_TXSTART));
|
|
|
|
if (res != sizeof(IRTOY_COMMAND_TXSTART)) {
|
|
@@ -647,6 +653,12 @@ static int send(struct ir_remote* remote, struct ir_ncode* code)
|
|
lirc_t val;
|
|
int res;
|
|
|
|
+ log_trace("irtoy: send");
|
|
+
|
|
+ if (dev == NULL) {
|
|
+ log_error("irtoy: send: irtoy not initialized");
|
|
+ return 0;
|
|
+ }
|
|
|
|
if (!send_buffer_put(remote, code))
|
|
return 0;
|
|
--
|
|
2.5.5
|
|
|