Blame src/version.cpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
/*
Packit 01d647
 * Copyright (C) 2004-2018 Exiv2 authors
Packit 01d647
 * This program is part of the Exiv2 distribution.
Packit 01d647
 *
Packit 01d647
 * This program is free software; you can redistribute it and/or
Packit 01d647
 * modify it under the terms of the GNU General Public License
Packit 01d647
 * as published by the Free Software Foundation; either version 2
Packit 01d647
 * of the License, or (at your option) any later version.
Packit 01d647
 *
Packit 01d647
 * This program is distributed in the hope that it will be useful,
Packit 01d647
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 01d647
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 01d647
 * GNU General Public License for more details.
Packit 01d647
 *
Packit 01d647
 * You should have received a copy of the GNU General Public License
Packit 01d647
 * along with this program; if not, write to the Free Software
Packit 01d647
 * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
Packit 01d647
 */
Packit 01d647
// *****************************************************************************
Packit 01d647
Packit 01d647
#include "config.h"
Packit 01d647
Packit 01d647
#ifdef EXV_USE_CURL
Packit 01d647
#include <curl/curl.h>
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#include "http.hpp"
Packit 01d647
#include "version.hpp"
Packit 01d647
#include "makernote_int.hpp"
Packit 01d647
#include "futils.hpp"
Packit 01d647
Packit 01d647
// Adobe XMP Toolkit
Packit 01d647
#ifdef EXV_HAVE_XMP_TOOLKIT
Packit 01d647
#include "xmp_exiv2.hpp"
Packit 01d647
#endif
Packit 01d647
Packit 01d647
// + standard includes
Packit 01d647
#include <iomanip>
Packit 01d647
#include <sstream>
Packit 01d647
#include <string>
Packit 01d647
#include <stdio.h>
Packit 01d647
#include <iostream>
Packit 01d647
#include <fstream>
Packit 01d647
Packit 01d647
// #1147
Packit 01d647
#ifndef WIN32
Packit 01d647
#include <unistd.h>
Packit 01d647
#include <sys/types.h>
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifndef lengthof
Packit 01d647
#define lengthof(x) sizeof(x)/sizeof(x[0])
Packit 01d647
#endif
Packit 01d647
#ifndef _MAX_PATH
Packit 01d647
#define _MAX_PATH 512
Packit 01d647
#endif
Packit 01d647
Packit 01d647
// platform specific support for getLoadedLibraries
Packit 01d647
#if defined(__CYGWIN__) || defined(__MINGW__) || defined(WIN32)
Packit 01d647
# include <windows.h>
Packit 01d647
# include <psapi.h>
Packit 01d647
# if __LP64__
Packit 01d647
#  ifdef  _WIN64
Packit 01d647
#   undef _WIN64
Packit 01d647
#  endif
Packit 01d647
#  define _WIN64 1
Packit 01d647
# endif
Packit 01d647
#elif defined(__APPLE__)
Packit 01d647
# include <mach-o/dyld.h>
Packit 01d647
#elif defined(__FreeBSD__)
Packit 01d647
# include <sys/param.h>
Packit 01d647
# include <sys/queue.h>
Packit 01d647
# include <sys/socket.h>
Packit 01d647
# include <sys/sysctl.h>
Packit 01d647
# include <libprocstat.h>
Packit Service fb147c
# include <unistd.h>
Packit Service fb147c
#elif defined(__sun__)
Packit Service fb147c
# include <dlfcn.h>
Packit Service fb147c
# include <link.h>
Packit 01d647
#endif
Packit 01d647
Packit 01d647
namespace Exiv2 {
Packit 01d647
    int versionNumber()
Packit 01d647
    {
Packit 01d647
        return EXIV2_MAKE_VERSION(EXIV2_MAJOR_VERSION, EXIV2_MINOR_VERSION, EXIV2_PATCH_VERSION);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::string versionString()
Packit 01d647
    {
Packit 01d647
        std::ostringstream os;
Packit 01d647
        os << EXIV2_MAJOR_VERSION << '.' << EXIV2_MINOR_VERSION << '.' << EXIV2_PATCH_VERSION;
Packit 01d647
        return os.str();
Packit 01d647
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::string versionNumberHexString()
Packit 01d647
    {
Packit 01d647
        std::ostringstream os;
Packit 01d647
        os << std::hex << std::setw(6) << std::setfill('0') << Exiv2::versionNumber();
Packit 01d647
        return os.str();
Packit 01d647
    }
Packit 01d647
Packit 01d647
    const char* version()
Packit 01d647
    {
Packit 01d647
        return EXV_PACKAGE_VERSION;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    bool testVersion(int major, int minor, int patch)
Packit 01d647
    {
Packit 01d647
        return versionNumber() >= EXIV2_MAKE_VERSION(major,minor,patch);
Packit 01d647
    }
Packit 01d647
}   // namespace Exiv2
Packit 01d647
Packit 01d647
static bool shouldOutput(const exv_grep_keys_t& greps,const char* key,const std::string& value)
Packit 01d647
{
Packit 01d647
    bool bPrint = greps.empty();
Packit 01d647
    for( exv_grep_keys_t::const_iterator g = greps.begin();
Packit 01d647
      !bPrint && g != greps.end() ; ++g
Packit 01d647
    ) {
Packit 01d647
        std::string Key(key);
Packit 01d647
#if defined(EXV_HAVE_REGEX_H)
Packit 01d647
        bPrint = (  0 == regexec( &(*g), key          , 0, NULL, 0)
Packit 01d647
                 || 0 == regexec( &(*g), value.c_str(), 0, NULL, 0)
Packit 01d647
                 );
Packit 01d647
#else
Packit 01d647
            std::string Pattern(g->pattern_);
Packit 01d647
            std::string Value(value);
Packit 01d647
            if ( g->bIgnoreCase_ ) {
Packit 01d647
                // https://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/
Packit 01d647
                std::transform(Pattern.begin(), Pattern.end(),Pattern.begin(), ::tolower);
Packit 01d647
                std::transform(Key.begin()    , Key.end()    ,Key.begin()    , ::tolower);
Packit 01d647
                std::transform(Value.begin()  , Value.end()  ,Value.begin()    , ::tolower);
Packit 01d647
            }
Packit 01d647
            bPrint = Key.find(Pattern) != std::string::npos || Value.find(Pattern) != std::string::npos;
Packit 01d647
#endif
Packit 01d647
    }
Packit 01d647
    return bPrint;
Packit 01d647
}
Packit 01d647
Packit 01d647
static void output(std::ostream& os,const exv_grep_keys_t& greps,const char* name,const std::string& value)
Packit 01d647
{
Packit 01d647
    if ( shouldOutput(greps,name,value) ) os << name << "=" << value << std::endl;
Packit 01d647
}
Packit 01d647
Packit 01d647
static void output(std::ostream& os,const exv_grep_keys_t& greps,const char* name,int value)
Packit 01d647
{
Packit 01d647
    std::ostringstream stringStream;
Packit 01d647
    stringStream << value;
Packit 01d647
    output(os,greps,name,stringStream.str());
Packit 01d647
}
Packit 01d647
Packit 01d647
static bool pushPath(std::string& path,Exiv2::StringVector& libs,Exiv2::StringSet& paths)
Packit 01d647
{
Packit 01d647
    bool result = Exiv2::fileExists(path,true) && paths.find(path) == paths.end() && path != "/" ;
Packit 01d647
    if ( result ) {
Packit 01d647
        paths.insert(path);
Packit 01d647
        libs.push_back(path);
Packit 01d647
    }
Packit 01d647
    return result ;
Packit 01d647
}
Packit 01d647
Packit 01d647
static Exiv2::StringVector getLoadedLibraries()
Packit 01d647
{
Packit 01d647
    Exiv2::StringVector libs ;
Packit 01d647
    Exiv2::StringSet    paths;
Packit 01d647
    std::string         path ;
Packit 01d647
Packit 01d647
#if defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW__)
Packit 01d647
    // enumerate loaded libraries and determine path to executable
Packit 01d647
    HMODULE handles[200];
Packit 01d647
    DWORD   cbNeeded;
Packit 01d647
    if ( EnumProcessModules(GetCurrentProcess(),handles,lengthof(handles),&cbNeeded)) {
Packit 01d647
        char szFilename[_MAX_PATH];
Packit 01d647
        for ( DWORD h = 0 ; h < cbNeeded/sizeof(handles[0]) ; h++ ) {
Packit 01d647
            GetModuleFileNameA(handles[h],szFilename,lengthof(szFilename)) ;
Packit 01d647
            std::string path(szFilename);
Packit 01d647
            pushPath(path,libs,paths);
Packit 01d647
        }
Packit 01d647
    }
Packit 01d647
#elif defined(__APPLE__)
Packit 01d647
    // man 3 dyld
Packit 01d647
    uint32_t count = _dyld_image_count();
Packit 01d647
    for (uint32_t image = 0 ; image < count ; image++ ) {
Packit 01d647
        std::string path(_dyld_get_image_name(image));
Packit 01d647
        pushPath(path,libs,paths);
Packit 01d647
    }
Packit 01d647
#elif defined(__FreeBSD__)
Packit Service fb147c
    // this code seg-faults when called from an SSH script! (security?)
Packit Service fb147c
    if ( isatty(STDIN_FILENO) ) {
Packit Service fb147c
        unsigned int n;
Packit Service fb147c
        struct procstat*      procstat = procstat_open_sysctl();
Packit Service fb147c
        struct kinfo_proc*    procs    = procstat ? procstat_getprocs(procstat, KERN_PROC_PID, getpid(), &n) : NULL;
Packit Service fb147c
        struct filestat_list* files    = procs    ? procstat_getfiles(procstat, procs, true)                 : NULL;
Packit Service fb147c
        if ( files ) {
Packit Service fb147c
            filestat* entry;
Packit Service fb147c
            STAILQ_FOREACH(entry, files, next) {
Packit Service fb147c
                std::string path(entry->fs_path);
Packit Service fb147c
                pushPath(path,libs,paths);
Packit Service fb147c
            }
Packit 01d647
        }
Packit Service fb147c
        // free resources
Packit Service fb147c
        if ( files    ) procstat_freefiles(procstat, files);
Packit Service fb147c
        if ( procs    ) procstat_freeprocs(procstat, procs);
Packit Service fb147c
        if ( procstat ) procstat_close    (procstat);
Packit Service fb147c
    }
Packit Service fb147c
#elif defined (__sun__) || defined(__unix__)
Packit Service fb147c
    // http://stackoverflow.com/questions/606041/how-do-i-get-the-path-of-a-process-in-unix-linux
Packit Service fb147c
    char procsz[100];
Packit Service fb147c
    char pathsz[500];
Packit Service fb147c
    sprintf(procsz,"/proc/%d/path/a.out", getpid());
Packit Service fb147c
    int l = readlink (procsz, pathsz,sizeof(pathsz));
Packit Service fb147c
    if (l>0) {
Packit Service fb147c
        pathsz[l]='\0';
Packit Service fb147c
        path.assign(pathsz);
Packit Service fb147c
        libs.push_back(path);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    // read file /proc/self/maps which has a list of files in memory
Packit Service fb147c
    // (this doesn't yield anything on __sun__)
Packit 01d647
    std::ifstream maps("/proc/self/maps",std::ifstream::in);
Packit 01d647
    std::string   string ;
Packit 01d647
    while ( std::getline(maps,string) ) {
Packit 01d647
        std::size_t pos = string.find_last_of(' ');
Packit 01d647
        if ( pos != std::string::npos ) {
Packit 01d647
            std::string path = string.substr(pos+1);
Packit 01d647
            pushPath(path,libs,paths);
Packit 01d647
        }
Packit 01d647
    }
Packit 01d647
#endif
Packit Service fb147c
    if ( !libs.size() ) libs.push_back("unknown");
Packit Service fb147c
Packit 01d647
    return libs;
Packit 01d647
}
Packit 01d647
Packit 01d647
void Exiv2::dumpLibraryInfo(std::ostream& os,const exv_grep_keys_t& keys)
Packit 01d647
{
Packit 01d647
    int      bits = 8*sizeof(void*);
Packit 01d647
#ifdef NDEBUG
Packit 01d647
    int debug=0;
Packit 01d647
#else
Packit 01d647
    int debug=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef exiv2lib_EXPORTS
Packit 01d647
    int dll=1;
Packit 01d647
#else
Packit 01d647
    int dll=0;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
    const char* compiler =
Packit 01d647
#if defined(_MSC_VER)
Packit 01d647
    "MSVC"    ;
Packit 01d647
Packit 01d647
#ifndef __VERSION__
Packit 01d647
    char  version[40];
Packit 01d647
    sprintf(version,"%d.%02d",(_MSC_VER-600)/100,_MSC_VER%100);
Packit 01d647
Packit 01d647
    // add edition in brackets
Packit 01d647
    // 7.10 = 2003 8.00 = 2005 etc 12.00 = 2013 13.00 = 2015 (yet the installer labels it as 14.0!)
Packit 01d647
    size_t      edition       = (_MSC_VER-600)/100;
Packit 01d647
    const char* editions[]    = { "0","1","2","3","4","5","6","2003", "2005", "2008", "2010", "2012","2013","2015","2017","2019"};
Packit 01d647
    if (  edition == 13 && _MSC_VER >= 1910 ) edition++ ; // 2017 _MSC_VAR  == 1910
Packit Service fb147c
    if (  edition == 14 && _MSC_VER >= 1920 ) edition++ ; // 2019 _MSC_VAR  == 1920
Packit 01d647
Packit 01d647
    if  ( edition > lengthof(editions) ) edition = 0 ;
Packit 01d647
    if  ( edition ) sprintf(version+::strlen(version)," (%s/%s)",editions[edition],bits==64?"x64":"x86");
Packit 01d647
#define __VERSION__ version
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#elif defined(__clang__)
Packit 01d647
    "Clang"   ;
Packit 01d647
#elif defined(__GNUG__)
Packit 01d647
    "G++"     ;
Packit 01d647
#elif defined(__GNUC__)
Packit 01d647
    "GCC"     ;
Packit 01d647
#elif defined(__SUNPRO_CC)
Packit 01d647
    "CC (oracle)";
Packit 01d647
#elif defined (__SUNPRO_C)
Packit 01d647
    "cc (oracle)";
Packit Service fb147c
#elif defined (__sun__)
Packit Service fb147c
    "cc (solaris)";
Packit 01d647
#else
Packit 01d647
    "unknown" ;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifndef __VERSION__
Packit 01d647
#ifdef  __clang__version__
Packit 01d647
#define __VERSION__ __clang__version__
Packit 01d647
#else
Packit 01d647
#define __VERSION__ "unknown"
Packit 01d647
#endif
Packit 01d647
#endif
Packit 01d647
Packit 01d647
    const char* platform =
Packit 01d647
#if defined(__MSYS__)
Packit 01d647
    "msys";
Packit 01d647
#elif defined(__CYGWIN__)
Packit 01d647
    "cygwin";
Packit 01d647
#elif defined(_MSC_VER)
Packit 01d647
    "windows";
Packit 01d647
#elif defined(__APPLE__)
Packit 01d647
    "apple";
Packit 01d647
#elif defined(__MINGW64__)
Packit 01d647
    "mingw64";
Packit 01d647
#elif defined(__MINGW32__)
Packit 01d647
    "mingw32";
Packit Service fb147c
#elif defined(__sun__)
Packit Service fb147c
    "solaris";
Packit 01d647
#elif defined(__NetBSD__)
Packit 01d647
    "netbsd";
Packit 01d647
#elif defined(__FreeBSD__)
Packit 01d647
    "freebsd";
Packit 01d647
#elif defined(__linux__)
Packit 01d647
    "linux";
Packit 01d647
#else
Packit 01d647
    "unknown";
Packit 01d647
#endif
Packit 01d647
Packit 01d647
    int have_inttypes    =0;
Packit 01d647
    int have_libintl     =0;
Packit 01d647
    int have_lensdata    =0;
Packit 01d647
    int have_iconv       =0;
Packit 01d647
    int have_memory      =0;
Packit 01d647
    int have_lstat       =0;
Packit 01d647
    int have_regex       =0;
Packit 01d647
    int have_regex_h     =0;
Packit 01d647
    int have_stdbool     =0;
Packit 01d647
    int have_stdint      =0;
Packit 01d647
    int have_stdlib      =0;
Packit 01d647
    int have_strlib      =0;
Packit 01d647
    int have_strerror_r  =0;
Packit 01d647
    int have_strings_h   =0;
Packit 01d647
    int have_mmap        =0;
Packit 01d647
    int have_munmap      =0;
Packit 01d647
    int have_sys_stat    =0;
Packit 01d647
    int have_unistd_h    =0;
Packit 01d647
    int have_sys_mman    =0;
Packit 01d647
    int have_libz        =0;
Packit 01d647
    int have_xmptoolkit  =0;
Packit 01d647
    int adobe_xmpsdk     =0;
Packit 01d647
    int have_bool        =0;
Packit 01d647
    int have_strings     =0;
Packit 01d647
    int have_sys_types   =0;
Packit 01d647
    int have_unistd      =0;
Packit 01d647
    int have_unicode_path=0;
Packit 01d647
Packit 01d647
    int enable_video     =0;
Packit 01d647
    int enable_webready  =0;
Packit 01d647
    int enable_nls       =0;
Packit 01d647
    int use_curl         =0;
Packit 01d647
    int use_ssh          =0;
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_INTTYPES_H
Packit 01d647
    have_inttypes=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_LIBINTL_H
Packit 01d647
    have_libintl=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_LENSDATA
Packit 01d647
    have_lensdata=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_ICONV
Packit 01d647
    have_iconv=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_LIBINTL_H
Packit 01d647
    have_libintl=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_MEMORY_H
Packit 01d647
    have_memory=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_LSTAT
Packit 01d647
    have_lstat=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_REGEX
Packit 01d647
    have_regex=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_REGEX_H
Packit 01d647
    have_regex_h=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_STDBOOL_H
Packit 01d647
    have_stdbool=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_STDINT_H
Packit 01d647
    have_stdint=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_STDLIB_H
Packit 01d647
    have_stdlib=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_STRERROR_R
Packit 01d647
    have_strerror_r=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_STRINGS_H
Packit 01d647
    have_strings=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_MMAP
Packit 01d647
    have_mmap=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_MUNMAP
Packit 01d647
    have_munmap=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_SYS_STAT_H
Packit 01d647
    have_sys_stat=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_SYS_TYPES_H
Packit 01d647
    have_sys_types=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_UNISTD_H
Packit 01d647
    have_unistd=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_SYS_MMAN_H
Packit 01d647
    have_sys_mman=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_LIBZ
Packit 01d647
    have_libz=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_XMP_TOOLKIT
Packit 01d647
    have_xmptoolkit=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_ADOBE_XMPSDK
Packit 01d647
    adobe_xmpsdk=EXV_ADOBE_XMPSDK;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_BOOL
Packit 01d647
    have_bool=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_STRINGS
Packit 01d647
     have_strings=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_SYS_TYPES
Packit 01d647
     have_sys_types=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_UNISTD
Packit 01d647
     have_unistd=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_UNICODE_PATH
Packit 01d647
     have_unicode_path=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_ENABLE_VIDEO
Packit 01d647
     enable_video=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_ENABLE_WEBREADY
Packit 01d647
     enable_webready=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_ENABLE_NLS
Packit 01d647
     enable_nls=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_USE_CURL
Packit 01d647
    use_curl=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_USE_SSH
Packit 01d647
     use_ssh=1;
Packit 01d647
#endif
Packit 01d647
Packit 01d647
    Exiv2::StringVector libs =getLoadedLibraries();
Packit 01d647
Packit 01d647
    output(os,keys,"exiv2",Exiv2::versionString());
Packit 01d647
    output(os,keys,"platform"       , platform   );
Packit 01d647
    output(os,keys,"compiler"       , compiler   );
Packit 01d647
    output(os,keys,"bits"           , bits       );
Packit 01d647
    output(os,keys,"dll"            , dll        );
Packit 01d647
    output(os,keys,"debug"          , debug      );
Packit 01d647
    output(os,keys,"cplusplus"      , __cplusplus);
Packit 01d647
    output(os,keys,"version"        , __VERSION__);
Packit 01d647
    output(os,keys,"date"           , __DATE__   );
Packit 01d647
    output(os,keys,"time"           , __TIME__   );
Packit 01d647
    output(os,keys,"processpath"    , Exiv2::getProcessPath());
Packit 01d647
#ifdef EXV_ENABLE_NLS
Packit 01d647
    output(os,keys,"localedir"      , EXV_LOCALEDIR);
Packit 01d647
#endif
Packit 01d647
    output(os,keys,"package_name"   , EXV_PACKAGE_NAME);
Packit 01d647
Packit 01d647
#ifdef EXV_USE_CURL
Packit 01d647
    std::string curl_protocols;
Packit 01d647
    curl_version_info_data* vinfo = curl_version_info(CURLVERSION_NOW);
Packit 01d647
    for (int i = 0; vinfo->protocols[i]; i++) {
Packit 01d647
        curl_protocols += vinfo->protocols[i];
Packit 01d647
        curl_protocols += " " ;
Packit 01d647
    }
Packit 01d647
    output(os,keys,"curlprotocols" ,curl_protocols);
Packit 01d647
#endif
Packit 01d647
Packit 01d647
    output(os,keys,"curl"          , use_curl);
Packit 01d647
    if ( libs.begin() != libs.end() ) {
Packit 01d647
        output(os,keys,"executable" ,*libs.begin());
Packit 01d647
        for ( Exiv2::StringVector_i lib = libs.begin()+1 ; lib != libs.end() ; ++lib )
Packit 01d647
            output(os,keys,"library",*lib);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    output(os,keys,"have_strerror_r"   ,have_strerror_r  );
Packit 01d647
    output(os,keys,"have_inttypes"     ,have_inttypes    );
Packit 01d647
    output(os,keys,"have_libintl"      ,have_libintl     );
Packit 01d647
    output(os,keys,"have_lensdata"     ,have_lensdata    );
Packit 01d647
    output(os,keys,"have_iconv"        ,have_iconv       );
Packit 01d647
    output(os,keys,"have_memory"       ,have_memory      );
Packit 01d647
    output(os,keys,"have_lstat"        ,have_lstat       );
Packit 01d647
    output(os,keys,"have_regex"        ,have_regex       );
Packit 01d647
    output(os,keys,"have_regex_h"      ,have_regex_h     );
Packit 01d647
    output(os,keys,"have_stdbool"      ,have_stdbool     );
Packit 01d647
    output(os,keys,"have_stdint"       ,have_stdint      );
Packit 01d647
    output(os,keys,"have_stdlib"       ,have_stdlib      );
Packit 01d647
    output(os,keys,"have_strlib"       ,have_strlib      );
Packit 01d647
    output(os,keys,"have_strerror_r"   ,have_strerror_r  );
Packit 01d647
    output(os,keys,"have_strings_h"    ,have_strings_h   );
Packit 01d647
    output(os,keys,"have_mmap"         ,have_mmap        );
Packit 01d647
    output(os,keys,"have_munmap"       ,have_munmap      );
Packit 01d647
    output(os,keys,"have_sys_stat"     ,have_sys_stat    );
Packit 01d647
    output(os,keys,"have_unistd_h"     ,have_unistd_h    );
Packit 01d647
    output(os,keys,"have_sys_mman"     ,have_sys_mman    );
Packit 01d647
    output(os,keys,"have_libz"         ,have_libz        );
Packit 01d647
    output(os,keys,"have_xmptoolkit"   ,have_xmptoolkit  );
Packit 01d647
    output(os,keys,"adobe_xmpsdk"      ,adobe_xmpsdk     );
Packit 01d647
    output(os,keys,"have_bool"         ,have_bool        );
Packit 01d647
    output(os,keys,"have_strings"      ,have_strings     );
Packit 01d647
    output(os,keys,"have_sys_types"    ,have_sys_types   );
Packit 01d647
    output(os,keys,"have_unistd"       ,have_unistd      );
Packit 01d647
    output(os,keys,"have_unicode_path" ,have_unicode_path);
Packit 01d647
    output(os,keys,"enable_video"      ,enable_video     );
Packit 01d647
    output(os,keys,"enable_webready"   ,enable_webready  );
Packit 01d647
    output(os,keys,"enable_nls"        ,enable_nls       );
Packit 01d647
    output(os,keys,"use_curl"          ,use_curl         );
Packit 01d647
    output(os,keys,"use_ssh"           ,use_ssh          );
Packit 01d647
Packit 01d647
    output(os,keys,"config_path"       ,Exiv2::Internal::getExiv2ConfigPath());
Packit 01d647
Packit 01d647
// #1147
Packit 01d647
#ifndef WIN32
Packit 01d647
    uid_t uid  = getuid()  ; output(os,keys,"uid" ,  uid  );
Packit 01d647
    uid_t euid = geteuid() ; output(os,keys,"euid", euid  );
Packit 01d647
    uid_t gid  = getgid()  ; output(os,keys,"gid" ,  gid  );
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_HAVE_XMP_TOOLKIT
Packit 01d647
    const char* name = "xmlns";
Packit 01d647
Packit 01d647
    Exiv2::Dictionary ns;
Packit 01d647
    Exiv2::XmpProperties::registeredNamespaces(ns);
Packit 01d647
    for ( Exiv2::Dictionary_i it = ns.begin(); it != ns.end() ; ++it ) {
Packit 01d647
        std::string xmlns = (*it).first;
Packit 01d647
        std::string uri   = (*it).second;
Packit 01d647
        output(os,keys,name,xmlns+":"+uri);
Packit 01d647
    }
Packit 01d647
#endif
Packit 01d647
}