1315633Smm/*-
2315633Smm * Copyright (c) 2009-2012,2014 Michihiro NAKAJIMA
3315633Smm * Copyright (c) 2003-2007 Tim Kientzle
4315633Smm * All rights reserved.
5315633Smm *
6315633Smm * Redistribution and use in source and binary forms, with or without
7315633Smm * modification, are permitted provided that the following conditions
8315633Smm * are met:
9315633Smm * 1. Redistributions of source code must retain the above copyright
10315633Smm *    notice, this list of conditions and the following disclaimer.
11315633Smm * 2. Redistributions in binary form must reproduce the above copyright
12315633Smm *    notice, this list of conditions and the following disclaimer in the
13315633Smm *    documentation and/or other materials provided with the distribution.
14315633Smm *
15315633Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16315633Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17315633Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18315633Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19315633Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20315633Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21315633Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22315633Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23315633Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24315633Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25315633Smm */
26315633Smm
27315633Smm#include "archive_platform.h"
28315633Smm__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/archive_version_details.c 324418 2017-10-08 20:55:45Z mm $");
29315633Smm
30315633Smm#ifdef HAVE_STDLIB_H
31315633Smm#include <stdlib.h>
32315633Smm#endif
33315633Smm#ifdef HAVE_STRING_H
34315633Smm#include <string.h>
35315633Smm#endif
36315633Smm#ifdef HAVE_ZLIB_H
37315633Smm#include <zlib.h>
38315633Smm#endif
39315633Smm#ifdef HAVE_LZMA_H
40315633Smm#include <lzma.h>
41315633Smm#endif
42315633Smm#ifdef HAVE_BZLIB_H
43315633Smm#include <bzlib.h>
44315633Smm#endif
45315633Smm#ifdef HAVE_LZ4_H
46315633Smm#include <lz4.h>
47315633Smm#endif
48324418Smm#ifdef HAVE_ZSTD_H
49324418Smm#include <zstd.h>
50324418Smm#endif
51315633Smm
52315633Smm#include "archive.h"
53315633Smm#include "archive_private.h"
54315633Smm#include "archive_string.h"
55315633Smm
56315633Smmconst char *
57315633Smmarchive_version_details(void)
58315633Smm{
59315633Smm	static struct archive_string str;
60315633Smm	static int init = 0;
61315633Smm	const char *zlib = archive_zlib_version();
62315633Smm	const char *liblzma = archive_liblzma_version();
63315633Smm	const char *bzlib = archive_bzlib_version();
64315633Smm	const char *liblz4 = archive_liblz4_version();
65324418Smm	const char *libzstd = archive_libzstd_version();
66315633Smm
67315633Smm	if (!init) {
68315633Smm		archive_string_init(&str);
69315633Smm
70315633Smm		archive_strcat(&str, ARCHIVE_VERSION_STRING);
71315633Smm		if (zlib != NULL) {
72315633Smm			archive_strcat(&str, " zlib/");
73315633Smm			archive_strcat(&str, zlib);
74315633Smm		}
75315633Smm		if (liblzma) {
76315633Smm			archive_strcat(&str, " liblzma/");
77315633Smm			archive_strcat(&str, liblzma);
78315633Smm		}
79315633Smm		if (bzlib) {
80315633Smm			const char *p = bzlib;
81315633Smm			const char *sep = strchr(p, ',');
82315633Smm			if (sep == NULL)
83315633Smm				sep = p + strlen(p);
84315633Smm			archive_strcat(&str, " bz2lib/");
85315633Smm			archive_strncat(&str, p, sep - p);
86315633Smm		}
87315633Smm		if (liblz4) {
88315633Smm			archive_strcat(&str, " liblz4/");
89315633Smm			archive_strcat(&str, liblz4);
90315633Smm		}
91324418Smm		if (libzstd) {
92324418Smm			archive_strcat(&str, " libzstd/");
93324418Smm			archive_strcat(&str, libzstd);
94324418Smm		}
95315633Smm	}
96315633Smm	return str.s;
97315633Smm}
98315633Smm
99315633Smmconst char *
100315633Smmarchive_zlib_version(void)
101315633Smm{
102315633Smm#ifdef HAVE_ZLIB_H
103315633Smm	return ZLIB_VERSION;
104315633Smm#else
105315633Smm	return NULL;
106315633Smm#endif
107315633Smm}
108315633Smm
109315633Smmconst char *
110315633Smmarchive_liblzma_version(void)
111315633Smm{
112315633Smm#ifdef HAVE_LZMA_H
113315633Smm	return LZMA_VERSION_STRING;
114315633Smm#else
115315633Smm	return NULL;
116315633Smm#endif
117315633Smm}
118315633Smm
119315633Smmconst char *
120315633Smmarchive_bzlib_version(void)
121315633Smm{
122315633Smm#ifdef HAVE_BZLIB_H
123315633Smm	return BZ2_bzlibVersion();
124315633Smm#else
125315633Smm	return NULL;
126315633Smm#endif
127315633Smm}
128315633Smm
129315633Smmconst char *
130315633Smmarchive_liblz4_version(void)
131315633Smm{
132315633Smm#if defined(HAVE_LZ4_H) && defined(HAVE_LIBLZ4)
133315633Smm#define str(s) #s
134315633Smm#define NUMBER(x) str(x)
135315633Smm	return NUMBER(LZ4_VERSION_MAJOR) "." NUMBER(LZ4_VERSION_MINOR) "." NUMBER(LZ4_VERSION_RELEASE);
136315633Smm#undef NUMBER
137315633Smm#undef str
138315633Smm#else
139315633Smm	return NULL;
140315633Smm#endif
141315633Smm}
142324418Smm
143324418Smmconst char *
144324418Smmarchive_libzstd_version(void)
145324418Smm{
146324418Smm#if HAVE_ZSTD_H && HAVE_LIBZSTD
147324418Smm	return ZSTD_VERSION_STRING;
148324418Smm#else
149324418Smm	return NULL;
150324418Smm#endif
151324418Smm}
152