- Update to libraw1394 v2.0.1 release

epel9
Jarod Wilson 16 years ago
parent 995f367082
commit 14d9587ed1

@ -4,3 +4,4 @@ fw-device-cdev.h
libraw1394-1.3.0.tar.gz libraw1394-1.3.0.tar.gz
libraw1394-2.0.0-20080430_git.tar.bz2 libraw1394-2.0.0-20080430_git.tar.bz2
libraw1394-2.0.0.tar.gz libraw1394-2.0.0.tar.gz
libraw1394-2.0.1.tar.gz

@ -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 <krh@bitplanet.net>
*
@@ -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 <string.h>
#include <sys/poll.h>
#include <stdlib.h>
+#include <time.h>
#include <arpa/inet.h>
#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;
}

@ -1,59 +0,0 @@
Date: Sun, 11 Jan 2009 22:39:17 +0100 (CET)
From: Stefan Richter <stefanr@s5r6.in-berlin.de>
Subject: [PATCH libraw1394 fix] Set errno = ENOSYS in unimplemented functions
To: Dan Dennedy <dan@dennedy.org>
Cc: linux1394-devel@lists.sourceforge.net
Most of them do this already, only a few missed it.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
---
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

@ -1,245 +0,0 @@
Date: Sat, 10 Jan 2009 21:14:50 +0100 (CET)
From: Stefan Richter <stefanr@s5r6.in-berlin.de>
Subject: Re: [PATCH libraw1394] Work without permission to access local node's
/dev/fw*
To: Dan Dennedy <dan@dennedy.org>
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 <stefanr@s5r6.in-berlin.de>
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 <stefanr@s5r6.in-berlin.de>
---
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

@ -1,13 +1,10 @@
Summary: Library providing low-level IEEE-1394 access Summary: Library providing low-level IEEE-1394 access
Name: libraw1394 Name: libraw1394
Version: 2.0.0 Version: 2.0.1
Release: 6%{?dist} Release: 1%{?dist}
License: LGPLv2+ License: LGPLv2+
Group: System Environment/Libraries Group: System Environment/Libraries
Source: http://www.linux1394.org/dl/libraw1394-%{version}.tar.gz 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/ URL: http://www.linux1394.org/
ExcludeArch: s390 s390x ExcludeArch: s390 s390x
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@ -30,9 +27,6 @@ Development libraries needed to build applications against libraw1394.
%prep %prep
%setup -q %setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%build %build
%configure --disable-static %configure --disable-static
@ -71,6 +65,9 @@ rm -rf $RPM_BUILD_ROOT
%changelog %changelog
* Thu Jan 15 2009 Jarod Wilson <jarod@redhat.com> - 2.0.1-1
- Update to libraw1394 v2.0.1 release
* Tue Jan 13 2009 Jarod Wilson <jarod@redhat.com> - 2.0.0-6 * Tue Jan 13 2009 Jarod Wilson <jarod@redhat.com> - 2.0.0-6
- Set errno = ENOSYS for all unimplemented functions - Set errno = ENOSYS for all unimplemented functions
- Make dvgrab and friends work w/o requiring r/w on the local fw node (#441073) - Make dvgrab and friends work w/o requiring r/w on the local fw node (#441073)

@ -1 +1 @@
f037629cc02509d4f24f6170bd656694 libraw1394-2.0.0.tar.gz c2c2ead417f0cb4e65bb3513325e73a9 libraw1394-2.0.1.tar.gz

Loading…
Cancel
Save