summaryrefslogtreecommitdiffstats
path: root/src/readwrite.c
diff options
context:
space:
mode:
authorGravatar abombe 1999-12-02 23:07:38 +0000
committerGravatar abombe 1999-12-02 23:07:38 +0000
commit0f5ef10baaba0890f7e9bed6545e0614b65e7884 (patch)
tree115fc38dea3113e5937f33fba540764e0802c80b /src/readwrite.c
Initial revision
git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@1 53a565d1-3bb7-0310-b661-cf11e63c67ab
Diffstat (limited to 'src/readwrite.c')
-rw-r--r--src/readwrite.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/readwrite.c b/src/readwrite.c
new file mode 100644
index 0000000..37e9f71
--- /dev/null
+++ b/src/readwrite.c
@@ -0,0 +1,96 @@
+
+#include <unistd.h>
+
+#include "raw1394.h"
+#include "kernel-raw1394.h"
+#include "raw1394_private.h"
+
+
+struct sync_cb_data {
+ int done;
+ int errcode;
+};
+
+static int sync_cb(struct raw1394_handle *unused,
+ struct sync_cb_data *data, int error)
+{
+ data->errcode = error;
+ data->done = 1;
+ return 0;
+}
+
+
+int raw1394_start_read(struct raw1394_handle *handle, nodeid_t node,
+ nodeaddr_t addr, size_t length, quadlet_t *buffer,
+ unsigned long tag)
+{
+ struct raw1394_request *req = &handle->req;
+
+ CLEAR_REQ(req);
+
+ req->type = RAW1394_REQ_ASYNC_READ;
+ req->generation = handle->generation;
+ req->tag = tag;
+
+ req->address = ((u_int64_t)node << 48) | addr;
+ req->length = length;
+ req->recvb = buffer;
+
+ return (int)write(handle->fd, req, sizeof(*req));
+}
+
+int raw1394_start_write(struct raw1394_handle *handle, nodeid_t node,
+ nodeaddr_t addr, size_t length, quadlet_t *data,
+ unsigned long tag)
+{
+ struct raw1394_request *req = &handle->req;
+
+ CLEAR_REQ(req);
+
+ req->type = RAW1394_REQ_ASYNC_WRITE;
+ req->generation = handle->generation;
+ req->tag = tag;
+
+ req->address = ((u_int64_t)node << 48) | addr;
+ req->length = length;
+ req->sendb = data;
+
+ return (int)write(handle->fd, req, sizeof(*req));
+}
+
+
+
+#define SYNCFUNC_VARS \
+ struct sync_cb_data sd = { 0, 0 }; \
+ struct raw1394_reqhandle rh = { (req_callback_t)sync_cb, &sd }; \
+ int err
+
+#define SYNCFUNC_BODY \
+ if (err < 0) return err; \
+ while (!sd.done) raw1394_loop_iterate(handle); \
+ return sd.errcode
+
+int raw1394_read(struct raw1394_handle *handle, nodeid_t node, nodeaddr_t addr,
+ size_t length, quadlet_t *buffer)
+{
+ SYNCFUNC_VARS;
+
+ err = raw1394_start_read(handle, node, addr, length, buffer,
+ (unsigned long)&rh);
+
+ SYNCFUNC_BODY;
+}
+
+int raw1394_write(struct raw1394_handle *handle, nodeid_t node, nodeaddr_t addr,
+ size_t length, quadlet_t *data)
+{
+ SYNCFUNC_VARS;
+
+ err = raw1394_start_write(handle, node, addr, length, data,
+ (unsigned long)&rh);
+
+ SYNCFUNC_BODY;
+}
+
+#undef SYNCFUNC_VARS
+#undef SYNCFUNC_BODY