parent
995f367082
commit
14d9587ed1
@ -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
|
Loading…
Reference in new issue