diff --git a/libraw1394-2.0.0-coverity-prevent-fixes.patch b/libraw1394-2.0.0-coverity-prevent-fixes.patch deleted file mode 100644 index b6ec3c3..0000000 --- a/libraw1394-2.0.0-coverity-prevent-fixes.patch +++ /dev/null @@ -1,298 +0,0 @@ -From: Erik Hovland - -Series of coverity prevent-inspired fixes. - --- -Makes extra sure strings are not overrun. - -When using strncpy with the exact size of the destination string the -string may end up lacking null termination because the source string is -bigger then the destination. - --- -Makes sure to check any return values - -The return value of any function should be checked if that function -uses the return value to provide some sort of status information. - --- -Makes sure a value is returned by the function. - -A function can compile without returning something always. - --- -Make sure that we have the right types. - -When an unsigned type is assigned a signed value, the -negatived value is never seen. - - --- -Compare unsigned values instead of subtracting them. - -Unsigned values do not return signed values when subtracted -and the right operand is larger then the left operand. - --- -Protect against resource leaks. - --- -Make sure variables are initialized before used. - - -Signed-off-by: Erik Hovland ---- - - src/dispatch.c | 11 ++++++++--- - src/fw-iso.c | 11 +++++++---- - src/fw.c | 49 +++++++++++++++++++++++++++++-------------------- - tools/testlibraw.c | 3 ++- - 4 files changed, 46 insertions(+), 28 deletions(-) - -diff -Naurp libraw1394-2.0.0.orig/src/dispatch.c libraw1394-2.0.0/src/dispatch.c ---- libraw1394-2.0.0.orig/src/dispatch.c 2008-07-06 14:48:17.000000000 -0400 -+++ libraw1394-2.0.0/src/dispatch.c 2008-10-01 10:58:16.000000000 -0400 -@@ -48,7 +48,10 @@ raw1394handle_t raw1394_new_handle(void) - else if (handle) { - handle->is_fw = 1; - handle->mode.fw = fw_handle; -- } -+ } else if (fw_handle) -+ fw_destroy_handle(fw_handle); -+ else if (ieee1394_handle) -+ ieee1394_destroy_handle(ieee1394_handle); - } - return handle; - } -@@ -75,14 +78,16 @@ raw1394handle_t raw1394_new_handle_on_po - if (handle) { - handle->is_fw = 0; - handle->mode.ieee1394 = ieee1394_handle; -- } -+ } else -+ ieee1394_destroy_handle(ieee1394_handle); - } - else if (fw_handle = fw_new_handle_on_port(port)) { - handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); - if (handle) { - handle->is_fw = 1; - handle->mode.fw = fw_handle; -- } -+ } else -+ fw_destroy_handle(fw_handle); - } - return handle; - } -diff -Naurp libraw1394-2.0.0.orig/src/fw.c libraw1394-2.0.0/src/fw.c ---- libraw1394-2.0.0.orig/src/fw.c 2008-07-05 16:09:29.000000000 -0400 -+++ libraw1394-2.0.0/src/fw.c 2008-10-01 10:58:16.000000000 -0400 -@@ -125,7 +125,7 @@ scan_devices(fw_handle_t handle) - char filename[32]; - struct fw_cdev_get_info get_info; - struct fw_cdev_event_bus_reset reset; -- int fd, err, i; -+ int fd, err, i, fname_str_sz; - struct port *ports; - - ports = handle->ports; -@@ -162,8 +162,9 @@ scan_devices(fw_handle_t handle) - continue; - - if (i < MAX_PORTS && reset.node_id == reset.local_node_id) { -- strncpy(ports[i].device_file, filename, -- sizeof ports[i].device_file); -+ fname_str_sz = sizeof(ports[i].device_file) - 1; -+ strncpy(ports[i].device_file, filename, fname_str_sz); -+ ports[i].device_file[fname_str_sz] = '\0'; - ports[i].node_count = (reset.root_node_id & 0x3f) + 1; - ports[i].card = get_info.card; - i++; -@@ -315,7 +316,7 @@ handle_inotify(raw1394handle_t handle, s - struct fw_cdev_get_info info; - struct fw_cdev_event_bus_reset reset; - struct epoll_event ep; -- int i, len, fd, phy_id; -+ int i, len, fd, phy_id, fname_str_sz; - - event = (struct inotify_event *) fwhandle->buffer; - len = read(fwhandle->inotify_fd, event, BUFFER_SIZE); -@@ -365,8 +366,9 @@ handle_inotify(raw1394handle_t handle, s - fwhandle->devices[i].node_id = reset.node_id; - fwhandle->devices[i].generation = reset.generation; - fwhandle->devices[i].fd = fd; -- strncpy(fwhandle->devices[i].filename, filename, -- sizeof fwhandle->devices[i].filename); -+ fname_str_sz = sizeof(fwhandle->devices[i].filename) - 1; -+ strncpy(fwhandle->devices[i].filename, filename, fname_str_sz); -+ fwhandle->devices[i].filename[fname_str_sz] = '\0'; - fwhandle->devices[i].closure.func = handle_device_event; - ep.events = EPOLLIN; - ep.data.ptr = &fwhandle->devices[i].closure; -@@ -501,8 +503,10 @@ fw_handle_t fw_new_handle_on_port(int po - if (handle == NULL) - return NULL; - -- if (fw_set_port(handle, port) < 0) -+ if (fw_set_port(handle, port) < 0) { -+ fw_destroy_handle(handle); - return NULL; -+ } - - return handle; - } -@@ -538,15 +542,17 @@ int fw_get_port_info(fw_handle_t handle, - struct raw1394_portinfo *pinf, - int maxports) - { -- int i; -+ int i, port_name_sz; - - if (maxports >= handle->port_count) - maxports = handle->port_count; - - for (i = 0; i < maxports; i++) { - pinf[i].nodes = handle->ports[i].node_count; -+ port_name_sz = sizeof(pinf[i].name) - 1; - strncpy(pinf[i].name, handle->ports[i].device_file, -- sizeof pinf[i].name); -+ port_name_sz); -+ pinf[i].name[port_name_sz] = '\0'; - } - - return handle->port_count; -@@ -560,7 +566,7 @@ int fw_set_port(fw_handle_t handle, int - struct dirent *de; - char filename[32]; - DIR *dir; -- int i, fd, phy_id; -+ int i, fd, phy_id, fname_str_sz; - - if (port >= handle->port_count) { - errno = EINVAL; -@@ -606,8 +612,9 @@ int fw_set_port(fw_handle_t handle, int - handle->devices[i].node_id = reset.node_id; - handle->devices[i].generation = reset.generation; - handle->devices[i].fd = fd; -- strncpy(handle->devices[i].filename, filename, -- sizeof handle->devices[i].filename); -+ fname_str_sz = sizeof(handle->devices[i].filename) -1; -+ strncpy(handle->devices[i].filename, filename, fname_str_sz); -+ handle->devices[i].filename[fname_str_sz] = '\0'; - - handle->devices[i].closure.func = handle_device_event; - memset(&ep, 0, sizeof(ep)); -@@ -623,8 +630,9 @@ int fw_set_port(fw_handle_t handle, int - if (reset.node_id == reset.local_node_id) { - memcpy(&handle->reset, &reset, sizeof handle->reset); - handle->local_fd = fd; -- strncpy(handle->local_filename, filename, -- sizeof handle->local_filename); -+ fname_str_sz = sizeof(handle->local_filename) -1; -+ strncpy(handle->local_filename, filename, fname_str_sz); -+ handle->local_filename[fname_str_sz] = '\0'; - } - - i++; -@@ -1174,14 +1182,14 @@ fw_lock(raw1394handle_t handle, nodeid_t - quadlet_t *result) - { - quadlet_t buffer[2]; -- size_t length; -+ ssize_t length; - - length = setup_lock(extcode, data, arg, buffer); - if (length < 0) - return length; - - return send_request_sync(handle, 16 + extcode, node, addr, -- length, buffer, result); -+ (size_t) length, buffer, result); - } - - int -@@ -1190,14 +1198,14 @@ fw_lock64(raw1394handle_t handle, nodeid - octlet_t *result) - { - octlet_t buffer[2]; -- size_t length; -+ ssize_t length; - - length = setup_lock64(extcode, data, arg, buffer); - if (length < 0) - return length; - - return send_request_sync(handle, 16 + extcode, node, addr, -- length, buffer, result); -+ (size_t) length, buffer, result); - } - - int -@@ -1308,9 +1316,10 @@ fw_bandwidth_modify (raw1394handle_t han - compare = ntohl (buffer); - switch (mode) { - case RAW1394_MODIFY_ALLOC: -- swap = compare - bandwidth; -- if (swap < 0) -+ if (compare < bandwidth) - return -1; -+ -+ swap = compare - bandwidth; - break; - - case RAW1394_MODIFY_FREE: -diff -Naurp libraw1394-2.0.0.orig/src/fw-iso.c libraw1394-2.0.0/src/fw-iso.c ---- libraw1394-2.0.0.orig/src/fw-iso.c 2008-07-05 16:16:30.000000000 -0400 -+++ libraw1394-2.0.0/src/fw-iso.c 2008-10-01 10:58:40.000000000 -0400 -@@ -76,6 +76,7 @@ queue_packet(fw_handle_t handle, - if (err < 0) - return -1; - } -+ return 0; - } - - static int -@@ -84,7 +85,8 @@ queue_xmit_packets(raw1394handle_t handl - fw_handle_t fwhandle = handle->mode.fw; - enum raw1394_iso_disposition d; - unsigned char tag, sy; -- int len, cycle, dropped; -+ int len, cycle = -1; -+ unsigned int dropped = 0; - - if (fwhandle->iso.xmit_handler == NULL) - return 0; -@@ -259,6 +261,7 @@ int fw_iso_xmit_write(raw1394handle_t ha - struct fw_cdev_queue_iso queue_iso; - struct fw_cdev_start_iso start_iso; - struct fw_cdev_iso_packet *p; -+ int retval; - - if (len > fwhandle->iso.max_packet_size) { - errno = EINVAL; -@@ -283,10 +286,10 @@ int fw_iso_xmit_write(raw1394handle_t ha - start_iso.cycle = fwhandle->iso.start_on_cycle; - start_iso.handle = 0; - -- len = ioctl(fwhandle->iso.fd, -+ retval = ioctl(fwhandle->iso.fd, - FW_CDEV_IOC_START_ISO, &start_iso); -- if (len < 0) -- return len; -+ if (retval < 0) -+ return retval; - } - - return 0; -diff -Naurp libraw1394-2.0.0.orig/tools/testlibraw.c libraw1394-2.0.0/tools/testlibraw.c ---- libraw1394-2.0.0.orig/tools/testlibraw.c 2008-07-05 16:09:29.000000000 -0400 -+++ libraw1394-2.0.0/tools/testlibraw.c 2008-10-01 10:58:02.000000000 -0400 -@@ -180,7 +180,8 @@ int main(int argc, char **argv) - perror("failed"); - continue; - } -- raw1394_loop_iterate(handle); -+ if (raw1394_loop_iterate(handle)) -+ perror("failed"); - } - - printf("\nusing standard tag handler and synchronous calls\n"); diff --git a/libraw1394-2.0.0-fix-channel_modify.patch b/libraw1394-2.0.0-fix-channel_modify.patch deleted file mode 100644 index be35149..0000000 --- a/libraw1394-2.0.0-fix-channel_modify.patch +++ /dev/null @@ -1,96 +0,0 @@ -diff -Naurp libraw1394-2.0.0.orig/src/dispatch.c libraw1394-2.0.0.fix/src/dispatch.c ---- libraw1394-2.0.0.orig/src/dispatch.c 2008-12-05 11:37:36.686557198 -0500 -+++ libraw1394-2.0.0.fix/src/dispatch.c 2008-12-05 11:38:57.117432534 -0500 -@@ -553,10 +553,7 @@ int raw1394_channel_modify (raw1394handl - errno = EINVAL; - return -1; - } -- if (handle->is_fw) -- return fw_channel_modify(handle, channel, mode); -- else -- return ieee1394_channel_modify(handle, channel, mode); -+ return ieee1394_channel_modify(handle, channel, mode); - } - - int raw1394_iso_xmit_init(raw1394handle_t handle, -diff -Naurp libraw1394-2.0.0.orig/src/fw.c libraw1394-2.0.0.fix/src/fw.c ---- libraw1394-2.0.0.orig/src/fw.c 2008-12-05 11:37:36.689432892 -0500 -+++ libraw1394-2.0.0.fix/src/fw.c 2008-12-05 11:39:44.830509943 -0500 -@@ -1342,52 +1342,3 @@ fw_bandwidth_modify (raw1394handle_t han - - return 0; - } -- --int --fw_channel_modify (raw1394handle_t handle, -- unsigned int channel, -- enum raw1394_modify_mode mode) --{ -- quadlet_t buffer, compare, swap, bit; -- nodeaddr_t addr; -- int result; -- -- if (channel >= 64) -- return -1; -- addr = CSR_REGISTER_BASE + -- CSR_CHANNELS_AVAILABLE_HI + 4 * (channel / 32); -- /* Read currently available channels from IRM. */ -- result = raw1394_read(handle, raw1394_get_irm_id (handle), addr, -- sizeof buffer, &buffer); -- if (result < 0) -- return -1; -- -- /* IEEE numbers bits from MSB (0) to LSB (31). */ -- bit = 1 << (31 - (channel & 31)); -- compare = ntohl(buffer); -- switch (mode) { -- case RAW1394_MODIFY_ALLOC: -- if ((compare & bit) == 0) -- return -1; -- swap = buffer & ~bit; -- break; -- -- case RAW1394_MODIFY_FREE: -- if ((buffer & bit) != 0) -- return -1; -- swap = buffer | bit; -- break; -- -- default: -- return -1; -- } -- -- result = raw1394_lock (handle, raw1394_get_irm_id (handle), addr, -- RAW1394_EXTCODE_COMPARE_SWAP, -- htonl(swap), htonl(compare), &buffer); -- -- if (result < 0 || ntohl(buffer) != compare) -- return -1; -- -- return 0; --} -diff -Naurp libraw1394-2.0.0.orig/src/fw.h libraw1394-2.0.0.fix/src/fw.h ---- libraw1394-2.0.0.orig/src/fw.h 2008-07-05 16:16:30.000000000 -0400 -+++ libraw1394-2.0.0.fix/src/fw.h 2008-12-05 11:40:02.062495475 -0500 -@@ -214,9 +214,6 @@ int fw_get_config_rom(fw_handle_t handle - int fw_bandwidth_modify (raw1394handle_t handle, - unsigned int bandwidth, - enum raw1394_modify_mode mode); --int fw_channel_modify (raw1394handle_t handle, -- unsigned int channel, -- enum raw1394_modify_mode mode); - - int fw_iso_xmit_start(raw1394handle_t handle, int start_on_cycle, - int prebuffer_packets); -diff -Naurp libraw1394-2.0.0.orig/src/raw1394.h libraw1394-2.0.0.fix/src/raw1394.h ---- libraw1394-2.0.0.orig/src/raw1394.h 2008-07-06 15:03:31.000000000 -0400 -+++ libraw1394-2.0.0.fix/src/raw1394.h 2008-12-05 11:39:23.582432381 -0500 -@@ -1203,7 +1203,7 @@ raw1394_bandwidth_modify (raw1394handle_ - enum raw1394_modify_mode mode); - - /** -- * raw1394_bandwidth_modify - allocate or release isochronous channel -+ * raw1394_channel_modify - allocate or release isochronous channel - * @handle: a libraw1394 handle - * @channel: isochronous channel - * @mode: whether to allocate or free diff --git a/libraw1394-2.0.0-git-fixes.patch b/libraw1394-2.0.0-git-fixes.patch deleted file mode 100644 index c5ba75f..0000000 --- a/libraw1394-2.0.0-git-fixes.patch +++ /dev/null @@ -1,200 +0,0 @@ -diff -Naurp libraw1394-2.0.0/src/arm.c libraw1394-2.0.0.fix/src/arm.c ---- libraw1394-2.0.0/src/arm.c 2008-07-05 16:08:26.000000000 -0400 -+++ libraw1394-2.0.0.fix/src/arm.c 2008-11-20 12:37:05.136821199 -0500 -@@ -109,7 +109,6 @@ int ieee1394_arm_set_buf (struct ieee139 - size_t length, void *buf) - { - struct raw1394_request req; -- int status; - - CLEAR_REQ(&req); - -@@ -139,7 +138,6 @@ int ieee1394_arm_get_buf (struct ieee139 - size_t length, void *buf) - { - struct raw1394_request req; -- int status; - - CLEAR_REQ(&req); - -diff -Naurp libraw1394-2.0.0/src/dispatch.c libraw1394-2.0.0.fix/src/dispatch.c ---- libraw1394-2.0.0/src/dispatch.c 2008-11-20 12:36:00.918753368 -0500 -+++ libraw1394-2.0.0.fix/src/dispatch.c 2008-11-20 12:42:03.387817813 -0500 -@@ -24,36 +24,35 @@ int raw1394_errcode_to_errno(raw1394_err - - raw1394handle_t raw1394_new_handle(void) - { -- ieee1394handle_t ieee1394_handle = ieee1394_new_handle(); -- fw_handle_t fw_handle = NULL; -- raw1394handle_t handle = NULL; -- -- if (ieee1394_handle) { -- struct raw1394_portinfo port; -- if (ieee1394_get_port_info(ieee1394_handle, &port, 1) < 1) { -- ieee1394_destroy_handle(ieee1394_handle); -- ieee1394_handle = NULL; -- fw_handle = fw_new_handle(); -- } -- } -- else { -- fw_handle = fw_new_handle(); -- } -- if (ieee1394_handle || fw_handle) { -- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); -- if (ieee1394_handle && handle) { -- handle->is_fw = 0; -- handle->mode.ieee1394 = ieee1394_handle; -- } -- else if (handle) { -- handle->is_fw = 1; -- handle->mode.fw = fw_handle; -- } else if (fw_handle) -- fw_destroy_handle(fw_handle); -- else if (ieee1394_handle) -- ieee1394_destroy_handle(ieee1394_handle); -+ ieee1394handle_t ieee1394_handle; -+ fw_handle_t fw_handle; -+ raw1394handle_t handle; -+ struct raw1394_portinfo port; -+ -+ handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); -+ if (!handle) -+ return NULL; -+ -+ ieee1394_handle = ieee1394_new_handle(); -+ if (!ieee1394_handle) -+ goto try_fw; -+ -+ if (ieee1394_get_port_info(ieee1394_handle, &port, 1) >= 1) { -+ handle->is_fw = 0; -+ handle->mode.ieee1394 = ieee1394_handle; -+ return handle; -+ } -+ ieee1394_destroy_handle(ieee1394_handle); -+try_fw: -+ fw_handle = fw_new_handle(); -+ if (fw_handle) { -+ handle->is_fw = 1; -+ handle->mode.fw = fw_handle; -+ return handle; - } -- return handle; -+ -+ free(handle); -+ return NULL; - } - - void raw1394_destroy_handle(raw1394handle_t handle) -@@ -69,27 +68,30 @@ void raw1394_destroy_handle(raw1394handl - - raw1394handle_t raw1394_new_handle_on_port(int port) - { -- ieee1394handle_t ieee1394_handle = ieee1394_new_handle_on_port(port); -- fw_handle_t fw_handle = NULL; -- raw1394handle_t handle = NULL; -+ ieee1394handle_t ieee1394_handle; -+ fw_handle_t fw_handle; -+ raw1394handle_t handle; -+ -+ handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); -+ if (!handle) -+ return NULL; - -+ ieee1394_handle = ieee1394_new_handle_on_port(port); - if (ieee1394_handle) { -- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); -- if (handle) { -- handle->is_fw = 0; -- handle->mode.ieee1394 = ieee1394_handle; -- } else -- ieee1394_destroy_handle(ieee1394_handle); -- } -- else if (fw_handle = fw_new_handle_on_port(port)) { -- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); -- if (handle) { -- handle->is_fw = 1; -- handle->mode.fw = fw_handle; -- } else -- fw_destroy_handle(fw_handle); -+ handle->is_fw = 0; -+ handle->mode.ieee1394 = ieee1394_handle; -+ return handle; - } -- return handle; -+ -+ fw_handle = fw_new_handle_on_port(port); -+ if (fw_handle) { -+ handle->is_fw = 1; -+ handle->mode.fw = fw_handle; -+ return handle; -+ } -+ -+ free(handle); -+ return NULL; - } - - int raw1394_busreset_notify (raw1394handle_t handle, int off_on_switch) -diff -Naurp libraw1394-2.0.0/src/eventloop.c libraw1394-2.0.0.fix/src/eventloop.c ---- libraw1394-2.0.0/src/eventloop.c 2008-07-06 14:41:48.000000000 -0400 -+++ libraw1394-2.0.0.fix/src/eventloop.c 2008-11-20 12:38:22.289816445 -0500 -@@ -32,7 +32,7 @@ int ieee1394_loop_iterate(struct raw1394 - { - struct raw1394_request req; - ieee1394handle_t ihandle = handle->mode.ieee1394; -- int retval = 0, channel; -+ int retval = 0; - - while (read(ihandle->fd, &req, sizeof(req)) < 0) { - if (errno != EINTR) return -1; -diff -Naurp libraw1394-2.0.0/src/fw.c libraw1394-2.0.0.fix/src/fw.c ---- libraw1394-2.0.0/src/fw.c 2008-11-20 12:36:00.920753360 -0500 -+++ libraw1394-2.0.0.fix/src/fw.c 2008-11-20 12:43:13.017816248 -0500 -@@ -773,10 +773,12 @@ handle_arm_request(raw1394handle_t handl - } - rrb->request.generation = fwhandle->reset.generation; - rrb->request.buffer_length = in_length; -+ rrb->request.buffer = rrb->data; - memcpy(rrb->request.buffer, request->data, in_length); - - rrb->response.response_code = response.rcode; - rrb->response.buffer_length = response.length; -+ rrb->request.buffer = rrb->data + in_length; - memcpy(rrb->response.buffer, - allocation->data + offset, response.length); - -diff -Naurp libraw1394-2.0.0/src/fw-iso.c libraw1394-2.0.0.fix/src/fw-iso.c ---- libraw1394-2.0.0/src/fw-iso.c 2008-11-20 12:36:00.921763895 -0500 -+++ libraw1394-2.0.0.fix/src/fw-iso.c 2008-11-20 12:39:35.003793770 -0500 -@@ -85,7 +85,8 @@ queue_xmit_packets(raw1394handle_t handl - fw_handle_t fwhandle = handle->mode.fw; - enum raw1394_iso_disposition d; - unsigned char tag, sy; -- int len, cycle = -1; -+ unsigned int len; -+ int cycle = -1; - unsigned int dropped = 0; - - if (fwhandle->iso.xmit_handler == NULL) -@@ -258,9 +259,7 @@ int fw_iso_xmit_write(raw1394handle_t ha - unsigned char sy) - { - fw_handle_t fwhandle = handle->mode.fw; -- struct fw_cdev_queue_iso queue_iso; - struct fw_cdev_start_iso start_iso; -- struct fw_cdev_iso_packet *p; - int retval; - - if (len > fwhandle->iso.max_packet_size) { -diff -Naurp libraw1394-2.0.0/src/main.c libraw1394-2.0.0.fix/src/main.c ---- libraw1394-2.0.0/src/main.c 2008-07-06 14:50:34.000000000 -0400 -+++ libraw1394-2.0.0.fix/src/main.c 2008-11-20 12:40:02.828816470 -0500 -@@ -253,9 +253,7 @@ void *raw1394_get_userdata(struct raw139 - int ieee1394_get_port_info(struct ieee1394_handle *handle, - struct raw1394_portinfo *pinf, int maxports) - { -- int num; - struct raw1394_request req; -- struct raw1394_khost_list *khl; - - CLEAR_REQ(&req); - req.type = RAW1394_REQ_LIST_CARDS; diff --git a/libraw1394-2.0.0-git-update.patch b/libraw1394-2.0.0-git-update.patch new file mode 100644 index 0000000..9324063 --- /dev/null +++ b/libraw1394-2.0.0-git-update.patch @@ -0,0 +1,993 @@ + Makefile.am | 23 ---- + src/arm.c | 2 - + src/dispatch.c | 102 ++++++++++--------- + src/eventloop.c | 2 +- + src/fw-iso.c | 40 ++++++-- + src/fw.c | 143 +++++--------------------- + src/fw.h | 7 +- + src/main.c | 2 - + src/raw1394.h | 2 +- + tools/testlibraw.c | 285 ++++++++++++++++++++++++++++++---------------------- + 10 files changed, 279 insertions(+), 329 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index f48af74..bf094f0 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -23,28 +23,5 @@ htmldoc: + + .PHONY: doc psdoc pdfdoc htmldoc + +-# make required device file +-dev: +- mknod -m 600 /dev/raw1394 c 171 0 +- chown root.root /dev/raw1394 +- @echo +- @echo "/dev/raw1394 created" +- @echo "It is owned by root with permissions 600. You may want to fix" +- @echo "the group/permission to something appropriate for you." +- @echo "Note however that anyone who can open raw1394 can access all" +- @echo "devices on all connected 1394 buses unrestricted, including" +- @echo "harddisks and other probably sensitive devices." +- @echo +- +-install-exec-hook: +- @if [ ! -c /dev/raw1394 ]; then \ +- echo; \ +- echo "********************************************"; \ +- echo "Required /dev/raw1394 device file not found."; \ +- echo "Run 'make dev' to create it."; \ +- echo "********************************************"; \ +- echo; \ +- fi +- + dist-hook: + git log >$(distdir)/ChangeLog +diff --git a/src/arm.c b/src/arm.c +index c523c00..27ad762 100644 +--- a/src/arm.c ++++ b/src/arm.c +@@ -109,7 +109,6 @@ int ieee1394_arm_set_buf (struct ieee1394_handle *handle, nodeaddr_t start, + size_t length, void *buf) + { + struct raw1394_request req; +- int status; + + CLEAR_REQ(&req); + +@@ -139,7 +138,6 @@ int ieee1394_arm_get_buf (struct ieee1394_handle *handle, nodeaddr_t start, + size_t length, void *buf) + { + struct raw1394_request req; +- int status; + + CLEAR_REQ(&req); + +diff --git a/src/dispatch.c b/src/dispatch.c +index b15e8c5..49ceca2 100644 +--- a/src/dispatch.c ++++ b/src/dispatch.c +@@ -24,33 +24,35 @@ int raw1394_errcode_to_errno(raw1394_errcode_t errcode) + + raw1394handle_t raw1394_new_handle(void) + { +- ieee1394handle_t ieee1394_handle = ieee1394_new_handle(); +- fw_handle_t fw_handle = NULL; +- raw1394handle_t handle = NULL; ++ ieee1394handle_t ieee1394_handle; ++ fw_handle_t fw_handle; ++ raw1394handle_t handle; ++ struct raw1394_portinfo port; + +- if (ieee1394_handle) { +- struct raw1394_portinfo port; +- if (ieee1394_get_port_info(ieee1394_handle, &port, 1) < 1) { +- ieee1394_destroy_handle(ieee1394_handle); +- ieee1394_handle = NULL; +- fw_handle = fw_new_handle(); +- } +- } +- else { +- fw_handle = fw_new_handle(); +- } +- if (ieee1394_handle || fw_handle) { +- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); +- if (ieee1394_handle && handle) { +- handle->is_fw = 0; +- handle->mode.ieee1394 = ieee1394_handle; +- } +- else if (handle) { +- handle->is_fw = 1; +- handle->mode.fw = fw_handle; +- } +- } +- return handle; ++ handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); ++ if (!handle) ++ return NULL; ++ ++ ieee1394_handle = ieee1394_new_handle(); ++ if (!ieee1394_handle) ++ goto try_fw; ++ ++ if (ieee1394_get_port_info(ieee1394_handle, &port, 1) >= 1) { ++ handle->is_fw = 0; ++ handle->mode.ieee1394 = ieee1394_handle; ++ return handle; ++ } ++ ieee1394_destroy_handle(ieee1394_handle); ++try_fw: ++ fw_handle = fw_new_handle(); ++ if (fw_handle) { ++ handle->is_fw = 1; ++ handle->mode.fw = fw_handle; ++ return handle; ++ } ++ ++ free(handle); ++ return NULL; + } + + void raw1394_destroy_handle(raw1394handle_t handle) +@@ -61,30 +63,36 @@ void raw1394_destroy_handle(raw1394handle_t handle) + if (handle->is_fw) + fw_destroy_handle(handle->mode.fw); + else +- ieee1394_destroy_handle(handle->mode.ieee1394);; ++ ieee1394_destroy_handle(handle->mode.ieee1394); ++ free(handle); + } + + raw1394handle_t raw1394_new_handle_on_port(int port) + { +- ieee1394handle_t ieee1394_handle = ieee1394_new_handle_on_port(port); +- fw_handle_t fw_handle = NULL; +- raw1394handle_t handle = NULL; ++ ieee1394handle_t ieee1394_handle; ++ fw_handle_t fw_handle; ++ raw1394handle_t handle; ++ ++ handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); ++ if (!handle) ++ return NULL; + ++ ieee1394_handle = ieee1394_new_handle_on_port(port); + if (ieee1394_handle) { +- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); +- if (handle) { +- handle->is_fw = 0; +- handle->mode.ieee1394 = ieee1394_handle; +- } ++ handle->is_fw = 0; ++ handle->mode.ieee1394 = ieee1394_handle; ++ return handle; + } +- else if (fw_handle = fw_new_handle_on_port(port)) { +- handle = (raw1394handle_t) malloc(sizeof(struct raw1394_handle)); +- if (handle) { +- handle->is_fw = 1; +- handle->mode.fw = fw_handle; +- } ++ ++ fw_handle = fw_new_handle_on_port(port); ++ if (fw_handle) { ++ handle->is_fw = 1; ++ handle->mode.fw = fw_handle; ++ return handle; + } +- return handle; ++ ++ free(handle); ++ return NULL; + } + + int raw1394_busreset_notify (raw1394handle_t handle, int off_on_switch) +@@ -533,10 +541,7 @@ int raw1394_bandwidth_modify (raw1394handle_t handle, unsigned int bandwidth, + errno = EINVAL; + return -1; + } +- if (handle->is_fw) +- return fw_bandwidth_modify(handle, bandwidth, mode); +- else +- return ieee1394_bandwidth_modify(handle, bandwidth, mode); ++ return ieee1394_bandwidth_modify(handle, bandwidth, mode); + } + + int raw1394_channel_modify (raw1394handle_t handle, unsigned int channel, +@@ -546,10 +551,7 @@ int raw1394_channel_modify (raw1394handle_t handle, unsigned int channel, + errno = EINVAL; + return -1; + } +- if (handle->is_fw) +- return fw_channel_modify(handle, channel, mode); +- else +- return ieee1394_channel_modify(handle, channel, mode); ++ return ieee1394_channel_modify(handle, channel, mode); + } + + int raw1394_iso_xmit_init(raw1394handle_t handle, +diff --git a/src/eventloop.c b/src/eventloop.c +index 43a9519..81bb881 100644 +--- a/src/eventloop.c ++++ b/src/eventloop.c +@@ -32,7 +32,7 @@ int ieee1394_loop_iterate(struct raw1394_handle *handle) + { + struct raw1394_request req; + ieee1394handle_t ihandle = handle->mode.ieee1394; +- int retval = 0, channel; ++ int retval = 0; + + while (read(ihandle->fd, &req, sizeof(req)) < 0) { + if (errno != EINTR) return -1; +diff --git a/src/fw-iso.c b/src/fw-iso.c +index f493444..6a84662 100644 +--- a/src/fw-iso.c ++++ b/src/fw-iso.c +@@ -1,6 +1,6 @@ + /* -*- c-basic-offset: 8 -*- + * +- * raw1394-iso.c -- Emulation of the raw1394 rawiso API on the firewire stack ++ * fw-iso.c -- Emulation of the raw1394 rawiso API on the firewire stack + * + * Copyright (C) 2007 Kristian Hoegsberg + * +@@ -76,6 +76,7 @@ queue_packet(fw_handle_t handle, + if (err < 0) + return -1; + } ++ return 0; + } + + static int +@@ -84,7 +85,9 @@ queue_xmit_packets(raw1394handle_t handle, int limit) + fw_handle_t fwhandle = handle->mode.fw; + enum raw1394_iso_disposition d; + unsigned char tag, sy; +- int len, cycle, dropped; ++ unsigned int len; ++ int cycle = -1; ++ unsigned int dropped = 0; + + if (fwhandle->iso.xmit_handler == NULL) + return 0; +@@ -138,7 +141,14 @@ int fw_iso_xmit_start(raw1394handle_t handle, int start_on_cycle, + return retval; + } + +- return queue_xmit_packets(handle, fwhandle->iso.buf_packets); ++ retval = queue_xmit_packets(handle, fwhandle->iso.buf_packets); ++ ++ if (retval) ++ return -1; ++ else ++ fwhandle->iso.state = ISO_ACTIVE; ++ ++ return 0; + } + + static int +@@ -221,7 +231,12 @@ int fw_iso_recv_start(fw_handle_t handle, int start_on_cycle, + start_iso.sync = 0; + start_iso.handle = 0; + +- return ioctl(handle->iso.fd, FW_CDEV_IOC_START_ISO, &start_iso); ++ if (ioctl(handle->iso.fd, FW_CDEV_IOC_START_ISO, &start_iso)) ++ return -1; ++ else ++ handle->iso.state = ISO_ACTIVE; ++ ++ return 0; + } + + static int handle_iso_event(raw1394handle_t handle, +@@ -256,9 +271,8 @@ int fw_iso_xmit_write(raw1394handle_t handle, unsigned char *data, + unsigned char sy) + { + fw_handle_t fwhandle = handle->mode.fw; +- struct fw_cdev_queue_iso queue_iso; + struct fw_cdev_start_iso start_iso; +- struct fw_cdev_iso_packet *p; ++ int retval; + + if (len > fwhandle->iso.max_packet_size) { + errno = EINVAL; +@@ -283,10 +297,10 @@ int fw_iso_xmit_write(raw1394handle_t handle, unsigned char *data, + start_iso.cycle = fwhandle->iso.start_on_cycle; + start_iso.handle = 0; + +- len = ioctl(fwhandle->iso.fd, ++ retval = ioctl(fwhandle->iso.fd, + FW_CDEV_IOC_START_ISO, &start_iso); +- if (len < 0) +- return len; ++ if (retval < 0) ++ return retval; + } + + return 0; +@@ -443,6 +457,7 @@ iso_init(fw_handle_t handle, int type, + handle->iso.head = handle->iso.buffer; + handle->iso.tail = handle->iso.buffer; + handle->iso.first_payload = handle->iso.buffer; ++ handle->iso.state = ISO_STOPPED; + + return 0; + } +@@ -519,15 +534,20 @@ void fw_iso_stop(fw_handle_t handle) + handle->iso.first_payload = handle->iso.buffer; + handle->iso.packet_phase = 0; + handle->iso.packet_count = 0; ++ handle->iso.packet_index = 0; ++ handle->iso.state = ISO_STOPPED; + } + + void fw_iso_shutdown(fw_handle_t handle) + { + munmap(handle->iso.buffer, + handle->iso.buf_packets * handle->iso.max_packet_size); ++ if (handle->iso.state != ISO_STOPPED) ++ fw_iso_stop(handle); + close(handle->iso.fd); + free(handle->iso.packets); + handle->iso.packets = NULL; ++ handle->iso.fd = -1; + } + + int fw_read_cycle_timer(fw_handle_t handle, +@@ -537,7 +557,7 @@ int fw_read_cycle_timer(fw_handle_t handle, + int err; + struct fw_cdev_get_cycle_timer ctr = { 0 }; + +- err = ioctl(handle->iso.fd, FW_CDEV_IOC_GET_CYCLE_TIMER, &ctr); ++ err = ioctl(handle->local_fd, FW_CDEV_IOC_GET_CYCLE_TIMER, &ctr); + if (!err) { + *cycle_timer = ctr.cycle_timer; + *local_time = ctr.local_time; +diff --git a/src/fw.c b/src/fw.c +index 3c61385..03e34a7 100644 +--- a/src/fw.c ++++ b/src/fw.c +@@ -125,7 +125,7 @@ scan_devices(fw_handle_t handle) + char filename[32]; + struct fw_cdev_get_info get_info; + struct fw_cdev_event_bus_reset reset; +- int fd, err, i; ++ int fd, err, i, fname_str_sz; + struct port *ports; + + ports = handle->ports; +@@ -162,8 +162,9 @@ scan_devices(fw_handle_t handle) + continue; + + if (i < MAX_PORTS && reset.node_id == reset.local_node_id) { +- strncpy(ports[i].device_file, filename, +- sizeof ports[i].device_file); ++ fname_str_sz = sizeof(ports[i].device_file) - 1; ++ strncpy(ports[i].device_file, filename, fname_str_sz); ++ ports[i].device_file[fname_str_sz] = '\0'; + ports[i].node_count = (reset.root_node_id & 0x3f) + 1; + ports[i].card = get_info.card; + i++; +@@ -315,7 +316,7 @@ handle_inotify(raw1394handle_t handle, struct epoll_closure *ec, + struct fw_cdev_get_info info; + struct fw_cdev_event_bus_reset reset; + struct epoll_event ep; +- int i, len, fd, phy_id; ++ int i, len, fd, phy_id, fname_str_sz; + + event = (struct inotify_event *) fwhandle->buffer; + len = read(fwhandle->inotify_fd, event, BUFFER_SIZE); +@@ -365,8 +366,9 @@ handle_inotify(raw1394handle_t handle, struct epoll_closure *ec, + fwhandle->devices[i].node_id = reset.node_id; + fwhandle->devices[i].generation = reset.generation; + fwhandle->devices[i].fd = fd; +- strncpy(fwhandle->devices[i].filename, filename, +- sizeof fwhandle->devices[i].filename); ++ fname_str_sz = sizeof(fwhandle->devices[i].filename) - 1; ++ strncpy(fwhandle->devices[i].filename, filename, fname_str_sz); ++ fwhandle->devices[i].filename[fname_str_sz] = '\0'; + fwhandle->devices[i].closure.func = handle_device_event; + ep.events = EPOLLIN; + ep.data.ptr = &fwhandle->devices[i].closure; +@@ -501,8 +503,10 @@ fw_handle_t fw_new_handle_on_port(int port) + if (handle == NULL) + return NULL; + +- if (fw_set_port(handle, port) < 0) ++ if (fw_set_port(handle, port) < 0) { ++ fw_destroy_handle(handle); + return NULL; ++ } + + return handle; + } +@@ -538,15 +542,17 @@ int fw_get_port_info(fw_handle_t handle, + struct raw1394_portinfo *pinf, + int maxports) + { +- int i; ++ int i, port_name_sz; + + if (maxports >= handle->port_count) + maxports = handle->port_count; + + for (i = 0; i < maxports; i++) { + pinf[i].nodes = handle->ports[i].node_count; ++ port_name_sz = sizeof(pinf[i].name) - 1; + strncpy(pinf[i].name, handle->ports[i].device_file, +- sizeof pinf[i].name); ++ port_name_sz); ++ pinf[i].name[port_name_sz] = '\0'; + } + + return handle->port_count; +@@ -560,7 +566,7 @@ int fw_set_port(fw_handle_t handle, int port) + struct dirent *de; + char filename[32]; + DIR *dir; +- int i, fd, phy_id; ++ int i, fd, phy_id, fname_str_sz; + + if (port >= handle->port_count) { + errno = EINVAL; +@@ -606,8 +612,9 @@ int fw_set_port(fw_handle_t handle, int port) + handle->devices[i].node_id = reset.node_id; + handle->devices[i].generation = reset.generation; + handle->devices[i].fd = fd; +- strncpy(handle->devices[i].filename, filename, +- sizeof handle->devices[i].filename); ++ fname_str_sz = sizeof(handle->devices[i].filename) -1; ++ strncpy(handle->devices[i].filename, filename, fname_str_sz); ++ handle->devices[i].filename[fname_str_sz] = '\0'; + + handle->devices[i].closure.func = handle_device_event; + memset(&ep, 0, sizeof(ep)); +@@ -623,8 +630,9 @@ int fw_set_port(fw_handle_t handle, int port) + if (reset.node_id == reset.local_node_id) { + memcpy(&handle->reset, &reset, sizeof handle->reset); + handle->local_fd = fd; +- strncpy(handle->local_filename, filename, +- sizeof handle->local_filename); ++ fname_str_sz = sizeof(handle->local_filename) -1; ++ strncpy(handle->local_filename, filename, fname_str_sz); ++ handle->local_filename[fname_str_sz] = '\0'; + } + + i++; +@@ -765,10 +773,12 @@ handle_arm_request(raw1394handle_t handle, struct address_closure *ac, + } + rrb->request.generation = fwhandle->reset.generation; + rrb->request.buffer_length = in_length; ++ rrb->request.buffer = rrb->data; + memcpy(rrb->request.buffer, request->data, in_length); + + rrb->response.response_code = response.rcode; + rrb->response.buffer_length = response.length; ++ rrb->response.buffer = rrb->data + in_length; + memcpy(rrb->response.buffer, + allocation->data + offset, response.length); + +@@ -1174,14 +1184,14 @@ fw_lock(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr, + quadlet_t *result) + { + quadlet_t buffer[2]; +- size_t length; ++ ssize_t length; + + length = setup_lock(extcode, data, arg, buffer); + if (length < 0) + return length; + + return send_request_sync(handle, 16 + extcode, node, addr, +- length, buffer, result); ++ (size_t) length, buffer, result); + } + + int +@@ -1190,14 +1200,14 @@ fw_lock64(raw1394handle_t handle, nodeid_t node, nodeaddr_t addr, + octlet_t *result) + { + octlet_t buffer[2]; +- size_t length; ++ ssize_t length; + + length = setup_lock64(extcode, data, arg, buffer); + if (length < 0) + return length; + + return send_request_sync(handle, 16 + extcode, node, addr, +- length, buffer, result); ++ (size_t) length, buffer, result); + } + + int +@@ -1283,100 +1293,3 @@ fw_get_config_rom(fw_handle_t handle, quadlet_t *buffer, + + return 0; + } +- +-#define MAXIMUM_BANDWIDTH 4915 +- +-int +-fw_bandwidth_modify (raw1394handle_t handle, +- unsigned int bandwidth, +- enum raw1394_modify_mode mode) +-{ +- quadlet_t buffer, compare, swap; +- nodeaddr_t addr; +- int result; +- +- if (bandwidth == 0) +- return 0; +- +- addr = CSR_REGISTER_BASE + CSR_BANDWIDTH_AVAILABLE; +- /* Read current bandwidth usage from IRM. */ +- result = raw1394_read (handle, raw1394_get_irm_id (handle), addr, +- sizeof buffer, &buffer); +- if (result < 0) +- return -1; +- +- compare = ntohl (buffer); +- switch (mode) { +- case RAW1394_MODIFY_ALLOC: +- swap = compare - bandwidth; +- if (swap < 0) +- return -1; +- break; +- +- case RAW1394_MODIFY_FREE: +- swap = compare + bandwidth; +- if (swap > MAXIMUM_BANDWIDTH) +- swap = MAXIMUM_BANDWIDTH; +- break; +- +- default: +- return -1; +- } +- +- result = raw1394_lock(handle, raw1394_get_irm_id (handle), addr, +- RAW1394_EXTCODE_COMPARE_SWAP, +- htonl(swap), htonl(compare), &buffer); +- if (result < 0 || ntohl(buffer) != compare) +- return -1; +- +- return 0; +-} +- +-int +-fw_channel_modify (raw1394handle_t handle, +- unsigned int channel, +- enum raw1394_modify_mode mode) +-{ +- quadlet_t buffer, compare, swap, bit; +- nodeaddr_t addr; +- int result; +- +- if (channel >= 64) +- return -1; +- addr = CSR_REGISTER_BASE + +- CSR_CHANNELS_AVAILABLE_HI + 4 * (channel / 32); +- /* Read currently available channels from IRM. */ +- result = raw1394_read(handle, raw1394_get_irm_id (handle), addr, +- sizeof buffer, &buffer); +- if (result < 0) +- return -1; +- +- /* IEEE numbers bits from MSB (0) to LSB (31). */ +- bit = 1 << (31 - (channel & 31)); +- compare = ntohl(buffer); +- switch (mode) { +- case RAW1394_MODIFY_ALLOC: +- if ((compare & bit) == 0) +- return -1; +- swap = buffer & ~bit; +- break; +- +- case RAW1394_MODIFY_FREE: +- if ((buffer & bit) != 0) +- return -1; +- swap = buffer | bit; +- break; +- +- default: +- return -1; +- } +- +- result = raw1394_lock (handle, raw1394_get_irm_id (handle), addr, +- RAW1394_EXTCODE_COMPARE_SWAP, +- htonl(swap), htonl(compare), &buffer); +- +- if (result < 0 || ntohl(buffer) != compare) +- return -1; +- +- return 0; +-} +diff --git a/src/fw.h b/src/fw.h +index 4ee9017..56b59d9 100644 +--- a/src/fw.h ++++ b/src/fw.h +@@ -129,6 +129,7 @@ struct fw_handle { + int prebuffer; + int start_on_cycle; + enum raw1394_iso_dma_recv_mode recv_mode; ++ enum { ISO_STOPPED, ISO_ACTIVE } state; + raw1394_iso_xmit_handler_t xmit_handler; + raw1394_iso_recv_handler_t recv_handler; + unsigned char *buffer, *buffer_end, *head; +@@ -211,12 +212,6 @@ int fw_update_config_rom(fw_handle_t handle, const quadlet_t *new_rom, + int fw_get_config_rom(fw_handle_t handle, quadlet_t *buffer, + size_t buffersize, size_t *rom_size, + unsigned char *rom_version); +-int fw_bandwidth_modify (raw1394handle_t handle, +- unsigned int bandwidth, +- enum raw1394_modify_mode mode); +-int fw_channel_modify (raw1394handle_t handle, +- unsigned int channel, +- enum raw1394_modify_mode mode); + + int fw_iso_xmit_start(raw1394handle_t handle, int start_on_cycle, + int prebuffer_packets); +diff --git a/src/main.c b/src/main.c +index 55b4fbc..d83256e 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -253,9 +253,7 @@ void *raw1394_get_userdata(struct raw1394_handle *handle) + int ieee1394_get_port_info(struct ieee1394_handle *handle, + struct raw1394_portinfo *pinf, int maxports) + { +- int num; + struct raw1394_request req; +- struct raw1394_khost_list *khl; + + CLEAR_REQ(&req); + req.type = RAW1394_REQ_LIST_CARDS; +diff --git a/src/raw1394.h b/src/raw1394.h +index c489c20..7bfeb05 100644 +--- a/src/raw1394.h ++++ b/src/raw1394.h +@@ -1203,7 +1203,7 @@ raw1394_bandwidth_modify (raw1394handle_t handle, unsigned int bandwidth, + enum raw1394_modify_mode mode); + + /** +- * raw1394_bandwidth_modify - allocate or release isochronous channel ++ * raw1394_channel_modify - allocate or release isochronous channel + * @handle: a libraw1394 handle + * @channel: isochronous channel + * @mode: whether to allocate or free +diff --git a/tools/testlibraw.c b/tools/testlibraw.c +index efd87ad..82b8ee5 100644 +--- a/tools/testlibraw.c ++++ b/tools/testlibraw.c +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + + #include "../src/raw1394.h" +@@ -53,8 +54,8 @@ static const unsigned char fcp_data[] = + int my_fcp_handler(raw1394handle_t handle, nodeid_t nodeid, int response, + size_t length, unsigned char *data) + { +- printf("got fcp %s from node %d of %d bytes:", +- (response ? "response" : "command"), nodeid & 0x3f, length); ++ printf(" got fcp %s from node %d of %d bytes:", ++ (response ? "response" : "command"), nodeid & 0x3f, length); + + if (memcmp(fcp_data, data, sizeof fcp_data) != 0) + printf("ERROR: fcp payload not correct\n"); +@@ -73,7 +74,7 @@ int my_fcp_handler(raw1394handle_t handle, nodeid_t nodeid, int response, + static void + test_fcp(raw1394handle_t handle) + { +- printf("\ntesting FCP monitoring on local node\n"); ++ printf("\n - testing FCP monitoring on local node\n"); + raw1394_set_fcp_handler(handle, my_fcp_handler); + raw1394_start_fcp_listen(handle); + raw1394_write(handle, raw1394_get_local_id(handle), +@@ -95,142 +96,188 @@ read_topology_map(raw1394handle_t handle) + + retval = raw1394_read(handle, local_id, + CSR_REGISTER_BASE + CSR_TOPOLOGY_MAP, 12, &map[0]); +- if (retval < 0) +- perror("topology map: raw1394_read failed with error"); +- ++ if (retval < 0) { ++ perror("\n - topology map: raw1394_read failed with error"); ++ return; ++ } ++ + self_id_count = ntohl(map[2]) & 0xffff; + node_count = ntohl(map[2]) >> 16; + retval = raw1394_read(handle, local_id, + CSR_REGISTER_BASE + CSR_TOPOLOGY_MAP + 12, + self_id_count * sizeof map[0], &map[3]); +- if (retval < 0) +- perror("topology map: raw1394_read failed with error"); ++ if (retval < 0) { ++ perror("\n - topology map: raw1394_read failed with error"); ++ return; ++ } + +- printf("topology map: %d nodes, %d self ids, generation %d\n", ++ printf("\n - topology map: %d nodes, %d self ids, generation %d\n", + node_count, self_id_count, ntohl(map[1])); + for (i = 0; i < self_id_count; i++) +- printf(" 0x%08x\n", ntohl(map[3 + i])); ++ printf(" 0x%08x\n", ntohl(map[3 + i])); + } + +-int main(int argc, char **argv) ++static void ++test_config_rom(raw1394handle_t handle) + { +- raw1394handle_t handle; +- int i, numcards; +- struct raw1394_portinfo pinf[16]; +- +- tag_handler_t std_handler; +- int retval; +- +- struct pollfd pfd; +- quadlet_t rom[0x100]; +- size_t rom_size; +- unsigned char rom_version; +- +- handle = raw1394_new_handle(); +- +- if (!handle) { +- if (!errno) { +- printf(not_compatible); +- } else { +- perror("couldn't get handle"); +- printf(not_loaded); +- } +- exit(1); +- } +- +- printf("successfully got handle\n"); +- printf("current generation number: %d\n", raw1394_get_generation(handle)); +- +- numcards = raw1394_get_port_info(handle, pinf, 16); +- if (numcards < 0) { +- perror("couldn't get card info"); +- exit(1); +- } else { +- printf("%d card(s) found\n", numcards); +- } +- +- if (!numcards) { +- exit(0); +- } +- +- for (i = 0; i < numcards; i++) { +- printf(" nodes on bus: %2d, card name: %s\n", pinf[i].nodes, +- pinf[i].name); +- } +- +- if (raw1394_set_port(handle, 0) < 0) { +- perror("couldn't set port"); +- exit(1); +- } ++ quadlet_t rom[0x100] = { 0, }; ++ size_t rom_size; ++ unsigned char rom_version; ++ int i, retval; ++ ++ printf("\n - testing config rom\n"); ++ retval = raw1394_get_config_rom(handle, rom, 0x100, ++ &rom_size, &rom_version); ++ printf(" get_config_rom returned %d, romsize %d, rom_version %d\n", ++ retval, rom_size, rom_version); ++ printf(" here are the first 10 quadlets:\n"); ++ for (i = 0; i < 10; i++) ++ printf(" 0x%08x\n", i, rom[i]); ++ ++ retval = raw1394_update_config_rom(handle, rom, rom_size, rom_version); ++ printf(" update_config_rom returned %d\n", retval); ++} + +- printf("using first card found: %d nodes on bus, local ID is %d, IRM is %d\n", +- raw1394_get_nodecount(handle), +- raw1394_get_local_id(handle) & 0x3f, +- raw1394_get_irm_id(handle) & 0x3f); +- +- printf("\ndoing transactions with custom tag handler\n"); +- std_handler = raw1394_set_tag_handler(handle, my_tag_handler); +- for (i = 0; i < pinf[0].nodes; i++) { +- printf("trying to send read request to node %d... ", i); +- fflush(stdout); +- buffer = 0; +- +- if (raw1394_start_read(handle, 0xffc0 | i, TESTADDR, 4, +- &buffer, 0) < 0) { +- perror("failed"); +- continue; +- } +- raw1394_loop_iterate(handle); +- } ++static void ++read_cycle_timer(raw1394handle_t handle) ++{ ++ u_int32_t ct; ++ u_int64_t local_time; ++ time_t seconds; ++ int retval; ++ ++ retval = raw1394_read_cycle_timer(handle, &ct, &local_time); ++ if (retval < 0) { ++ perror("\n - raw1394_read_cycle_timer failed with error"); ++ return; ++ } ++ ++ printf("\n - cycle timer: %d seconds, %d cycles, %d sub-cycles\n", ++ ct >> 25, (ct >> 12) & 0x1fff, ct & 0xfff); ++ seconds = local_time / 1000000; ++ printf(" local time: %lld us = %s", ++ (unsigned long long)local_time, ctime(&seconds)); ++} + +- printf("\nusing standard tag handler and synchronous calls\n"); +- raw1394_set_tag_handler(handle, std_handler); +- for (i = 0; i < pinf[0].nodes; i++) { +- printf("trying to read from node %d... ", i); +- fflush(stdout); +- buffer = 0; +- +- retval = raw1394_read(handle, 0xffc0 | i, TESTADDR, 4, &buffer); +- if (retval < 0) { +- perror("failed with error"); +- } else { +- printf("completed with value 0x%08x\n", buffer); +- } +- } ++int test_card(int card) ++{ ++ raw1394handle_t handle; ++ struct raw1394_portinfo pinf; ++ tag_handler_t std_handler; ++ struct pollfd pfd; ++ int i, n, numcards, retval; ++ ++ handle = raw1394_new_handle(); ++ ++ if (!handle) { ++ if (!errno) { ++ printf(not_compatible); ++ } else { ++ perror("couldn't get handle"); ++ printf(not_loaded); ++ } ++ return -1; ++ } ++ ++ if (card == 0) { ++ printf("successfully got handle\n"); ++ printf("current generation number: %d\n", ++ raw1394_get_generation(handle)); ++ } ++ ++ numcards = raw1394_get_port_info(handle, &pinf, 1); ++ if (numcards < card) ++ perror("couldn't get card info"); ++ else if (card == 0) ++ printf("%d card%s found\n", ++ numcards, numcards == 1 ? "" : "s"); ++ ++ if (numcards <= card) ++ goto out; ++ ++ printf("\ncard %d, name: %s\n", card, pinf.name); ++ ++ if (raw1394_set_port(handle, card) < 0) { ++ perror("couldn't set port"); ++ goto out; ++ } ++ ++ n = raw1394_get_nodecount(handle); ++ printf("%d nodes on bus, local ID is %d, IRM is %d\n", ++ n, ++ raw1394_get_local_id(handle) & 0x3f, ++ raw1394_get_irm_id(handle) & 0x3f); ++ ++ if (n > 0) { ++ printf("\n - doing transactions with custom tag handler\n"); ++ std_handler = raw1394_set_tag_handler(handle, my_tag_handler); ++ } ++ for (i = 0; i < n; i++) { ++ printf(" read from node %d... ", i); ++ fflush(stdout); ++ buffer = 0; ++ ++ if (raw1394_start_read(handle, 0xffc0 | i, TESTADDR, 4, ++ &buffer, 0) < 0) { ++ perror("failed"); ++ continue; ++ } ++ if (raw1394_loop_iterate(handle)) ++ perror("failed"); ++ } ++ ++ if (n > 0) { ++ printf("\n - using standard tag handler and synchronous calls\n"); ++ raw1394_set_tag_handler(handle, std_handler); ++ } ++ for (i = 0; i < n; i++) { ++ printf(" read from node %d... ", i); ++ fflush(stdout); ++ buffer = 0; ++ ++ retval = raw1394_read(handle, 0xffc0 | i, TESTADDR, 4, &buffer); ++ if (retval < 0) ++ perror("failed with error"); ++ else ++ printf("completed with value 0x%08x\n", buffer); ++ } + + test_fcp(handle); + read_topology_map(handle); ++ test_config_rom(handle); ++ read_cycle_timer(handle); + +- printf("testing config rom stuff\n"); +- memset(rom, 0, sizeof(rom)); +- retval=raw1394_get_config_rom(handle, rom, 0x100, &rom_size, &rom_version); +- printf("get_config_rom returned %d, romsize %d, rom_version %d\n",retval,rom_size,rom_version); +- printf("here are the first 10 quadlets:\n"); +- for (i = 0; i < 10; i++) +- printf("%d. quadlet: 0x%08x\n",i,rom[i]); +- +- /* some manipulation */ +-/* printf("incrementing 2nd quadlet\n"); +- rom[0x02/4]++; +-*/ +- retval=raw1394_update_config_rom(handle, rom, rom_size, rom_version); +- printf("update_config_rom returned %d\n",retval); +- +- printf("\nposting 0xdeadbeef as an echo request\n"); ++ printf("\n - posting 0xdeadbeef as an echo request\n"); + raw1394_echo_request(handle, 0xdeadbeef); + +- printf("polling for leftover messages\n"); +- pfd.fd = raw1394_get_fd(handle); +- pfd.events = POLLIN; +- pfd.revents = 0; +- while (1) { +- retval = poll(&pfd, 1, 10); +- if (retval < 1) break; ++ printf(" polling for leftover messages\n"); ++ pfd.fd = raw1394_get_fd(handle); ++ pfd.events = POLLIN; ++ pfd.revents = 0; ++ while (1) { ++ retval = poll(&pfd, 1, 10); ++ if (retval < 1) ++ break; + retval = raw1394_loop_iterate(handle); + if (retval != 0) +- printf("raw1394_loop_iterate() returned 0x%08x\n", retval); +- } ++ printf(" raw1394_loop_iterate() returned 0x%08x\n", ++ retval); ++ } ++ ++ if (retval < 0) ++ perror("poll failed"); ++out: ++ raw1394_destroy_handle(handle); ++ return numcards; ++} ++ ++int main(int argc, char **argv) ++{ ++ int card = 0, numcards; ++ ++ do ++ numcards = test_card(card); ++ while (++card < numcards); + +- if (retval < 0) perror("poll failed"); +- exit(0); ++ return numcards < 0; + } diff --git a/libraw1394.spec b/libraw1394.spec index f6918a9..8d6a948 100644 --- a/libraw1394.spec +++ b/libraw1394.spec @@ -1,13 +1,11 @@ Summary: Library providing low-level IEEE-1394 access Name: libraw1394 Version: 2.0.0 -Release: 4%{?dist} +Release: 5%{?dist} License: LGPLv2+ Group: System Environment/Libraries Source: http://www.linux1394.org/dl/libraw1394-%{version}.tar.gz -Patch0: libraw1394-2.0.0-coverity-prevent-fixes.patch -Patch1: libraw1394-2.0.0-git-fixes.patch -Patch2: libraw1394-2.0.0-fix-channel_modify.patch +Patch0: libraw1394-2.0.0-git-update.patch URL: http://www.linux1394.org/ ExcludeArch: s390 s390x BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -31,8 +29,6 @@ Development libraries needed to build applications against libraw1394. %prep %setup -q %patch0 -p1 -%patch1 -p1 -%patch2 -p1 %build %configure --disable-static @@ -71,6 +67,10 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Mon Dec 08 2008 Jarod Wilson - 2.0.0-5 +- Fix up iso stop command so starting/stopping/starting iso reception works +- Plug firewire handle leak + * Fri Dec 05 2008 Jarod Wilson - 2.0.0-4 - Fix channel modify code, should make iso reception work reliably now