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