rpms/libraw1394/devel libraw1394-2.0.0-git-update.patch, NONE, 1.1 libraw1394.spec, 1.48, 1.49 libraw1394-2.0.0-coverity-prevent-fixes.patch, 1.1, NONE libraw1394-2.0.0-fix-channel_modify.patch, 1.1, NONE libraw1394-2.0.0-git-fixes.patch, 1.1, NONE

Jarod Wilson jwilson at fedoraproject.org
Tue Dec 9 15:41:19 UTC 2008


Author: jwilson

Update of /cvs/pkgs/rpms/libraw1394/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv20659

Modified Files:
	libraw1394.spec 
Added Files:
	libraw1394-2.0.0-git-update.patch 
Removed Files:
	libraw1394-2.0.0-coverity-prevent-fixes.patch 
	libraw1394-2.0.0-fix-channel_modify.patch 
	libraw1394-2.0.0-git-fixes.patch 
Log Message:
* Mon Dec 08 2008 Jarod Wilson <jarod at redhat.com> - 2.0.0-5
- Fix up iso stop command so starting/stopping/starting iso reception works
- Plug firewire handle leak


libraw1394-2.0.0-git-update.patch:

--- NEW FILE libraw1394-2.0.0-git-update.patch ---
 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 at 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;
 }


Index: libraw1394.spec
===================================================================
RCS file: /cvs/pkgs/rpms/libraw1394/devel/libraw1394.spec,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- libraw1394.spec	5 Dec 2008 17:05:54 -0000	1.48
+++ libraw1394.spec	9 Dec 2008 15:40:49 -0000	1.49
@@ -1,13 +1,11 @@
 Summary:        Library providing low-level IEEE-1394 access
 Name:           libraw1394
 Version:        2.0.0
-Release:        4%{?dist}
+Release:        5%{?dist}
 License:        LGPLv2+
 Group:          System Environment/Libraries
 Source:         http://www.linux1394.org/dl/libraw1394-%{version}.tar.gz
-Patch0:         libraw1394-2.0.0-coverity-prevent-fixes.patch
-Patch1:         libraw1394-2.0.0-git-fixes.patch
-Patch2:         libraw1394-2.0.0-fix-channel_modify.patch
+Patch0:         libraw1394-2.0.0-git-update.patch
 URL:            http://www.linux1394.org/
 ExcludeArch:    s390 s390x
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -31,8 +29,6 @@
 %prep
 %setup -q
 %patch0 -p1
-%patch1 -p1
-%patch2 -p1
 
 %build
 %configure --disable-static
@@ -71,6 +67,10 @@
 
 
 %changelog
+* Mon Dec 08 2008 Jarod Wilson <jarod at redhat.com> - 2.0.0-5
+- Fix up iso stop command so starting/stopping/starting iso reception works
+- Plug firewire handle leak
+
 * Fri Dec 05 2008 Jarod Wilson <jarod at redhat.com> - 2.0.0-4
 - Fix channel modify code, should make iso reception work reliably now
 


--- libraw1394-2.0.0-coverity-prevent-fixes.patch DELETED ---


--- libraw1394-2.0.0-fix-channel_modify.patch DELETED ---


--- libraw1394-2.0.0-git-fixes.patch DELETED ---




More information about the fedora-extras-commits mailing list