summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar aeb 2001-01-19 01:11:48 +0000
committerGravatar aeb 2001-01-19 01:11:48 +0000
commite6015ce5e9be81881102e33ed3139fc11bb233cc (patch)
treedf9981bade81a4784f69f3f0da427a61ed4c2ee2
parentFix misplaced device file in Debian installation. (diff)
First implementation of new error reporting API.
git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@49 53a565d1-3bb7-0310-b661-cf11e63c67ab
-rw-r--r--configure.in8
-rw-r--r--src/errors.c88
-rw-r--r--src/eventloop.c3
-rw-r--r--src/main.c3
-rw-r--r--src/raw1394.h37
-rw-r--r--src/raw1394_private.h5
-rw-r--r--src/readwrite.c18
7 files changed, 134 insertions, 28 deletions
diff --git a/configure.in b/configure.in
index 763daa5..0aadf1d 100644
--- a/configure.in
+++ b/configure.in
@@ -1,7 +1,7 @@
# process this file with autoconf to get a configure script
AC_INIT(Makefile.am)
-AM_INIT_AUTOMAKE(libraw1394, 0.8.2)
+AM_INIT_AUTOMAKE(libraw1394, 0.9pre)
AM_CONFIG_HEADER(config.h)
AC_PROG_CC
@@ -9,11 +9,13 @@ AM_PROG_LIBTOOL
AC_PROG_INSTALL
AC_CHECK_SIZEOF(void *, 8)
+AC_C_CONST
+AC_C_BIGENDIAN
# set the libtool so version numbers
lt_major=5
-lt_revision=0
-lt_age=1
+lt_revision=1
+lt_age=0
AC_SUBST(lt_major)
AC_SUBST(lt_revision)
diff --git a/src/errors.c b/src/errors.c
new file mode 100644
index 0000000..a81c0ea
--- /dev/null
+++ b/src/errors.c
@@ -0,0 +1,88 @@
+/*
+ * libraw1394 - library for raw access to the 1394 bus with the Linux subsystem.
+ *
+ * Copyright (C) 1999,2000 Andreas Bombe
+ *
+ * This library is licensed under the GNU Lesser General Public License (LGPL),
+ * version 2.1 or later. See the file COPYING.LIB in the distribution for
+ * details.
+ */
+
+#include <config.h>
+#include <errno.h>
+
+#include "raw1394.h"
+#include "kernel-raw1394.h"
+#include "raw1394_private.h"
+
+raw1394_errcode_t raw1394_get_errcode(struct raw1394_handle *handle)
+{
+ return handle->err;
+}
+
+int raw1394_errcode_to_errno(raw1394_errcode_t errcode)
+{
+ static const int ack2errno[16] = {
+ 0xdead, /* invalid ack code */
+ 0, /* ack_complete */
+ 0xdead, /* ack_pending, should not be used here */
+ EAGAIN, /* busy_x, busy_a and busy_b acks */
+ EAGAIN,
+ EAGAIN,
+ 0xdead, /* invalid ack codes */
+ 0xdead,
+ 0xdead,
+ 0xdead,
+ 0xdead,
+ 0xdead,
+ 0xdead,
+ EREMOTEIO, /* ack_data_error */
+ EPERM, /* ack_type_error */
+ 0xdead /* invalid ack code */
+ };
+ static const int rcode2errno[16] = {
+ 0, /* rcode_complete */
+ 0xdead, /* invalid rcodes */
+ 0xdead,
+ 0xdead,
+ EAGAIN, /* rcode_conflict_error */
+ EREMOTEIO, /* rcode_data_error */
+ EPERM, /* rcode_type_error */
+ EINVAL, /* rcode_address_error */
+ 0xdead, /* invalid rcodes */
+ 0xdead,
+ 0xdead,
+ 0xdead,
+ 0xdead,
+ 0xdead,
+ 0xdead,
+ 0xdead
+ };
+
+ if (!raw1394_internal_err(errcode)) {
+ if (raw1394_get_ack(errcode) == L1394_ACK_PENDING)
+ return rcode2errno[raw1394_get_rcode(errcode)];
+ else
+ return ack2errno[raw1394_get_ack(errcode)];
+ }
+
+ switch (raw1394_get_internal(errcode)) {
+ case RAW1394_ERROR_GENERATION:
+ case RAW1394_ERROR_SEND_ERROR:
+ case RAW1394_ERROR_ABORTED:
+ case RAW1394_ERROR_TIMEOUT:
+ return EAGAIN;
+
+ case RAW1394_ERROR_MEMFAULT:
+ return EFAULT;
+
+ case RAW1394_ERROR_COMPAT:
+ case RAW1394_ERROR_STATE_ORDER:
+ case RAW1394_ERROR_INVALID_ARG:
+ case RAW1394_ERROR_ALREADY:
+ case RAW1394_ERROR_EXCESSIVE:
+ case RAW1394_ERROR_UNTIDY_LEN:
+ default:
+ return EINVAL;
+ }
+}
diff --git a/src/eventloop.c b/src/eventloop.c
index 813acb4..080d42a 100644
--- a/src/eventloop.c
+++ b/src/eventloop.c
@@ -45,6 +45,9 @@ int raw1394_loop_iterate(struct raw1394_handle *handle)
case RAW1394_REQ_ISO_RECEIVE:
channel = (handle->buffer[0] >> 8) & 0x3f;
+#ifndef WORDS_BIGENDIAN
+ /* swap(buffer[0]); */
+#endif
if (handle->iso_handler[channel]) {
retval = handle->iso_handler[channel](handle, channel,
diff --git a/src/main.c b/src/main.c
index 744543c..20745c5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -76,7 +76,7 @@ static unsigned int init_rawdevice(struct raw1394_handle *h)
}
-struct raw1394_handle *raw1394_get_handle(void)
+struct raw1394_handle *raw1394_new_handle(void)
{
struct raw1394_handle *handle;
@@ -99,6 +99,7 @@ struct raw1394_handle *raw1394_get_handle(void)
return NULL;
}
+ handle->err = 0;
handle->bus_reset_handler = bus_reset_default;
handle->tag_handler = tag_handler_default;
memset(handle->iso_handler, 0, sizeof(handle->iso_handler));
diff --git a/src/raw1394.h b/src/raw1394.h
index 2e080e5..d3a207e 100644
--- a/src/raw1394.h
+++ b/src/raw1394.h
@@ -8,21 +8,28 @@ typedef u_int64_t octlet_t;
typedef u_int64_t nodeaddr_t;
typedef u_int16_t nodeid_t;
-
typedef struct raw1394_handle *raw1394handle_t;
-
#ifdef __cplusplus
-extern "C" {
+//extern "C" {
#endif
+typedef int raw1394_errcode_t;
+#define raw1394_make_errcode(ack, rcode) (((ack) << 16) | rcode)
+#define raw1394_internal_err(errcode) ((errcode) < 0)
+#define raw1394_get_ack(errcode) ((errcode) >> 16)
+#define raw1394_get_rcode(errcode) ((errcode) & 0xf)
+#define raw1394_get_internal(errcode) (errcode)
+raw1394_errcode_t raw1394_get_errcode(raw1394handle_t);
+int raw1394_errcode_to_errno(raw1394_errcode_t);
+
/*
* Required as initialization. One handle can control one port, it is possible
- * to use multiple handles. raw1394_get_handle returns NULL for failure,
- * raw1394_destroy_handle accepts NULL. If raw1394_get_handle returns NULL and
+ * to use multiple handles. raw1394_new_handle returns NULL for failure,
+ * raw1394_destroy_handle accepts NULL. If raw1394_new_handle returns NULL and
* errno is 0, this version of libraw1394 is incompatible with the kernel.
*/
-raw1394handle_t raw1394_get_handle(void);
+raw1394handle_t raw1394_new_handle(void);
void raw1394_destroy_handle(raw1394handle_t handle);
/*
@@ -96,7 +103,8 @@ bus_reset_handler_t raw1394_set_bus_reset_handler(raw1394handle_t handle,
* The default action is to call the callback in the raw1394_reqhandle pointed
* to by tag. Returns old handler.
*/
-typedef int (*tag_handler_t)(raw1394handle_t, unsigned long tag, int errcode);
+typedef int (*tag_handler_t)(raw1394handle_t, unsigned long tag,
+ raw1394_errcode_t err);
tag_handler_t raw1394_set_tag_handler(raw1394handle_t handle,
tag_handler_t new_h);
@@ -132,7 +140,8 @@ fcp_handler_t raw1394_set_fcp_handler(raw1394handle_t, fcp_handler_t);
* when a request completes, it calls the callback and passes it the data
* pointer and the error code of the request.
*/
-typedef int (*req_callback_t)(raw1394handle_t, void *data, int errcode);
+typedef int (*req_callback_t)(raw1394handle_t, void *data,
+ raw1394_errcode_t err);
struct raw1394_reqhandle {
req_callback_t callback;
void *data;
@@ -146,10 +155,10 @@ int raw1394_start_read(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
size_t length, quadlet_t *buffer, unsigned long tag);
int raw1394_start_write(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
size_t length, quadlet_t *data, unsigned long tag);
-int raw1394_start_lock(struct raw1394_handle *handle, nodeid_t node,
- nodeaddr_t addr, unsigned int extcode, quadlet_t data,
- quadlet_t arg, quadlet_t *result, unsigned long tag);
-int raw1394_start_iso_write(struct raw1394_handle *handle, unsigned int channel,
+int raw1394_start_lock(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
+ unsigned int extcode, quadlet_t data, quadlet_t arg,
+ quadlet_t *result, unsigned long tag);
+int raw1394_start_iso_write(raw1394handle_t handle, unsigned int channel,
unsigned int tag, unsigned int sy,
unsigned int speed, size_t length, quadlet_t *data,
unsigned long rawtag);
@@ -163,10 +172,10 @@ int raw1394_read(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
size_t length, quadlet_t *buffer);
int raw1394_write(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
size_t length, quadlet_t *data);
-int raw1394_lock(struct raw1394_handle *handle, nodeid_t node, nodeaddr_t addr,
+int raw1394_lock(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr,
unsigned int extcode, quadlet_t data, quadlet_t arg,
quadlet_t *result);
-int raw1394_iso_write(struct raw1394_handle *handle, unsigned int channel,
+int raw1394_iso_write(raw1394handle_t handle, unsigned int channel,
unsigned int tag, unsigned int sy, unsigned int speed,
size_t length, quadlet_t *data);
diff --git a/src/raw1394_private.h b/src/raw1394_private.h
index 616ac75..7b414c8 100644
--- a/src/raw1394_private.h
+++ b/src/raw1394_private.h
@@ -11,6 +11,9 @@ struct raw1394_handle {
int num_of_nodes;
nodeid_t irm_id;
+ raw1394_errcode_t err;
+ void *userdata;
+
bus_reset_handler_t bus_reset_handler;
tag_handler_t tag_handler;
fcp_handler_t fcp_handler;
@@ -18,8 +21,6 @@ struct raw1394_handle {
struct raw1394_request req;
quadlet_t buffer[2048];
-
- void *userdata;
};
struct sync_cb_data {
diff --git a/src/readwrite.c b/src/readwrite.c
index a983c30..c4a571b 100644
--- a/src/readwrite.c
+++ b/src/readwrite.c
@@ -120,14 +120,16 @@ int raw1394_start_iso_write(struct raw1394_handle *handle, unsigned int channel,
struct sync_cb_data sd = { 0, 0 }; \
struct raw1394_reqhandle rh = { (req_callback_t)_raw1394_sync_cb, \
&sd }; \
- int err
-
-#define SYNCFUNC_BODY \
- while (!sd.done) { \
- if (err < 0) return err; \
- err = raw1394_loop_iterate(handle); \
- } \
- return sd.errcode
+ int err = 0
+
+#define SYNCFUNC_BODY \
+ while (!sd.done) { \
+ if (err < 0) return err; \
+ err = raw1394_loop_iterate(handle); \
+ } \
+ handle->err = sd.errcode; \
+ errno = raw1394_errcode_to_errno(sd.errcode); \
+ return (errno ? -1 : 0)
int raw1394_read(struct raw1394_handle *handle, nodeid_t node, nodeaddr_t addr,
size_t length, quadlet_t *buffer)