From 14d9587ed1a9c329ba4ab0aeadcc1c446348b130 Mon Sep 17 00:00:00 2001 From: Jarod Wilson Date: Thu, 15 Jan 2009 15:11:20 +0000 Subject: [PATCH] - Update to libraw1394 v2.0.1 release --- .cvsignore | 1 + libraw1394-2.0.0-git-update.patch | 993 ------------------ ...no-ENOSYS-in-unimplemented-functions.patch | 59 -- ...work-without-write-on-local-node-dev.patch | 245 ----- libraw1394.spec | 13 +- sources | 2 +- 6 files changed, 7 insertions(+), 1306 deletions(-) delete mode 100644 libraw1394-2.0.0-git-update.patch delete mode 100644 libraw1394-use-errno-ENOSYS-in-unimplemented-functions.patch delete mode 100644 libraw1394-work-without-write-on-local-node-dev.patch diff --git a/.cvsignore b/.cvsignore index 22da05b..1059d3a 100644 --- a/.cvsignore +++ b/.cvsignore @@ -4,3 +4,4 @@ fw-device-cdev.h libraw1394-1.3.0.tar.gz libraw1394-2.0.0-20080430_git.tar.bz2 libraw1394-2.0.0.tar.gz +libraw1394-2.0.1.tar.gz diff --git a/libraw1394-2.0.0-git-update.patch b/libraw1394-2.0.0-git-update.patch deleted file mode 100644 index 9324063..0000000 --- a/libraw1394-2.0.0-git-update.patch +++ /dev/null @@ -1,993 +0,0 @@ - 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-use-errno-ENOSYS-in-unimplemented-functions.patch b/libraw1394-use-errno-ENOSYS-in-unimplemented-functions.patch deleted file mode 100644 index 741b78e..0000000 --- a/libraw1394-use-errno-ENOSYS-in-unimplemented-functions.patch +++ /dev/null @@ -1,59 +0,0 @@ -Date: Sun, 11 Jan 2009 22:39:17 +0100 (CET) -From: Stefan Richter -Subject: [PATCH libraw1394 fix] Set errno = ENOSYS in unimplemented functions -To: Dan Dennedy -Cc: linux1394-devel@lists.sourceforge.net - -Most of them do this already, only a few missed it. - -Signed-off-by: Stefan Richter ---- - src/fw.c | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - -diff --git a/src/fw.c b/src/fw.c -index 3f5d806..ba3a807 100644 ---- a/src/fw.c -+++ b/src/fw.c -@@ -1104,6 +1104,7 @@ fw_start_async_stream(fw_handle_t handle, unsigned int channel, - unsigned long rawtag) - { - /* FIXME: implement this? */ -+ errno = ENOSYS; - return -1; - } - -@@ -1115,6 +1116,7 @@ fw_start_async_send(fw_handle_t handle, - quadlet_t *data, unsigned long rawtag) - { - /* FIXME: implement this? */ -+ errno = ENOSYS; - return -1; - } - -@@ -1233,6 +1235,7 @@ fw_async_stream(fw_handle_t handle, unsigned int channel, - size_t length, quadlet_t *data) - { - /* FIXME: implement this? */ -+ errno = ENOSYS; - return -1; - } - -@@ -1243,6 +1246,7 @@ fw_async_send(fw_handle_t handle, - quadlet_t *data) - { - /* FIXME: implement this? */ -+ errno = ENOSYS; - return -1; - } - -@@ -1284,6 +1288,7 @@ int - fw_update_config_rom(fw_handle_t handle, const quadlet_t *new_rom, - size_t size, unsigned char rom_version) - { -+ errno = ENOSYS; - return -1; - } - --- -1.6.0.6 diff --git a/libraw1394-work-without-write-on-local-node-dev.patch b/libraw1394-work-without-write-on-local-node-dev.patch deleted file mode 100644 index f0985c5..0000000 --- a/libraw1394-work-without-write-on-local-node-dev.patch +++ /dev/null @@ -1,245 +0,0 @@ -Date: Sat, 10 Jan 2009 21:14:50 +0100 (CET) -From: Stefan Richter -Subject: Re: [PATCH libraw1394] Work without permission to access local node's - /dev/fw* -To: Dan Dennedy -Cc: linux1394-devel@lists.sourceforge.net, - dcm@acm.org - -On 10 Jan, Stefan Richter wrote: -> --- a/src/fw.c -> +++ b/src/fw.c -> @@ -125,17 +125,19 @@ 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, fname_str_sz; -> + int fd, err, i, j, fname_str_sz; -> struct port *ports; -> -> ports = handle->ports; -> memset(ports, 0, sizeof handle->ports); -> + for (i = 0; i < MAX_PORTS; i++) -> + ports[i].card = -1; -> + - -The memset is not necessary. - - -From: Stefan Richter -Subject: [PATCH] Work without permission to access local node's /dev/fw* - -Fix for juju backend: - -libraw1394 required write permission to the character device file of -the local node(s) in order to enumerate cards and for a number of -other operations. This forced users to either run applications like -dvgrab and kino with elevated privileges, or to configure write -permission for all /dev/fw* or at least for local nodes' /dev/fw*. - -We now use the first accessible file which was found for each card -for as many tasks as possible, instead of the local node's file. - -This allows distributors or admins to implement stricter access -rights (default off, e.g. only on for AV/C and IIDC devices) -without sacrificing functionality of said class of applications. -Access to the local node is now only required by low-level tools -like gscanbus. - -Signed-off-by: Stefan Richter ---- - src/fw-iso.c | 4 ++-- - src/fw.c | 50 +++++++++++++++++++++++++++++++++----------------- - src/fw.h | 6 +++--- - 3 files changed, 38 insertions(+), 22 deletions(-) - -diff --git a/src/fw-iso.c b/src/fw-iso.c -index 6a84662..a87259b 100644 ---- a/src/fw-iso.c -+++ b/src/fw-iso.c -@@ -407,7 +407,7 @@ iso_init(fw_handle_t handle, int type, - if (handle->iso.packets == NULL) - return -1; - -- handle->iso.fd = open(handle->local_filename, O_RDWR); -+ handle->iso.fd = open(handle->iso.filename, O_RDWR); - if (handle->iso.fd < 0) { - free(handle->iso.packets); - handle->iso.packets = NULL; -@@ -557,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->local_fd, FW_CDEV_IOC_GET_CYCLE_TIMER, &ctr); -+ err = ioctl(handle->ioctl_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 e211b60..3f5d806 100644 ---- a/src/fw.c -+++ b/src/fw.c -@@ -125,17 +125,18 @@ 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, fname_str_sz; -+ int fd, err, i, j, fname_str_sz; - struct port *ports; - - ports = handle->ports; -- memset(ports, 0, sizeof handle->ports); -+ for (i = 0; i < MAX_PORTS; i++) -+ ports[i].card = -1; -+ - dir = opendir(FW_DEVICE_DIR); - if (dir == NULL) - return -1; - -- i = 0; -- while (1) { -+ for (i = 0; i < MAX_PORTS; ) { - de = readdir(dir); - if (de == NULL) - break; -@@ -161,7 +162,10 @@ scan_devices(fw_handle_t handle) - if (err < 0) - continue; - -- if (i < MAX_PORTS && reset.node_id == reset.local_node_id) { -+ for (j = 0; j < i; j++) -+ if (ports[j].card == get_info.card) -+ break; -+ if (j == i) { - 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'; -@@ -626,20 +630,27 @@ int fw_set_port(fw_handle_t handle, int port) - return -1; - } - -- handle->generation = reset.generation; -- if (reset.node_id == reset.local_node_id) { -+ if (handle->iso.filename == NULL) { - memcpy(&handle->reset, &reset, sizeof handle->reset); -- handle->local_fd = fd; -- fname_str_sz = sizeof(handle->local_filename) -1; -- strncpy(handle->local_filename, filename, fname_str_sz); -- handle->local_filename[fname_str_sz] = '\0'; -+ handle->iso.filename = handle->devices[i].filename; -+ handle->ioctl_fd = fd; - } - -+ if (reset.node_id == reset.local_node_id) -+ handle->local_device = &handle->devices[i]; -+ -+ handle->generation = reset.generation; -+ - i++; - } - - closedir(dir); - -+ if (i == 0) { -+ errno = ENODEV; -+ return -1; -+ } -+ - return 0; - } - -@@ -656,7 +667,7 @@ int fw_reset_bus_new(fw_handle_t handle, int type) - break; - } - -- return ioctl(handle->local_fd, -+ return ioctl(handle->ioctl_fd, - FW_CDEV_IOC_INITIATE_BUS_RESET, &initiate); - } - -@@ -817,7 +828,7 @@ fw_arm_register(fw_handle_t handle, nodeaddr_t start, - request.length = length; - request.closure = ptr_to_u64(&allocation->closure); - -- retval = ioctl(handle->local_fd, FW_CDEV_IOC_ALLOCATE, &request); -+ retval = ioctl(handle->ioctl_fd, FW_CDEV_IOC_ALLOCATE, &request); - if (retval < 0) { - free(allocation); - return -1; -@@ -863,7 +874,7 @@ fw_arm_unregister(fw_handle_t handle, nodeaddr_t start) - request.handle = allocation->handle; - free(allocation); - -- return ioctl(handle->local_fd, FW_CDEV_IOC_DEALLOCATE, &request); -+ return ioctl(handle->ioctl_fd, FW_CDEV_IOC_DEALLOCATE, &request); - } - - int -@@ -1251,7 +1262,7 @@ fw_start_fcp_listen(fw_handle_t handle) - request.offset = CSR_REGISTER_BASE + CSR_FCP_COMMAND; - request.length = CSR_FCP_END - CSR_FCP_COMMAND; - request.closure = ptr_to_u64(closure); -- if (ioctl(handle->local_fd, FW_CDEV_IOC_ALLOCATE, &request) < 0) -+ if (ioctl(handle->ioctl_fd, FW_CDEV_IOC_ALLOCATE, &request) < 0) - return -1; - - handle->fcp_allocation_handle = request.handle; -@@ -1266,7 +1277,7 @@ fw_stop_fcp_listen(fw_handle_t handle) - - request.handle = handle->fcp_allocation_handle; - -- return ioctl(handle->local_fd, FW_CDEV_IOC_DEALLOCATE, &request); -+ return ioctl(handle->ioctl_fd, FW_CDEV_IOC_DEALLOCATE, &request); - } - - int -@@ -1284,13 +1295,18 @@ fw_get_config_rom(fw_handle_t handle, quadlet_t *buffer, - struct fw_cdev_get_info get_info; - int err; - -+ if (handle->local_device == NULL) { -+ errno = EPERM; -+ return -1; -+ } -+ - memset(&get_info, 0, sizeof(get_info)); - get_info.version = FW_CDEV_VERSION; - get_info.rom = ptr_to_u64(buffer); - get_info.rom_length = buffersize; - get_info.bus_reset = 0; - -- err = ioctl(handle->local_fd, FW_CDEV_IOC_GET_INFO, &get_info); -+ err = ioctl(handle->local_device->fd, FW_CDEV_IOC_GET_INFO, &get_info); - if (err) - return err; - -diff --git a/src/fw.h b/src/fw.h -index 56b59d9..a5e3772 100644 ---- a/src/fw.h -+++ b/src/fw.h -@@ -101,6 +101,7 @@ struct fw_handle { - __u32 fcp_allocation_handle; - struct allocation *allocations; - -+ int ioctl_fd; - int epoll_fd; - int inotify_fd; - int inotify_watch; -@@ -110,13 +111,12 @@ struct fw_handle { - struct epoll_closure inotify_closure; - - struct device devices[MAX_DEVICES]; -+ struct device *local_device; - int nodes[MAX_DEVICES]; -- int local_fd; -- char local_filename[FILENAME_SIZE]; -- - struct fw_cdev_event_bus_reset reset; - - struct { -+ char *filename; - struct epoll_closure closure; - int fd; - int type; --- -1.6.0.6 diff --git a/libraw1394.spec b/libraw1394.spec index 29dd0ea..99d9c7a 100644 --- a/libraw1394.spec +++ b/libraw1394.spec @@ -1,13 +1,10 @@ Summary: Library providing low-level IEEE-1394 access Name: libraw1394 -Version: 2.0.0 -Release: 6%{?dist} +Version: 2.0.1 +Release: 1%{?dist} License: LGPLv2+ Group: System Environment/Libraries Source: http://www.linux1394.org/dl/libraw1394-%{version}.tar.gz -Patch0: libraw1394-2.0.0-git-update.patch -Patch1: libraw1394-use-errno-ENOSYS-in-unimplemented-functions.patch -Patch2: libraw1394-work-without-write-on-local-node-dev.patch URL: http://www.linux1394.org/ ExcludeArch: s390 s390x BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -30,9 +27,6 @@ Development libraries needed to build applications against libraw1394. %prep %setup -q -%patch0 -p1 -%patch1 -p1 -%patch2 -p1 %build %configure --disable-static @@ -71,6 +65,9 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Thu Jan 15 2009 Jarod Wilson - 2.0.1-1 +- Update to libraw1394 v2.0.1 release + * Tue Jan 13 2009 Jarod Wilson - 2.0.0-6 - Set errno = ENOSYS for all unimplemented functions - Make dvgrab and friends work w/o requiring r/w on the local fw node (#441073) diff --git a/sources b/sources index 8f7dc98..8178728 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -f037629cc02509d4f24f6170bd656694 libraw1394-2.0.0.tar.gz +c2c2ead417f0cb4e65bb3513325e73a9 libraw1394-2.0.1.tar.gz