summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2007-07-06 15:36:38 +0000
committerkientzle <kientzle@FreeBSD.org>2007-07-06 15:36:38 +0000
commit8f8c5c97731ba5f5874c4278189ec2138711e819 (patch)
tree6f2d9bec516c8a7620bc902230da37c559bf1ab3 /lib
parent1651def96b01c3ce15b52e4cc084302ea73f4a27 (diff)
downloadFreeBSD-src-8f8c5c97731ba5f5874c4278189ec2138711e819.zip
FreeBSD-src-8f8c5c97731ba5f5874c4278189ec2138711e819.tar.gz
New "version stamp" simplifies determining the exact version
of libarchive being used. I've been taking advantage of this with a recent round of updates to libarchive_test so that it can test older and newer versions of the library. Approved by: re (Ken Smith)
Diffstat (limited to 'lib')
-rw-r--r--lib/libarchive/Makefile18
-rw-r--r--lib/libarchive/archive.h.in67
-rw-r--r--lib/libarchive/archive_read_open_memory.c2
-rw-r--r--lib/libarchive/archive_util.c6
4 files changed, 70 insertions, 23 deletions
diff --git a/lib/libarchive/Makefile b/lib/libarchive/Makefile
index f52d662..3d041de 100644
--- a/lib/libarchive/Makefile
+++ b/lib/libarchive/Makefile
@@ -13,6 +13,9 @@ VERSION= 2.2.3
ARCHIVE_API_MAJOR!= echo ${VERSION} | sed -e 's/[^0-9]/./g' -e 's/\..*//'
ARCHIVE_API_MINOR!= echo ${VERSION} | sed -e 's/[^0-9]/./g' -e 's/[0-9]*\.//' -e 's/\..*//'
+ARCHIVE_API_REV!= echo ${VERSION} | sed -e 's/[^0-9]/./g' -e 's/.*\.//'
+
+ARCHIVE_VERSION_STAMP!= printf "%d%03d%03d" ${ARCHIVE_API_MAJOR} ${ARCHIVE_API_MINOR} ${ARCHIVE_API_REV}
# FreeBSD SHLIB_MAJOR value is managed as part of the FreeBSD system.
# It has no real relation to the version number above.
@@ -31,13 +34,14 @@ INCS= archive.h archive_entry.h
# Build archive.h from archive.h.in by substituting version information.
# Note: FreeBSD has inttypes.h, so enable that include in archive.h.in
archive.h: archive.h.in Makefile
- cat ${.CURDIR}/archive.h.in | \
- sed 's/@ARCHIVE_VERSION@/${VERSION}/g' | \
- sed 's/@SHLIB_MAJOR@/${SHLIB_MAJOR}/g' | \
- sed 's/@ARCHIVE_API_MAJOR@/${ARCHIVE_API_MAJOR}/g' | \
- sed 's/@ARCHIVE_API_MINOR@/${ARCHIVE_API_MINOR}/g' | \
- sed 's|@ARCHIVE_H_INCLUDE_INTTYPES_H@|#include <inttypes.h> /* For int64_t */|g' | \
- cat > archive.h
+ cat ${.CURDIR}/archive.h.in | sed \
+ -e 's/@ARCHIVE_VERSION@/${VERSION}/g' \
+ -e 's/@SHLIB_MAJOR@/${SHLIB_MAJOR}/g' \
+ -e 's/@ARCHIVE_API_MAJOR@/${ARCHIVE_API_MAJOR}/g' \
+ -e 's/@ARCHIVE_API_MINOR@/${ARCHIVE_API_MINOR}/g' \
+ -e 's/@ARCHIVE_VERSION_STAMP@/${ARCHIVE_VERSION_STAMP}/g' \
+ -e 's|@ARCHIVE_H_INCLUDE_INTTYPES_H@|#include <inttypes.h> /* For int64_t */|g' \
+ > archive.h
# archive.h needs to be cleaned
CLEANFILES+= archive.h
diff --git a/lib/libarchive/archive.h.in b/lib/libarchive/archive.h.in
index 1c4af1b..bf90f4a 100644
--- a/lib/libarchive/archive.h.in
+++ b/lib/libarchive/archive.h.in
@@ -50,31 +50,68 @@ typedef unsigned short mode_t;
extern "C" {
#endif
+/*
+ * Each of the version identifiers comes as a macro and a function.
+ * The macro identifies the installed header; the function identifies
+ * the library version (which may not be the same if you're using a
+ * dynamically-linked version of the library).
+ */
/*
- * If ARCHIVE_API_VERSION != archive_api_version(), then the library you
- * were linked with is using an incompatible API to the one you were
- * compiled with. This is almost certainly a fatal problem.
- *
- * ARCHIVE_API_FEATURE is incremented with each significant feature
- * addition, so you can test (at compile or run time) if a particular
- * feature is implemented. It's no big deal if ARCHIVE_API_FEATURE !=
- * archive_api_feature(), as long as both are high enough to include
- * the features you're relying on. Specific values of FEATURE are
- * documented here:
+ * Textual name/version of the library, useful for version displays.
+ */
+#define ARCHIVE_LIBRARY_VERSION "libarchive @ARCHIVE_VERSION@"
+const char * archive_version(void);
+
+/*
+ * Major version number: If ARCHIVE_API_VERSION !=
+ * archive_api_version(), then the library you were linked with is
+ * using an incompatible API to the one you were compiled with. This
+ * is almost certainly a fatal problem.
+ */
+#define ARCHIVE_API_VERSION @ARCHIVE_API_MAJOR@
+int archive_api_version(void);
+
+/*
+ * Minor version number: ARCHIVE_API_FEATURE is incremented with each
+ * significant feature addition, so you can test (at compile or run
+ * time) if a particular feature is implemented. It's no big deal if
+ * ARCHIVE_API_FEATURE != archive_api_feature(), as long as both are
+ * high enough to include the features you're relying on. Specific
+ * values of FEATURE are documented here:
*
* 1 - Version tests are available.
* 2 - archive_{read,write}_close available separately from _finish.
* 3 - open_memory, open_memory2, open_FILE, open_fd available
* 5 - archive_write_disk interface available
+ *
+ * Unfortunately, this count resets whenever ARCHIVE_API_VERSION changes,
+ * making it awkward to use in practice. For that reason, it is deprecated
+ * in favor of the more-accurate version stamp below. It will eventually
+ * be removed.
*/
-#define ARCHIVE_API_VERSION @ARCHIVE_API_MAJOR@
-int archive_api_version(void);
#define ARCHIVE_API_FEATURE @ARCHIVE_API_MINOR@
int archive_api_feature(void);
-/* Textual name/version of the library. */
-#define ARCHIVE_LIBRARY_VERSION "libarchive @ARCHIVE_VERSION@"
-const char * archive_version(void);
+
+/*
+ * The "version stamp" is a single integer that makes it easy to check
+ * the exact version: for version a.b.c, the version stamp is
+ * printf("%d%03d%03d",a,b,c). For example, version 2.12.108 has
+ * version stamp 2012108.
+ *
+ * This was introduced with libarchive 1.9.0 in the libarchive 1.x family
+ * and libarchive 2.2.4 in the libarchive 2.x family. The following
+ * may be useful if you really want to do feature detection for earlier
+ * libarchive versions:
+ *
+ * #ifndef ARCHIVE_VERSION_STAMP
+ * #define ARCHIVE_VERSION_STAMP \
+ * (ARCHIVE_API_VERSION * 1000000 + ARCHIVE_API_FEATURE * 1000)
+ * #endif
+ */
+#define ARCHIVE_VERSION_STAMP @ARCHIVE_VERSION_STAMP@
+int archive_version_stamp(void);
+
#define ARCHIVE_BYTES_PER_RECORD 512
#define ARCHIVE_DEFAULT_BYTES_PER_BLOCK 10240
diff --git a/lib/libarchive/archive_read_open_memory.c b/lib/libarchive/archive_read_open_memory.c
index b32a6f3..7f52117 100644
--- a/lib/libarchive/archive_read_open_memory.c
+++ b/lib/libarchive/archive_read_open_memory.c
@@ -134,7 +134,7 @@ memory_read_skip(struct archive *a, void *client_data, off_t skip)
struct read_memory_data *mine = (struct read_memory_data *)client_data;
(void)a; /* UNUSED */
- if (skip > mine->end - mine->buffer)
+ if ((off_t)skip > (off_t)(mine->end - mine->buffer))
skip = mine->end - mine->buffer;
/* Round down to block size. */
skip /= mine->read_size;
diff --git a/lib/libarchive/archive_util.c b/lib/libarchive/archive_util.c
index 46e322a..fbb0a9f 100644
--- a/lib/libarchive/archive_util.c
+++ b/lib/libarchive/archive_util.c
@@ -51,6 +51,12 @@ archive_api_version(void)
return (ARCHIVE_API_VERSION);
}
+int
+archive_version_stamp(void)
+{
+ return (ARCHIVE_VERSION_STAMP);
+}
+
const char *
archive_version(void)
{
OpenPOWER on IntegriCloud