diff --git a/msvc/libdivecomputer.vcproj b/msvc/libdivecomputer.vcproj
index aff2bd7..3da8750 100644
--- a/msvc/libdivecomputer.vcproj
+++ b/msvc/libdivecomputer.vcproj
@@ -210,6 +210,10 @@
RelativePath="..\src\citizen_aqualand_parser.c"
>
+
+
@@ -520,6 +524,10 @@
RelativePath="..\include\libdivecomputer\citizen_aqualand.h"
>
+
+
diff --git a/src/Makefile.am b/src/Makefile.am
index 64c3649..c029a79 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -17,6 +17,7 @@ libdivecomputer_la_SOURCES = \
version.c \
descriptor.c \
iterator-private.h iterator.c \
+ common-private.h common.c \
context-private.h context.c \
device-private.h device.c \
parser-private.h parser.c \
diff --git a/src/citizen_aqualand.c b/src/citizen_aqualand.c
index 9a2812d..cda3dbc 100644
--- a/src/citizen_aqualand.c
+++ b/src/citizen_aqualand.c
@@ -125,18 +125,18 @@ error_free:
static dc_status_t
citizen_aqualand_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
citizen_aqualand_device_t *device = (citizen_aqualand_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/common-private.h b/src/common-private.h
new file mode 100644
index 0000000..94cfd91
--- /dev/null
+++ b/src/common-private.h
@@ -0,0 +1,37 @@
+/*
+ * libdivecomputer
+ *
+ * Copyright (C) 2015 Jef Driesen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef COMMON_PRIVATE_H
+#define COMMON_PRIVATE_H
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+void
+dc_status_set_error (dc_status_t *status, dc_status_t error);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* COMMON_PRIVATE_H */
diff --git a/src/common.c b/src/common.c
new file mode 100644
index 0000000..d1141d5
--- /dev/null
+++ b/src/common.c
@@ -0,0 +1,34 @@
+/*
+ * libdivecomputer
+ *
+ * Copyright (C) 2015 Jef Driesen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include
+#include
+
+#include "common-private.h"
+
+void
+dc_status_set_error (dc_status_t *status, dc_status_t error)
+{
+ assert (status != NULL);
+
+ if (*status == DC_STATUS_SUCCESS)
+ *status = error;
+}
diff --git a/src/cressi_edy.c b/src/cressi_edy.c
index 602ca0d..e58619b 100644
--- a/src/cressi_edy.c
+++ b/src/cressi_edy.c
@@ -331,6 +331,7 @@ error_free:
static dc_status_t
cressi_edy_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
cressi_edy_device_t *device = (cressi_edy_device_t*) abstract;
// Send the quit command.
@@ -338,14 +339,13 @@ cressi_edy_device_close (dc_device_t *abstract)
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/cressi_leonardo.c b/src/cressi_leonardo.c
index c02bea7..6ca321d 100644
--- a/src/cressi_leonardo.c
+++ b/src/cressi_leonardo.c
@@ -142,18 +142,18 @@ error_free:
static dc_status_t
cressi_leonardo_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
cressi_leonardo_device_t *device = (cressi_leonardo_device_t *) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
static dc_status_t
diff --git a/src/device-private.h b/src/device-private.h
index 8e183fb..9254c6c 100644
--- a/src/device-private.h
+++ b/src/device-private.h
@@ -27,6 +27,8 @@
#include
#include
+#include "common-private.h"
+
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
diff --git a/src/diverite_nitekq.c b/src/diverite_nitekq.c
index 2a7c4b4..1d8b96a 100644
--- a/src/diverite_nitekq.c
+++ b/src/diverite_nitekq.c
@@ -218,6 +218,7 @@ error_free:
static dc_status_t
diverite_nitekq_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
diverite_nitekq_device_t *device = (diverite_nitekq_device_t*) abstract;
// Disconnect.
@@ -225,14 +226,13 @@ diverite_nitekq_device_close (dc_device_t *abstract)
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/divesystem_idive.c b/src/divesystem_idive.c
index af36cd0..e4eec6a 100644
--- a/src/divesystem_idive.c
+++ b/src/divesystem_idive.c
@@ -173,18 +173,18 @@ error_free:
static dc_status_t
divesystem_idive_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
divesystem_idive_device_t *device = (divesystem_idive_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/hw_frog.c b/src/hw_frog.c
index 7c7b45a..48c9175 100644
--- a/src/hw_frog.c
+++ b/src/hw_frog.c
@@ -271,27 +271,26 @@ error_free:
static dc_status_t
hw_frog_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
hw_frog_device_t *device = (hw_frog_device_t*) abstract;
+ dc_status_t rc = DC_STATUS_SUCCESS;
// Send the exit command.
- dc_status_t status = hw_frog_transfer (device, NULL, EXIT, NULL, 0, NULL, 0);
- if (status != DC_STATUS_SUCCESS) {
+ rc = hw_frog_transfer (device, NULL, EXIT, NULL, 0, NULL, 0);
+ if (rc != DC_STATUS_SUCCESS) {
ERROR (abstract->context, "Failed to send the command.");
- serial_close (device->port);
- free (device);
- return status;
+ dc_status_set_error(&status, rc);
}
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/hw_ostc.c b/src/hw_ostc.c
index d62466e..42dc778 100644
--- a/src/hw_ostc.c
+++ b/src/hw_ostc.c
@@ -187,18 +187,18 @@ error_free:
static dc_status_t
hw_ostc_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
hw_ostc_device_t *device = (hw_ostc_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/hw_ostc3.c b/src/hw_ostc3.c
index a7bc9a3..20cbe8d 100644
--- a/src/hw_ostc3.c
+++ b/src/hw_ostc3.c
@@ -430,6 +430,7 @@ hw_ostc3_device_init (hw_ostc3_device_t *device, hw_ostc3_state_t state)
static dc_status_t
hw_ostc3_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
hw_ostc3_device_t *device = (hw_ostc3_device_t*) abstract;
dc_status_t rc = DC_STATUS_SUCCESS;
@@ -438,22 +439,19 @@ hw_ostc3_device_close (dc_device_t *abstract)
rc = hw_ostc3_transfer (device, NULL, EXIT, NULL, 0, NULL, 0);
if (rc != DC_STATUS_SUCCESS) {
ERROR (abstract->context, "Failed to send the command.");
- serial_close (device->port);
- free (device);
- return rc;
+ dc_status_set_error(&status, rc);
}
}
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/irda.c b/src/irda.c
index 3903b7b..3be1151 100644
--- a/src/irda.c
+++ b/src/irda.c
@@ -133,6 +133,8 @@ error_free:
int
irda_socket_close (irda_t *device)
{
+ int errcode = 0;
+
if (device == NULL)
return -1;
@@ -146,26 +148,21 @@ irda_socket_close (irda_t *device)
if (close (device->fd) != 0) {
#endif
SYSERROR (device->context, ERRNO);
-#ifdef _WIN32
- WSACleanup ();
-#endif
- free (device);
- return -1;
+ errcode = -1;
}
#ifdef _WIN32
// Terminate the winsock dll.
if (WSACleanup () != 0) {
SYSERROR (device->context, ERRNO);
- free (device);
- return -1;
+ errcode = -1;
}
#endif
// Free memory.
free (device);
- return 0;
+ return errcode;
}
diff --git a/src/mares_darwin.c b/src/mares_darwin.c
index 1113a46..5ab153d 100644
--- a/src/mares_darwin.c
+++ b/src/mares_darwin.c
@@ -173,18 +173,18 @@ error_free:
static dc_status_t
mares_darwin_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
mares_darwin_device_t *device = (mares_darwin_device_t *) abstract;
// Close the device.
if (serial_close (device->base.port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/mares_iconhd.c b/src/mares_iconhd.c
index af6b1de..488852c 100644
--- a/src/mares_iconhd.c
+++ b/src/mares_iconhd.c
@@ -324,18 +324,18 @@ error_free:
static dc_status_t
mares_iconhd_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
mares_iconhd_device_t *device = (mares_iconhd_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/mares_nemo.c b/src/mares_nemo.c
index 840c27e..2b40905 100644
--- a/src/mares_nemo.c
+++ b/src/mares_nemo.c
@@ -159,18 +159,18 @@ error_free:
static dc_status_t
mares_nemo_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
mares_nemo_device_t *device = (mares_nemo_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/mares_puck.c b/src/mares_puck.c
index 2b85b9f..07448c0 100644
--- a/src/mares_puck.c
+++ b/src/mares_puck.c
@@ -181,18 +181,18 @@ error_free:
static dc_status_t
mares_puck_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
mares_puck_device_t *device = (mares_puck_device_t*) abstract;
// Close the device.
if (serial_close (device->base.port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c
index c009ab1..26f6fd3 100644
--- a/src/oceanic_atom2.c
+++ b/src/oceanic_atom2.c
@@ -651,6 +651,7 @@ error_free:
static dc_status_t
oceanic_atom2_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
oceanic_atom2_device_t *device = (oceanic_atom2_device_t*) abstract;
// Send the quit command.
@@ -658,14 +659,13 @@ oceanic_atom2_device_close (dc_device_t *abstract)
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/oceanic_veo250.c b/src/oceanic_veo250.c
index b21f6a0..d2b5d6e 100644
--- a/src/oceanic_veo250.c
+++ b/src/oceanic_veo250.c
@@ -314,6 +314,7 @@ error_free:
static dc_status_t
oceanic_veo250_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
oceanic_veo250_device_t *device = (oceanic_veo250_device_t*) abstract;
// Switch the device back to surface mode.
@@ -321,14 +322,13 @@ oceanic_veo250_device_close (dc_device_t *abstract)
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/oceanic_vtpro.c b/src/oceanic_vtpro.c
index 92faf7a..0bce08e 100644
--- a/src/oceanic_vtpro.c
+++ b/src/oceanic_vtpro.c
@@ -357,6 +357,7 @@ error_free:
static dc_status_t
oceanic_vtpro_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
oceanic_vtpro_device_t *device = (oceanic_vtpro_device_t*) abstract;
// Switch the device back to surface mode.
@@ -364,14 +365,13 @@ oceanic_vtpro_device_close (dc_device_t *abstract)
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/reefnet_sensus.c b/src/reefnet_sensus.c
index ec0ee07..c4cc685 100644
--- a/src/reefnet_sensus.c
+++ b/src/reefnet_sensus.c
@@ -154,6 +154,7 @@ error_free:
static dc_status_t
reefnet_sensus_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
reefnet_sensus_device_t *device = (reefnet_sensus_device_t*) abstract;
// Safely close the connection if the last handshake was
@@ -163,14 +164,13 @@ reefnet_sensus_device_close (dc_device_t *abstract)
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/reefnet_sensuspro.c b/src/reefnet_sensuspro.c
index d20f432..f1bb9ca 100644
--- a/src/reefnet_sensuspro.c
+++ b/src/reefnet_sensuspro.c
@@ -132,18 +132,18 @@ error_free:
static dc_status_t
reefnet_sensuspro_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
reefnet_sensuspro_device_t *device = (reefnet_sensuspro_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/reefnet_sensusultra.c b/src/reefnet_sensusultra.c
index f16c535..c52d7b3 100644
--- a/src/reefnet_sensusultra.c
+++ b/src/reefnet_sensusultra.c
@@ -141,18 +141,18 @@ error_free:
static dc_status_t
reefnet_sensusultra_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
reefnet_sensusultra_device_t *device = (reefnet_sensusultra_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/serial_posix.c b/src/serial_posix.c
index ee9312f..ffd4047 100644
--- a/src/serial_posix.c
+++ b/src/serial_posix.c
@@ -195,15 +195,15 @@ error_free:
int
serial_close (serial_t *device)
{
+ int errcode = 0;
+
if (device == NULL)
return 0;
// Restore the initial terminal attributes.
if (tcsetattr (device->fd, TCSANOW, &device->tty) != 0) {
SYSERROR (device->context, errno);
- close (device->fd);
- free (device);
- return -1;
+ errcode = -1;
}
#ifndef ENABLE_PTY
@@ -214,14 +214,13 @@ serial_close (serial_t *device)
// Close the device.
if (close (device->fd) != 0) {
SYSERROR (device->context, errno);
- free (device);
- return -1;
+ errcode = -1;
}
// Free memory.
free (device);
- return 0;
+ return errcode;
}
//
diff --git a/src/serial_win32.c b/src/serial_win32.c
index 00aeb4d..56c3866 100644
--- a/src/serial_win32.c
+++ b/src/serial_win32.c
@@ -181,6 +181,8 @@ error_free:
int
serial_close (serial_t *device)
{
+ int errcode = 0;
+
if (device == NULL)
return 0;
@@ -188,22 +190,19 @@ serial_close (serial_t *device)
if (!SetCommState (device->hFile, &device->dcb) ||
!SetCommTimeouts (device->hFile, &device->timeouts)) {
SYSERROR (device->context, GetLastError ());
- CloseHandle (device->hFile);
- free (device);
- return -1;
+ errcode = -1;
}
// Close the device.
if (!CloseHandle (device->hFile)) {
SYSERROR (device->context, GetLastError ());
- free (device);
- return -1;
+ errcode = -1;
}
// Free memory.
free (device);
- return 0;
+ return errcode;
}
//
diff --git a/src/suunto_d9.c b/src/suunto_d9.c
index c0903bb..708070a 100644
--- a/src/suunto_d9.c
+++ b/src/suunto_d9.c
@@ -215,18 +215,18 @@ error_free:
static dc_status_t
suunto_d9_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
suunto_d9_device_t *device = (suunto_d9_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/suunto_eon.c b/src/suunto_eon.c
index e71e315..01b2743 100644
--- a/src/suunto_eon.c
+++ b/src/suunto_eon.c
@@ -135,18 +135,18 @@ error_free:
static dc_status_t
suunto_eon_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
suunto_eon_device_t *device = (suunto_eon_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/suunto_solution.c b/src/suunto_solution.c
index 421a090..2a2e8de 100644
--- a/src/suunto_solution.c
+++ b/src/suunto_solution.c
@@ -129,18 +129,18 @@ error_free:
static dc_status_t
suunto_solution_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
suunto_solution_device_t *device = (suunto_solution_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/suunto_vyper.c b/src/suunto_vyper.c
index 03fbc4a..a6bbfc1 100644
--- a/src/suunto_vyper.c
+++ b/src/suunto_vyper.c
@@ -161,18 +161,18 @@ error_free:
static dc_status_t
suunto_vyper_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
suunto_vyper_device_t *device = (suunto_vyper_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/suunto_vyper2.c b/src/suunto_vyper2.c
index efba846..66d3859 100644
--- a/src/suunto_vyper2.c
+++ b/src/suunto_vyper2.c
@@ -167,18 +167,18 @@ error_free:
static dc_status_t
suunto_vyper2_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
suunto_vyper2_device_t *device = (suunto_vyper2_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/uwatec_aladin.c b/src/uwatec_aladin.c
index 796e867..d4b1c83 100644
--- a/src/uwatec_aladin.c
+++ b/src/uwatec_aladin.c
@@ -142,18 +142,18 @@ error_free:
static dc_status_t
uwatec_aladin_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
uwatec_aladin_device_t *device = (uwatec_aladin_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/uwatec_memomouse.c b/src/uwatec_memomouse.c
index 9608cb5..12fc7a8 100644
--- a/src/uwatec_memomouse.c
+++ b/src/uwatec_memomouse.c
@@ -141,18 +141,18 @@ error_free:
static dc_status_t
uwatec_memomouse_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
uwatec_memomouse_device_t *device = (uwatec_memomouse_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/uwatec_meridian.c b/src/uwatec_meridian.c
index 4828a32..3689592 100644
--- a/src/uwatec_meridian.c
+++ b/src/uwatec_meridian.c
@@ -252,18 +252,18 @@ error_free:
static dc_status_t
uwatec_meridian_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
uwatec_meridian_device_t *device = (uwatec_meridian_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/uwatec_smart.c b/src/uwatec_smart.c
index 2b327ba..7d27cb5 100644
--- a/src/uwatec_smart.c
+++ b/src/uwatec_smart.c
@@ -216,18 +216,18 @@ error_free:
static dc_status_t
uwatec_smart_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
uwatec_smart_device_t *device = (uwatec_smart_device_t*) abstract;
// Close the device.
if (irda_socket_close (device->socket) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}
diff --git a/src/zeagle_n2ition3.c b/src/zeagle_n2ition3.c
index a98825a..2559a5a 100644
--- a/src/zeagle_n2ition3.c
+++ b/src/zeagle_n2ition3.c
@@ -201,18 +201,18 @@ error_free:
static dc_status_t
zeagle_n2ition3_device_close (dc_device_t *abstract)
{
+ dc_status_t status = DC_STATUS_SUCCESS;
zeagle_n2ition3_device_t *device = (zeagle_n2ition3_device_t*) abstract;
// Close the device.
if (serial_close (device->port) == -1) {
- free (device);
- return DC_STATUS_IO;
+ dc_status_set_error(&status, DC_STATUS_IO);
}
// Free memory.
free (device);
- return DC_STATUS_SUCCESS;
+ return status;
}