Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Feb 2010 22:59:40 +0100
From:      Juergen Lock <nox@jelal.kn-bremen.de>
To:        freebsd-hackers@FreeBSD.org
Cc:        kientzle@FreeBSD.org
Subject:   "tar tfv /dev/cd0" speedup patch
Message-ID:  <20100217215940.GA19713@triton8.kn-bremen.de>

next in thread | raw e-mail | index | archive | help
Hi!

 I recently wanted to quickly look at an optical disc without mounting it
and since bsdtar/libarchive know iso9660 I just did the command in the
Subject.  It worked, but it was sloow... :(  Apparently it read all of
the disc without seeking.  The following patch fixes this, is something
like this desired?  If yes I could look how to do the same for Linux,
I _think_ there you could just check for S_ISBLK and try to lseek to
the end and back, at least that seems to be how you find out the size
of a block device there...

 Cheers,
	Juergen

Index: lib/libarchive/archive_read_open_filename.c
@@ -44,6 +44,10 @@
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#ifdef __FreeBSD__
+#include <sys/ioctl.h>
+#include <sys/disk.h>
+#endif
 
 #include "archive.h"
 
@@ -83,6 +87,9 @@
 	struct read_file_data *mine;
 	void *b;
 	int fd;
+#ifdef __FreeBSD__
+	off_t mediasize = 0;
+#endif
 
 	archive_clear_error(a);
 	if (filename == NULL || filename[0] == '\0') {
@@ -143,6 +150,17 @@
 		 */
 		mine->can_skip = 1;
 	}
+#ifdef __FreeBSD__
+	/*
+	 * on FreeBSD if a device supports the DIOCGMEDIASIZE ioctl
+	 * it is a disk-like device and should be seekable.
+	 */
+	else if (S_ISCHR(st.st_mode) &&
+	    !ioctl(fd, DIOCGMEDIASIZE, &mediasize) && mediasize) {
+		archive_read_extract_set_skip_file(a, st.st_dev, st.st_ino);
+		mine->can_skip = 1;
+	}
+#endif
 	return (archive_read_open2(a, mine,
 		NULL, file_read, file_skip, file_close));
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100217215940.GA19713>