Merge pull request #98 from PatriceJiang/3dgfx-remove-unused-code
3dgfx remove unused libs
This commit is contained in:
commit
7259a85f50
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
set(CC_EXTERNAL_LIBS)
|
set(CC_EXTERNAL_LIBS)
|
||||||
set(CC_EXTERNAL_INCLUDES ${CMAKE_CURRENT_LIST_DIR}/sources)
|
set(CC_EXTERNAL_INCLUDES ${CMAKE_CURRENT_LIST_DIR}/sources)
|
||||||
|
set(CC_EXTERNAL_PRIVATE_INCLUDES)
|
||||||
|
|
||||||
include(${CMAKE_CURRENT_LIST_DIR}/cmake/CocosExternalConfig.cmake)
|
include(${CMAKE_CURRENT_LIST_DIR}/cmake/CocosExternalConfig.cmake)
|
||||||
include(${CMAKE_CURRENT_LIST_DIR}/sources/CMakeLists.txt)
|
include(${CMAKE_CURRENT_LIST_DIR}/sources/CMakeLists.txt)
|
||||||
|
|
|
||||||
|
|
@ -1,108 +0,0 @@
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := cocos_zlib_static
|
|
||||||
LOCAL_MODULE_FILENAME := zlib
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libz.a
|
|
||||||
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := cocos_jpeg_static
|
|
||||||
LOCAL_MODULE_FILENAME := jpeg
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libjpeg.a
|
|
||||||
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := cocos_png_static
|
|
||||||
LOCAL_MODULE_FILENAME := png
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libpng.a
|
|
||||||
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
ifeq ($(USE_TIFF),1)
|
|
||||||
LOCAL_MODULE := cocos_tiff_static
|
|
||||||
LOCAL_MODULE_FILENAME := tiff
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libtiff.a
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
endif
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := cocos_webp_static
|
|
||||||
LOCAL_MODULE_FILENAME := webp
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libwebp.a
|
|
||||||
|
|
||||||
LOCAL_WHOLE_STATIC_LIBRARIES := cpufeatures
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
|
||||||
LOCAL_CFLAGS := -DHAVE_NEON=1
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := cocos_crypto_static
|
|
||||||
LOCAL_MODULE_FILENAME := crypto
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcrypto.a
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(TARGET_ARCH_ABI)/include
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := cocos_ssl_static
|
|
||||||
LOCAL_MODULE_FILENAME := ssl
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libssl.a
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(TARGET_ARCH_ABI)/include
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := websockets_static
|
|
||||||
LOCAL_MODULE_FILENAME := libwebsockets_static
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libwebsockets.a
|
|
||||||
|
|
||||||
LOCAL_CPPFLAGS := -D__STDC_LIMIT_MACROS=1
|
|
||||||
LOCAL_EXPORT_CPPFLAGS := -D__STDC_LIMIT_MACROS=1
|
|
||||||
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := v8_inspector
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/v8/libinspector.a
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := v8_static
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/v8/libv8_monolith.a
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(TARGET_ARCH_ABI)/include/v8
|
|
||||||
ifeq ($(TARGET_ARCH),arm64)
|
|
||||||
LOCAL_EXPORT_CPPFLAGS := -DV8_COMPRESS_POINTERS
|
|
||||||
LOCAL_EXPORT_CFLAGS := -DV8_COMPRESS_POINTERS
|
|
||||||
endif
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := uv_static
|
|
||||||
LOCAL_MODULE_FILENAME := libuv
|
|
||||||
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libuv.a
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(TARGET_ARCH_ABI)/include/uv
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
#$(call import-module,android/cpufeatures)
|
|
||||||
|
|
@ -24,11 +24,6 @@ set_target_properties(ssl PROPERTIES
|
||||||
IMPORTED_LOCATION ${platform_spec_path}/libssl.a
|
IMPORTED_LOCATION ${platform_spec_path}/libssl.a
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(tiff STATIC IMPORTED GLOBAL)
|
|
||||||
set_target_properties(tiff PROPERTIES
|
|
||||||
IMPORTED_LOCATION ${platform_spec_path}/libtiff.a
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(uv STATIC IMPORTED GLOBAL)
|
add_library(uv STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(uv PROPERTIES
|
set_target_properties(uv PROPERTIES
|
||||||
IMPORTED_LOCATION ${platform_spec_path}/libuv.a
|
IMPORTED_LOCATION ${platform_spec_path}/libuv.a
|
||||||
|
|
@ -97,12 +92,6 @@ if(USE_SOCKET)
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(USE_TIFF)
|
|
||||||
list(APPEND CC_EXTERNAL_LIBS
|
|
||||||
tiff
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(USE_SE_V8 AND USE_V8_DEBUGGER)
|
if(USE_SE_V8 AND USE_V8_DEBUGGER)
|
||||||
list(APPEND CC_EXTERNAL_LIBS
|
list(APPEND CC_EXTERNAL_LIBS
|
||||||
v8_inspector
|
v8_inspector
|
||||||
|
|
|
||||||
|
|
@ -1,681 +0,0 @@
|
||||||
/* $Id: tiff.h,v 1.69 2014-04-02 17:23:06 fwarmerdam Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFF_
|
|
||||||
#define _TIFF_
|
|
||||||
|
|
||||||
#include "tiffconf.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag Image File Format (TIFF)
|
|
||||||
*
|
|
||||||
* Based on Rev 6.0 from:
|
|
||||||
* Developer's Desk
|
|
||||||
* Aldus Corporation
|
|
||||||
* 411 First Ave. South
|
|
||||||
* Suite 200
|
|
||||||
* Seattle, WA 98104
|
|
||||||
* 206-622-5500
|
|
||||||
*
|
|
||||||
* (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf)
|
|
||||||
*
|
|
||||||
* For BigTIFF design notes see the following links
|
|
||||||
* http://www.remotesensing.org/libtiff/bigtiffdesign.html
|
|
||||||
* http://www.awaresystems.be/imaging/tiff/bigtiff.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TIFF_VERSION_CLASSIC 42
|
|
||||||
#define TIFF_VERSION_BIG 43
|
|
||||||
|
|
||||||
#define TIFF_BIGENDIAN 0x4d4d
|
|
||||||
#define TIFF_LITTLEENDIAN 0x4949
|
|
||||||
#define MDI_LITTLEENDIAN 0x5045
|
|
||||||
#define MDI_BIGENDIAN 0x4550
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Intrinsic data types required by the file format:
|
|
||||||
*
|
|
||||||
* 8-bit quantities int8/uint8
|
|
||||||
* 16-bit quantities int16/uint16
|
|
||||||
* 32-bit quantities int32/uint32
|
|
||||||
* 64-bit quantities int64/uint64
|
|
||||||
* strings unsigned char*
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef TIFF_INT8_T int8;
|
|
||||||
typedef TIFF_UINT8_T uint8;
|
|
||||||
|
|
||||||
typedef TIFF_INT16_T int16;
|
|
||||||
typedef TIFF_UINT16_T uint16;
|
|
||||||
|
|
||||||
typedef TIFF_INT32_T int32;
|
|
||||||
typedef TIFF_UINT32_T uint32;
|
|
||||||
|
|
||||||
typedef TIFF_INT64_T int64;
|
|
||||||
typedef TIFF_UINT64_T uint64;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some types as promoted in a variable argument list
|
|
||||||
* We use uint16_vap rather then directly using int, because this way
|
|
||||||
* we document the type we actually want to pass through, conceptually,
|
|
||||||
* rather then confusing the issue by merely stating the type it gets
|
|
||||||
* promoted to
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef int uint16_vap;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF header.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
} TIFFHeaderCommon;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint32 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderClassic;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint16 tiff_offsetsize; /* size of offsets, should be 8 */
|
|
||||||
uint16 tiff_unused; /* unused word, should be 0 */
|
|
||||||
uint64 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderBig;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NB: In the comments below,
|
|
||||||
* - items marked with a + are obsoleted by revision 5.0,
|
|
||||||
* - items marked with a ! are introduced in revision 6.0.
|
|
||||||
* - items marked with a % are introduced post revision 6.0.
|
|
||||||
* - items marked with a $ are obsoleted by revision 6.0.
|
|
||||||
* - items marked with a & are introduced by Adobe DNG specification.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag data type information.
|
|
||||||
*
|
|
||||||
* Note: RATIONALs are the ratio of two 32-bit integer values.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
TIFF_NOTYPE = 0, /* placeholder */
|
|
||||||
TIFF_BYTE = 1, /* 8-bit unsigned integer */
|
|
||||||
TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
|
|
||||||
TIFF_SHORT = 3, /* 16-bit unsigned integer */
|
|
||||||
TIFF_LONG = 4, /* 32-bit unsigned integer */
|
|
||||||
TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
|
|
||||||
TIFF_SBYTE = 6, /* !8-bit signed integer */
|
|
||||||
TIFF_UNDEFINED = 7, /* !8-bit untyped data */
|
|
||||||
TIFF_SSHORT = 8, /* !16-bit signed integer */
|
|
||||||
TIFF_SLONG = 9, /* !32-bit signed integer */
|
|
||||||
TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
|
|
||||||
TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
|
|
||||||
TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
|
|
||||||
TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */
|
|
||||||
TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */
|
|
||||||
TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */
|
|
||||||
TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */
|
|
||||||
} TIFFDataType;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Tag Definitions.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
|
|
||||||
#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
|
|
||||||
#define FILETYPE_PAGE 0x2 /* one page of many */
|
|
||||||
#define FILETYPE_MASK 0x4 /* transparency mask */
|
|
||||||
#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
|
|
||||||
#define OFILETYPE_IMAGE 1 /* full resolution image data */
|
|
||||||
#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
|
|
||||||
#define OFILETYPE_PAGE 3 /* one page of many */
|
|
||||||
#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
|
|
||||||
#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
|
|
||||||
#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
|
|
||||||
#define TIFFTAG_COMPRESSION 259 /* data compression technique */
|
|
||||||
#define COMPRESSION_NONE 1 /* dump mode */
|
|
||||||
#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
|
|
||||||
#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
|
|
||||||
#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
|
|
||||||
#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
|
|
||||||
#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */
|
|
||||||
#define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */
|
|
||||||
#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
|
|
||||||
#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
|
|
||||||
#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
|
|
||||||
#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
|
|
||||||
/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
|
|
||||||
#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
|
|
||||||
#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
|
|
||||||
#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
|
|
||||||
/* compression codes 32908-32911 are reserved for Pixar */
|
|
||||||
#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
|
|
||||||
#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
|
|
||||||
#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
|
|
||||||
#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression,
|
|
||||||
as recognized by Adobe */
|
|
||||||
/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
|
|
||||||
#define COMPRESSION_JBIG 34661 /* ISO JBIG */
|
|
||||||
#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
|
|
||||||
#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
|
|
||||||
#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
|
|
||||||
#define COMPRESSION_LZMA 34925 /* LZMA2 */
|
|
||||||
#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
|
|
||||||
#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
|
|
||||||
#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
|
|
||||||
#define PHOTOMETRIC_RGB 2 /* RGB color model */
|
|
||||||
#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
|
|
||||||
#define PHOTOMETRIC_MASK 4 /* $holdout mask */
|
|
||||||
#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
|
|
||||||
#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
|
|
||||||
#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
|
|
||||||
#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
|
|
||||||
#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
|
|
||||||
#define PHOTOMETRIC_CFA 32803 /* color filter array */
|
|
||||||
#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
|
|
||||||
#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
|
|
||||||
#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
|
|
||||||
#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
|
|
||||||
#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
|
|
||||||
#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
|
|
||||||
#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
|
|
||||||
#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
|
|
||||||
#define TIFFTAG_FILLORDER 266 /* data order within a byte */
|
|
||||||
#define FILLORDER_MSB2LSB 1 /* most significant -> least */
|
|
||||||
#define FILLORDER_LSB2MSB 2 /* least significant -> most */
|
|
||||||
#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
|
|
||||||
#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
|
|
||||||
#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
|
|
||||||
#define TIFFTAG_MODEL 272 /* scanner model name/number */
|
|
||||||
#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
|
|
||||||
#define TIFFTAG_ORIENTATION 274 /* +image orientation */
|
|
||||||
#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
|
|
||||||
#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
|
|
||||||
#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
|
|
||||||
#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
|
|
||||||
#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
|
|
||||||
#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
|
|
||||||
#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
|
|
||||||
#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
|
|
||||||
#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
|
|
||||||
#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
|
|
||||||
#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
|
|
||||||
#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
|
|
||||||
#define PLANARCONFIG_CONTIG 1 /* single image plane */
|
|
||||||
#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
|
|
||||||
#define TIFFTAG_PAGENAME 285 /* page name image is from */
|
|
||||||
#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
|
|
||||||
#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
|
|
||||||
#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
|
|
||||||
#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
|
|
||||||
#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
|
|
||||||
#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
|
|
||||||
#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
|
|
||||||
#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
|
|
||||||
#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
|
|
||||||
#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
|
|
||||||
#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
|
|
||||||
#define RESUNIT_NONE 1 /* no meaningful units */
|
|
||||||
#define RESUNIT_INCH 2 /* english */
|
|
||||||
#define RESUNIT_CENTIMETER 3 /* metric */
|
|
||||||
#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
|
|
||||||
#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
|
|
||||||
#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_SOFTWARE 305 /* name & release */
|
|
||||||
#define TIFFTAG_DATETIME 306 /* creation date and time */
|
|
||||||
#define TIFFTAG_ARTIST 315 /* creator of image */
|
|
||||||
#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
|
|
||||||
#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
|
|
||||||
#define PREDICTOR_NONE 1 /* no prediction scheme used */
|
|
||||||
#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */
|
|
||||||
#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */
|
|
||||||
#define TIFFTAG_WHITEPOINT 318 /* image white point */
|
|
||||||
#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
|
|
||||||
#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */
|
|
||||||
#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
|
|
||||||
#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */
|
|
||||||
#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */
|
|
||||||
#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
|
|
||||||
#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
|
|
||||||
#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
|
|
||||||
#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
|
|
||||||
#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
|
|
||||||
#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
|
|
||||||
#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
|
|
||||||
#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
|
|
||||||
#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
|
|
||||||
#define TIFFTAG_INKSET 332 /* !inks in separated image */
|
|
||||||
#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
|
|
||||||
#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
|
|
||||||
#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
|
|
||||||
#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
|
|
||||||
#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
|
|
||||||
#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
|
|
||||||
#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
|
|
||||||
#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
|
|
||||||
#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
|
|
||||||
#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
|
|
||||||
#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
|
|
||||||
#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
|
|
||||||
#define SAMPLEFORMAT_INT 2 /* !signed integer data */
|
|
||||||
#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
|
|
||||||
#define SAMPLEFORMAT_VOID 4 /* !untyped data */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
|
|
||||||
#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
|
|
||||||
#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
|
|
||||||
#define TIFFTAG_CLIPPATH 343 /* %ClipPath
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_INDEXED 346 /* %Indexed
|
|
||||||
[Adobe TIFF Technote 3] */
|
|
||||||
#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
|
|
||||||
#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
|
|
||||||
/* Tags 400-435 are from the TIFF/FX spec */
|
|
||||||
#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */
|
|
||||||
#define TIFFTAG_PROFILETYPE 401 /* ! */
|
|
||||||
#define PROFILETYPE_UNSPECIFIED 0 /* ! */
|
|
||||||
#define PROFILETYPE_G3_FAX 1 /* ! */
|
|
||||||
#define TIFFTAG_FAXPROFILE 402 /* ! */
|
|
||||||
#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */
|
|
||||||
#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */
|
|
||||||
#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */
|
|
||||||
#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */
|
|
||||||
#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */
|
|
||||||
#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */
|
|
||||||
#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */
|
|
||||||
#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */
|
|
||||||
#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */
|
|
||||||
#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */
|
|
||||||
#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */
|
|
||||||
#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */
|
|
||||||
#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */
|
|
||||||
#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */
|
|
||||||
#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */
|
|
||||||
#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */
|
|
||||||
#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */
|
|
||||||
#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */
|
|
||||||
/*
|
|
||||||
* Tags 512-521 are obsoleted by Technical Note #2 which specifies a
|
|
||||||
* revised JPEG-in-TIFF scheme.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
|
|
||||||
#define JPEGPROC_BASELINE 1 /* !baseline sequential */
|
|
||||||
#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
|
|
||||||
#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
|
|
||||||
#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
|
|
||||||
#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
|
|
||||||
#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
|
|
||||||
#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
|
|
||||||
#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */
|
|
||||||
#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
|
|
||||||
#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
|
|
||||||
#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
|
|
||||||
#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
|
|
||||||
#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
|
|
||||||
#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
|
|
||||||
#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
|
|
||||||
#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
|
|
||||||
#define TIFFTAG_XMLPACKET 700 /* %XML packet
|
|
||||||
[Adobe XMP Specification,
|
|
||||||
January 2004 */
|
|
||||||
#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID
|
|
||||||
[Adobe TIFF technote] */
|
|
||||||
/* tags 32952-32956 are private tags registered to Island Graphics */
|
|
||||||
#define TIFFTAG_REFPTS 32953 /* image reference points */
|
|
||||||
#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
|
|
||||||
#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
|
|
||||||
#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
|
|
||||||
/* tags 32995-32999 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
|
|
||||||
#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
|
|
||||||
#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
|
|
||||||
#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
|
|
||||||
/* tags 33300-33309 are private tags registered to Pixar */
|
|
||||||
/*
|
|
||||||
* TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
|
|
||||||
* are set when an image has been cropped out of a larger image.
|
|
||||||
* They reflect the size of the original uncropped image.
|
|
||||||
* The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
|
|
||||||
* to determine the position of the smaller image in the larger one.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
|
|
||||||
/* Tags 33302-33306 are used to identify special image modes and data
|
|
||||||
* used by Pixar's texture formats.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
|
|
||||||
#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
|
|
||||||
#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
|
|
||||||
/* tag 33405 is a private tag registered to Eastman Kodak */
|
|
||||||
#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
|
|
||||||
#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
|
|
||||||
#define TIFFTAG_CFAPATTERN 33422 /* color filter array pattern */
|
|
||||||
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
|
|
||||||
#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
|
|
||||||
/* IPTC TAG from RichTIFF specifications */
|
|
||||||
#define TIFFTAG_RICHTIFFIPTC 33723
|
|
||||||
/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define TIFFTAG_IT8SITE 34016 /* site name */
|
|
||||||
#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
|
|
||||||
#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
|
|
||||||
#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
|
|
||||||
#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
|
|
||||||
#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
|
|
||||||
#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
|
|
||||||
#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
|
|
||||||
#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
|
|
||||||
#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
|
|
||||||
#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
|
|
||||||
#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator
|
|
||||||
(untrapped=0, trapped=1) */
|
|
||||||
#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
|
|
||||||
/* tags 34232-34236 are private tags registered to Texas Instruments */
|
|
||||||
#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
|
|
||||||
/* tag 34377 is private tag registered to Adobe for PhotoShop */
|
|
||||||
#define TIFFTAG_PHOTOSHOP 34377
|
|
||||||
/* tags 34665, 34853 and 40965 are documented in EXIF specification */
|
|
||||||
#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */
|
|
||||||
/* tag 34750 is a private tag registered to Adobe? */
|
|
||||||
#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
|
|
||||||
#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
|
|
||||||
/* tag 34750 is a private tag registered to Pixel Magic */
|
|
||||||
#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
|
|
||||||
#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
|
|
||||||
/* tags 34908-34914 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
|
|
||||||
#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
|
|
||||||
#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
|
|
||||||
#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
|
|
||||||
/* tags 37439-37443 are registered to SGI <gregl@sgi.com> */
|
|
||||||
#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
|
|
||||||
/* tag 34929 is a private tag registered to FedEx */
|
|
||||||
#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
|
|
||||||
#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */
|
|
||||||
/* Adobe Digital Negative (DNG) format tags */
|
|
||||||
#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
|
|
||||||
#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
|
|
||||||
#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
|
|
||||||
#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model
|
|
||||||
name */
|
|
||||||
#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space
|
|
||||||
mapping */
|
|
||||||
#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
|
|
||||||
#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
|
|
||||||
#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for
|
|
||||||
the BlackLevel tag */
|
|
||||||
#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level
|
|
||||||
differences (columns) */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level
|
|
||||||
differences (rows) */
|
|
||||||
#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding
|
|
||||||
level */
|
|
||||||
#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
|
|
||||||
#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space
|
|
||||||
transformation matrix 1 */
|
|
||||||
#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space
|
|
||||||
transformation matrix 2 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction
|
|
||||||
matrix 1 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction
|
|
||||||
matrix 2 */
|
|
||||||
#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw
|
|
||||||
values*/
|
|
||||||
#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in
|
|
||||||
linear reference space */
|
|
||||||
#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in
|
|
||||||
x-y chromaticity
|
|
||||||
coordinates */
|
|
||||||
#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero
|
|
||||||
point */
|
|
||||||
#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
|
|
||||||
#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of
|
|
||||||
sharpening */
|
|
||||||
#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of
|
|
||||||
the green pixels in the
|
|
||||||
blue/green rows track the
|
|
||||||
values of the green pixels
|
|
||||||
in the red/green rows */
|
|
||||||
#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
|
|
||||||
#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
|
|
||||||
#define TIFFTAG_LENSINFO 50736 /* info about the lens */
|
|
||||||
#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
|
|
||||||
#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the
|
|
||||||
camera's anti-alias filter */
|
|
||||||
#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
|
|
||||||
#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
|
|
||||||
#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote
|
|
||||||
tag is safe to preserve
|
|
||||||
along with the rest of the
|
|
||||||
EXIF data */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
|
|
||||||
#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
|
|
||||||
#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for
|
|
||||||
the raw image data */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels
|
|
||||||
of the sensor */
|
|
||||||
#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates
|
|
||||||
of fully masked pixels */
|
|
||||||
#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
|
|
||||||
#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space
|
|
||||||
into ICC profile space */
|
|
||||||
#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
|
|
||||||
#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
|
|
||||||
/* tag 65535 is an undefined tag used by Eastman Kodak */
|
|
||||||
#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following are ``pseudo tags'' that can be used to control
|
|
||||||
* codec-specific functionality. These tags are not written to file.
|
|
||||||
* Note that these values start at 0xffff+1 so that they'll never
|
|
||||||
* collide with Aldus-assigned tags.
|
|
||||||
*
|
|
||||||
* If you want your private pseudo tags ``registered'' (i.e. added to
|
|
||||||
* this file), please post a bug report via the tracking system at
|
|
||||||
* http://www.remotesensing.org/libtiff/bugs.html with the appropriate
|
|
||||||
* C definitions to add.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
|
|
||||||
#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
|
|
||||||
#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
|
|
||||||
#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
|
|
||||||
#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
|
|
||||||
#define FAXMODE_WORDALIGN 0x0008 /* word align row */
|
|
||||||
#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
|
|
||||||
#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
|
|
||||||
/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */
|
|
||||||
#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
|
|
||||||
#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
|
|
||||||
#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
|
|
||||||
#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
|
|
||||||
#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
|
|
||||||
#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
|
|
||||||
/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
|
|
||||||
#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
|
|
||||||
#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
|
|
||||||
#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
|
|
||||||
#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
|
|
||||||
#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
|
|
||||||
#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
|
|
||||||
#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
|
|
||||||
#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
|
|
||||||
/* 65550-65556 are allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
|
|
||||||
#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
|
|
||||||
#define DCSIMAGERFILTER_IR 0 /* infrared filter */
|
|
||||||
#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
|
|
||||||
#define DCSIMAGERFILTER_CFA 2 /* color filter array */
|
|
||||||
#define DCSIMAGERFILTER_OTHER 3 /* other filter */
|
|
||||||
#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
|
|
||||||
#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
|
|
||||||
#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
|
|
||||||
#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
|
|
||||||
#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
|
|
||||||
#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
|
|
||||||
#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
|
|
||||||
#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
|
|
||||||
/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
|
|
||||||
#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
|
|
||||||
#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
|
|
||||||
/* 65559 is allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
|
|
||||||
#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
|
|
||||||
#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
|
|
||||||
#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
|
|
||||||
#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
|
|
||||||
#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
|
|
||||||
#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
|
|
||||||
#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
|
|
||||||
#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
|
|
||||||
#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */
|
|
||||||
#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */
|
|
||||||
#define PERSAMPLE_MERGED 0 /* present as a single value */
|
|
||||||
#define PERSAMPLE_MULTI 1 /* present as multiple values */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXIF tags
|
|
||||||
*/
|
|
||||||
#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */
|
|
||||||
#define EXIFTAG_FNUMBER 33437 /* F number */
|
|
||||||
#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
|
|
||||||
#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
|
||||||
#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
|
||||||
#define EXIFTAG_OECF 34856 /* Optoelectric conversion
|
|
||||||
factor */
|
|
||||||
#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
|
|
||||||
#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
|
|
||||||
#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
|
||||||
#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
|
||||||
#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */
|
|
||||||
#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */
|
|
||||||
#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */
|
|
||||||
#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */
|
|
||||||
#define EXIFTAG_METERINGMODE 37383 /* Metering mode */
|
|
||||||
#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */
|
|
||||||
#define EXIFTAG_FLASH 37385 /* Flash */
|
|
||||||
#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */
|
|
||||||
#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */
|
|
||||||
#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */
|
|
||||||
#define EXIFTAG_USERCOMMENT 37510 /* User comments */
|
|
||||||
#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */
|
|
||||||
#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */
|
|
||||||
#define EXIFTAG_COLORSPACE 40961 /* Color space information */
|
|
||||||
#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */
|
|
||||||
#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */
|
|
||||||
#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */
|
|
||||||
#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */
|
|
||||||
#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */
|
|
||||||
#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */
|
|
||||||
#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */
|
|
||||||
#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */
|
|
||||||
#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */
|
|
||||||
#define EXIFTAG_FILESOURCE 41728 /* File source */
|
|
||||||
#define EXIFTAG_SCENETYPE 41729 /* Scene type */
|
|
||||||
#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */
|
|
||||||
#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */
|
|
||||||
#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */
|
|
||||||
#define EXIFTAG_WHITEBALANCE 41987 /* White balance */
|
|
||||||
#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */
|
|
||||||
#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */
|
|
||||||
#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_CONTRAST 41992 /* Contrast */
|
|
||||||
#define EXIFTAG_SATURATION 41993 /* Saturation */
|
|
||||||
#define EXIFTAG_SHARPNESS 41994 /* Sharpness */
|
|
||||||
#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */
|
|
||||||
|
|
||||||
#endif /* _TIFF_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */
|
|
||||||
/*
|
|
||||||
Configuration defines for installed libtiff.
|
|
||||||
This file maintained for backward compatibility. Do not use definitions
|
|
||||||
from this file in your programs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFCONF_
|
|
||||||
#define _TIFFCONF_
|
|
||||||
|
|
||||||
/* Signed 16-bit type */
|
|
||||||
#define TIFF_INT16_T signed short
|
|
||||||
|
|
||||||
/* Signed 32-bit type */
|
|
||||||
#define TIFF_INT32_T signed int
|
|
||||||
|
|
||||||
/* Signed 64-bit type */
|
|
||||||
#define TIFF_INT64_T signed long
|
|
||||||
|
|
||||||
/* Signed 8-bit type */
|
|
||||||
#define TIFF_INT8_T signed char
|
|
||||||
|
|
||||||
/* Unsigned 16-bit type */
|
|
||||||
#define TIFF_UINT16_T unsigned short
|
|
||||||
|
|
||||||
/* Unsigned 32-bit type */
|
|
||||||
#define TIFF_UINT32_T unsigned int
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type */
|
|
||||||
#define TIFF_UINT64_T unsigned long
|
|
||||||
|
|
||||||
/* Unsigned 8-bit type */
|
|
||||||
#define TIFF_UINT8_T unsigned char
|
|
||||||
|
|
||||||
/* Signed size type */
|
|
||||||
#define TIFF_SSIZE_T signed long
|
|
||||||
|
|
||||||
/* Pointer difference type */
|
|
||||||
#define TIFF_PTRDIFF_T ptrdiff_t
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
/* #undef HAVE_INT16 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
/* #undef HAVE_INT32 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
/* #undef HAVE_INT8 */
|
|
||||||
|
|
||||||
/* Compatibility stuff. */
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#define HAVE_IEEEFP 1
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#define HOST_FILLORDER FILLORDER_MSB2LSB
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#define HOST_BIGENDIAN 0
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#define CCITT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
/* #undef JPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support JBIG compression (requires JBIG-KIT library) */
|
|
||||||
/* #undef JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#define LOGLUV_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#define LZW_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#define NEXT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
|
|
||||||
fails with unpatched IJG JPEG library) */
|
|
||||||
/* #undef OJPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#define PACKBITS_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
/* #undef PIXARLOG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#define THUNDER_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
/* #undef ZIP_SUPPORT */
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of ~8Kb to reduce memory usage) */
|
|
||||||
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#define SUBIFD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
|
|
||||||
|
|
||||||
/* Support MS MDI magic number files as TIFF */
|
|
||||||
#define MDI_SUPPORT 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature support definitions.
|
|
||||||
* XXX: These macros are obsoleted. Don't use them in your apps!
|
|
||||||
* Macros stays here for backward compatibility and should be always defined.
|
|
||||||
*/
|
|
||||||
#define COLORIMETRY_SUPPORT
|
|
||||||
#define YCBCR_SUPPORT
|
|
||||||
#define CMYK_SUPPORT
|
|
||||||
#define ICC_SUPPORT
|
|
||||||
#define PHOTOSHOP_SUPPORT
|
|
||||||
#define IPTC_SUPPORT
|
|
||||||
|
|
||||||
#endif /* _TIFFCONF_ */
|
|
||||||
|
|
@ -1,557 +0,0 @@
|
||||||
/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFIO_
|
|
||||||
#define _TIFFIO_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF I/O Library Definitions.
|
|
||||||
*/
|
|
||||||
#include "tiff.h"
|
|
||||||
#include "tiffvers.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF is defined as an incomplete type to hide the
|
|
||||||
* library's internal data structures from clients.
|
|
||||||
*/
|
|
||||||
typedef struct tiff TIFF;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following typedefs define the intrinsic size of
|
|
||||||
* data types used in the *exported* interfaces. These
|
|
||||||
* definitions depend on the proper definition of types
|
|
||||||
* in tiff.h. Note also that the varargs interface used
|
|
||||||
* to pass tag types and values uses the types defined in
|
|
||||||
* tiff.h directly.
|
|
||||||
*
|
|
||||||
* NB: ttag_t is unsigned int and not unsigned short because
|
|
||||||
* ANSI C requires that the type before the ellipsis be a
|
|
||||||
* promoted type (i.e. one of int, unsigned int, pointer,
|
|
||||||
* or double) and because we defined pseudo-tags that are
|
|
||||||
* outside the range of legal Aldus-assigned tags.
|
|
||||||
* NB: tsize_t is int32 and not uint32 because some functions
|
|
||||||
* return -1.
|
|
||||||
* NB: toff_t is not off_t for many reasons; TIFFs max out at
|
|
||||||
* 32-bit file offsets, and BigTIFF maxes out at 64-bit
|
|
||||||
* offsets being the most important, and to ensure use of
|
|
||||||
* a consistently unsigned type across architectures.
|
|
||||||
* Prior to libtiff 4.0, this was an unsigned 32 bit type.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* this is the machine addressing size type, only it's signed, so make it
|
|
||||||
* int32 on 32bit machines, int64 on 64bit machines
|
|
||||||
*/
|
|
||||||
typedef TIFF_SSIZE_T tmsize_t;
|
|
||||||
typedef uint64 toff_t; /* file offset */
|
|
||||||
/* the following are deprecated and should be replaced by their defining
|
|
||||||
counterparts */
|
|
||||||
typedef uint32 ttag_t; /* directory tag */
|
|
||||||
typedef uint16 tdir_t; /* directory index */
|
|
||||||
typedef uint16 tsample_t; /* sample number */
|
|
||||||
typedef uint32 tstrile_t; /* strip or tile number */
|
|
||||||
typedef tstrile_t tstrip_t; /* strip number */
|
|
||||||
typedef tstrile_t ttile_t; /* tile number */
|
|
||||||
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
|
||||||
typedef void* tdata_t; /* image data ref */
|
|
||||||
|
|
||||||
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
|
|
||||||
#define __WIN32__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c
|
|
||||||
* or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c).
|
|
||||||
*
|
|
||||||
* By default tif_unix.c is assumed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
|
||||||
# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
|
|
||||||
# define AVOID_WIN32_FILEIO
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_WIN32_FILEIO)
|
|
||||||
# define VC_EXTRALEAN
|
|
||||||
# include <windows.h>
|
|
||||||
# ifdef __WIN32__
|
|
||||||
DECLARE_HANDLE(thandle_t); /* Win32 file handle */
|
|
||||||
# else
|
|
||||||
typedef HFILE thandle_t; /* client data handle */
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
#else
|
|
||||||
typedef void* thandle_t; /* client data handle */
|
|
||||||
#endif /* USE_WIN32_FILEIO */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags to pass to TIFFPrintDirectory to control
|
|
||||||
* printing of data structures that are potentially
|
|
||||||
* very large. Bit-or these flags to enable printing
|
|
||||||
* multiple items.
|
|
||||||
*/
|
|
||||||
#define TIFFPRINT_NONE 0x0 /* no extra info */
|
|
||||||
#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
|
|
||||||
#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
|
|
||||||
#define TIFFPRINT_COLORMAP 0x4 /* colormap */
|
|
||||||
#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
|
|
||||||
#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
|
|
||||||
#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Colour conversion stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* reference white */
|
|
||||||
#define D65_X0 (95.0470F)
|
|
||||||
#define D65_Y0 (100.0F)
|
|
||||||
#define D65_Z0 (108.8827F)
|
|
||||||
|
|
||||||
#define D50_X0 (96.4250F)
|
|
||||||
#define D50_Y0 (100.0F)
|
|
||||||
#define D50_Z0 (82.4680F)
|
|
||||||
|
|
||||||
/* Structure for holding information about a display device. */
|
|
||||||
|
|
||||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
|
||||||
float d_YCR; /* Light o/p for reference white */
|
|
||||||
float d_YCG;
|
|
||||||
float d_YCB;
|
|
||||||
uint32 d_Vrwr; /* Pixel values for ref. white */
|
|
||||||
uint32 d_Vrwg;
|
|
||||||
uint32 d_Vrwb;
|
|
||||||
float d_Y0R; /* Residual light for black pixel */
|
|
||||||
float d_Y0G;
|
|
||||||
float d_Y0B;
|
|
||||||
float d_gammaR; /* Gamma values for the three guns */
|
|
||||||
float d_gammaG;
|
|
||||||
float d_gammaB;
|
|
||||||
} TIFFDisplay;
|
|
||||||
|
|
||||||
typedef struct { /* YCbCr->RGB support */
|
|
||||||
TIFFRGBValue* clamptab; /* range clamping table */
|
|
||||||
int* Cr_r_tab;
|
|
||||||
int* Cb_b_tab;
|
|
||||||
int32* Cr_g_tab;
|
|
||||||
int32* Cb_g_tab;
|
|
||||||
int32* Y_tab;
|
|
||||||
} TIFFYCbCrToRGB;
|
|
||||||
|
|
||||||
typedef struct { /* CIE Lab 1976->RGB support */
|
|
||||||
int range; /* Size of conversion table */
|
|
||||||
#define CIELABTORGB_TABLE_RANGE 1500
|
|
||||||
float rstep, gstep, bstep;
|
|
||||||
float X0, Y0, Z0; /* Reference white point */
|
|
||||||
TIFFDisplay display;
|
|
||||||
float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
|
|
||||||
float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
|
|
||||||
float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
|
|
||||||
} TIFFCIELabToRGB;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RGBA-style image support.
|
|
||||||
*/
|
|
||||||
typedef struct _TIFFRGBAImage TIFFRGBAImage;
|
|
||||||
/*
|
|
||||||
* The image reading and conversion routines invoke
|
|
||||||
* ``put routines'' to copy/image/whatever tiles of
|
|
||||||
* raw image data. A default set of routines are
|
|
||||||
* provided to convert/copy raw image data to 8-bit
|
|
||||||
* packed ABGR format rasters. Applications can supply
|
|
||||||
* alternate routines that unpack the data into a
|
|
||||||
* different format or, for example, unpack the data
|
|
||||||
* and draw the unpacked raster on the display.
|
|
||||||
*/
|
|
||||||
typedef void (*tileContigRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*);
|
|
||||||
typedef void (*tileSeparateRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
|
|
||||||
/*
|
|
||||||
* RGBA-reader state.
|
|
||||||
*/
|
|
||||||
struct _TIFFRGBAImage {
|
|
||||||
TIFF* tif; /* image handle */
|
|
||||||
int stoponerr; /* stop on read error */
|
|
||||||
int isContig; /* data is packed/separate */
|
|
||||||
int alpha; /* type of alpha data present */
|
|
||||||
uint32 width; /* image width */
|
|
||||||
uint32 height; /* image height */
|
|
||||||
uint16 bitspersample; /* image bits/sample */
|
|
||||||
uint16 samplesperpixel; /* image samples/pixel */
|
|
||||||
uint16 orientation; /* image orientation */
|
|
||||||
uint16 req_orientation; /* requested orientation */
|
|
||||||
uint16 photometric; /* image photometric interp */
|
|
||||||
uint16* redcmap; /* colormap pallete */
|
|
||||||
uint16* greencmap;
|
|
||||||
uint16* bluecmap;
|
|
||||||
/* get image data routine */
|
|
||||||
int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
/* put decoded strip/tile */
|
|
||||||
union {
|
|
||||||
void (*any)(TIFFRGBAImage*);
|
|
||||||
tileContigRoutine contig;
|
|
||||||
tileSeparateRoutine separate;
|
|
||||||
} put;
|
|
||||||
TIFFRGBValue* Map; /* sample mapping array */
|
|
||||||
uint32** BWmap; /* black&white map */
|
|
||||||
uint32** PALmap; /* palette image map */
|
|
||||||
TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
|
|
||||||
TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
|
|
||||||
|
|
||||||
uint8* UaToAa; /* Unassociated alpha to associated alpha convertion LUT */
|
|
||||||
uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
|
||||||
|
|
||||||
int row_offset;
|
|
||||||
int col_offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros for extracting components from the
|
|
||||||
* packed ABGR form returned by TIFFReadRGBAImage.
|
|
||||||
*/
|
|
||||||
#define TIFFGetR(abgr) ((abgr) & 0xff)
|
|
||||||
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
|
|
||||||
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
|
|
||||||
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A CODEC is a software package that implements decoding,
|
|
||||||
* encoding, or decoding+encoding of a compression algorithm.
|
|
||||||
* The library provides a collection of builtin codecs.
|
|
||||||
* More codecs may be registered through calls to the library
|
|
||||||
* and/or the builtin implementations may be overridden.
|
|
||||||
*/
|
|
||||||
typedef int (*TIFFInitMethod)(TIFF*, int);
|
|
||||||
typedef struct {
|
|
||||||
char* name;
|
|
||||||
uint16 scheme;
|
|
||||||
TIFFInitMethod init;
|
|
||||||
} TIFFCodec;
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
/* share internal LogLuv conversion routines? */
|
|
||||||
#ifndef LOGLUV_PUBLIC
|
|
||||||
#define LOGLUV_PUBLIC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
|
||||||
# define __attribute__(x) /*nothing*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
|
|
||||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
|
|
||||||
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t);
|
|
||||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
|
||||||
typedef int (*TIFFCloseProc)(thandle_t);
|
|
||||||
typedef toff_t (*TIFFSizeProc)(thandle_t);
|
|
||||||
typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size);
|
|
||||||
typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size);
|
|
||||||
typedef void (*TIFFExtendProc)(TIFF*);
|
|
||||||
|
|
||||||
extern const char* TIFFGetVersion(void);
|
|
||||||
|
|
||||||
extern const TIFFCodec* TIFFFindCODEC(uint16);
|
|
||||||
extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
|
|
||||||
extern void TIFFUnRegisterCODEC(TIFFCodec*);
|
|
||||||
extern int TIFFIsCODECConfigured(uint16);
|
|
||||||
extern TIFFCodec* TIFFGetConfiguredCODECs(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Auxiliary functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void* _TIFFmalloc(tmsize_t s);
|
|
||||||
extern void* _TIFFrealloc(void* p, tmsize_t s);
|
|
||||||
extern void _TIFFmemset(void* p, int v, tmsize_t c);
|
|
||||||
extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c);
|
|
||||||
extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c);
|
|
||||||
extern void _TIFFfree(void* p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Stuff, related to tag handling and creating custom tags.
|
|
||||||
*/
|
|
||||||
extern int TIFFGetTagListCount( TIFF * );
|
|
||||||
extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index );
|
|
||||||
|
|
||||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
|
||||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
|
||||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
|
||||||
#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
|
|
||||||
|
|
||||||
#define FIELD_CUSTOM 65
|
|
||||||
|
|
||||||
typedef struct _TIFFField TIFFField;
|
|
||||||
typedef struct _TIFFFieldArray TIFFFieldArray;
|
|
||||||
|
|
||||||
extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType);
|
|
||||||
extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32);
|
|
||||||
extern const TIFFField* TIFFFieldWithName(TIFF*, const char *);
|
|
||||||
|
|
||||||
extern uint32 TIFFFieldTag(const TIFFField*);
|
|
||||||
extern const char* TIFFFieldName(const TIFFField*);
|
|
||||||
extern TIFFDataType TIFFFieldDataType(const TIFFField*);
|
|
||||||
extern int TIFFFieldPassCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldReadCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldWriteCount(const TIFFField*);
|
|
||||||
|
|
||||||
typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
|
||||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
|
||||||
TIFFPrintMethod printdir; /* directory print routine */
|
|
||||||
} TIFFTagMethods;
|
|
||||||
|
|
||||||
extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
|
|
||||||
extern void *TIFFGetClientInfo(TIFF *, const char *);
|
|
||||||
extern void TIFFSetClientInfo(TIFF *, void *, const char *);
|
|
||||||
|
|
||||||
extern void TIFFCleanup(TIFF* tif);
|
|
||||||
extern void TIFFClose(TIFF* tif);
|
|
||||||
extern int TIFFFlush(TIFF* tif);
|
|
||||||
extern int TIFFFlushData(TIFF* tif);
|
|
||||||
extern int TIFFGetField(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFReadDirectory(TIFF* tif);
|
|
||||||
extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
|
|
||||||
extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff);
|
|
||||||
extern uint64 TIFFScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRasterScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFRasterScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFStripSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFStripSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip);
|
|
||||||
extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip);
|
|
||||||
extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint64 TIFFTileRowSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileRowSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFTileSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request);
|
|
||||||
extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
|
|
||||||
extern int TIFFFileno(TIFF*);
|
|
||||||
extern int TIFFSetFileno(TIFF*, int);
|
|
||||||
extern thandle_t TIFFClientdata(TIFF*);
|
|
||||||
extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
|
|
||||||
extern int TIFFGetMode(TIFF*);
|
|
||||||
extern int TIFFSetMode(TIFF*, int);
|
|
||||||
extern int TIFFIsTiled(TIFF*);
|
|
||||||
extern int TIFFIsByteSwapped(TIFF*);
|
|
||||||
extern int TIFFIsUpSampled(TIFF*);
|
|
||||||
extern int TIFFIsMSB2LSB(TIFF*);
|
|
||||||
extern int TIFFIsBigEndian(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
|
|
||||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
|
|
||||||
extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
|
|
||||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
|
|
||||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
|
|
||||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentRow(TIFF*);
|
|
||||||
extern uint16 TIFFCurrentDirectory(TIFF*);
|
|
||||||
extern uint16 TIFFNumberOfDirectories(TIFF*);
|
|
||||||
extern uint64 TIFFCurrentDirOffset(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentStrip(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentTile(TIFF* tif);
|
|
||||||
extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFSetupStrips(TIFF *);
|
|
||||||
extern int TIFFWriteCheck(TIFF*, int, const char *);
|
|
||||||
extern void TIFFFreeDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
|
|
||||||
extern int TIFFCreateEXIFDirectory(TIFF*);
|
|
||||||
extern int TIFFLastDirectory(TIFF*);
|
|
||||||
extern int TIFFSetDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetSubDirectory(TIFF*, uint64);
|
|
||||||
extern int TIFFUnlinkDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetField(TIFF*, uint32, ...);
|
|
||||||
extern int TIFFVSetField(TIFF*, uint32, va_list);
|
|
||||||
extern int TIFFUnsetField(TIFF*, uint32);
|
|
||||||
extern int TIFFWriteDirectory(TIFF *);
|
|
||||||
extern int TIFFWriteCustomDirectory(TIFF *, uint64 *);
|
|
||||||
extern int TIFFCheckpointDirectory(TIFF *);
|
|
||||||
extern int TIFFRewriteDirectory(TIFF *);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
|
|
||||||
int = ORIENTATION_BOTLEFT, int = 0);
|
|
||||||
#else
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * );
|
|
||||||
extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
|
|
||||||
extern int TIFFRGBAImageOK(TIFF*, char [1024]);
|
|
||||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
|
|
||||||
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
|
|
||||||
extern TIFF* TIFFOpen(const char*, const char*);
|
|
||||||
# ifdef __WIN32__
|
|
||||||
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
extern TIFF* TIFFFdOpen(int, const char*, const char*);
|
|
||||||
extern TIFF* TIFFClientOpen(const char*, const char*,
|
|
||||||
thandle_t,
|
|
||||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
|
||||||
TIFFSeekProc, TIFFCloseProc,
|
|
||||||
TIFFSizeProc,
|
|
||||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
|
||||||
extern const char* TIFFFileName(TIFF*);
|
|
||||||
extern const char* TIFFSetFileName(TIFF*, const char *);
|
|
||||||
extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
|
||||||
extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFNumberOfTiles(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16);
|
|
||||||
extern uint32 TIFFNumberOfStrips(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
|
|
||||||
extern void TIFFSetWriteOffset(TIFF* tif, toff_t off);
|
|
||||||
extern void TIFFSwabShort(uint16*);
|
|
||||||
extern void TIFFSwabLong(uint32*);
|
|
||||||
extern void TIFFSwabLong8(uint64*);
|
|
||||||
extern void TIFFSwabFloat(float*);
|
|
||||||
extern void TIFFSwabDouble(double*);
|
|
||||||
extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n);
|
|
||||||
extern void TIFFReverseBits(uint8* cp, tmsize_t n);
|
|
||||||
extern const unsigned char* TIFFGetBitRevTable(int);
|
|
||||||
|
|
||||||
#ifdef LOGLUV_PUBLIC
|
|
||||||
#define U_NEU 0.210526316
|
|
||||||
#define V_NEU 0.473684211
|
|
||||||
#define UVSCALE 410.
|
|
||||||
extern double LogL16toY(int);
|
|
||||||
extern double LogL10toY(int);
|
|
||||||
extern void XYZtoRGB24(float*, uint8*);
|
|
||||||
extern int uv_decode(double*, double*, int);
|
|
||||||
extern void LogLuv24toXYZ(uint32, float*);
|
|
||||||
extern void LogLuv32toXYZ(uint32, float*);
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
#else
|
|
||||||
extern int LogL16fromY(double, int);
|
|
||||||
extern int LogL10fromY(double, int);
|
|
||||||
extern int uv_encode(double, double, int);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int);
|
|
||||||
#endif
|
|
||||||
#endif /* LOGLUV_PUBLIC */
|
|
||||||
|
|
||||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*);
|
|
||||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
|
|
||||||
float *, float *, float *);
|
|
||||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
|
|
||||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* O B S O L E T E D I N T E R F A C E S
|
|
||||||
*
|
|
||||||
* Don't use this stuff in your applications, it may be removed in the future
|
|
||||||
* libtiff versions.
|
|
||||||
****************************************************************************/
|
|
||||||
typedef struct {
|
|
||||||
ttag_t field_tag; /* field's tag */
|
|
||||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
|
||||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
|
||||||
TIFFDataType field_type; /* type of associated data */
|
|
||||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
|
||||||
unsigned char field_oktochange; /* if true, can change while writing */
|
|
||||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
|
||||||
char *field_name; /* ASCII name */
|
|
||||||
} TIFFFieldInfo;
|
|
||||||
|
|
||||||
extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _TIFFIO_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.6\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
|
|
||||||
/*
|
|
||||||
* This define can be used in code that requires
|
|
||||||
* compilation-related definitions specific to a
|
|
||||||
* version or versions of the library. Runtime
|
|
||||||
* version checking should be done based on the
|
|
||||||
* string returned by TIFFGetVersion.
|
|
||||||
*/
|
|
||||||
#define TIFFLIB_VERSION 20150912
|
|
||||||
Binary file not shown.
|
|
@ -1,681 +0,0 @@
|
||||||
/* $Id: tiff.h,v 1.69 2014-04-02 17:23:06 fwarmerdam Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFF_
|
|
||||||
#define _TIFF_
|
|
||||||
|
|
||||||
#include "tiffconf.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag Image File Format (TIFF)
|
|
||||||
*
|
|
||||||
* Based on Rev 6.0 from:
|
|
||||||
* Developer's Desk
|
|
||||||
* Aldus Corporation
|
|
||||||
* 411 First Ave. South
|
|
||||||
* Suite 200
|
|
||||||
* Seattle, WA 98104
|
|
||||||
* 206-622-5500
|
|
||||||
*
|
|
||||||
* (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf)
|
|
||||||
*
|
|
||||||
* For BigTIFF design notes see the following links
|
|
||||||
* http://www.remotesensing.org/libtiff/bigtiffdesign.html
|
|
||||||
* http://www.awaresystems.be/imaging/tiff/bigtiff.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TIFF_VERSION_CLASSIC 42
|
|
||||||
#define TIFF_VERSION_BIG 43
|
|
||||||
|
|
||||||
#define TIFF_BIGENDIAN 0x4d4d
|
|
||||||
#define TIFF_LITTLEENDIAN 0x4949
|
|
||||||
#define MDI_LITTLEENDIAN 0x5045
|
|
||||||
#define MDI_BIGENDIAN 0x4550
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Intrinsic data types required by the file format:
|
|
||||||
*
|
|
||||||
* 8-bit quantities int8/uint8
|
|
||||||
* 16-bit quantities int16/uint16
|
|
||||||
* 32-bit quantities int32/uint32
|
|
||||||
* 64-bit quantities int64/uint64
|
|
||||||
* strings unsigned char*
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef TIFF_INT8_T int8;
|
|
||||||
typedef TIFF_UINT8_T uint8;
|
|
||||||
|
|
||||||
typedef TIFF_INT16_T int16;
|
|
||||||
typedef TIFF_UINT16_T uint16;
|
|
||||||
|
|
||||||
typedef TIFF_INT32_T int32;
|
|
||||||
typedef TIFF_UINT32_T uint32;
|
|
||||||
|
|
||||||
typedef TIFF_INT64_T int64;
|
|
||||||
typedef TIFF_UINT64_T uint64;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some types as promoted in a variable argument list
|
|
||||||
* We use uint16_vap rather then directly using int, because this way
|
|
||||||
* we document the type we actually want to pass through, conceptually,
|
|
||||||
* rather then confusing the issue by merely stating the type it gets
|
|
||||||
* promoted to
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef int uint16_vap;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF header.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
} TIFFHeaderCommon;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint32 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderClassic;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint16 tiff_offsetsize; /* size of offsets, should be 8 */
|
|
||||||
uint16 tiff_unused; /* unused word, should be 0 */
|
|
||||||
uint64 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderBig;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NB: In the comments below,
|
|
||||||
* - items marked with a + are obsoleted by revision 5.0,
|
|
||||||
* - items marked with a ! are introduced in revision 6.0.
|
|
||||||
* - items marked with a % are introduced post revision 6.0.
|
|
||||||
* - items marked with a $ are obsoleted by revision 6.0.
|
|
||||||
* - items marked with a & are introduced by Adobe DNG specification.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag data type information.
|
|
||||||
*
|
|
||||||
* Note: RATIONALs are the ratio of two 32-bit integer values.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
TIFF_NOTYPE = 0, /* placeholder */
|
|
||||||
TIFF_BYTE = 1, /* 8-bit unsigned integer */
|
|
||||||
TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
|
|
||||||
TIFF_SHORT = 3, /* 16-bit unsigned integer */
|
|
||||||
TIFF_LONG = 4, /* 32-bit unsigned integer */
|
|
||||||
TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
|
|
||||||
TIFF_SBYTE = 6, /* !8-bit signed integer */
|
|
||||||
TIFF_UNDEFINED = 7, /* !8-bit untyped data */
|
|
||||||
TIFF_SSHORT = 8, /* !16-bit signed integer */
|
|
||||||
TIFF_SLONG = 9, /* !32-bit signed integer */
|
|
||||||
TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
|
|
||||||
TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
|
|
||||||
TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
|
|
||||||
TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */
|
|
||||||
TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */
|
|
||||||
TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */
|
|
||||||
TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */
|
|
||||||
} TIFFDataType;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Tag Definitions.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
|
|
||||||
#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
|
|
||||||
#define FILETYPE_PAGE 0x2 /* one page of many */
|
|
||||||
#define FILETYPE_MASK 0x4 /* transparency mask */
|
|
||||||
#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
|
|
||||||
#define OFILETYPE_IMAGE 1 /* full resolution image data */
|
|
||||||
#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
|
|
||||||
#define OFILETYPE_PAGE 3 /* one page of many */
|
|
||||||
#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
|
|
||||||
#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
|
|
||||||
#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
|
|
||||||
#define TIFFTAG_COMPRESSION 259 /* data compression technique */
|
|
||||||
#define COMPRESSION_NONE 1 /* dump mode */
|
|
||||||
#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
|
|
||||||
#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
|
|
||||||
#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
|
|
||||||
#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
|
|
||||||
#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */
|
|
||||||
#define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */
|
|
||||||
#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
|
|
||||||
#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
|
|
||||||
#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
|
|
||||||
#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
|
|
||||||
/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
|
|
||||||
#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
|
|
||||||
#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
|
|
||||||
#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
|
|
||||||
/* compression codes 32908-32911 are reserved for Pixar */
|
|
||||||
#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
|
|
||||||
#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
|
|
||||||
#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
|
|
||||||
#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression,
|
|
||||||
as recognized by Adobe */
|
|
||||||
/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
|
|
||||||
#define COMPRESSION_JBIG 34661 /* ISO JBIG */
|
|
||||||
#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
|
|
||||||
#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
|
|
||||||
#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
|
|
||||||
#define COMPRESSION_LZMA 34925 /* LZMA2 */
|
|
||||||
#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
|
|
||||||
#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
|
|
||||||
#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
|
|
||||||
#define PHOTOMETRIC_RGB 2 /* RGB color model */
|
|
||||||
#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
|
|
||||||
#define PHOTOMETRIC_MASK 4 /* $holdout mask */
|
|
||||||
#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
|
|
||||||
#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
|
|
||||||
#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
|
|
||||||
#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
|
|
||||||
#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
|
|
||||||
#define PHOTOMETRIC_CFA 32803 /* color filter array */
|
|
||||||
#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
|
|
||||||
#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
|
|
||||||
#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
|
|
||||||
#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
|
|
||||||
#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
|
|
||||||
#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
|
|
||||||
#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
|
|
||||||
#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
|
|
||||||
#define TIFFTAG_FILLORDER 266 /* data order within a byte */
|
|
||||||
#define FILLORDER_MSB2LSB 1 /* most significant -> least */
|
|
||||||
#define FILLORDER_LSB2MSB 2 /* least significant -> most */
|
|
||||||
#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
|
|
||||||
#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
|
|
||||||
#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
|
|
||||||
#define TIFFTAG_MODEL 272 /* scanner model name/number */
|
|
||||||
#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
|
|
||||||
#define TIFFTAG_ORIENTATION 274 /* +image orientation */
|
|
||||||
#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
|
|
||||||
#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
|
|
||||||
#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
|
|
||||||
#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
|
|
||||||
#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
|
|
||||||
#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
|
|
||||||
#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
|
|
||||||
#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
|
|
||||||
#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
|
|
||||||
#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
|
|
||||||
#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
|
|
||||||
#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
|
|
||||||
#define PLANARCONFIG_CONTIG 1 /* single image plane */
|
|
||||||
#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
|
|
||||||
#define TIFFTAG_PAGENAME 285 /* page name image is from */
|
|
||||||
#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
|
|
||||||
#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
|
|
||||||
#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
|
|
||||||
#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
|
|
||||||
#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
|
|
||||||
#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
|
|
||||||
#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
|
|
||||||
#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
|
|
||||||
#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
|
|
||||||
#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
|
|
||||||
#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
|
|
||||||
#define RESUNIT_NONE 1 /* no meaningful units */
|
|
||||||
#define RESUNIT_INCH 2 /* english */
|
|
||||||
#define RESUNIT_CENTIMETER 3 /* metric */
|
|
||||||
#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
|
|
||||||
#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
|
|
||||||
#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_SOFTWARE 305 /* name & release */
|
|
||||||
#define TIFFTAG_DATETIME 306 /* creation date and time */
|
|
||||||
#define TIFFTAG_ARTIST 315 /* creator of image */
|
|
||||||
#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
|
|
||||||
#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
|
|
||||||
#define PREDICTOR_NONE 1 /* no prediction scheme used */
|
|
||||||
#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */
|
|
||||||
#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */
|
|
||||||
#define TIFFTAG_WHITEPOINT 318 /* image white point */
|
|
||||||
#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
|
|
||||||
#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */
|
|
||||||
#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
|
|
||||||
#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */
|
|
||||||
#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */
|
|
||||||
#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
|
|
||||||
#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
|
|
||||||
#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
|
|
||||||
#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
|
|
||||||
#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
|
|
||||||
#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
|
|
||||||
#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
|
|
||||||
#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
|
|
||||||
#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
|
|
||||||
#define TIFFTAG_INKSET 332 /* !inks in separated image */
|
|
||||||
#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
|
|
||||||
#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
|
|
||||||
#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
|
|
||||||
#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
|
|
||||||
#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
|
|
||||||
#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
|
|
||||||
#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
|
|
||||||
#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
|
|
||||||
#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
|
|
||||||
#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
|
|
||||||
#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
|
|
||||||
#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
|
|
||||||
#define SAMPLEFORMAT_INT 2 /* !signed integer data */
|
|
||||||
#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
|
|
||||||
#define SAMPLEFORMAT_VOID 4 /* !untyped data */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
|
|
||||||
#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
|
|
||||||
#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
|
|
||||||
#define TIFFTAG_CLIPPATH 343 /* %ClipPath
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_INDEXED 346 /* %Indexed
|
|
||||||
[Adobe TIFF Technote 3] */
|
|
||||||
#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
|
|
||||||
#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
|
|
||||||
/* Tags 400-435 are from the TIFF/FX spec */
|
|
||||||
#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */
|
|
||||||
#define TIFFTAG_PROFILETYPE 401 /* ! */
|
|
||||||
#define PROFILETYPE_UNSPECIFIED 0 /* ! */
|
|
||||||
#define PROFILETYPE_G3_FAX 1 /* ! */
|
|
||||||
#define TIFFTAG_FAXPROFILE 402 /* ! */
|
|
||||||
#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */
|
|
||||||
#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */
|
|
||||||
#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */
|
|
||||||
#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */
|
|
||||||
#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */
|
|
||||||
#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */
|
|
||||||
#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */
|
|
||||||
#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */
|
|
||||||
#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */
|
|
||||||
#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */
|
|
||||||
#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */
|
|
||||||
#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */
|
|
||||||
#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */
|
|
||||||
#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */
|
|
||||||
#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */
|
|
||||||
#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */
|
|
||||||
#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */
|
|
||||||
#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */
|
|
||||||
/*
|
|
||||||
* Tags 512-521 are obsoleted by Technical Note #2 which specifies a
|
|
||||||
* revised JPEG-in-TIFF scheme.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
|
|
||||||
#define JPEGPROC_BASELINE 1 /* !baseline sequential */
|
|
||||||
#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
|
|
||||||
#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
|
|
||||||
#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
|
|
||||||
#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
|
|
||||||
#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
|
|
||||||
#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
|
|
||||||
#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */
|
|
||||||
#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
|
|
||||||
#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
|
|
||||||
#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
|
|
||||||
#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
|
|
||||||
#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
|
|
||||||
#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
|
|
||||||
#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
|
|
||||||
#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
|
|
||||||
#define TIFFTAG_XMLPACKET 700 /* %XML packet
|
|
||||||
[Adobe XMP Specification,
|
|
||||||
January 2004 */
|
|
||||||
#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID
|
|
||||||
[Adobe TIFF technote] */
|
|
||||||
/* tags 32952-32956 are private tags registered to Island Graphics */
|
|
||||||
#define TIFFTAG_REFPTS 32953 /* image reference points */
|
|
||||||
#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
|
|
||||||
#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
|
|
||||||
#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
|
|
||||||
/* tags 32995-32999 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
|
|
||||||
#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
|
|
||||||
#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
|
|
||||||
#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
|
|
||||||
/* tags 33300-33309 are private tags registered to Pixar */
|
|
||||||
/*
|
|
||||||
* TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
|
|
||||||
* are set when an image has been cropped out of a larger image.
|
|
||||||
* They reflect the size of the original uncropped image.
|
|
||||||
* The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
|
|
||||||
* to determine the position of the smaller image in the larger one.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
|
|
||||||
/* Tags 33302-33306 are used to identify special image modes and data
|
|
||||||
* used by Pixar's texture formats.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
|
|
||||||
#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
|
|
||||||
#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
|
|
||||||
/* tag 33405 is a private tag registered to Eastman Kodak */
|
|
||||||
#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
|
|
||||||
#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
|
|
||||||
#define TIFFTAG_CFAPATTERN 33422 /* color filter array pattern */
|
|
||||||
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
|
|
||||||
#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
|
|
||||||
/* IPTC TAG from RichTIFF specifications */
|
|
||||||
#define TIFFTAG_RICHTIFFIPTC 33723
|
|
||||||
/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define TIFFTAG_IT8SITE 34016 /* site name */
|
|
||||||
#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
|
|
||||||
#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
|
|
||||||
#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
|
|
||||||
#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
|
|
||||||
#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
|
|
||||||
#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
|
|
||||||
#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
|
|
||||||
#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
|
|
||||||
#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
|
|
||||||
#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
|
|
||||||
#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator
|
|
||||||
(untrapped=0, trapped=1) */
|
|
||||||
#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
|
|
||||||
/* tags 34232-34236 are private tags registered to Texas Instruments */
|
|
||||||
#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
|
|
||||||
/* tag 34377 is private tag registered to Adobe for PhotoShop */
|
|
||||||
#define TIFFTAG_PHOTOSHOP 34377
|
|
||||||
/* tags 34665, 34853 and 40965 are documented in EXIF specification */
|
|
||||||
#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */
|
|
||||||
/* tag 34750 is a private tag registered to Adobe? */
|
|
||||||
#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
|
|
||||||
#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
|
|
||||||
/* tag 34750 is a private tag registered to Pixel Magic */
|
|
||||||
#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
|
|
||||||
#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
|
|
||||||
/* tags 34908-34914 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
|
|
||||||
#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
|
|
||||||
#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
|
|
||||||
#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
|
|
||||||
/* tags 37439-37443 are registered to SGI <gregl@sgi.com> */
|
|
||||||
#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
|
|
||||||
/* tag 34929 is a private tag registered to FedEx */
|
|
||||||
#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
|
|
||||||
#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */
|
|
||||||
/* Adobe Digital Negative (DNG) format tags */
|
|
||||||
#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
|
|
||||||
#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
|
|
||||||
#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
|
|
||||||
#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model
|
|
||||||
name */
|
|
||||||
#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space
|
|
||||||
mapping */
|
|
||||||
#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
|
|
||||||
#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
|
|
||||||
#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for
|
|
||||||
the BlackLevel tag */
|
|
||||||
#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level
|
|
||||||
differences (columns) */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level
|
|
||||||
differences (rows) */
|
|
||||||
#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding
|
|
||||||
level */
|
|
||||||
#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
|
|
||||||
#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space
|
|
||||||
transformation matrix 1 */
|
|
||||||
#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space
|
|
||||||
transformation matrix 2 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction
|
|
||||||
matrix 1 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction
|
|
||||||
matrix 2 */
|
|
||||||
#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw
|
|
||||||
values*/
|
|
||||||
#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in
|
|
||||||
linear reference space */
|
|
||||||
#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in
|
|
||||||
x-y chromaticity
|
|
||||||
coordinates */
|
|
||||||
#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero
|
|
||||||
point */
|
|
||||||
#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
|
|
||||||
#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of
|
|
||||||
sharpening */
|
|
||||||
#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of
|
|
||||||
the green pixels in the
|
|
||||||
blue/green rows track the
|
|
||||||
values of the green pixels
|
|
||||||
in the red/green rows */
|
|
||||||
#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
|
|
||||||
#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
|
|
||||||
#define TIFFTAG_LENSINFO 50736 /* info about the lens */
|
|
||||||
#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
|
|
||||||
#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the
|
|
||||||
camera's anti-alias filter */
|
|
||||||
#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
|
|
||||||
#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
|
|
||||||
#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote
|
|
||||||
tag is safe to preserve
|
|
||||||
along with the rest of the
|
|
||||||
EXIF data */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
|
|
||||||
#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
|
|
||||||
#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for
|
|
||||||
the raw image data */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels
|
|
||||||
of the sensor */
|
|
||||||
#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates
|
|
||||||
of fully masked pixels */
|
|
||||||
#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
|
|
||||||
#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space
|
|
||||||
into ICC profile space */
|
|
||||||
#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
|
|
||||||
#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
|
|
||||||
/* tag 65535 is an undefined tag used by Eastman Kodak */
|
|
||||||
#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following are ``pseudo tags'' that can be used to control
|
|
||||||
* codec-specific functionality. These tags are not written to file.
|
|
||||||
* Note that these values start at 0xffff+1 so that they'll never
|
|
||||||
* collide with Aldus-assigned tags.
|
|
||||||
*
|
|
||||||
* If you want your private pseudo tags ``registered'' (i.e. added to
|
|
||||||
* this file), please post a bug report via the tracking system at
|
|
||||||
* http://www.remotesensing.org/libtiff/bugs.html with the appropriate
|
|
||||||
* C definitions to add.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
|
|
||||||
#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
|
|
||||||
#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
|
|
||||||
#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
|
|
||||||
#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
|
|
||||||
#define FAXMODE_WORDALIGN 0x0008 /* word align row */
|
|
||||||
#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
|
|
||||||
#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
|
|
||||||
/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */
|
|
||||||
#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
|
|
||||||
#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
|
|
||||||
#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
|
|
||||||
#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
|
|
||||||
#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
|
|
||||||
#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
|
|
||||||
/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
|
|
||||||
#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
|
|
||||||
#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
|
|
||||||
#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
|
|
||||||
#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
|
|
||||||
#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
|
|
||||||
#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
|
|
||||||
#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
|
|
||||||
#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
|
|
||||||
/* 65550-65556 are allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
|
|
||||||
#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
|
|
||||||
#define DCSIMAGERFILTER_IR 0 /* infrared filter */
|
|
||||||
#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
|
|
||||||
#define DCSIMAGERFILTER_CFA 2 /* color filter array */
|
|
||||||
#define DCSIMAGERFILTER_OTHER 3 /* other filter */
|
|
||||||
#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
|
|
||||||
#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
|
|
||||||
#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
|
|
||||||
#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
|
|
||||||
#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
|
|
||||||
#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
|
|
||||||
#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
|
|
||||||
#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
|
|
||||||
/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
|
|
||||||
#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
|
|
||||||
#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
|
|
||||||
/* 65559 is allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
|
|
||||||
#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
|
|
||||||
#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
|
|
||||||
#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
|
|
||||||
#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
|
|
||||||
#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
|
|
||||||
#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
|
|
||||||
#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
|
|
||||||
#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
|
|
||||||
#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */
|
|
||||||
#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */
|
|
||||||
#define PERSAMPLE_MERGED 0 /* present as a single value */
|
|
||||||
#define PERSAMPLE_MULTI 1 /* present as multiple values */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXIF tags
|
|
||||||
*/
|
|
||||||
#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */
|
|
||||||
#define EXIFTAG_FNUMBER 33437 /* F number */
|
|
||||||
#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
|
|
||||||
#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
|
||||||
#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
|
||||||
#define EXIFTAG_OECF 34856 /* Optoelectric conversion
|
|
||||||
factor */
|
|
||||||
#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
|
|
||||||
#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
|
|
||||||
#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
|
||||||
#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
|
||||||
#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */
|
|
||||||
#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */
|
|
||||||
#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */
|
|
||||||
#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */
|
|
||||||
#define EXIFTAG_METERINGMODE 37383 /* Metering mode */
|
|
||||||
#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */
|
|
||||||
#define EXIFTAG_FLASH 37385 /* Flash */
|
|
||||||
#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */
|
|
||||||
#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */
|
|
||||||
#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */
|
|
||||||
#define EXIFTAG_USERCOMMENT 37510 /* User comments */
|
|
||||||
#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */
|
|
||||||
#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */
|
|
||||||
#define EXIFTAG_COLORSPACE 40961 /* Color space information */
|
|
||||||
#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */
|
|
||||||
#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */
|
|
||||||
#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */
|
|
||||||
#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */
|
|
||||||
#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */
|
|
||||||
#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */
|
|
||||||
#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */
|
|
||||||
#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */
|
|
||||||
#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */
|
|
||||||
#define EXIFTAG_FILESOURCE 41728 /* File source */
|
|
||||||
#define EXIFTAG_SCENETYPE 41729 /* Scene type */
|
|
||||||
#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */
|
|
||||||
#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */
|
|
||||||
#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */
|
|
||||||
#define EXIFTAG_WHITEBALANCE 41987 /* White balance */
|
|
||||||
#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */
|
|
||||||
#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */
|
|
||||||
#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_CONTRAST 41992 /* Contrast */
|
|
||||||
#define EXIFTAG_SATURATION 41993 /* Saturation */
|
|
||||||
#define EXIFTAG_SHARPNESS 41994 /* Sharpness */
|
|
||||||
#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */
|
|
||||||
|
|
||||||
#endif /* _TIFF_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */
|
|
||||||
/*
|
|
||||||
Configuration defines for installed libtiff.
|
|
||||||
This file maintained for backward compatibility. Do not use definitions
|
|
||||||
from this file in your programs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFCONF_
|
|
||||||
#define _TIFFCONF_
|
|
||||||
|
|
||||||
/* Signed 16-bit type */
|
|
||||||
#define TIFF_INT16_T signed short
|
|
||||||
|
|
||||||
/* Signed 32-bit type */
|
|
||||||
#define TIFF_INT32_T signed int
|
|
||||||
|
|
||||||
/* Signed 64-bit type */
|
|
||||||
#define TIFF_INT64_T signed long long
|
|
||||||
|
|
||||||
/* Signed 8-bit type */
|
|
||||||
#define TIFF_INT8_T signed char
|
|
||||||
|
|
||||||
/* Unsigned 16-bit type */
|
|
||||||
#define TIFF_UINT16_T unsigned short
|
|
||||||
|
|
||||||
/* Unsigned 32-bit type */
|
|
||||||
#define TIFF_UINT32_T unsigned int
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type */
|
|
||||||
#define TIFF_UINT64_T unsigned long long
|
|
||||||
|
|
||||||
/* Unsigned 8-bit type */
|
|
||||||
#define TIFF_UINT8_T unsigned char
|
|
||||||
|
|
||||||
/* Signed size type */
|
|
||||||
#define TIFF_SSIZE_T signed int
|
|
||||||
|
|
||||||
/* Pointer difference type */
|
|
||||||
#define TIFF_PTRDIFF_T ptrdiff_t
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
/* #undef HAVE_INT16 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
/* #undef HAVE_INT32 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
/* #undef HAVE_INT8 */
|
|
||||||
|
|
||||||
/* Compatibility stuff. */
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#define HAVE_IEEEFP 1
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#define HOST_FILLORDER FILLORDER_MSB2LSB
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#define HOST_BIGENDIAN 0
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#define CCITT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
/* #undef JPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support JBIG compression (requires JBIG-KIT library) */
|
|
||||||
/* #undef JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#define LOGLUV_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#define LZW_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#define NEXT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
|
|
||||||
fails with unpatched IJG JPEG library) */
|
|
||||||
/* #undef OJPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#define PACKBITS_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
/* #undef PIXARLOG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#define THUNDER_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
/* #undef ZIP_SUPPORT */
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of ~8Kb to reduce memory usage) */
|
|
||||||
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#define SUBIFD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
|
|
||||||
|
|
||||||
/* Support MS MDI magic number files as TIFF */
|
|
||||||
#define MDI_SUPPORT 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature support definitions.
|
|
||||||
* XXX: These macros are obsoleted. Don't use them in your apps!
|
|
||||||
* Macros stays here for backward compatibility and should be always defined.
|
|
||||||
*/
|
|
||||||
#define COLORIMETRY_SUPPORT
|
|
||||||
#define YCBCR_SUPPORT
|
|
||||||
#define CMYK_SUPPORT
|
|
||||||
#define ICC_SUPPORT
|
|
||||||
#define PHOTOSHOP_SUPPORT
|
|
||||||
#define IPTC_SUPPORT
|
|
||||||
|
|
||||||
#endif /* _TIFFCONF_ */
|
|
||||||
|
|
@ -1,557 +0,0 @@
|
||||||
/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFIO_
|
|
||||||
#define _TIFFIO_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF I/O Library Definitions.
|
|
||||||
*/
|
|
||||||
#include "tiff.h"
|
|
||||||
#include "tiffvers.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF is defined as an incomplete type to hide the
|
|
||||||
* library's internal data structures from clients.
|
|
||||||
*/
|
|
||||||
typedef struct tiff TIFF;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following typedefs define the intrinsic size of
|
|
||||||
* data types used in the *exported* interfaces. These
|
|
||||||
* definitions depend on the proper definition of types
|
|
||||||
* in tiff.h. Note also that the varargs interface used
|
|
||||||
* to pass tag types and values uses the types defined in
|
|
||||||
* tiff.h directly.
|
|
||||||
*
|
|
||||||
* NB: ttag_t is unsigned int and not unsigned short because
|
|
||||||
* ANSI C requires that the type before the ellipsis be a
|
|
||||||
* promoted type (i.e. one of int, unsigned int, pointer,
|
|
||||||
* or double) and because we defined pseudo-tags that are
|
|
||||||
* outside the range of legal Aldus-assigned tags.
|
|
||||||
* NB: tsize_t is int32 and not uint32 because some functions
|
|
||||||
* return -1.
|
|
||||||
* NB: toff_t is not off_t for many reasons; TIFFs max out at
|
|
||||||
* 32-bit file offsets, and BigTIFF maxes out at 64-bit
|
|
||||||
* offsets being the most important, and to ensure use of
|
|
||||||
* a consistently unsigned type across architectures.
|
|
||||||
* Prior to libtiff 4.0, this was an unsigned 32 bit type.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* this is the machine addressing size type, only it's signed, so make it
|
|
||||||
* int32 on 32bit machines, int64 on 64bit machines
|
|
||||||
*/
|
|
||||||
typedef TIFF_SSIZE_T tmsize_t;
|
|
||||||
typedef uint64 toff_t; /* file offset */
|
|
||||||
/* the following are deprecated and should be replaced by their defining
|
|
||||||
counterparts */
|
|
||||||
typedef uint32 ttag_t; /* directory tag */
|
|
||||||
typedef uint16 tdir_t; /* directory index */
|
|
||||||
typedef uint16 tsample_t; /* sample number */
|
|
||||||
typedef uint32 tstrile_t; /* strip or tile number */
|
|
||||||
typedef tstrile_t tstrip_t; /* strip number */
|
|
||||||
typedef tstrile_t ttile_t; /* tile number */
|
|
||||||
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
|
||||||
typedef void* tdata_t; /* image data ref */
|
|
||||||
|
|
||||||
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
|
|
||||||
#define __WIN32__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c
|
|
||||||
* or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c).
|
|
||||||
*
|
|
||||||
* By default tif_unix.c is assumed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
|
||||||
# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
|
|
||||||
# define AVOID_WIN32_FILEIO
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_WIN32_FILEIO)
|
|
||||||
# define VC_EXTRALEAN
|
|
||||||
# include <windows.h>
|
|
||||||
# ifdef __WIN32__
|
|
||||||
DECLARE_HANDLE(thandle_t); /* Win32 file handle */
|
|
||||||
# else
|
|
||||||
typedef HFILE thandle_t; /* client data handle */
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
#else
|
|
||||||
typedef void* thandle_t; /* client data handle */
|
|
||||||
#endif /* USE_WIN32_FILEIO */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags to pass to TIFFPrintDirectory to control
|
|
||||||
* printing of data structures that are potentially
|
|
||||||
* very large. Bit-or these flags to enable printing
|
|
||||||
* multiple items.
|
|
||||||
*/
|
|
||||||
#define TIFFPRINT_NONE 0x0 /* no extra info */
|
|
||||||
#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
|
|
||||||
#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
|
|
||||||
#define TIFFPRINT_COLORMAP 0x4 /* colormap */
|
|
||||||
#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
|
|
||||||
#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
|
|
||||||
#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Colour conversion stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* reference white */
|
|
||||||
#define D65_X0 (95.0470F)
|
|
||||||
#define D65_Y0 (100.0F)
|
|
||||||
#define D65_Z0 (108.8827F)
|
|
||||||
|
|
||||||
#define D50_X0 (96.4250F)
|
|
||||||
#define D50_Y0 (100.0F)
|
|
||||||
#define D50_Z0 (82.4680F)
|
|
||||||
|
|
||||||
/* Structure for holding information about a display device. */
|
|
||||||
|
|
||||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
|
||||||
float d_YCR; /* Light o/p for reference white */
|
|
||||||
float d_YCG;
|
|
||||||
float d_YCB;
|
|
||||||
uint32 d_Vrwr; /* Pixel values for ref. white */
|
|
||||||
uint32 d_Vrwg;
|
|
||||||
uint32 d_Vrwb;
|
|
||||||
float d_Y0R; /* Residual light for black pixel */
|
|
||||||
float d_Y0G;
|
|
||||||
float d_Y0B;
|
|
||||||
float d_gammaR; /* Gamma values for the three guns */
|
|
||||||
float d_gammaG;
|
|
||||||
float d_gammaB;
|
|
||||||
} TIFFDisplay;
|
|
||||||
|
|
||||||
typedef struct { /* YCbCr->RGB support */
|
|
||||||
TIFFRGBValue* clamptab; /* range clamping table */
|
|
||||||
int* Cr_r_tab;
|
|
||||||
int* Cb_b_tab;
|
|
||||||
int32* Cr_g_tab;
|
|
||||||
int32* Cb_g_tab;
|
|
||||||
int32* Y_tab;
|
|
||||||
} TIFFYCbCrToRGB;
|
|
||||||
|
|
||||||
typedef struct { /* CIE Lab 1976->RGB support */
|
|
||||||
int range; /* Size of conversion table */
|
|
||||||
#define CIELABTORGB_TABLE_RANGE 1500
|
|
||||||
float rstep, gstep, bstep;
|
|
||||||
float X0, Y0, Z0; /* Reference white point */
|
|
||||||
TIFFDisplay display;
|
|
||||||
float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
|
|
||||||
float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
|
|
||||||
float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
|
|
||||||
} TIFFCIELabToRGB;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RGBA-style image support.
|
|
||||||
*/
|
|
||||||
typedef struct _TIFFRGBAImage TIFFRGBAImage;
|
|
||||||
/*
|
|
||||||
* The image reading and conversion routines invoke
|
|
||||||
* ``put routines'' to copy/image/whatever tiles of
|
|
||||||
* raw image data. A default set of routines are
|
|
||||||
* provided to convert/copy raw image data to 8-bit
|
|
||||||
* packed ABGR format rasters. Applications can supply
|
|
||||||
* alternate routines that unpack the data into a
|
|
||||||
* different format or, for example, unpack the data
|
|
||||||
* and draw the unpacked raster on the display.
|
|
||||||
*/
|
|
||||||
typedef void (*tileContigRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*);
|
|
||||||
typedef void (*tileSeparateRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
|
|
||||||
/*
|
|
||||||
* RGBA-reader state.
|
|
||||||
*/
|
|
||||||
struct _TIFFRGBAImage {
|
|
||||||
TIFF* tif; /* image handle */
|
|
||||||
int stoponerr; /* stop on read error */
|
|
||||||
int isContig; /* data is packed/separate */
|
|
||||||
int alpha; /* type of alpha data present */
|
|
||||||
uint32 width; /* image width */
|
|
||||||
uint32 height; /* image height */
|
|
||||||
uint16 bitspersample; /* image bits/sample */
|
|
||||||
uint16 samplesperpixel; /* image samples/pixel */
|
|
||||||
uint16 orientation; /* image orientation */
|
|
||||||
uint16 req_orientation; /* requested orientation */
|
|
||||||
uint16 photometric; /* image photometric interp */
|
|
||||||
uint16* redcmap; /* colormap pallete */
|
|
||||||
uint16* greencmap;
|
|
||||||
uint16* bluecmap;
|
|
||||||
/* get image data routine */
|
|
||||||
int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
/* put decoded strip/tile */
|
|
||||||
union {
|
|
||||||
void (*any)(TIFFRGBAImage*);
|
|
||||||
tileContigRoutine contig;
|
|
||||||
tileSeparateRoutine separate;
|
|
||||||
} put;
|
|
||||||
TIFFRGBValue* Map; /* sample mapping array */
|
|
||||||
uint32** BWmap; /* black&white map */
|
|
||||||
uint32** PALmap; /* palette image map */
|
|
||||||
TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
|
|
||||||
TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
|
|
||||||
|
|
||||||
uint8* UaToAa; /* Unassociated alpha to associated alpha convertion LUT */
|
|
||||||
uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
|
||||||
|
|
||||||
int row_offset;
|
|
||||||
int col_offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros for extracting components from the
|
|
||||||
* packed ABGR form returned by TIFFReadRGBAImage.
|
|
||||||
*/
|
|
||||||
#define TIFFGetR(abgr) ((abgr) & 0xff)
|
|
||||||
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
|
|
||||||
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
|
|
||||||
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A CODEC is a software package that implements decoding,
|
|
||||||
* encoding, or decoding+encoding of a compression algorithm.
|
|
||||||
* The library provides a collection of builtin codecs.
|
|
||||||
* More codecs may be registered through calls to the library
|
|
||||||
* and/or the builtin implementations may be overridden.
|
|
||||||
*/
|
|
||||||
typedef int (*TIFFInitMethod)(TIFF*, int);
|
|
||||||
typedef struct {
|
|
||||||
char* name;
|
|
||||||
uint16 scheme;
|
|
||||||
TIFFInitMethod init;
|
|
||||||
} TIFFCodec;
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
/* share internal LogLuv conversion routines? */
|
|
||||||
#ifndef LOGLUV_PUBLIC
|
|
||||||
#define LOGLUV_PUBLIC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
|
||||||
# define __attribute__(x) /*nothing*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
|
|
||||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
|
|
||||||
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t);
|
|
||||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
|
||||||
typedef int (*TIFFCloseProc)(thandle_t);
|
|
||||||
typedef toff_t (*TIFFSizeProc)(thandle_t);
|
|
||||||
typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size);
|
|
||||||
typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size);
|
|
||||||
typedef void (*TIFFExtendProc)(TIFF*);
|
|
||||||
|
|
||||||
extern const char* TIFFGetVersion(void);
|
|
||||||
|
|
||||||
extern const TIFFCodec* TIFFFindCODEC(uint16);
|
|
||||||
extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
|
|
||||||
extern void TIFFUnRegisterCODEC(TIFFCodec*);
|
|
||||||
extern int TIFFIsCODECConfigured(uint16);
|
|
||||||
extern TIFFCodec* TIFFGetConfiguredCODECs(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Auxiliary functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void* _TIFFmalloc(tmsize_t s);
|
|
||||||
extern void* _TIFFrealloc(void* p, tmsize_t s);
|
|
||||||
extern void _TIFFmemset(void* p, int v, tmsize_t c);
|
|
||||||
extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c);
|
|
||||||
extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c);
|
|
||||||
extern void _TIFFfree(void* p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Stuff, related to tag handling and creating custom tags.
|
|
||||||
*/
|
|
||||||
extern int TIFFGetTagListCount( TIFF * );
|
|
||||||
extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index );
|
|
||||||
|
|
||||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
|
||||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
|
||||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
|
||||||
#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
|
|
||||||
|
|
||||||
#define FIELD_CUSTOM 65
|
|
||||||
|
|
||||||
typedef struct _TIFFField TIFFField;
|
|
||||||
typedef struct _TIFFFieldArray TIFFFieldArray;
|
|
||||||
|
|
||||||
extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType);
|
|
||||||
extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32);
|
|
||||||
extern const TIFFField* TIFFFieldWithName(TIFF*, const char *);
|
|
||||||
|
|
||||||
extern uint32 TIFFFieldTag(const TIFFField*);
|
|
||||||
extern const char* TIFFFieldName(const TIFFField*);
|
|
||||||
extern TIFFDataType TIFFFieldDataType(const TIFFField*);
|
|
||||||
extern int TIFFFieldPassCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldReadCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldWriteCount(const TIFFField*);
|
|
||||||
|
|
||||||
typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
|
||||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
|
||||||
TIFFPrintMethod printdir; /* directory print routine */
|
|
||||||
} TIFFTagMethods;
|
|
||||||
|
|
||||||
extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
|
|
||||||
extern void *TIFFGetClientInfo(TIFF *, const char *);
|
|
||||||
extern void TIFFSetClientInfo(TIFF *, void *, const char *);
|
|
||||||
|
|
||||||
extern void TIFFCleanup(TIFF* tif);
|
|
||||||
extern void TIFFClose(TIFF* tif);
|
|
||||||
extern int TIFFFlush(TIFF* tif);
|
|
||||||
extern int TIFFFlushData(TIFF* tif);
|
|
||||||
extern int TIFFGetField(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFReadDirectory(TIFF* tif);
|
|
||||||
extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
|
|
||||||
extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff);
|
|
||||||
extern uint64 TIFFScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRasterScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFRasterScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFStripSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFStripSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip);
|
|
||||||
extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip);
|
|
||||||
extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint64 TIFFTileRowSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileRowSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFTileSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request);
|
|
||||||
extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
|
|
||||||
extern int TIFFFileno(TIFF*);
|
|
||||||
extern int TIFFSetFileno(TIFF*, int);
|
|
||||||
extern thandle_t TIFFClientdata(TIFF*);
|
|
||||||
extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
|
|
||||||
extern int TIFFGetMode(TIFF*);
|
|
||||||
extern int TIFFSetMode(TIFF*, int);
|
|
||||||
extern int TIFFIsTiled(TIFF*);
|
|
||||||
extern int TIFFIsByteSwapped(TIFF*);
|
|
||||||
extern int TIFFIsUpSampled(TIFF*);
|
|
||||||
extern int TIFFIsMSB2LSB(TIFF*);
|
|
||||||
extern int TIFFIsBigEndian(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
|
|
||||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
|
|
||||||
extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
|
|
||||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
|
|
||||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
|
|
||||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentRow(TIFF*);
|
|
||||||
extern uint16 TIFFCurrentDirectory(TIFF*);
|
|
||||||
extern uint16 TIFFNumberOfDirectories(TIFF*);
|
|
||||||
extern uint64 TIFFCurrentDirOffset(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentStrip(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentTile(TIFF* tif);
|
|
||||||
extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFSetupStrips(TIFF *);
|
|
||||||
extern int TIFFWriteCheck(TIFF*, int, const char *);
|
|
||||||
extern void TIFFFreeDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
|
|
||||||
extern int TIFFCreateEXIFDirectory(TIFF*);
|
|
||||||
extern int TIFFLastDirectory(TIFF*);
|
|
||||||
extern int TIFFSetDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetSubDirectory(TIFF*, uint64);
|
|
||||||
extern int TIFFUnlinkDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetField(TIFF*, uint32, ...);
|
|
||||||
extern int TIFFVSetField(TIFF*, uint32, va_list);
|
|
||||||
extern int TIFFUnsetField(TIFF*, uint32);
|
|
||||||
extern int TIFFWriteDirectory(TIFF *);
|
|
||||||
extern int TIFFWriteCustomDirectory(TIFF *, uint64 *);
|
|
||||||
extern int TIFFCheckpointDirectory(TIFF *);
|
|
||||||
extern int TIFFRewriteDirectory(TIFF *);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
|
|
||||||
int = ORIENTATION_BOTLEFT, int = 0);
|
|
||||||
#else
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * );
|
|
||||||
extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
|
|
||||||
extern int TIFFRGBAImageOK(TIFF*, char [1024]);
|
|
||||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
|
|
||||||
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
|
|
||||||
extern TIFF* TIFFOpen(const char*, const char*);
|
|
||||||
# ifdef __WIN32__
|
|
||||||
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
extern TIFF* TIFFFdOpen(int, const char*, const char*);
|
|
||||||
extern TIFF* TIFFClientOpen(const char*, const char*,
|
|
||||||
thandle_t,
|
|
||||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
|
||||||
TIFFSeekProc, TIFFCloseProc,
|
|
||||||
TIFFSizeProc,
|
|
||||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
|
||||||
extern const char* TIFFFileName(TIFF*);
|
|
||||||
extern const char* TIFFSetFileName(TIFF*, const char *);
|
|
||||||
extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
|
||||||
extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFNumberOfTiles(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16);
|
|
||||||
extern uint32 TIFFNumberOfStrips(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
|
|
||||||
extern void TIFFSetWriteOffset(TIFF* tif, toff_t off);
|
|
||||||
extern void TIFFSwabShort(uint16*);
|
|
||||||
extern void TIFFSwabLong(uint32*);
|
|
||||||
extern void TIFFSwabLong8(uint64*);
|
|
||||||
extern void TIFFSwabFloat(float*);
|
|
||||||
extern void TIFFSwabDouble(double*);
|
|
||||||
extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n);
|
|
||||||
extern void TIFFReverseBits(uint8* cp, tmsize_t n);
|
|
||||||
extern const unsigned char* TIFFGetBitRevTable(int);
|
|
||||||
|
|
||||||
#ifdef LOGLUV_PUBLIC
|
|
||||||
#define U_NEU 0.210526316
|
|
||||||
#define V_NEU 0.473684211
|
|
||||||
#define UVSCALE 410.
|
|
||||||
extern double LogL16toY(int);
|
|
||||||
extern double LogL10toY(int);
|
|
||||||
extern void XYZtoRGB24(float*, uint8*);
|
|
||||||
extern int uv_decode(double*, double*, int);
|
|
||||||
extern void LogLuv24toXYZ(uint32, float*);
|
|
||||||
extern void LogLuv32toXYZ(uint32, float*);
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
#else
|
|
||||||
extern int LogL16fromY(double, int);
|
|
||||||
extern int LogL10fromY(double, int);
|
|
||||||
extern int uv_encode(double, double, int);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int);
|
|
||||||
#endif
|
|
||||||
#endif /* LOGLUV_PUBLIC */
|
|
||||||
|
|
||||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*);
|
|
||||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
|
|
||||||
float *, float *, float *);
|
|
||||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
|
|
||||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* O B S O L E T E D I N T E R F A C E S
|
|
||||||
*
|
|
||||||
* Don't use this stuff in your applications, it may be removed in the future
|
|
||||||
* libtiff versions.
|
|
||||||
****************************************************************************/
|
|
||||||
typedef struct {
|
|
||||||
ttag_t field_tag; /* field's tag */
|
|
||||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
|
||||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
|
||||||
TIFFDataType field_type; /* type of associated data */
|
|
||||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
|
||||||
unsigned char field_oktochange; /* if true, can change while writing */
|
|
||||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
|
||||||
char *field_name; /* ASCII name */
|
|
||||||
} TIFFFieldInfo;
|
|
||||||
|
|
||||||
extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _TIFFIO_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.6\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
|
|
||||||
/*
|
|
||||||
* This define can be used in code that requires
|
|
||||||
* compilation-related definitions specific to a
|
|
||||||
* version or versions of the library. Runtime
|
|
||||||
* version checking should be done based on the
|
|
||||||
* string returned by TIFFGetVersion.
|
|
||||||
*/
|
|
||||||
#define TIFFLIB_VERSION 20150912
|
|
||||||
Binary file not shown.
|
|
@ -1,681 +0,0 @@
|
||||||
/* $Id: tiff.h,v 1.69 2014-04-02 17:23:06 fwarmerdam Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFF_
|
|
||||||
#define _TIFF_
|
|
||||||
|
|
||||||
#include "tiffconf.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag Image File Format (TIFF)
|
|
||||||
*
|
|
||||||
* Based on Rev 6.0 from:
|
|
||||||
* Developer's Desk
|
|
||||||
* Aldus Corporation
|
|
||||||
* 411 First Ave. South
|
|
||||||
* Suite 200
|
|
||||||
* Seattle, WA 98104
|
|
||||||
* 206-622-5500
|
|
||||||
*
|
|
||||||
* (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf)
|
|
||||||
*
|
|
||||||
* For BigTIFF design notes see the following links
|
|
||||||
* http://www.remotesensing.org/libtiff/bigtiffdesign.html
|
|
||||||
* http://www.awaresystems.be/imaging/tiff/bigtiff.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TIFF_VERSION_CLASSIC 42
|
|
||||||
#define TIFF_VERSION_BIG 43
|
|
||||||
|
|
||||||
#define TIFF_BIGENDIAN 0x4d4d
|
|
||||||
#define TIFF_LITTLEENDIAN 0x4949
|
|
||||||
#define MDI_LITTLEENDIAN 0x5045
|
|
||||||
#define MDI_BIGENDIAN 0x4550
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Intrinsic data types required by the file format:
|
|
||||||
*
|
|
||||||
* 8-bit quantities int8/uint8
|
|
||||||
* 16-bit quantities int16/uint16
|
|
||||||
* 32-bit quantities int32/uint32
|
|
||||||
* 64-bit quantities int64/uint64
|
|
||||||
* strings unsigned char*
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef TIFF_INT8_T int8;
|
|
||||||
typedef TIFF_UINT8_T uint8;
|
|
||||||
|
|
||||||
typedef TIFF_INT16_T int16;
|
|
||||||
typedef TIFF_UINT16_T uint16;
|
|
||||||
|
|
||||||
typedef TIFF_INT32_T int32;
|
|
||||||
typedef TIFF_UINT32_T uint32;
|
|
||||||
|
|
||||||
typedef TIFF_INT64_T int64;
|
|
||||||
typedef TIFF_UINT64_T uint64;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some types as promoted in a variable argument list
|
|
||||||
* We use uint16_vap rather then directly using int, because this way
|
|
||||||
* we document the type we actually want to pass through, conceptually,
|
|
||||||
* rather then confusing the issue by merely stating the type it gets
|
|
||||||
* promoted to
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef int uint16_vap;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF header.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
} TIFFHeaderCommon;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint32 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderClassic;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint16 tiff_offsetsize; /* size of offsets, should be 8 */
|
|
||||||
uint16 tiff_unused; /* unused word, should be 0 */
|
|
||||||
uint64 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderBig;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NB: In the comments below,
|
|
||||||
* - items marked with a + are obsoleted by revision 5.0,
|
|
||||||
* - items marked with a ! are introduced in revision 6.0.
|
|
||||||
* - items marked with a % are introduced post revision 6.0.
|
|
||||||
* - items marked with a $ are obsoleted by revision 6.0.
|
|
||||||
* - items marked with a & are introduced by Adobe DNG specification.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag data type information.
|
|
||||||
*
|
|
||||||
* Note: RATIONALs are the ratio of two 32-bit integer values.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
TIFF_NOTYPE = 0, /* placeholder */
|
|
||||||
TIFF_BYTE = 1, /* 8-bit unsigned integer */
|
|
||||||
TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
|
|
||||||
TIFF_SHORT = 3, /* 16-bit unsigned integer */
|
|
||||||
TIFF_LONG = 4, /* 32-bit unsigned integer */
|
|
||||||
TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
|
|
||||||
TIFF_SBYTE = 6, /* !8-bit signed integer */
|
|
||||||
TIFF_UNDEFINED = 7, /* !8-bit untyped data */
|
|
||||||
TIFF_SSHORT = 8, /* !16-bit signed integer */
|
|
||||||
TIFF_SLONG = 9, /* !32-bit signed integer */
|
|
||||||
TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
|
|
||||||
TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
|
|
||||||
TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
|
|
||||||
TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */
|
|
||||||
TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */
|
|
||||||
TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */
|
|
||||||
TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */
|
|
||||||
} TIFFDataType;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Tag Definitions.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
|
|
||||||
#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
|
|
||||||
#define FILETYPE_PAGE 0x2 /* one page of many */
|
|
||||||
#define FILETYPE_MASK 0x4 /* transparency mask */
|
|
||||||
#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
|
|
||||||
#define OFILETYPE_IMAGE 1 /* full resolution image data */
|
|
||||||
#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
|
|
||||||
#define OFILETYPE_PAGE 3 /* one page of many */
|
|
||||||
#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
|
|
||||||
#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
|
|
||||||
#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
|
|
||||||
#define TIFFTAG_COMPRESSION 259 /* data compression technique */
|
|
||||||
#define COMPRESSION_NONE 1 /* dump mode */
|
|
||||||
#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
|
|
||||||
#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
|
|
||||||
#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
|
|
||||||
#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
|
|
||||||
#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */
|
|
||||||
#define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */
|
|
||||||
#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
|
|
||||||
#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
|
|
||||||
#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
|
|
||||||
#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
|
|
||||||
/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
|
|
||||||
#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
|
|
||||||
#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
|
|
||||||
#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
|
|
||||||
/* compression codes 32908-32911 are reserved for Pixar */
|
|
||||||
#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
|
|
||||||
#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
|
|
||||||
#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
|
|
||||||
#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression,
|
|
||||||
as recognized by Adobe */
|
|
||||||
/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
|
|
||||||
#define COMPRESSION_JBIG 34661 /* ISO JBIG */
|
|
||||||
#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
|
|
||||||
#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
|
|
||||||
#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
|
|
||||||
#define COMPRESSION_LZMA 34925 /* LZMA2 */
|
|
||||||
#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
|
|
||||||
#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
|
|
||||||
#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
|
|
||||||
#define PHOTOMETRIC_RGB 2 /* RGB color model */
|
|
||||||
#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
|
|
||||||
#define PHOTOMETRIC_MASK 4 /* $holdout mask */
|
|
||||||
#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
|
|
||||||
#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
|
|
||||||
#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
|
|
||||||
#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
|
|
||||||
#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
|
|
||||||
#define PHOTOMETRIC_CFA 32803 /* color filter array */
|
|
||||||
#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
|
|
||||||
#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
|
|
||||||
#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
|
|
||||||
#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
|
|
||||||
#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
|
|
||||||
#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
|
|
||||||
#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
|
|
||||||
#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
|
|
||||||
#define TIFFTAG_FILLORDER 266 /* data order within a byte */
|
|
||||||
#define FILLORDER_MSB2LSB 1 /* most significant -> least */
|
|
||||||
#define FILLORDER_LSB2MSB 2 /* least significant -> most */
|
|
||||||
#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
|
|
||||||
#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
|
|
||||||
#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
|
|
||||||
#define TIFFTAG_MODEL 272 /* scanner model name/number */
|
|
||||||
#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
|
|
||||||
#define TIFFTAG_ORIENTATION 274 /* +image orientation */
|
|
||||||
#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
|
|
||||||
#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
|
|
||||||
#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
|
|
||||||
#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
|
|
||||||
#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
|
|
||||||
#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
|
|
||||||
#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
|
|
||||||
#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
|
|
||||||
#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
|
|
||||||
#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
|
|
||||||
#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
|
|
||||||
#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
|
|
||||||
#define PLANARCONFIG_CONTIG 1 /* single image plane */
|
|
||||||
#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
|
|
||||||
#define TIFFTAG_PAGENAME 285 /* page name image is from */
|
|
||||||
#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
|
|
||||||
#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
|
|
||||||
#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
|
|
||||||
#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
|
|
||||||
#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
|
|
||||||
#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
|
|
||||||
#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
|
|
||||||
#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
|
|
||||||
#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
|
|
||||||
#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
|
|
||||||
#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
|
|
||||||
#define RESUNIT_NONE 1 /* no meaningful units */
|
|
||||||
#define RESUNIT_INCH 2 /* english */
|
|
||||||
#define RESUNIT_CENTIMETER 3 /* metric */
|
|
||||||
#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
|
|
||||||
#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
|
|
||||||
#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_SOFTWARE 305 /* name & release */
|
|
||||||
#define TIFFTAG_DATETIME 306 /* creation date and time */
|
|
||||||
#define TIFFTAG_ARTIST 315 /* creator of image */
|
|
||||||
#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
|
|
||||||
#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
|
|
||||||
#define PREDICTOR_NONE 1 /* no prediction scheme used */
|
|
||||||
#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */
|
|
||||||
#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */
|
|
||||||
#define TIFFTAG_WHITEPOINT 318 /* image white point */
|
|
||||||
#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
|
|
||||||
#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */
|
|
||||||
#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
|
|
||||||
#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */
|
|
||||||
#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */
|
|
||||||
#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
|
|
||||||
#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
|
|
||||||
#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
|
|
||||||
#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
|
|
||||||
#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
|
|
||||||
#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
|
|
||||||
#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
|
|
||||||
#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
|
|
||||||
#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
|
|
||||||
#define TIFFTAG_INKSET 332 /* !inks in separated image */
|
|
||||||
#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
|
|
||||||
#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
|
|
||||||
#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
|
|
||||||
#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
|
|
||||||
#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
|
|
||||||
#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
|
|
||||||
#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
|
|
||||||
#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
|
|
||||||
#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
|
|
||||||
#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
|
|
||||||
#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
|
|
||||||
#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
|
|
||||||
#define SAMPLEFORMAT_INT 2 /* !signed integer data */
|
|
||||||
#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
|
|
||||||
#define SAMPLEFORMAT_VOID 4 /* !untyped data */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
|
|
||||||
#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
|
|
||||||
#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
|
|
||||||
#define TIFFTAG_CLIPPATH 343 /* %ClipPath
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_INDEXED 346 /* %Indexed
|
|
||||||
[Adobe TIFF Technote 3] */
|
|
||||||
#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
|
|
||||||
#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
|
|
||||||
/* Tags 400-435 are from the TIFF/FX spec */
|
|
||||||
#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */
|
|
||||||
#define TIFFTAG_PROFILETYPE 401 /* ! */
|
|
||||||
#define PROFILETYPE_UNSPECIFIED 0 /* ! */
|
|
||||||
#define PROFILETYPE_G3_FAX 1 /* ! */
|
|
||||||
#define TIFFTAG_FAXPROFILE 402 /* ! */
|
|
||||||
#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */
|
|
||||||
#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */
|
|
||||||
#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */
|
|
||||||
#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */
|
|
||||||
#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */
|
|
||||||
#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */
|
|
||||||
#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */
|
|
||||||
#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */
|
|
||||||
#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */
|
|
||||||
#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */
|
|
||||||
#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */
|
|
||||||
#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */
|
|
||||||
#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */
|
|
||||||
#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */
|
|
||||||
#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */
|
|
||||||
#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */
|
|
||||||
#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */
|
|
||||||
#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */
|
|
||||||
/*
|
|
||||||
* Tags 512-521 are obsoleted by Technical Note #2 which specifies a
|
|
||||||
* revised JPEG-in-TIFF scheme.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
|
|
||||||
#define JPEGPROC_BASELINE 1 /* !baseline sequential */
|
|
||||||
#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
|
|
||||||
#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
|
|
||||||
#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
|
|
||||||
#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
|
|
||||||
#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
|
|
||||||
#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
|
|
||||||
#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */
|
|
||||||
#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
|
|
||||||
#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
|
|
||||||
#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
|
|
||||||
#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
|
|
||||||
#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
|
|
||||||
#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
|
|
||||||
#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
|
|
||||||
#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
|
|
||||||
#define TIFFTAG_XMLPACKET 700 /* %XML packet
|
|
||||||
[Adobe XMP Specification,
|
|
||||||
January 2004 */
|
|
||||||
#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID
|
|
||||||
[Adobe TIFF technote] */
|
|
||||||
/* tags 32952-32956 are private tags registered to Island Graphics */
|
|
||||||
#define TIFFTAG_REFPTS 32953 /* image reference points */
|
|
||||||
#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
|
|
||||||
#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
|
|
||||||
#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
|
|
||||||
/* tags 32995-32999 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
|
|
||||||
#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
|
|
||||||
#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
|
|
||||||
#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
|
|
||||||
/* tags 33300-33309 are private tags registered to Pixar */
|
|
||||||
/*
|
|
||||||
* TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
|
|
||||||
* are set when an image has been cropped out of a larger image.
|
|
||||||
* They reflect the size of the original uncropped image.
|
|
||||||
* The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
|
|
||||||
* to determine the position of the smaller image in the larger one.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
|
|
||||||
/* Tags 33302-33306 are used to identify special image modes and data
|
|
||||||
* used by Pixar's texture formats.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
|
|
||||||
#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
|
|
||||||
#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
|
|
||||||
/* tag 33405 is a private tag registered to Eastman Kodak */
|
|
||||||
#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
|
|
||||||
#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
|
|
||||||
#define TIFFTAG_CFAPATTERN 33422 /* color filter array pattern */
|
|
||||||
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
|
|
||||||
#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
|
|
||||||
/* IPTC TAG from RichTIFF specifications */
|
|
||||||
#define TIFFTAG_RICHTIFFIPTC 33723
|
|
||||||
/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define TIFFTAG_IT8SITE 34016 /* site name */
|
|
||||||
#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
|
|
||||||
#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
|
|
||||||
#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
|
|
||||||
#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
|
|
||||||
#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
|
|
||||||
#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
|
|
||||||
#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
|
|
||||||
#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
|
|
||||||
#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
|
|
||||||
#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
|
|
||||||
#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator
|
|
||||||
(untrapped=0, trapped=1) */
|
|
||||||
#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
|
|
||||||
/* tags 34232-34236 are private tags registered to Texas Instruments */
|
|
||||||
#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
|
|
||||||
/* tag 34377 is private tag registered to Adobe for PhotoShop */
|
|
||||||
#define TIFFTAG_PHOTOSHOP 34377
|
|
||||||
/* tags 34665, 34853 and 40965 are documented in EXIF specification */
|
|
||||||
#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */
|
|
||||||
/* tag 34750 is a private tag registered to Adobe? */
|
|
||||||
#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
|
|
||||||
#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
|
|
||||||
/* tag 34750 is a private tag registered to Pixel Magic */
|
|
||||||
#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
|
|
||||||
#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
|
|
||||||
/* tags 34908-34914 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
|
|
||||||
#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
|
|
||||||
#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
|
|
||||||
#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
|
|
||||||
/* tags 37439-37443 are registered to SGI <gregl@sgi.com> */
|
|
||||||
#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
|
|
||||||
/* tag 34929 is a private tag registered to FedEx */
|
|
||||||
#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
|
|
||||||
#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */
|
|
||||||
/* Adobe Digital Negative (DNG) format tags */
|
|
||||||
#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
|
|
||||||
#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
|
|
||||||
#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
|
|
||||||
#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model
|
|
||||||
name */
|
|
||||||
#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space
|
|
||||||
mapping */
|
|
||||||
#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
|
|
||||||
#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
|
|
||||||
#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for
|
|
||||||
the BlackLevel tag */
|
|
||||||
#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level
|
|
||||||
differences (columns) */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level
|
|
||||||
differences (rows) */
|
|
||||||
#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding
|
|
||||||
level */
|
|
||||||
#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
|
|
||||||
#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space
|
|
||||||
transformation matrix 1 */
|
|
||||||
#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space
|
|
||||||
transformation matrix 2 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction
|
|
||||||
matrix 1 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction
|
|
||||||
matrix 2 */
|
|
||||||
#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw
|
|
||||||
values*/
|
|
||||||
#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in
|
|
||||||
linear reference space */
|
|
||||||
#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in
|
|
||||||
x-y chromaticity
|
|
||||||
coordinates */
|
|
||||||
#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero
|
|
||||||
point */
|
|
||||||
#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
|
|
||||||
#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of
|
|
||||||
sharpening */
|
|
||||||
#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of
|
|
||||||
the green pixels in the
|
|
||||||
blue/green rows track the
|
|
||||||
values of the green pixels
|
|
||||||
in the red/green rows */
|
|
||||||
#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
|
|
||||||
#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
|
|
||||||
#define TIFFTAG_LENSINFO 50736 /* info about the lens */
|
|
||||||
#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
|
|
||||||
#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the
|
|
||||||
camera's anti-alias filter */
|
|
||||||
#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
|
|
||||||
#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
|
|
||||||
#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote
|
|
||||||
tag is safe to preserve
|
|
||||||
along with the rest of the
|
|
||||||
EXIF data */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
|
|
||||||
#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
|
|
||||||
#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for
|
|
||||||
the raw image data */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels
|
|
||||||
of the sensor */
|
|
||||||
#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates
|
|
||||||
of fully masked pixels */
|
|
||||||
#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
|
|
||||||
#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space
|
|
||||||
into ICC profile space */
|
|
||||||
#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
|
|
||||||
#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
|
|
||||||
/* tag 65535 is an undefined tag used by Eastman Kodak */
|
|
||||||
#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following are ``pseudo tags'' that can be used to control
|
|
||||||
* codec-specific functionality. These tags are not written to file.
|
|
||||||
* Note that these values start at 0xffff+1 so that they'll never
|
|
||||||
* collide with Aldus-assigned tags.
|
|
||||||
*
|
|
||||||
* If you want your private pseudo tags ``registered'' (i.e. added to
|
|
||||||
* this file), please post a bug report via the tracking system at
|
|
||||||
* http://www.remotesensing.org/libtiff/bugs.html with the appropriate
|
|
||||||
* C definitions to add.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
|
|
||||||
#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
|
|
||||||
#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
|
|
||||||
#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
|
|
||||||
#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
|
|
||||||
#define FAXMODE_WORDALIGN 0x0008 /* word align row */
|
|
||||||
#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
|
|
||||||
#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
|
|
||||||
/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */
|
|
||||||
#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
|
|
||||||
#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
|
|
||||||
#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
|
|
||||||
#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
|
|
||||||
#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
|
|
||||||
#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
|
|
||||||
/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
|
|
||||||
#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
|
|
||||||
#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
|
|
||||||
#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
|
|
||||||
#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
|
|
||||||
#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
|
|
||||||
#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
|
|
||||||
#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
|
|
||||||
#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
|
|
||||||
/* 65550-65556 are allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
|
|
||||||
#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
|
|
||||||
#define DCSIMAGERFILTER_IR 0 /* infrared filter */
|
|
||||||
#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
|
|
||||||
#define DCSIMAGERFILTER_CFA 2 /* color filter array */
|
|
||||||
#define DCSIMAGERFILTER_OTHER 3 /* other filter */
|
|
||||||
#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
|
|
||||||
#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
|
|
||||||
#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
|
|
||||||
#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
|
|
||||||
#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
|
|
||||||
#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
|
|
||||||
#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
|
|
||||||
#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
|
|
||||||
/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
|
|
||||||
#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
|
|
||||||
#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
|
|
||||||
/* 65559 is allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
|
|
||||||
#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
|
|
||||||
#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
|
|
||||||
#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
|
|
||||||
#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
|
|
||||||
#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
|
|
||||||
#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
|
|
||||||
#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
|
|
||||||
#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
|
|
||||||
#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */
|
|
||||||
#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */
|
|
||||||
#define PERSAMPLE_MERGED 0 /* present as a single value */
|
|
||||||
#define PERSAMPLE_MULTI 1 /* present as multiple values */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXIF tags
|
|
||||||
*/
|
|
||||||
#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */
|
|
||||||
#define EXIFTAG_FNUMBER 33437 /* F number */
|
|
||||||
#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
|
|
||||||
#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
|
||||||
#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
|
||||||
#define EXIFTAG_OECF 34856 /* Optoelectric conversion
|
|
||||||
factor */
|
|
||||||
#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
|
|
||||||
#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
|
|
||||||
#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
|
||||||
#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
|
||||||
#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */
|
|
||||||
#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */
|
|
||||||
#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */
|
|
||||||
#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */
|
|
||||||
#define EXIFTAG_METERINGMODE 37383 /* Metering mode */
|
|
||||||
#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */
|
|
||||||
#define EXIFTAG_FLASH 37385 /* Flash */
|
|
||||||
#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */
|
|
||||||
#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */
|
|
||||||
#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */
|
|
||||||
#define EXIFTAG_USERCOMMENT 37510 /* User comments */
|
|
||||||
#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */
|
|
||||||
#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */
|
|
||||||
#define EXIFTAG_COLORSPACE 40961 /* Color space information */
|
|
||||||
#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */
|
|
||||||
#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */
|
|
||||||
#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */
|
|
||||||
#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */
|
|
||||||
#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */
|
|
||||||
#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */
|
|
||||||
#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */
|
|
||||||
#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */
|
|
||||||
#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */
|
|
||||||
#define EXIFTAG_FILESOURCE 41728 /* File source */
|
|
||||||
#define EXIFTAG_SCENETYPE 41729 /* Scene type */
|
|
||||||
#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */
|
|
||||||
#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */
|
|
||||||
#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */
|
|
||||||
#define EXIFTAG_WHITEBALANCE 41987 /* White balance */
|
|
||||||
#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */
|
|
||||||
#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */
|
|
||||||
#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_CONTRAST 41992 /* Contrast */
|
|
||||||
#define EXIFTAG_SATURATION 41993 /* Saturation */
|
|
||||||
#define EXIFTAG_SHARPNESS 41994 /* Sharpness */
|
|
||||||
#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */
|
|
||||||
|
|
||||||
#endif /* _TIFF_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */
|
|
||||||
/*
|
|
||||||
Configuration defines for installed libtiff.
|
|
||||||
This file maintained for backward compatibility. Do not use definitions
|
|
||||||
from this file in your programs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFCONF_
|
|
||||||
#define _TIFFCONF_
|
|
||||||
|
|
||||||
/* Signed 16-bit type */
|
|
||||||
#define TIFF_INT16_T signed short
|
|
||||||
|
|
||||||
/* Signed 32-bit type */
|
|
||||||
#define TIFF_INT32_T signed int
|
|
||||||
|
|
||||||
/* Signed 64-bit type */
|
|
||||||
#define TIFF_INT64_T signed long long
|
|
||||||
|
|
||||||
/* Signed 8-bit type */
|
|
||||||
#define TIFF_INT8_T signed char
|
|
||||||
|
|
||||||
/* Unsigned 16-bit type */
|
|
||||||
#define TIFF_UINT16_T unsigned short
|
|
||||||
|
|
||||||
/* Unsigned 32-bit type */
|
|
||||||
#define TIFF_UINT32_T unsigned int
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type */
|
|
||||||
#define TIFF_UINT64_T unsigned long long
|
|
||||||
|
|
||||||
/* Unsigned 8-bit type */
|
|
||||||
#define TIFF_UINT8_T unsigned char
|
|
||||||
|
|
||||||
/* Signed size type */
|
|
||||||
#define TIFF_SSIZE_T signed int
|
|
||||||
|
|
||||||
/* Pointer difference type */
|
|
||||||
#define TIFF_PTRDIFF_T ptrdiff_t
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
/* #undef HAVE_INT16 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
/* #undef HAVE_INT32 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
/* #undef HAVE_INT8 */
|
|
||||||
|
|
||||||
/* Compatibility stuff. */
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#define HAVE_IEEEFP 1
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#define HOST_FILLORDER FILLORDER_LSB2MSB
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#define HOST_BIGENDIAN 0
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#define CCITT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
/* #undef JPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support JBIG compression (requires JBIG-KIT library) */
|
|
||||||
/* #undef JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#define LOGLUV_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#define LZW_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#define NEXT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
|
|
||||||
fails with unpatched IJG JPEG library) */
|
|
||||||
/* #undef OJPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#define PACKBITS_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
/* #undef PIXARLOG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#define THUNDER_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
/* #undef ZIP_SUPPORT */
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of ~8Kb to reduce memory usage) */
|
|
||||||
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#define SUBIFD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
|
|
||||||
|
|
||||||
/* Support MS MDI magic number files as TIFF */
|
|
||||||
#define MDI_SUPPORT 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature support definitions.
|
|
||||||
* XXX: These macros are obsoleted. Don't use them in your apps!
|
|
||||||
* Macros stays here for backward compatibility and should be always defined.
|
|
||||||
*/
|
|
||||||
#define COLORIMETRY_SUPPORT
|
|
||||||
#define YCBCR_SUPPORT
|
|
||||||
#define CMYK_SUPPORT
|
|
||||||
#define ICC_SUPPORT
|
|
||||||
#define PHOTOSHOP_SUPPORT
|
|
||||||
#define IPTC_SUPPORT
|
|
||||||
|
|
||||||
#endif /* _TIFFCONF_ */
|
|
||||||
|
|
@ -1,557 +0,0 @@
|
||||||
/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFIO_
|
|
||||||
#define _TIFFIO_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF I/O Library Definitions.
|
|
||||||
*/
|
|
||||||
#include "tiff.h"
|
|
||||||
#include "tiffvers.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF is defined as an incomplete type to hide the
|
|
||||||
* library's internal data structures from clients.
|
|
||||||
*/
|
|
||||||
typedef struct tiff TIFF;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following typedefs define the intrinsic size of
|
|
||||||
* data types used in the *exported* interfaces. These
|
|
||||||
* definitions depend on the proper definition of types
|
|
||||||
* in tiff.h. Note also that the varargs interface used
|
|
||||||
* to pass tag types and values uses the types defined in
|
|
||||||
* tiff.h directly.
|
|
||||||
*
|
|
||||||
* NB: ttag_t is unsigned int and not unsigned short because
|
|
||||||
* ANSI C requires that the type before the ellipsis be a
|
|
||||||
* promoted type (i.e. one of int, unsigned int, pointer,
|
|
||||||
* or double) and because we defined pseudo-tags that are
|
|
||||||
* outside the range of legal Aldus-assigned tags.
|
|
||||||
* NB: tsize_t is int32 and not uint32 because some functions
|
|
||||||
* return -1.
|
|
||||||
* NB: toff_t is not off_t for many reasons; TIFFs max out at
|
|
||||||
* 32-bit file offsets, and BigTIFF maxes out at 64-bit
|
|
||||||
* offsets being the most important, and to ensure use of
|
|
||||||
* a consistently unsigned type across architectures.
|
|
||||||
* Prior to libtiff 4.0, this was an unsigned 32 bit type.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* this is the machine addressing size type, only it's signed, so make it
|
|
||||||
* int32 on 32bit machines, int64 on 64bit machines
|
|
||||||
*/
|
|
||||||
typedef TIFF_SSIZE_T tmsize_t;
|
|
||||||
typedef uint64 toff_t; /* file offset */
|
|
||||||
/* the following are deprecated and should be replaced by their defining
|
|
||||||
counterparts */
|
|
||||||
typedef uint32 ttag_t; /* directory tag */
|
|
||||||
typedef uint16 tdir_t; /* directory index */
|
|
||||||
typedef uint16 tsample_t; /* sample number */
|
|
||||||
typedef uint32 tstrile_t; /* strip or tile number */
|
|
||||||
typedef tstrile_t tstrip_t; /* strip number */
|
|
||||||
typedef tstrile_t ttile_t; /* tile number */
|
|
||||||
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
|
||||||
typedef void* tdata_t; /* image data ref */
|
|
||||||
|
|
||||||
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
|
|
||||||
#define __WIN32__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c
|
|
||||||
* or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c).
|
|
||||||
*
|
|
||||||
* By default tif_unix.c is assumed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
|
||||||
# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
|
|
||||||
# define AVOID_WIN32_FILEIO
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_WIN32_FILEIO)
|
|
||||||
# define VC_EXTRALEAN
|
|
||||||
# include <windows.h>
|
|
||||||
# ifdef __WIN32__
|
|
||||||
DECLARE_HANDLE(thandle_t); /* Win32 file handle */
|
|
||||||
# else
|
|
||||||
typedef HFILE thandle_t; /* client data handle */
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
#else
|
|
||||||
typedef void* thandle_t; /* client data handle */
|
|
||||||
#endif /* USE_WIN32_FILEIO */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags to pass to TIFFPrintDirectory to control
|
|
||||||
* printing of data structures that are potentially
|
|
||||||
* very large. Bit-or these flags to enable printing
|
|
||||||
* multiple items.
|
|
||||||
*/
|
|
||||||
#define TIFFPRINT_NONE 0x0 /* no extra info */
|
|
||||||
#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
|
|
||||||
#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
|
|
||||||
#define TIFFPRINT_COLORMAP 0x4 /* colormap */
|
|
||||||
#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
|
|
||||||
#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
|
|
||||||
#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Colour conversion stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* reference white */
|
|
||||||
#define D65_X0 (95.0470F)
|
|
||||||
#define D65_Y0 (100.0F)
|
|
||||||
#define D65_Z0 (108.8827F)
|
|
||||||
|
|
||||||
#define D50_X0 (96.4250F)
|
|
||||||
#define D50_Y0 (100.0F)
|
|
||||||
#define D50_Z0 (82.4680F)
|
|
||||||
|
|
||||||
/* Structure for holding information about a display device. */
|
|
||||||
|
|
||||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
|
||||||
float d_YCR; /* Light o/p for reference white */
|
|
||||||
float d_YCG;
|
|
||||||
float d_YCB;
|
|
||||||
uint32 d_Vrwr; /* Pixel values for ref. white */
|
|
||||||
uint32 d_Vrwg;
|
|
||||||
uint32 d_Vrwb;
|
|
||||||
float d_Y0R; /* Residual light for black pixel */
|
|
||||||
float d_Y0G;
|
|
||||||
float d_Y0B;
|
|
||||||
float d_gammaR; /* Gamma values for the three guns */
|
|
||||||
float d_gammaG;
|
|
||||||
float d_gammaB;
|
|
||||||
} TIFFDisplay;
|
|
||||||
|
|
||||||
typedef struct { /* YCbCr->RGB support */
|
|
||||||
TIFFRGBValue* clamptab; /* range clamping table */
|
|
||||||
int* Cr_r_tab;
|
|
||||||
int* Cb_b_tab;
|
|
||||||
int32* Cr_g_tab;
|
|
||||||
int32* Cb_g_tab;
|
|
||||||
int32* Y_tab;
|
|
||||||
} TIFFYCbCrToRGB;
|
|
||||||
|
|
||||||
typedef struct { /* CIE Lab 1976->RGB support */
|
|
||||||
int range; /* Size of conversion table */
|
|
||||||
#define CIELABTORGB_TABLE_RANGE 1500
|
|
||||||
float rstep, gstep, bstep;
|
|
||||||
float X0, Y0, Z0; /* Reference white point */
|
|
||||||
TIFFDisplay display;
|
|
||||||
float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
|
|
||||||
float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
|
|
||||||
float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
|
|
||||||
} TIFFCIELabToRGB;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RGBA-style image support.
|
|
||||||
*/
|
|
||||||
typedef struct _TIFFRGBAImage TIFFRGBAImage;
|
|
||||||
/*
|
|
||||||
* The image reading and conversion routines invoke
|
|
||||||
* ``put routines'' to copy/image/whatever tiles of
|
|
||||||
* raw image data. A default set of routines are
|
|
||||||
* provided to convert/copy raw image data to 8-bit
|
|
||||||
* packed ABGR format rasters. Applications can supply
|
|
||||||
* alternate routines that unpack the data into a
|
|
||||||
* different format or, for example, unpack the data
|
|
||||||
* and draw the unpacked raster on the display.
|
|
||||||
*/
|
|
||||||
typedef void (*tileContigRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*);
|
|
||||||
typedef void (*tileSeparateRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
|
|
||||||
/*
|
|
||||||
* RGBA-reader state.
|
|
||||||
*/
|
|
||||||
struct _TIFFRGBAImage {
|
|
||||||
TIFF* tif; /* image handle */
|
|
||||||
int stoponerr; /* stop on read error */
|
|
||||||
int isContig; /* data is packed/separate */
|
|
||||||
int alpha; /* type of alpha data present */
|
|
||||||
uint32 width; /* image width */
|
|
||||||
uint32 height; /* image height */
|
|
||||||
uint16 bitspersample; /* image bits/sample */
|
|
||||||
uint16 samplesperpixel; /* image samples/pixel */
|
|
||||||
uint16 orientation; /* image orientation */
|
|
||||||
uint16 req_orientation; /* requested orientation */
|
|
||||||
uint16 photometric; /* image photometric interp */
|
|
||||||
uint16* redcmap; /* colormap pallete */
|
|
||||||
uint16* greencmap;
|
|
||||||
uint16* bluecmap;
|
|
||||||
/* get image data routine */
|
|
||||||
int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
/* put decoded strip/tile */
|
|
||||||
union {
|
|
||||||
void (*any)(TIFFRGBAImage*);
|
|
||||||
tileContigRoutine contig;
|
|
||||||
tileSeparateRoutine separate;
|
|
||||||
} put;
|
|
||||||
TIFFRGBValue* Map; /* sample mapping array */
|
|
||||||
uint32** BWmap; /* black&white map */
|
|
||||||
uint32** PALmap; /* palette image map */
|
|
||||||
TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
|
|
||||||
TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
|
|
||||||
|
|
||||||
uint8* UaToAa; /* Unassociated alpha to associated alpha convertion LUT */
|
|
||||||
uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
|
||||||
|
|
||||||
int row_offset;
|
|
||||||
int col_offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros for extracting components from the
|
|
||||||
* packed ABGR form returned by TIFFReadRGBAImage.
|
|
||||||
*/
|
|
||||||
#define TIFFGetR(abgr) ((abgr) & 0xff)
|
|
||||||
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
|
|
||||||
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
|
|
||||||
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A CODEC is a software package that implements decoding,
|
|
||||||
* encoding, or decoding+encoding of a compression algorithm.
|
|
||||||
* The library provides a collection of builtin codecs.
|
|
||||||
* More codecs may be registered through calls to the library
|
|
||||||
* and/or the builtin implementations may be overridden.
|
|
||||||
*/
|
|
||||||
typedef int (*TIFFInitMethod)(TIFF*, int);
|
|
||||||
typedef struct {
|
|
||||||
char* name;
|
|
||||||
uint16 scheme;
|
|
||||||
TIFFInitMethod init;
|
|
||||||
} TIFFCodec;
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
/* share internal LogLuv conversion routines? */
|
|
||||||
#ifndef LOGLUV_PUBLIC
|
|
||||||
#define LOGLUV_PUBLIC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
|
||||||
# define __attribute__(x) /*nothing*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
|
|
||||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
|
|
||||||
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t);
|
|
||||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
|
||||||
typedef int (*TIFFCloseProc)(thandle_t);
|
|
||||||
typedef toff_t (*TIFFSizeProc)(thandle_t);
|
|
||||||
typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size);
|
|
||||||
typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size);
|
|
||||||
typedef void (*TIFFExtendProc)(TIFF*);
|
|
||||||
|
|
||||||
extern const char* TIFFGetVersion(void);
|
|
||||||
|
|
||||||
extern const TIFFCodec* TIFFFindCODEC(uint16);
|
|
||||||
extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
|
|
||||||
extern void TIFFUnRegisterCODEC(TIFFCodec*);
|
|
||||||
extern int TIFFIsCODECConfigured(uint16);
|
|
||||||
extern TIFFCodec* TIFFGetConfiguredCODECs(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Auxiliary functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void* _TIFFmalloc(tmsize_t s);
|
|
||||||
extern void* _TIFFrealloc(void* p, tmsize_t s);
|
|
||||||
extern void _TIFFmemset(void* p, int v, tmsize_t c);
|
|
||||||
extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c);
|
|
||||||
extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c);
|
|
||||||
extern void _TIFFfree(void* p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Stuff, related to tag handling and creating custom tags.
|
|
||||||
*/
|
|
||||||
extern int TIFFGetTagListCount( TIFF * );
|
|
||||||
extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index );
|
|
||||||
|
|
||||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
|
||||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
|
||||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
|
||||||
#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
|
|
||||||
|
|
||||||
#define FIELD_CUSTOM 65
|
|
||||||
|
|
||||||
typedef struct _TIFFField TIFFField;
|
|
||||||
typedef struct _TIFFFieldArray TIFFFieldArray;
|
|
||||||
|
|
||||||
extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType);
|
|
||||||
extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32);
|
|
||||||
extern const TIFFField* TIFFFieldWithName(TIFF*, const char *);
|
|
||||||
|
|
||||||
extern uint32 TIFFFieldTag(const TIFFField*);
|
|
||||||
extern const char* TIFFFieldName(const TIFFField*);
|
|
||||||
extern TIFFDataType TIFFFieldDataType(const TIFFField*);
|
|
||||||
extern int TIFFFieldPassCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldReadCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldWriteCount(const TIFFField*);
|
|
||||||
|
|
||||||
typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
|
||||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
|
||||||
TIFFPrintMethod printdir; /* directory print routine */
|
|
||||||
} TIFFTagMethods;
|
|
||||||
|
|
||||||
extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
|
|
||||||
extern void *TIFFGetClientInfo(TIFF *, const char *);
|
|
||||||
extern void TIFFSetClientInfo(TIFF *, void *, const char *);
|
|
||||||
|
|
||||||
extern void TIFFCleanup(TIFF* tif);
|
|
||||||
extern void TIFFClose(TIFF* tif);
|
|
||||||
extern int TIFFFlush(TIFF* tif);
|
|
||||||
extern int TIFFFlushData(TIFF* tif);
|
|
||||||
extern int TIFFGetField(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFReadDirectory(TIFF* tif);
|
|
||||||
extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
|
|
||||||
extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff);
|
|
||||||
extern uint64 TIFFScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRasterScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFRasterScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFStripSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFStripSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip);
|
|
||||||
extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip);
|
|
||||||
extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint64 TIFFTileRowSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileRowSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFTileSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request);
|
|
||||||
extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
|
|
||||||
extern int TIFFFileno(TIFF*);
|
|
||||||
extern int TIFFSetFileno(TIFF*, int);
|
|
||||||
extern thandle_t TIFFClientdata(TIFF*);
|
|
||||||
extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
|
|
||||||
extern int TIFFGetMode(TIFF*);
|
|
||||||
extern int TIFFSetMode(TIFF*, int);
|
|
||||||
extern int TIFFIsTiled(TIFF*);
|
|
||||||
extern int TIFFIsByteSwapped(TIFF*);
|
|
||||||
extern int TIFFIsUpSampled(TIFF*);
|
|
||||||
extern int TIFFIsMSB2LSB(TIFF*);
|
|
||||||
extern int TIFFIsBigEndian(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
|
|
||||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
|
|
||||||
extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
|
|
||||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
|
|
||||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
|
|
||||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentRow(TIFF*);
|
|
||||||
extern uint16 TIFFCurrentDirectory(TIFF*);
|
|
||||||
extern uint16 TIFFNumberOfDirectories(TIFF*);
|
|
||||||
extern uint64 TIFFCurrentDirOffset(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentStrip(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentTile(TIFF* tif);
|
|
||||||
extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFSetupStrips(TIFF *);
|
|
||||||
extern int TIFFWriteCheck(TIFF*, int, const char *);
|
|
||||||
extern void TIFFFreeDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
|
|
||||||
extern int TIFFCreateEXIFDirectory(TIFF*);
|
|
||||||
extern int TIFFLastDirectory(TIFF*);
|
|
||||||
extern int TIFFSetDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetSubDirectory(TIFF*, uint64);
|
|
||||||
extern int TIFFUnlinkDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetField(TIFF*, uint32, ...);
|
|
||||||
extern int TIFFVSetField(TIFF*, uint32, va_list);
|
|
||||||
extern int TIFFUnsetField(TIFF*, uint32);
|
|
||||||
extern int TIFFWriteDirectory(TIFF *);
|
|
||||||
extern int TIFFWriteCustomDirectory(TIFF *, uint64 *);
|
|
||||||
extern int TIFFCheckpointDirectory(TIFF *);
|
|
||||||
extern int TIFFRewriteDirectory(TIFF *);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
|
|
||||||
int = ORIENTATION_BOTLEFT, int = 0);
|
|
||||||
#else
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * );
|
|
||||||
extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
|
|
||||||
extern int TIFFRGBAImageOK(TIFF*, char [1024]);
|
|
||||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
|
|
||||||
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
|
|
||||||
extern TIFF* TIFFOpen(const char*, const char*);
|
|
||||||
# ifdef __WIN32__
|
|
||||||
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
extern TIFF* TIFFFdOpen(int, const char*, const char*);
|
|
||||||
extern TIFF* TIFFClientOpen(const char*, const char*,
|
|
||||||
thandle_t,
|
|
||||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
|
||||||
TIFFSeekProc, TIFFCloseProc,
|
|
||||||
TIFFSizeProc,
|
|
||||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
|
||||||
extern const char* TIFFFileName(TIFF*);
|
|
||||||
extern const char* TIFFSetFileName(TIFF*, const char *);
|
|
||||||
extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
|
||||||
extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFNumberOfTiles(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16);
|
|
||||||
extern uint32 TIFFNumberOfStrips(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
|
|
||||||
extern void TIFFSetWriteOffset(TIFF* tif, toff_t off);
|
|
||||||
extern void TIFFSwabShort(uint16*);
|
|
||||||
extern void TIFFSwabLong(uint32*);
|
|
||||||
extern void TIFFSwabLong8(uint64*);
|
|
||||||
extern void TIFFSwabFloat(float*);
|
|
||||||
extern void TIFFSwabDouble(double*);
|
|
||||||
extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n);
|
|
||||||
extern void TIFFReverseBits(uint8* cp, tmsize_t n);
|
|
||||||
extern const unsigned char* TIFFGetBitRevTable(int);
|
|
||||||
|
|
||||||
#ifdef LOGLUV_PUBLIC
|
|
||||||
#define U_NEU 0.210526316
|
|
||||||
#define V_NEU 0.473684211
|
|
||||||
#define UVSCALE 410.
|
|
||||||
extern double LogL16toY(int);
|
|
||||||
extern double LogL10toY(int);
|
|
||||||
extern void XYZtoRGB24(float*, uint8*);
|
|
||||||
extern int uv_decode(double*, double*, int);
|
|
||||||
extern void LogLuv24toXYZ(uint32, float*);
|
|
||||||
extern void LogLuv32toXYZ(uint32, float*);
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
#else
|
|
||||||
extern int LogL16fromY(double, int);
|
|
||||||
extern int LogL10fromY(double, int);
|
|
||||||
extern int uv_encode(double, double, int);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int);
|
|
||||||
#endif
|
|
||||||
#endif /* LOGLUV_PUBLIC */
|
|
||||||
|
|
||||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*);
|
|
||||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
|
|
||||||
float *, float *, float *);
|
|
||||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
|
|
||||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* O B S O L E T E D I N T E R F A C E S
|
|
||||||
*
|
|
||||||
* Don't use this stuff in your applications, it may be removed in the future
|
|
||||||
* libtiff versions.
|
|
||||||
****************************************************************************/
|
|
||||||
typedef struct {
|
|
||||||
ttag_t field_tag; /* field's tag */
|
|
||||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
|
||||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
|
||||||
TIFFDataType field_type; /* type of associated data */
|
|
||||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
|
||||||
unsigned char field_oktochange; /* if true, can change while writing */
|
|
||||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
|
||||||
char *field_name; /* ASCII name */
|
|
||||||
} TIFFFieldInfo;
|
|
||||||
|
|
||||||
extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _TIFFIO_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.6\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
|
|
||||||
/*
|
|
||||||
* This define can be used in code that requires
|
|
||||||
* compilation-related definitions specific to a
|
|
||||||
* version or versions of the library. Runtime
|
|
||||||
* version checking should be done based on the
|
|
||||||
* string returned by TIFFGetVersion.
|
|
||||||
*/
|
|
||||||
#define TIFFLIB_VERSION 20150912
|
|
||||||
Binary file not shown.
|
|
@ -24,11 +24,6 @@ set_target_properties(ssl PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libssl.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libssl.a
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(tiff STATIC IMPORTED GLOBAL)
|
|
||||||
set_target_properties(tiff PROPERTIES
|
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libtiff.a
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(uv STATIC IMPORTED GLOBAL)
|
add_library(uv STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(uv PROPERTIES
|
set_target_properties(uv PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libuv_a.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libuv_a.a
|
||||||
|
|
@ -94,26 +89,11 @@ if(USE_SE_V8)
|
||||||
# endif()
|
# endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(USE_SE_SM)
|
|
||||||
list(APPEND se_libs_name
|
|
||||||
js_static
|
|
||||||
mozglue
|
|
||||||
)
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(USE_SE_JSC)
|
if(USE_SE_JSC)
|
||||||
find_library(JAVASCRIPT_CORE_LIBRARY JavaScriptCore REQUIRED)
|
find_library(JAVASCRIPT_CORE_LIBRARY JavaScriptCore REQUIRED)
|
||||||
set(se_libs_name ${JAVASCRIPT_CORE_LIBRARY})
|
set(se_libs_name ${JAVASCRIPT_CORE_LIBRARY})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(USE_TIFF)
|
|
||||||
list(APPEND CC_EXTERNAL_LIBS
|
|
||||||
tiff
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND CC_EXTERNAL_INCLUDES
|
list(APPEND CC_EXTERNAL_INCLUDES
|
||||||
${CMAKE_CURRENT_LIST_DIR}/include
|
${CMAKE_CURRENT_LIST_DIR}/include
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,678 +0,0 @@
|
||||||
/* $Id: tiff.h,v 1.68 2012-08-19 16:56:35 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFF_
|
|
||||||
#define _TIFF_
|
|
||||||
|
|
||||||
#include "tiffconf.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag Image File Format (TIFF)
|
|
||||||
*
|
|
||||||
* Based on Rev 6.0 from:
|
|
||||||
* Developer's Desk
|
|
||||||
* Aldus Corporation
|
|
||||||
* 411 First Ave. South
|
|
||||||
* Suite 200
|
|
||||||
* Seattle, WA 98104
|
|
||||||
* 206-622-5500
|
|
||||||
*
|
|
||||||
* (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf)
|
|
||||||
*
|
|
||||||
* For BigTIFF design notes see the following links
|
|
||||||
* http://www.remotesensing.org/libtiff/bigtiffdesign.html
|
|
||||||
* http://www.awaresystems.be/imaging/tiff/bigtiff.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TIFF_VERSION_CLASSIC 42
|
|
||||||
#define TIFF_VERSION_BIG 43
|
|
||||||
|
|
||||||
#define TIFF_BIGENDIAN 0x4d4d
|
|
||||||
#define TIFF_LITTLEENDIAN 0x4949
|
|
||||||
#define MDI_LITTLEENDIAN 0x5045
|
|
||||||
#define MDI_BIGENDIAN 0x4550
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Intrinsic data types required by the file format:
|
|
||||||
*
|
|
||||||
* 8-bit quantities int8/uint8
|
|
||||||
* 16-bit quantities int16/uint16
|
|
||||||
* 32-bit quantities int32/uint32
|
|
||||||
* 64-bit quantities int64/uint64
|
|
||||||
* strings unsigned char*
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef TIFF_INT8_T int8;
|
|
||||||
typedef TIFF_UINT8_T uint8;
|
|
||||||
|
|
||||||
typedef TIFF_INT16_T int16;
|
|
||||||
typedef TIFF_UINT16_T uint16;
|
|
||||||
|
|
||||||
typedef TIFF_INT32_T int32;
|
|
||||||
typedef TIFF_UINT32_T uint32;
|
|
||||||
|
|
||||||
typedef TIFF_INT64_T int64;
|
|
||||||
typedef TIFF_UINT64_T uint64;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some types as promoted in a variable argument list
|
|
||||||
* We use uint16_vap rather then directly using int, because this way
|
|
||||||
* we document the type we actually want to pass through, conceptually,
|
|
||||||
* rather then confusing the issue by merely stating the type it gets
|
|
||||||
* promoted to
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef int uint16_vap;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF header.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
} TIFFHeaderCommon;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint32 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderClassic;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint16 tiff_offsetsize; /* size of offsets, should be 8 */
|
|
||||||
uint16 tiff_unused; /* unused word, should be 0 */
|
|
||||||
uint64 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderBig;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NB: In the comments below,
|
|
||||||
* - items marked with a + are obsoleted by revision 5.0,
|
|
||||||
* - items marked with a ! are introduced in revision 6.0.
|
|
||||||
* - items marked with a % are introduced post revision 6.0.
|
|
||||||
* - items marked with a $ are obsoleted by revision 6.0.
|
|
||||||
* - items marked with a & are introduced by Adobe DNG specification.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag data type information.
|
|
||||||
*
|
|
||||||
* Note: RATIONALs are the ratio of two 32-bit integer values.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
TIFF_NOTYPE = 0, /* placeholder */
|
|
||||||
TIFF_BYTE = 1, /* 8-bit unsigned integer */
|
|
||||||
TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
|
|
||||||
TIFF_SHORT = 3, /* 16-bit unsigned integer */
|
|
||||||
TIFF_LONG = 4, /* 32-bit unsigned integer */
|
|
||||||
TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
|
|
||||||
TIFF_SBYTE = 6, /* !8-bit signed integer */
|
|
||||||
TIFF_UNDEFINED = 7, /* !8-bit untyped data */
|
|
||||||
TIFF_SSHORT = 8, /* !16-bit signed integer */
|
|
||||||
TIFF_SLONG = 9, /* !32-bit signed integer */
|
|
||||||
TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
|
|
||||||
TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
|
|
||||||
TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
|
|
||||||
TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */
|
|
||||||
TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */
|
|
||||||
TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */
|
|
||||||
TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */
|
|
||||||
} TIFFDataType;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Tag Definitions.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
|
|
||||||
#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
|
|
||||||
#define FILETYPE_PAGE 0x2 /* one page of many */
|
|
||||||
#define FILETYPE_MASK 0x4 /* transparency mask */
|
|
||||||
#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
|
|
||||||
#define OFILETYPE_IMAGE 1 /* full resolution image data */
|
|
||||||
#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
|
|
||||||
#define OFILETYPE_PAGE 3 /* one page of many */
|
|
||||||
#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
|
|
||||||
#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
|
|
||||||
#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
|
|
||||||
#define TIFFTAG_COMPRESSION 259 /* data compression technique */
|
|
||||||
#define COMPRESSION_NONE 1 /* dump mode */
|
|
||||||
#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
|
|
||||||
#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
|
|
||||||
#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
|
|
||||||
#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
|
|
||||||
#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */
|
|
||||||
#define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */
|
|
||||||
#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
|
|
||||||
#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
|
|
||||||
#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
|
|
||||||
#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
|
|
||||||
/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
|
|
||||||
#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
|
|
||||||
#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
|
|
||||||
#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
|
|
||||||
/* compression codes 32908-32911 are reserved for Pixar */
|
|
||||||
#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
|
|
||||||
#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
|
|
||||||
#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
|
|
||||||
#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression,
|
|
||||||
as recognized by Adobe */
|
|
||||||
/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
|
|
||||||
#define COMPRESSION_JBIG 34661 /* ISO JBIG */
|
|
||||||
#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
|
|
||||||
#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
|
|
||||||
#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
|
|
||||||
#define COMPRESSION_LZMA 34925 /* LZMA2 */
|
|
||||||
#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
|
|
||||||
#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
|
|
||||||
#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
|
|
||||||
#define PHOTOMETRIC_RGB 2 /* RGB color model */
|
|
||||||
#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
|
|
||||||
#define PHOTOMETRIC_MASK 4 /* $holdout mask */
|
|
||||||
#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
|
|
||||||
#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
|
|
||||||
#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
|
|
||||||
#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
|
|
||||||
#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
|
|
||||||
#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
|
|
||||||
#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
|
|
||||||
#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
|
|
||||||
#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
|
|
||||||
#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
|
|
||||||
#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
|
|
||||||
#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
|
|
||||||
#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
|
|
||||||
#define TIFFTAG_FILLORDER 266 /* data order within a byte */
|
|
||||||
#define FILLORDER_MSB2LSB 1 /* most significant -> least */
|
|
||||||
#define FILLORDER_LSB2MSB 2 /* least significant -> most */
|
|
||||||
#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
|
|
||||||
#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
|
|
||||||
#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
|
|
||||||
#define TIFFTAG_MODEL 272 /* scanner model name/number */
|
|
||||||
#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
|
|
||||||
#define TIFFTAG_ORIENTATION 274 /* +image orientation */
|
|
||||||
#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
|
|
||||||
#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
|
|
||||||
#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
|
|
||||||
#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
|
|
||||||
#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
|
|
||||||
#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
|
|
||||||
#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
|
|
||||||
#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
|
|
||||||
#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
|
|
||||||
#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
|
|
||||||
#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
|
|
||||||
#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
|
|
||||||
#define PLANARCONFIG_CONTIG 1 /* single image plane */
|
|
||||||
#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
|
|
||||||
#define TIFFTAG_PAGENAME 285 /* page name image is from */
|
|
||||||
#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
|
|
||||||
#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
|
|
||||||
#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
|
|
||||||
#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
|
|
||||||
#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
|
|
||||||
#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
|
|
||||||
#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
|
|
||||||
#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
|
|
||||||
#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
|
|
||||||
#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
|
|
||||||
#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
|
|
||||||
#define RESUNIT_NONE 1 /* no meaningful units */
|
|
||||||
#define RESUNIT_INCH 2 /* english */
|
|
||||||
#define RESUNIT_CENTIMETER 3 /* metric */
|
|
||||||
#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
|
|
||||||
#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
|
|
||||||
#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_SOFTWARE 305 /* name & release */
|
|
||||||
#define TIFFTAG_DATETIME 306 /* creation date and time */
|
|
||||||
#define TIFFTAG_ARTIST 315 /* creator of image */
|
|
||||||
#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
|
|
||||||
#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
|
|
||||||
#define PREDICTOR_NONE 1 /* no prediction scheme used */
|
|
||||||
#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */
|
|
||||||
#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */
|
|
||||||
#define TIFFTAG_WHITEPOINT 318 /* image white point */
|
|
||||||
#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
|
|
||||||
#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */
|
|
||||||
#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
|
|
||||||
#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */
|
|
||||||
#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */
|
|
||||||
#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
|
|
||||||
#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
|
|
||||||
#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
|
|
||||||
#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
|
|
||||||
#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
|
|
||||||
#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
|
|
||||||
#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
|
|
||||||
#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
|
|
||||||
#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
|
|
||||||
#define TIFFTAG_INKSET 332 /* !inks in separated image */
|
|
||||||
#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
|
|
||||||
#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
|
|
||||||
#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
|
|
||||||
#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
|
|
||||||
#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
|
|
||||||
#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
|
|
||||||
#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
|
|
||||||
#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
|
|
||||||
#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
|
|
||||||
#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
|
|
||||||
#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
|
|
||||||
#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
|
|
||||||
#define SAMPLEFORMAT_INT 2 /* !signed integer data */
|
|
||||||
#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
|
|
||||||
#define SAMPLEFORMAT_VOID 4 /* !untyped data */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
|
|
||||||
#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
|
|
||||||
#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
|
|
||||||
#define TIFFTAG_CLIPPATH 343 /* %ClipPath
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_INDEXED 346 /* %Indexed
|
|
||||||
[Adobe TIFF Technote 3] */
|
|
||||||
#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
|
|
||||||
#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
|
|
||||||
/* Tags 400-435 are from the TIFF/FX spec */
|
|
||||||
#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */
|
|
||||||
#define TIFFTAG_PROFILETYPE 401 /* ! */
|
|
||||||
#define PROFILETYPE_UNSPECIFIED 0 /* ! */
|
|
||||||
#define PROFILETYPE_G3_FAX 1 /* ! */
|
|
||||||
#define TIFFTAG_FAXPROFILE 402 /* ! */
|
|
||||||
#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */
|
|
||||||
#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */
|
|
||||||
#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */
|
|
||||||
#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */
|
|
||||||
#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */
|
|
||||||
#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */
|
|
||||||
#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */
|
|
||||||
#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */
|
|
||||||
#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */
|
|
||||||
#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */
|
|
||||||
#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */
|
|
||||||
#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */
|
|
||||||
#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */
|
|
||||||
#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */
|
|
||||||
#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */
|
|
||||||
#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */
|
|
||||||
#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */
|
|
||||||
#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */
|
|
||||||
/*
|
|
||||||
* Tags 512-521 are obsoleted by Technical Note #2 which specifies a
|
|
||||||
* revised JPEG-in-TIFF scheme.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
|
|
||||||
#define JPEGPROC_BASELINE 1 /* !baseline sequential */
|
|
||||||
#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
|
|
||||||
#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
|
|
||||||
#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
|
|
||||||
#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
|
|
||||||
#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
|
|
||||||
#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
|
|
||||||
#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */
|
|
||||||
#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
|
|
||||||
#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
|
|
||||||
#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
|
|
||||||
#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
|
|
||||||
#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
|
|
||||||
#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
|
|
||||||
#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
|
|
||||||
#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
|
|
||||||
#define TIFFTAG_XMLPACKET 700 /* %XML packet
|
|
||||||
[Adobe XMP Specification,
|
|
||||||
January 2004 */
|
|
||||||
#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID
|
|
||||||
[Adobe TIFF technote] */
|
|
||||||
/* tags 32952-32956 are private tags registered to Island Graphics */
|
|
||||||
#define TIFFTAG_REFPTS 32953 /* image reference points */
|
|
||||||
#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
|
|
||||||
#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
|
|
||||||
#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
|
|
||||||
/* tags 32995-32999 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
|
|
||||||
#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
|
|
||||||
#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
|
|
||||||
#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
|
|
||||||
/* tags 33300-33309 are private tags registered to Pixar */
|
|
||||||
/*
|
|
||||||
* TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
|
|
||||||
* are set when an image has been cropped out of a larger image.
|
|
||||||
* They reflect the size of the original uncropped image.
|
|
||||||
* The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
|
|
||||||
* to determine the position of the smaller image in the larger one.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
|
|
||||||
/* Tags 33302-33306 are used to identify special image modes and data
|
|
||||||
* used by Pixar's texture formats.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
|
|
||||||
#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
|
|
||||||
#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
|
|
||||||
/* tag 33405 is a private tag registered to Eastman Kodak */
|
|
||||||
#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
|
|
||||||
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
|
|
||||||
#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
|
|
||||||
/* IPTC TAG from RichTIFF specifications */
|
|
||||||
#define TIFFTAG_RICHTIFFIPTC 33723
|
|
||||||
/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define TIFFTAG_IT8SITE 34016 /* site name */
|
|
||||||
#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
|
|
||||||
#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
|
|
||||||
#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
|
|
||||||
#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
|
|
||||||
#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
|
|
||||||
#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
|
|
||||||
#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
|
|
||||||
#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
|
|
||||||
#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
|
|
||||||
#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
|
|
||||||
#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator
|
|
||||||
(untrapped=0, trapped=1) */
|
|
||||||
#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
|
|
||||||
/* tags 34232-34236 are private tags registered to Texas Instruments */
|
|
||||||
#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
|
|
||||||
/* tag 34377 is private tag registered to Adobe for PhotoShop */
|
|
||||||
#define TIFFTAG_PHOTOSHOP 34377
|
|
||||||
/* tags 34665, 34853 and 40965 are documented in EXIF specification */
|
|
||||||
#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */
|
|
||||||
/* tag 34750 is a private tag registered to Adobe? */
|
|
||||||
#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
|
|
||||||
#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
|
|
||||||
/* tag 34750 is a private tag registered to Pixel Magic */
|
|
||||||
#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
|
|
||||||
#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
|
|
||||||
/* tags 34908-34914 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
|
|
||||||
#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
|
|
||||||
#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
|
|
||||||
#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
|
|
||||||
/* tags 37439-37443 are registered to SGI <gregl@sgi.com> */
|
|
||||||
#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
|
|
||||||
/* tag 34929 is a private tag registered to FedEx */
|
|
||||||
#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
|
|
||||||
#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */
|
|
||||||
/* Adobe Digital Negative (DNG) format tags */
|
|
||||||
#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
|
|
||||||
#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
|
|
||||||
#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
|
|
||||||
#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model
|
|
||||||
name */
|
|
||||||
#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space
|
|
||||||
mapping */
|
|
||||||
#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
|
|
||||||
#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
|
|
||||||
#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for
|
|
||||||
the BlackLevel tag */
|
|
||||||
#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level
|
|
||||||
differences (columns) */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level
|
|
||||||
differences (rows) */
|
|
||||||
#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding
|
|
||||||
level */
|
|
||||||
#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
|
|
||||||
#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space
|
|
||||||
transformation matrix 1 */
|
|
||||||
#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space
|
|
||||||
transformation matrix 2 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction
|
|
||||||
matrix 1 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction
|
|
||||||
matrix 2 */
|
|
||||||
#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw
|
|
||||||
values*/
|
|
||||||
#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in
|
|
||||||
linear reference space */
|
|
||||||
#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in
|
|
||||||
x-y chromaticity
|
|
||||||
coordinates */
|
|
||||||
#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero
|
|
||||||
point */
|
|
||||||
#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
|
|
||||||
#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of
|
|
||||||
sharpening */
|
|
||||||
#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of
|
|
||||||
the green pixels in the
|
|
||||||
blue/green rows track the
|
|
||||||
values of the green pixels
|
|
||||||
in the red/green rows */
|
|
||||||
#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
|
|
||||||
#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
|
|
||||||
#define TIFFTAG_LENSINFO 50736 /* info about the lens */
|
|
||||||
#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
|
|
||||||
#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the
|
|
||||||
camera's anti-alias filter */
|
|
||||||
#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
|
|
||||||
#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
|
|
||||||
#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote
|
|
||||||
tag is safe to preserve
|
|
||||||
along with the rest of the
|
|
||||||
EXIF data */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
|
|
||||||
#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
|
|
||||||
#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for
|
|
||||||
the raw image data */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels
|
|
||||||
of the sensor */
|
|
||||||
#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates
|
|
||||||
of fully masked pixels */
|
|
||||||
#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
|
|
||||||
#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space
|
|
||||||
into ICC profile space */
|
|
||||||
#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
|
|
||||||
#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
|
|
||||||
/* tag 65535 is an undefined tag used by Eastman Kodak */
|
|
||||||
#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following are ``pseudo tags'' that can be used to control
|
|
||||||
* codec-specific functionality. These tags are not written to file.
|
|
||||||
* Note that these values start at 0xffff+1 so that they'll never
|
|
||||||
* collide with Aldus-assigned tags.
|
|
||||||
*
|
|
||||||
* If you want your private pseudo tags ``registered'' (i.e. added to
|
|
||||||
* this file), please post a bug report via the tracking system at
|
|
||||||
* http://www.remotesensing.org/libtiff/bugs.html with the appropriate
|
|
||||||
* C definitions to add.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
|
|
||||||
#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
|
|
||||||
#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
|
|
||||||
#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
|
|
||||||
#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
|
|
||||||
#define FAXMODE_WORDALIGN 0x0008 /* word align row */
|
|
||||||
#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
|
|
||||||
#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
|
|
||||||
/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */
|
|
||||||
#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
|
|
||||||
#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
|
|
||||||
#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
|
|
||||||
#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
|
|
||||||
#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
|
|
||||||
#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
|
|
||||||
/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
|
|
||||||
#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
|
|
||||||
#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
|
|
||||||
#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
|
|
||||||
#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
|
|
||||||
#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
|
|
||||||
#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
|
|
||||||
#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
|
|
||||||
#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
|
|
||||||
/* 65550-65556 are allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
|
|
||||||
#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
|
|
||||||
#define DCSIMAGERFILTER_IR 0 /* infrared filter */
|
|
||||||
#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
|
|
||||||
#define DCSIMAGERFILTER_CFA 2 /* color filter array */
|
|
||||||
#define DCSIMAGERFILTER_OTHER 3 /* other filter */
|
|
||||||
#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
|
|
||||||
#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
|
|
||||||
#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
|
|
||||||
#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
|
|
||||||
#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
|
|
||||||
#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
|
|
||||||
#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
|
|
||||||
#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
|
|
||||||
/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
|
|
||||||
#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
|
|
||||||
#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
|
|
||||||
/* 65559 is allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
|
|
||||||
#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
|
|
||||||
#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
|
|
||||||
#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
|
|
||||||
#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
|
|
||||||
#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
|
|
||||||
#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
|
|
||||||
#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
|
|
||||||
#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
|
|
||||||
#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */
|
|
||||||
#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */
|
|
||||||
#define PERSAMPLE_MERGED 0 /* present as a single value */
|
|
||||||
#define PERSAMPLE_MULTI 1 /* present as multiple values */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXIF tags
|
|
||||||
*/
|
|
||||||
#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */
|
|
||||||
#define EXIFTAG_FNUMBER 33437 /* F number */
|
|
||||||
#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
|
|
||||||
#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
|
||||||
#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
|
||||||
#define EXIFTAG_OECF 34856 /* Optoelectric conversion
|
|
||||||
factor */
|
|
||||||
#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
|
|
||||||
#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
|
|
||||||
#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
|
||||||
#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
|
||||||
#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */
|
|
||||||
#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */
|
|
||||||
#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */
|
|
||||||
#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */
|
|
||||||
#define EXIFTAG_METERINGMODE 37383 /* Metering mode */
|
|
||||||
#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */
|
|
||||||
#define EXIFTAG_FLASH 37385 /* Flash */
|
|
||||||
#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */
|
|
||||||
#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */
|
|
||||||
#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */
|
|
||||||
#define EXIFTAG_USERCOMMENT 37510 /* User comments */
|
|
||||||
#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */
|
|
||||||
#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */
|
|
||||||
#define EXIFTAG_COLORSPACE 40961 /* Color space information */
|
|
||||||
#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */
|
|
||||||
#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */
|
|
||||||
#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */
|
|
||||||
#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */
|
|
||||||
#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */
|
|
||||||
#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */
|
|
||||||
#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */
|
|
||||||
#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */
|
|
||||||
#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */
|
|
||||||
#define EXIFTAG_FILESOURCE 41728 /* File source */
|
|
||||||
#define EXIFTAG_SCENETYPE 41729 /* Scene type */
|
|
||||||
#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */
|
|
||||||
#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */
|
|
||||||
#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */
|
|
||||||
#define EXIFTAG_WHITEBALANCE 41987 /* White balance */
|
|
||||||
#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */
|
|
||||||
#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */
|
|
||||||
#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_CONTRAST 41992 /* Contrast */
|
|
||||||
#define EXIFTAG_SATURATION 41993 /* Saturation */
|
|
||||||
#define EXIFTAG_SHARPNESS 41994 /* Sharpness */
|
|
||||||
#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */
|
|
||||||
|
|
||||||
#endif /* _TIFF_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */
|
|
||||||
/*
|
|
||||||
Configuration defines for installed libtiff.
|
|
||||||
This file maintained for backward compatibility. Do not use definitions
|
|
||||||
from this file in your programs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFCONF_
|
|
||||||
#define _TIFFCONF_
|
|
||||||
|
|
||||||
/* Signed 16-bit type */
|
|
||||||
#define TIFF_INT16_T signed short
|
|
||||||
|
|
||||||
/* Signed 32-bit type */
|
|
||||||
#define TIFF_INT32_T signed int
|
|
||||||
|
|
||||||
/* Signed 64-bit type */
|
|
||||||
#define TIFF_INT64_T signed long long
|
|
||||||
|
|
||||||
/* Signed 8-bit type */
|
|
||||||
#define TIFF_INT8_T signed char
|
|
||||||
|
|
||||||
/* Unsigned 16-bit type */
|
|
||||||
#define TIFF_UINT16_T unsigned short
|
|
||||||
|
|
||||||
/* Unsigned 32-bit type */
|
|
||||||
#define TIFF_UINT32_T unsigned int
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type */
|
|
||||||
#define TIFF_UINT64_T unsigned long long
|
|
||||||
|
|
||||||
/* Unsigned 8-bit type */
|
|
||||||
#define TIFF_UINT8_T unsigned char
|
|
||||||
|
|
||||||
/* Signed size type */
|
|
||||||
#define TIFF_SSIZE_T signed int
|
|
||||||
|
|
||||||
/* Pointer difference type */
|
|
||||||
#define TIFF_PTRDIFF_T ptrdiff_t
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
/* #undef HAVE_INT16 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
/* #undef HAVE_INT32 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
/* #undef HAVE_INT8 */
|
|
||||||
|
|
||||||
/* Compatibility stuff. */
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#define HAVE_IEEEFP 1
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#define HOST_FILLORDER FILLORDER_MSB2LSB
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#define HOST_BIGENDIAN 0
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#define CCITT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
/* #undef JPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support JBIG compression (requires JBIG-KIT library) */
|
|
||||||
/* #undef JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#define LOGLUV_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#define LZW_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#define NEXT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
|
|
||||||
fails with unpatched IJG JPEG library) */
|
|
||||||
/* #undef OJPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#define PACKBITS_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
/* #undef PIXARLOG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#define THUNDER_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
/* #undef ZIP_SUPPORT */
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of ~8Kb to reduce memory usage) */
|
|
||||||
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#define SUBIFD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
|
|
||||||
|
|
||||||
/* Support MS MDI magic number files as TIFF */
|
|
||||||
#define MDI_SUPPORT 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature support definitions.
|
|
||||||
* XXX: These macros are obsoleted. Don't use them in your apps!
|
|
||||||
* Macros stays here for backward compatibility and should be always defined.
|
|
||||||
*/
|
|
||||||
#define COLORIMETRY_SUPPORT
|
|
||||||
#define YCBCR_SUPPORT
|
|
||||||
#define CMYK_SUPPORT
|
|
||||||
#define ICC_SUPPORT
|
|
||||||
#define PHOTOSHOP_SUPPORT
|
|
||||||
#define IPTC_SUPPORT
|
|
||||||
|
|
||||||
#endif /* _TIFFCONF_ */
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */
|
|
||||||
/*
|
|
||||||
Configuration defines for installed libtiff.
|
|
||||||
This file maintained for backward compatibility. Do not use definitions
|
|
||||||
from this file in your programs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFCONF_
|
|
||||||
#define _TIFFCONF_
|
|
||||||
|
|
||||||
/* Signed 16-bit type */
|
|
||||||
#define TIFF_INT16_T signed short
|
|
||||||
|
|
||||||
/* Signed 32-bit type */
|
|
||||||
#define TIFF_INT32_T signed int
|
|
||||||
|
|
||||||
/* Signed 64-bit type */
|
|
||||||
#define TIFF_INT64_T signed long
|
|
||||||
|
|
||||||
/* Signed 8-bit type */
|
|
||||||
#define TIFF_INT8_T signed char
|
|
||||||
|
|
||||||
/* Unsigned 16-bit type */
|
|
||||||
#define TIFF_UINT16_T unsigned short
|
|
||||||
|
|
||||||
/* Unsigned 32-bit type */
|
|
||||||
#define TIFF_UINT32_T unsigned int
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type */
|
|
||||||
#define TIFF_UINT64_T unsigned long
|
|
||||||
|
|
||||||
/* Unsigned 8-bit type */
|
|
||||||
#define TIFF_UINT8_T unsigned char
|
|
||||||
|
|
||||||
/* Signed size type */
|
|
||||||
#define TIFF_SSIZE_T signed long
|
|
||||||
|
|
||||||
/* Pointer difference type */
|
|
||||||
#define TIFF_PTRDIFF_T ptrdiff_t
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
/* #undef HAVE_INT16 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
/* #undef HAVE_INT32 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
/* #undef HAVE_INT8 */
|
|
||||||
|
|
||||||
/* Compatibility stuff. */
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#define HAVE_IEEEFP 1
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#define HOST_FILLORDER FILLORDER_LSB2MSB
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#define HOST_BIGENDIAN 0
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#define CCITT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
/* #undef JPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support JBIG compression (requires JBIG-KIT library) */
|
|
||||||
/* #undef JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#define LOGLUV_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#define LZW_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#define NEXT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
|
|
||||||
fails with unpatched IJG JPEG library) */
|
|
||||||
/* #undef OJPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#define PACKBITS_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
/* #undef PIXARLOG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#define THUNDER_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
/* #undef ZIP_SUPPORT */
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of ~8Kb to reduce memory usage) */
|
|
||||||
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#define SUBIFD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
|
|
||||||
|
|
||||||
/* Support MS MDI magic number files as TIFF */
|
|
||||||
#define MDI_SUPPORT 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature support definitions.
|
|
||||||
* XXX: These macros are obsoleted. Don't use them in your apps!
|
|
||||||
* Macros stays here for backward compatibility and should be always defined.
|
|
||||||
*/
|
|
||||||
#define COLORIMETRY_SUPPORT
|
|
||||||
#define YCBCR_SUPPORT
|
|
||||||
#define CMYK_SUPPORT
|
|
||||||
#define ICC_SUPPORT
|
|
||||||
#define PHOTOSHOP_SUPPORT
|
|
||||||
#define IPTC_SUPPORT
|
|
||||||
|
|
||||||
#endif /* _TIFFCONF_ */
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
#if defined(__LP64__) && __LP64__
|
|
||||||
#include"tiffconf-64.h"
|
|
||||||
#else
|
|
||||||
#include"tiffconf-32.h"
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,557 +0,0 @@
|
||||||
/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFIO_
|
|
||||||
#define _TIFFIO_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF I/O Library Definitions.
|
|
||||||
*/
|
|
||||||
#include "tiff.h"
|
|
||||||
#include "tiffvers.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF is defined as an incomplete type to hide the
|
|
||||||
* library's internal data structures from clients.
|
|
||||||
*/
|
|
||||||
typedef struct tiff TIFF;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following typedefs define the intrinsic size of
|
|
||||||
* data types used in the *exported* interfaces. These
|
|
||||||
* definitions depend on the proper definition of types
|
|
||||||
* in tiff.h. Note also that the varargs interface used
|
|
||||||
* to pass tag types and values uses the types defined in
|
|
||||||
* tiff.h directly.
|
|
||||||
*
|
|
||||||
* NB: ttag_t is unsigned int and not unsigned short because
|
|
||||||
* ANSI C requires that the type before the ellipsis be a
|
|
||||||
* promoted type (i.e. one of int, unsigned int, pointer,
|
|
||||||
* or double) and because we defined pseudo-tags that are
|
|
||||||
* outside the range of legal Aldus-assigned tags.
|
|
||||||
* NB: tsize_t is int32 and not uint32 because some functions
|
|
||||||
* return -1.
|
|
||||||
* NB: toff_t is not off_t for many reasons; TIFFs max out at
|
|
||||||
* 32-bit file offsets, and BigTIFF maxes out at 64-bit
|
|
||||||
* offsets being the most important, and to ensure use of
|
|
||||||
* a consistently unsigned type across architectures.
|
|
||||||
* Prior to libtiff 4.0, this was an unsigned 32 bit type.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* this is the machine addressing size type, only it's signed, so make it
|
|
||||||
* int32 on 32bit machines, int64 on 64bit machines
|
|
||||||
*/
|
|
||||||
typedef TIFF_SSIZE_T tmsize_t;
|
|
||||||
typedef uint64 toff_t; /* file offset */
|
|
||||||
/* the following are deprecated and should be replaced by their defining
|
|
||||||
counterparts */
|
|
||||||
typedef uint32 ttag_t; /* directory tag */
|
|
||||||
typedef uint16 tdir_t; /* directory index */
|
|
||||||
typedef uint16 tsample_t; /* sample number */
|
|
||||||
typedef uint32 tstrile_t; /* strip or tile number */
|
|
||||||
typedef tstrile_t tstrip_t; /* strip number */
|
|
||||||
typedef tstrile_t ttile_t; /* tile number */
|
|
||||||
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
|
||||||
typedef void* tdata_t; /* image data ref */
|
|
||||||
|
|
||||||
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
|
|
||||||
#define __WIN32__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c
|
|
||||||
* or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c).
|
|
||||||
*
|
|
||||||
* By default tif_unix.c is assumed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
|
||||||
# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
|
|
||||||
# define AVOID_WIN32_FILEIO
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_WIN32_FILEIO)
|
|
||||||
# define VC_EXTRALEAN
|
|
||||||
# include <windows.h>
|
|
||||||
# ifdef __WIN32__
|
|
||||||
DECLARE_HANDLE(thandle_t); /* Win32 file handle */
|
|
||||||
# else
|
|
||||||
typedef HFILE thandle_t; /* client data handle */
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
#else
|
|
||||||
typedef void* thandle_t; /* client data handle */
|
|
||||||
#endif /* USE_WIN32_FILEIO */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags to pass to TIFFPrintDirectory to control
|
|
||||||
* printing of data structures that are potentially
|
|
||||||
* very large. Bit-or these flags to enable printing
|
|
||||||
* multiple items.
|
|
||||||
*/
|
|
||||||
#define TIFFPRINT_NONE 0x0 /* no extra info */
|
|
||||||
#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
|
|
||||||
#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
|
|
||||||
#define TIFFPRINT_COLORMAP 0x4 /* colormap */
|
|
||||||
#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
|
|
||||||
#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
|
|
||||||
#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Colour conversion stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* reference white */
|
|
||||||
#define D65_X0 (95.0470F)
|
|
||||||
#define D65_Y0 (100.0F)
|
|
||||||
#define D65_Z0 (108.8827F)
|
|
||||||
|
|
||||||
#define D50_X0 (96.4250F)
|
|
||||||
#define D50_Y0 (100.0F)
|
|
||||||
#define D50_Z0 (82.4680F)
|
|
||||||
|
|
||||||
/* Structure for holding information about a display device. */
|
|
||||||
|
|
||||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
|
||||||
float d_YCR; /* Light o/p for reference white */
|
|
||||||
float d_YCG;
|
|
||||||
float d_YCB;
|
|
||||||
uint32 d_Vrwr; /* Pixel values for ref. white */
|
|
||||||
uint32 d_Vrwg;
|
|
||||||
uint32 d_Vrwb;
|
|
||||||
float d_Y0R; /* Residual light for black pixel */
|
|
||||||
float d_Y0G;
|
|
||||||
float d_Y0B;
|
|
||||||
float d_gammaR; /* Gamma values for the three guns */
|
|
||||||
float d_gammaG;
|
|
||||||
float d_gammaB;
|
|
||||||
} TIFFDisplay;
|
|
||||||
|
|
||||||
typedef struct { /* YCbCr->RGB support */
|
|
||||||
TIFFRGBValue* clamptab; /* range clamping table */
|
|
||||||
int* Cr_r_tab;
|
|
||||||
int* Cb_b_tab;
|
|
||||||
int32* Cr_g_tab;
|
|
||||||
int32* Cb_g_tab;
|
|
||||||
int32* Y_tab;
|
|
||||||
} TIFFYCbCrToRGB;
|
|
||||||
|
|
||||||
typedef struct { /* CIE Lab 1976->RGB support */
|
|
||||||
int range; /* Size of conversion table */
|
|
||||||
#define CIELABTORGB_TABLE_RANGE 1500
|
|
||||||
float rstep, gstep, bstep;
|
|
||||||
float X0, Y0, Z0; /* Reference white point */
|
|
||||||
TIFFDisplay display;
|
|
||||||
float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
|
|
||||||
float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
|
|
||||||
float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
|
|
||||||
} TIFFCIELabToRGB;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RGBA-style image support.
|
|
||||||
*/
|
|
||||||
typedef struct _TIFFRGBAImage TIFFRGBAImage;
|
|
||||||
/*
|
|
||||||
* The image reading and conversion routines invoke
|
|
||||||
* ``put routines'' to copy/image/whatever tiles of
|
|
||||||
* raw image data. A default set of routines are
|
|
||||||
* provided to convert/copy raw image data to 8-bit
|
|
||||||
* packed ABGR format rasters. Applications can supply
|
|
||||||
* alternate routines that unpack the data into a
|
|
||||||
* different format or, for example, unpack the data
|
|
||||||
* and draw the unpacked raster on the display.
|
|
||||||
*/
|
|
||||||
typedef void (*tileContigRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*);
|
|
||||||
typedef void (*tileSeparateRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
|
|
||||||
/*
|
|
||||||
* RGBA-reader state.
|
|
||||||
*/
|
|
||||||
struct _TIFFRGBAImage {
|
|
||||||
TIFF* tif; /* image handle */
|
|
||||||
int stoponerr; /* stop on read error */
|
|
||||||
int isContig; /* data is packed/separate */
|
|
||||||
int alpha; /* type of alpha data present */
|
|
||||||
uint32 width; /* image width */
|
|
||||||
uint32 height; /* image height */
|
|
||||||
uint16 bitspersample; /* image bits/sample */
|
|
||||||
uint16 samplesperpixel; /* image samples/pixel */
|
|
||||||
uint16 orientation; /* image orientation */
|
|
||||||
uint16 req_orientation; /* requested orientation */
|
|
||||||
uint16 photometric; /* image photometric interp */
|
|
||||||
uint16* redcmap; /* colormap pallete */
|
|
||||||
uint16* greencmap;
|
|
||||||
uint16* bluecmap;
|
|
||||||
/* get image data routine */
|
|
||||||
int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
/* put decoded strip/tile */
|
|
||||||
union {
|
|
||||||
void (*any)(TIFFRGBAImage*);
|
|
||||||
tileContigRoutine contig;
|
|
||||||
tileSeparateRoutine separate;
|
|
||||||
} put;
|
|
||||||
TIFFRGBValue* Map; /* sample mapping array */
|
|
||||||
uint32** BWmap; /* black&white map */
|
|
||||||
uint32** PALmap; /* palette image map */
|
|
||||||
TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
|
|
||||||
TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
|
|
||||||
|
|
||||||
uint8* UaToAa; /* Unassociated alpha to associated alpha convertion LUT */
|
|
||||||
uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
|
||||||
|
|
||||||
int row_offset;
|
|
||||||
int col_offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros for extracting components from the
|
|
||||||
* packed ABGR form returned by TIFFReadRGBAImage.
|
|
||||||
*/
|
|
||||||
#define TIFFGetR(abgr) ((abgr) & 0xff)
|
|
||||||
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
|
|
||||||
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
|
|
||||||
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A CODEC is a software package that implements decoding,
|
|
||||||
* encoding, or decoding+encoding of a compression algorithm.
|
|
||||||
* The library provides a collection of builtin codecs.
|
|
||||||
* More codecs may be registered through calls to the library
|
|
||||||
* and/or the builtin implementations may be overridden.
|
|
||||||
*/
|
|
||||||
typedef int (*TIFFInitMethod)(TIFF*, int);
|
|
||||||
typedef struct {
|
|
||||||
char* name;
|
|
||||||
uint16 scheme;
|
|
||||||
TIFFInitMethod init;
|
|
||||||
} TIFFCodec;
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
/* share internal LogLuv conversion routines? */
|
|
||||||
#ifndef LOGLUV_PUBLIC
|
|
||||||
#define LOGLUV_PUBLIC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
|
||||||
# define __attribute__(x) /*nothing*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
|
|
||||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
|
|
||||||
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t);
|
|
||||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
|
||||||
typedef int (*TIFFCloseProc)(thandle_t);
|
|
||||||
typedef toff_t (*TIFFSizeProc)(thandle_t);
|
|
||||||
typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size);
|
|
||||||
typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size);
|
|
||||||
typedef void (*TIFFExtendProc)(TIFF*);
|
|
||||||
|
|
||||||
extern const char* TIFFGetVersion(void);
|
|
||||||
|
|
||||||
extern const TIFFCodec* TIFFFindCODEC(uint16);
|
|
||||||
extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
|
|
||||||
extern void TIFFUnRegisterCODEC(TIFFCodec*);
|
|
||||||
extern int TIFFIsCODECConfigured(uint16);
|
|
||||||
extern TIFFCodec* TIFFGetConfiguredCODECs(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Auxiliary functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void* _TIFFmalloc(tmsize_t s);
|
|
||||||
extern void* _TIFFrealloc(void* p, tmsize_t s);
|
|
||||||
extern void _TIFFmemset(void* p, int v, tmsize_t c);
|
|
||||||
extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c);
|
|
||||||
extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c);
|
|
||||||
extern void _TIFFfree(void* p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Stuff, related to tag handling and creating custom tags.
|
|
||||||
*/
|
|
||||||
extern int TIFFGetTagListCount( TIFF * );
|
|
||||||
extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index );
|
|
||||||
|
|
||||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
|
||||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
|
||||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
|
||||||
#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
|
|
||||||
|
|
||||||
#define FIELD_CUSTOM 65
|
|
||||||
|
|
||||||
typedef struct _TIFFField TIFFField;
|
|
||||||
typedef struct _TIFFFieldArray TIFFFieldArray;
|
|
||||||
|
|
||||||
extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType);
|
|
||||||
extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32);
|
|
||||||
extern const TIFFField* TIFFFieldWithName(TIFF*, const char *);
|
|
||||||
|
|
||||||
extern uint32 TIFFFieldTag(const TIFFField*);
|
|
||||||
extern const char* TIFFFieldName(const TIFFField*);
|
|
||||||
extern TIFFDataType TIFFFieldDataType(const TIFFField*);
|
|
||||||
extern int TIFFFieldPassCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldReadCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldWriteCount(const TIFFField*);
|
|
||||||
|
|
||||||
typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
|
||||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
|
||||||
TIFFPrintMethod printdir; /* directory print routine */
|
|
||||||
} TIFFTagMethods;
|
|
||||||
|
|
||||||
extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
|
|
||||||
extern void *TIFFGetClientInfo(TIFF *, const char *);
|
|
||||||
extern void TIFFSetClientInfo(TIFF *, void *, const char *);
|
|
||||||
|
|
||||||
extern void TIFFCleanup(TIFF* tif);
|
|
||||||
extern void TIFFClose(TIFF* tif);
|
|
||||||
extern int TIFFFlush(TIFF* tif);
|
|
||||||
extern int TIFFFlushData(TIFF* tif);
|
|
||||||
extern int TIFFGetField(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFReadDirectory(TIFF* tif);
|
|
||||||
extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
|
|
||||||
extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff);
|
|
||||||
extern uint64 TIFFScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRasterScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFRasterScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFStripSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFStripSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip);
|
|
||||||
extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip);
|
|
||||||
extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint64 TIFFTileRowSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileRowSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFTileSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request);
|
|
||||||
extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
|
|
||||||
extern int TIFFFileno(TIFF*);
|
|
||||||
extern int TIFFSetFileno(TIFF*, int);
|
|
||||||
extern thandle_t TIFFClientdata(TIFF*);
|
|
||||||
extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
|
|
||||||
extern int TIFFGetMode(TIFF*);
|
|
||||||
extern int TIFFSetMode(TIFF*, int);
|
|
||||||
extern int TIFFIsTiled(TIFF*);
|
|
||||||
extern int TIFFIsByteSwapped(TIFF*);
|
|
||||||
extern int TIFFIsUpSampled(TIFF*);
|
|
||||||
extern int TIFFIsMSB2LSB(TIFF*);
|
|
||||||
extern int TIFFIsBigEndian(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
|
|
||||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
|
|
||||||
extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
|
|
||||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
|
|
||||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
|
|
||||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentRow(TIFF*);
|
|
||||||
extern uint16 TIFFCurrentDirectory(TIFF*);
|
|
||||||
extern uint16 TIFFNumberOfDirectories(TIFF*);
|
|
||||||
extern uint64 TIFFCurrentDirOffset(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentStrip(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentTile(TIFF* tif);
|
|
||||||
extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFSetupStrips(TIFF *);
|
|
||||||
extern int TIFFWriteCheck(TIFF*, int, const char *);
|
|
||||||
extern void TIFFFreeDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
|
|
||||||
extern int TIFFCreateEXIFDirectory(TIFF*);
|
|
||||||
extern int TIFFLastDirectory(TIFF*);
|
|
||||||
extern int TIFFSetDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetSubDirectory(TIFF*, uint64);
|
|
||||||
extern int TIFFUnlinkDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetField(TIFF*, uint32, ...);
|
|
||||||
extern int TIFFVSetField(TIFF*, uint32, va_list);
|
|
||||||
extern int TIFFUnsetField(TIFF*, uint32);
|
|
||||||
extern int TIFFWriteDirectory(TIFF *);
|
|
||||||
extern int TIFFWriteCustomDirectory(TIFF *, uint64 *);
|
|
||||||
extern int TIFFCheckpointDirectory(TIFF *);
|
|
||||||
extern int TIFFRewriteDirectory(TIFF *);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
|
|
||||||
int = ORIENTATION_BOTLEFT, int = 0);
|
|
||||||
#else
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * );
|
|
||||||
extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
|
|
||||||
extern int TIFFRGBAImageOK(TIFF*, char [1024]);
|
|
||||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
|
|
||||||
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
|
|
||||||
extern TIFF* TIFFOpen(const char*, const char*);
|
|
||||||
# ifdef __WIN32__
|
|
||||||
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
extern TIFF* TIFFFdOpen(int, const char*, const char*);
|
|
||||||
extern TIFF* TIFFClientOpen(const char*, const char*,
|
|
||||||
thandle_t,
|
|
||||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
|
||||||
TIFFSeekProc, TIFFCloseProc,
|
|
||||||
TIFFSizeProc,
|
|
||||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
|
||||||
extern const char* TIFFFileName(TIFF*);
|
|
||||||
extern const char* TIFFSetFileName(TIFF*, const char *);
|
|
||||||
extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
|
||||||
extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFNumberOfTiles(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16);
|
|
||||||
extern uint32 TIFFNumberOfStrips(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
|
|
||||||
extern void TIFFSetWriteOffset(TIFF* tif, toff_t off);
|
|
||||||
extern void TIFFSwabShort(uint16*);
|
|
||||||
extern void TIFFSwabLong(uint32*);
|
|
||||||
extern void TIFFSwabLong8(uint64*);
|
|
||||||
extern void TIFFSwabFloat(float*);
|
|
||||||
extern void TIFFSwabDouble(double*);
|
|
||||||
extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n);
|
|
||||||
extern void TIFFReverseBits(uint8* cp, tmsize_t n);
|
|
||||||
extern const unsigned char* TIFFGetBitRevTable(int);
|
|
||||||
|
|
||||||
#ifdef LOGLUV_PUBLIC
|
|
||||||
#define U_NEU 0.210526316
|
|
||||||
#define V_NEU 0.473684211
|
|
||||||
#define UVSCALE 410.
|
|
||||||
extern double LogL16toY(int);
|
|
||||||
extern double LogL10toY(int);
|
|
||||||
extern void XYZtoRGB24(float*, uint8*);
|
|
||||||
extern int uv_decode(double*, double*, int);
|
|
||||||
extern void LogLuv24toXYZ(uint32, float*);
|
|
||||||
extern void LogLuv32toXYZ(uint32, float*);
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
#else
|
|
||||||
extern int LogL16fromY(double, int);
|
|
||||||
extern int LogL10fromY(double, int);
|
|
||||||
extern int uv_encode(double, double, int);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int);
|
|
||||||
#endif
|
|
||||||
#endif /* LOGLUV_PUBLIC */
|
|
||||||
|
|
||||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*);
|
|
||||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
|
|
||||||
float *, float *, float *);
|
|
||||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
|
|
||||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* O B S O L E T E D I N T E R F A C E S
|
|
||||||
*
|
|
||||||
* Don't use this stuff in your applications, it may be removed in the future
|
|
||||||
* libtiff versions.
|
|
||||||
****************************************************************************/
|
|
||||||
typedef struct {
|
|
||||||
ttag_t field_tag; /* field's tag */
|
|
||||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
|
||||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
|
||||||
TIFFDataType field_type; /* type of associated data */
|
|
||||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
|
||||||
unsigned char field_oktochange; /* if true, can change while writing */
|
|
||||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
|
||||||
char *field_name; /* ASCII name */
|
|
||||||
} TIFFFieldInfo;
|
|
||||||
|
|
||||||
extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _TIFFIO_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.3\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
|
|
||||||
/*
|
|
||||||
* This define can be used in code that requires
|
|
||||||
* compilation-related definitions specific to a
|
|
||||||
* version or versions of the library. Runtime
|
|
||||||
* version checking should be done based on the
|
|
||||||
* string returned by TIFFGetVersion.
|
|
||||||
*/
|
|
||||||
#define TIFFLIB_VERSION 20120922
|
|
||||||
Binary file not shown.
|
|
@ -35,11 +35,6 @@ set_target_properties(ssl PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libssl.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libssl.a
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(tiff STATIC IMPORTED GLOBAL)
|
|
||||||
set_target_properties(tiff PROPERTIES
|
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libtiff.a
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(uv STATIC IMPORTED GLOBAL)
|
add_library(uv STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(uv PROPERTIES
|
set_target_properties(uv PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libuv_a.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libuv_a.a
|
||||||
|
|
@ -74,17 +69,6 @@ set_target_properties(inspector PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libinspector.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libinspector.a
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(js_static STATIC IMPORTED GLOBAL)
|
|
||||||
set_target_properties(js_static PROPERTIES
|
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libjs_static.a
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/include/spidermonkey
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(mozglue STATIC IMPORTED GLOBAL)
|
|
||||||
set_target_properties(mozglue PROPERTIES
|
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libmozglue.a
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(EGL SHARED IMPORTED GLOBAL)
|
add_library(EGL SHARED IMPORTED GLOBAL)
|
||||||
set_target_properties(EGL PROPERTIES
|
set_target_properties(EGL PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libEGL.dylib
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libEGL.dylib
|
||||||
|
|
@ -107,31 +91,12 @@ if(USE_SE_V8)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(USE_SE_SM)
|
|
||||||
list(APPEND se_libs_name
|
|
||||||
js_static
|
|
||||||
mozglue
|
|
||||||
)
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(USE_SE_JSC)
|
|
||||||
find_library(JAVASCRIPT_CORE_LIBRARY JavaScriptCore REQUIRED)
|
|
||||||
set(se_libs_name ${JAVASCRIPT_CORE_LIBRARY})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# if(USE_SOCKETS)
|
# if(USE_SOCKETS)
|
||||||
# list(APPEND CC_EXTERNAL_LIBS
|
# list(APPEND CC_EXTERNAL_LIBS
|
||||||
# websockets
|
# websockets
|
||||||
# )
|
# )
|
||||||
# endif()
|
# endif()
|
||||||
|
|
||||||
if(USE_TIFF)
|
|
||||||
list(APPEND CC_EXTERNAL_LIBS
|
|
||||||
tiff
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_library(glslang STATIC IMPORTED GLOBAL)
|
add_library(glslang STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(glslang PROPERTIES
|
set_target_properties(glslang PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libglslang.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libglslang.a
|
||||||
|
|
|
||||||
|
|
@ -1,681 +0,0 @@
|
||||||
/* $Id: tiff.h,v 1.69 2014-04-02 17:23:06 fwarmerdam Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFF_
|
|
||||||
#define _TIFF_
|
|
||||||
|
|
||||||
#include "tiffconf.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag Image File Format (TIFF)
|
|
||||||
*
|
|
||||||
* Based on Rev 6.0 from:
|
|
||||||
* Developer's Desk
|
|
||||||
* Aldus Corporation
|
|
||||||
* 411 First Ave. South
|
|
||||||
* Suite 200
|
|
||||||
* Seattle, WA 98104
|
|
||||||
* 206-622-5500
|
|
||||||
*
|
|
||||||
* (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf)
|
|
||||||
*
|
|
||||||
* For BigTIFF design notes see the following links
|
|
||||||
* http://www.remotesensing.org/libtiff/bigtiffdesign.html
|
|
||||||
* http://www.awaresystems.be/imaging/tiff/bigtiff.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TIFF_VERSION_CLASSIC 42
|
|
||||||
#define TIFF_VERSION_BIG 43
|
|
||||||
|
|
||||||
#define TIFF_BIGENDIAN 0x4d4d
|
|
||||||
#define TIFF_LITTLEENDIAN 0x4949
|
|
||||||
#define MDI_LITTLEENDIAN 0x5045
|
|
||||||
#define MDI_BIGENDIAN 0x4550
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Intrinsic data types required by the file format:
|
|
||||||
*
|
|
||||||
* 8-bit quantities int8/uint8
|
|
||||||
* 16-bit quantities int16/uint16
|
|
||||||
* 32-bit quantities int32/uint32
|
|
||||||
* 64-bit quantities int64/uint64
|
|
||||||
* strings unsigned char*
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef TIFF_INT8_T int8;
|
|
||||||
typedef TIFF_UINT8_T uint8;
|
|
||||||
|
|
||||||
typedef TIFF_INT16_T int16;
|
|
||||||
typedef TIFF_UINT16_T uint16;
|
|
||||||
|
|
||||||
typedef TIFF_INT32_T int32;
|
|
||||||
typedef TIFF_UINT32_T uint32;
|
|
||||||
|
|
||||||
typedef TIFF_INT64_T int64;
|
|
||||||
typedef TIFF_UINT64_T uint64;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some types as promoted in a variable argument list
|
|
||||||
* We use uint16_vap rather then directly using int, because this way
|
|
||||||
* we document the type we actually want to pass through, conceptually,
|
|
||||||
* rather then confusing the issue by merely stating the type it gets
|
|
||||||
* promoted to
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef int uint16_vap;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF header.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
} TIFFHeaderCommon;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint32 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderClassic;
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
uint16 tiff_offsetsize; /* size of offsets, should be 8 */
|
|
||||||
uint16 tiff_unused; /* unused word, should be 0 */
|
|
||||||
uint64 tiff_diroff; /* byte offset to first directory */
|
|
||||||
} TIFFHeaderBig;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NB: In the comments below,
|
|
||||||
* - items marked with a + are obsoleted by revision 5.0,
|
|
||||||
* - items marked with a ! are introduced in revision 6.0.
|
|
||||||
* - items marked with a % are introduced post revision 6.0.
|
|
||||||
* - items marked with a $ are obsoleted by revision 6.0.
|
|
||||||
* - items marked with a & are introduced by Adobe DNG specification.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag data type information.
|
|
||||||
*
|
|
||||||
* Note: RATIONALs are the ratio of two 32-bit integer values.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
TIFF_NOTYPE = 0, /* placeholder */
|
|
||||||
TIFF_BYTE = 1, /* 8-bit unsigned integer */
|
|
||||||
TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
|
|
||||||
TIFF_SHORT = 3, /* 16-bit unsigned integer */
|
|
||||||
TIFF_LONG = 4, /* 32-bit unsigned integer */
|
|
||||||
TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
|
|
||||||
TIFF_SBYTE = 6, /* !8-bit signed integer */
|
|
||||||
TIFF_UNDEFINED = 7, /* !8-bit untyped data */
|
|
||||||
TIFF_SSHORT = 8, /* !16-bit signed integer */
|
|
||||||
TIFF_SLONG = 9, /* !32-bit signed integer */
|
|
||||||
TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
|
|
||||||
TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
|
|
||||||
TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
|
|
||||||
TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */
|
|
||||||
TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */
|
|
||||||
TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */
|
|
||||||
TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */
|
|
||||||
} TIFFDataType;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Tag Definitions.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
|
|
||||||
#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
|
|
||||||
#define FILETYPE_PAGE 0x2 /* one page of many */
|
|
||||||
#define FILETYPE_MASK 0x4 /* transparency mask */
|
|
||||||
#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
|
|
||||||
#define OFILETYPE_IMAGE 1 /* full resolution image data */
|
|
||||||
#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
|
|
||||||
#define OFILETYPE_PAGE 3 /* one page of many */
|
|
||||||
#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
|
|
||||||
#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
|
|
||||||
#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
|
|
||||||
#define TIFFTAG_COMPRESSION 259 /* data compression technique */
|
|
||||||
#define COMPRESSION_NONE 1 /* dump mode */
|
|
||||||
#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
|
|
||||||
#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
|
|
||||||
#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
|
|
||||||
#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
|
|
||||||
#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */
|
|
||||||
#define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */
|
|
||||||
#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
|
|
||||||
#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
|
|
||||||
#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
|
|
||||||
#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
|
|
||||||
/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
|
|
||||||
#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
|
|
||||||
#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
|
|
||||||
#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
|
|
||||||
/* compression codes 32908-32911 are reserved for Pixar */
|
|
||||||
#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
|
|
||||||
#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
|
|
||||||
#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
|
|
||||||
#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression,
|
|
||||||
as recognized by Adobe */
|
|
||||||
/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
|
|
||||||
#define COMPRESSION_JBIG 34661 /* ISO JBIG */
|
|
||||||
#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
|
|
||||||
#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
|
|
||||||
#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
|
|
||||||
#define COMPRESSION_LZMA 34925 /* LZMA2 */
|
|
||||||
#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
|
|
||||||
#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
|
|
||||||
#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
|
|
||||||
#define PHOTOMETRIC_RGB 2 /* RGB color model */
|
|
||||||
#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
|
|
||||||
#define PHOTOMETRIC_MASK 4 /* $holdout mask */
|
|
||||||
#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
|
|
||||||
#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
|
|
||||||
#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
|
|
||||||
#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
|
|
||||||
#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
|
|
||||||
#define PHOTOMETRIC_CFA 32803 /* color filter array */
|
|
||||||
#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
|
|
||||||
#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
|
|
||||||
#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
|
|
||||||
#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
|
|
||||||
#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
|
|
||||||
#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
|
|
||||||
#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
|
|
||||||
#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
|
|
||||||
#define TIFFTAG_FILLORDER 266 /* data order within a byte */
|
|
||||||
#define FILLORDER_MSB2LSB 1 /* most significant -> least */
|
|
||||||
#define FILLORDER_LSB2MSB 2 /* least significant -> most */
|
|
||||||
#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
|
|
||||||
#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
|
|
||||||
#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
|
|
||||||
#define TIFFTAG_MODEL 272 /* scanner model name/number */
|
|
||||||
#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
|
|
||||||
#define TIFFTAG_ORIENTATION 274 /* +image orientation */
|
|
||||||
#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
|
|
||||||
#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
|
|
||||||
#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
|
|
||||||
#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
|
|
||||||
#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
|
|
||||||
#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
|
|
||||||
#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
|
|
||||||
#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
|
|
||||||
#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
|
|
||||||
#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
|
|
||||||
#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
|
|
||||||
#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
|
|
||||||
#define PLANARCONFIG_CONTIG 1 /* single image plane */
|
|
||||||
#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
|
|
||||||
#define TIFFTAG_PAGENAME 285 /* page name image is from */
|
|
||||||
#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
|
|
||||||
#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
|
|
||||||
#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
|
|
||||||
#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
|
|
||||||
#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
|
|
||||||
#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
|
|
||||||
#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
|
|
||||||
#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
|
|
||||||
#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
|
|
||||||
#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
|
|
||||||
#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
|
|
||||||
#define RESUNIT_NONE 1 /* no meaningful units */
|
|
||||||
#define RESUNIT_INCH 2 /* english */
|
|
||||||
#define RESUNIT_CENTIMETER 3 /* metric */
|
|
||||||
#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
|
|
||||||
#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
|
|
||||||
#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_SOFTWARE 305 /* name & release */
|
|
||||||
#define TIFFTAG_DATETIME 306 /* creation date and time */
|
|
||||||
#define TIFFTAG_ARTIST 315 /* creator of image */
|
|
||||||
#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
|
|
||||||
#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
|
|
||||||
#define PREDICTOR_NONE 1 /* no prediction scheme used */
|
|
||||||
#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */
|
|
||||||
#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */
|
|
||||||
#define TIFFTAG_WHITEPOINT 318 /* image white point */
|
|
||||||
#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
|
|
||||||
#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */
|
|
||||||
#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
|
|
||||||
#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */
|
|
||||||
#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */
|
|
||||||
#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
|
|
||||||
#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
|
|
||||||
#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
|
|
||||||
#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
|
|
||||||
#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
|
|
||||||
#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
|
|
||||||
#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
|
|
||||||
#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
|
|
||||||
#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
|
|
||||||
#define TIFFTAG_INKSET 332 /* !inks in separated image */
|
|
||||||
#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
|
|
||||||
#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
|
|
||||||
#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
|
|
||||||
#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
|
|
||||||
#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
|
|
||||||
#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
|
|
||||||
#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
|
|
||||||
#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
|
|
||||||
#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
|
|
||||||
#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
|
|
||||||
#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
|
|
||||||
#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
|
|
||||||
#define SAMPLEFORMAT_INT 2 /* !signed integer data */
|
|
||||||
#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
|
|
||||||
#define SAMPLEFORMAT_VOID 4 /* !untyped data */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
|
|
||||||
#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
|
|
||||||
#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
|
|
||||||
#define TIFFTAG_CLIPPATH 343 /* %ClipPath
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_INDEXED 346 /* %Indexed
|
|
||||||
[Adobe TIFF Technote 3] */
|
|
||||||
#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
|
|
||||||
#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
|
|
||||||
/* Tags 400-435 are from the TIFF/FX spec */
|
|
||||||
#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */
|
|
||||||
#define TIFFTAG_PROFILETYPE 401 /* ! */
|
|
||||||
#define PROFILETYPE_UNSPECIFIED 0 /* ! */
|
|
||||||
#define PROFILETYPE_G3_FAX 1 /* ! */
|
|
||||||
#define TIFFTAG_FAXPROFILE 402 /* ! */
|
|
||||||
#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */
|
|
||||||
#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */
|
|
||||||
#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */
|
|
||||||
#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */
|
|
||||||
#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */
|
|
||||||
#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */
|
|
||||||
#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */
|
|
||||||
#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */
|
|
||||||
#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */
|
|
||||||
#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */
|
|
||||||
#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */
|
|
||||||
#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */
|
|
||||||
#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */
|
|
||||||
#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */
|
|
||||||
#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */
|
|
||||||
#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */
|
|
||||||
#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */
|
|
||||||
#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */
|
|
||||||
/*
|
|
||||||
* Tags 512-521 are obsoleted by Technical Note #2 which specifies a
|
|
||||||
* revised JPEG-in-TIFF scheme.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
|
|
||||||
#define JPEGPROC_BASELINE 1 /* !baseline sequential */
|
|
||||||
#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
|
|
||||||
#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
|
|
||||||
#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
|
|
||||||
#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
|
|
||||||
#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
|
|
||||||
#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
|
|
||||||
#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */
|
|
||||||
#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
|
|
||||||
#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
|
|
||||||
#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
|
|
||||||
#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
|
|
||||||
#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
|
|
||||||
#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
|
|
||||||
#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
|
|
||||||
#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
|
|
||||||
#define TIFFTAG_XMLPACKET 700 /* %XML packet
|
|
||||||
[Adobe XMP Specification,
|
|
||||||
January 2004 */
|
|
||||||
#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID
|
|
||||||
[Adobe TIFF technote] */
|
|
||||||
/* tags 32952-32956 are private tags registered to Island Graphics */
|
|
||||||
#define TIFFTAG_REFPTS 32953 /* image reference points */
|
|
||||||
#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
|
|
||||||
#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
|
|
||||||
#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
|
|
||||||
/* tags 32995-32999 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
|
|
||||||
#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
|
|
||||||
#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
|
|
||||||
#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
|
|
||||||
/* tags 33300-33309 are private tags registered to Pixar */
|
|
||||||
/*
|
|
||||||
* TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
|
|
||||||
* are set when an image has been cropped out of a larger image.
|
|
||||||
* They reflect the size of the original uncropped image.
|
|
||||||
* The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
|
|
||||||
* to determine the position of the smaller image in the larger one.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
|
|
||||||
/* Tags 33302-33306 are used to identify special image modes and data
|
|
||||||
* used by Pixar's texture formats.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
|
|
||||||
#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
|
|
||||||
#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
|
|
||||||
/* tag 33405 is a private tag registered to Eastman Kodak */
|
|
||||||
#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
|
|
||||||
#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
|
|
||||||
#define TIFFTAG_CFAPATTERN 33422 /* color filter array pattern */
|
|
||||||
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
|
|
||||||
#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
|
|
||||||
/* IPTC TAG from RichTIFF specifications */
|
|
||||||
#define TIFFTAG_RICHTIFFIPTC 33723
|
|
||||||
/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
|
|
||||||
#define TIFFTAG_IT8SITE 34016 /* site name */
|
|
||||||
#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
|
|
||||||
#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
|
|
||||||
#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
|
|
||||||
#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
|
|
||||||
#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
|
|
||||||
#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
|
|
||||||
#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
|
|
||||||
#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
|
|
||||||
#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
|
|
||||||
#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
|
|
||||||
#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator
|
|
||||||
(untrapped=0, trapped=1) */
|
|
||||||
#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
|
|
||||||
/* tags 34232-34236 are private tags registered to Texas Instruments */
|
|
||||||
#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
|
|
||||||
/* tag 34377 is private tag registered to Adobe for PhotoShop */
|
|
||||||
#define TIFFTAG_PHOTOSHOP 34377
|
|
||||||
/* tags 34665, 34853 and 40965 are documented in EXIF specification */
|
|
||||||
#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */
|
|
||||||
/* tag 34750 is a private tag registered to Adobe? */
|
|
||||||
#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
|
|
||||||
#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
|
|
||||||
/* tag 34750 is a private tag registered to Pixel Magic */
|
|
||||||
#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
|
|
||||||
#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
|
|
||||||
/* tags 34908-34914 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
|
|
||||||
#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
|
|
||||||
#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
|
|
||||||
#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
|
|
||||||
/* tags 37439-37443 are registered to SGI <gregl@sgi.com> */
|
|
||||||
#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
|
|
||||||
/* tag 34929 is a private tag registered to FedEx */
|
|
||||||
#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
|
|
||||||
#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */
|
|
||||||
/* Adobe Digital Negative (DNG) format tags */
|
|
||||||
#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
|
|
||||||
#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
|
|
||||||
#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
|
|
||||||
#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model
|
|
||||||
name */
|
|
||||||
#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space
|
|
||||||
mapping */
|
|
||||||
#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
|
|
||||||
#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
|
|
||||||
#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for
|
|
||||||
the BlackLevel tag */
|
|
||||||
#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level
|
|
||||||
differences (columns) */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level
|
|
||||||
differences (rows) */
|
|
||||||
#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding
|
|
||||||
level */
|
|
||||||
#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
|
|
||||||
#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space
|
|
||||||
transformation matrix 1 */
|
|
||||||
#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space
|
|
||||||
transformation matrix 2 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction
|
|
||||||
matrix 1 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction
|
|
||||||
matrix 2 */
|
|
||||||
#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw
|
|
||||||
values*/
|
|
||||||
#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in
|
|
||||||
linear reference space */
|
|
||||||
#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in
|
|
||||||
x-y chromaticity
|
|
||||||
coordinates */
|
|
||||||
#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero
|
|
||||||
point */
|
|
||||||
#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
|
|
||||||
#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of
|
|
||||||
sharpening */
|
|
||||||
#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of
|
|
||||||
the green pixels in the
|
|
||||||
blue/green rows track the
|
|
||||||
values of the green pixels
|
|
||||||
in the red/green rows */
|
|
||||||
#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
|
|
||||||
#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
|
|
||||||
#define TIFFTAG_LENSINFO 50736 /* info about the lens */
|
|
||||||
#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
|
|
||||||
#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the
|
|
||||||
camera's anti-alias filter */
|
|
||||||
#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
|
|
||||||
#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
|
|
||||||
#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote
|
|
||||||
tag is safe to preserve
|
|
||||||
along with the rest of the
|
|
||||||
EXIF data */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
|
|
||||||
#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
|
|
||||||
#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for
|
|
||||||
the raw image data */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels
|
|
||||||
of the sensor */
|
|
||||||
#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates
|
|
||||||
of fully masked pixels */
|
|
||||||
#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
|
|
||||||
#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space
|
|
||||||
into ICC profile space */
|
|
||||||
#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
|
|
||||||
#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
|
|
||||||
/* tag 65535 is an undefined tag used by Eastman Kodak */
|
|
||||||
#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following are ``pseudo tags'' that can be used to control
|
|
||||||
* codec-specific functionality. These tags are not written to file.
|
|
||||||
* Note that these values start at 0xffff+1 so that they'll never
|
|
||||||
* collide with Aldus-assigned tags.
|
|
||||||
*
|
|
||||||
* If you want your private pseudo tags ``registered'' (i.e. added to
|
|
||||||
* this file), please post a bug report via the tracking system at
|
|
||||||
* http://www.remotesensing.org/libtiff/bugs.html with the appropriate
|
|
||||||
* C definitions to add.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
|
|
||||||
#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
|
|
||||||
#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
|
|
||||||
#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
|
|
||||||
#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
|
|
||||||
#define FAXMODE_WORDALIGN 0x0008 /* word align row */
|
|
||||||
#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
|
|
||||||
#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
|
|
||||||
/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */
|
|
||||||
#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
|
|
||||||
#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
|
|
||||||
#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
|
|
||||||
#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
|
|
||||||
#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
|
|
||||||
#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
|
|
||||||
/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
|
|
||||||
#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
|
|
||||||
#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
|
|
||||||
#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
|
|
||||||
#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
|
|
||||||
#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
|
|
||||||
#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
|
|
||||||
#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
|
|
||||||
#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
|
|
||||||
/* 65550-65556 are allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
|
|
||||||
#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
|
|
||||||
#define DCSIMAGERFILTER_IR 0 /* infrared filter */
|
|
||||||
#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
|
|
||||||
#define DCSIMAGERFILTER_CFA 2 /* color filter array */
|
|
||||||
#define DCSIMAGERFILTER_OTHER 3 /* other filter */
|
|
||||||
#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
|
|
||||||
#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
|
|
||||||
#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
|
|
||||||
#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
|
|
||||||
#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
|
|
||||||
#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
|
|
||||||
#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
|
|
||||||
#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
|
|
||||||
/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
|
|
||||||
#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
|
|
||||||
#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
|
|
||||||
/* 65559 is allocated to Oceana Matrix <dev@oceana.com> */
|
|
||||||
#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
|
|
||||||
#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
|
|
||||||
#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
|
|
||||||
#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
|
|
||||||
#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
|
|
||||||
#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
|
|
||||||
#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
|
|
||||||
#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
|
|
||||||
#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
|
|
||||||
#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */
|
|
||||||
#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */
|
|
||||||
#define PERSAMPLE_MERGED 0 /* present as a single value */
|
|
||||||
#define PERSAMPLE_MULTI 1 /* present as multiple values */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXIF tags
|
|
||||||
*/
|
|
||||||
#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */
|
|
||||||
#define EXIFTAG_FNUMBER 33437 /* F number */
|
|
||||||
#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
|
|
||||||
#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
|
||||||
#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
|
||||||
#define EXIFTAG_OECF 34856 /* Optoelectric conversion
|
|
||||||
factor */
|
|
||||||
#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
|
|
||||||
#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
|
|
||||||
#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
|
||||||
#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
|
||||||
#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */
|
|
||||||
#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */
|
|
||||||
#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */
|
|
||||||
#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */
|
|
||||||
#define EXIFTAG_METERINGMODE 37383 /* Metering mode */
|
|
||||||
#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */
|
|
||||||
#define EXIFTAG_FLASH 37385 /* Flash */
|
|
||||||
#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */
|
|
||||||
#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */
|
|
||||||
#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */
|
|
||||||
#define EXIFTAG_USERCOMMENT 37510 /* User comments */
|
|
||||||
#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */
|
|
||||||
#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */
|
|
||||||
#define EXIFTAG_COLORSPACE 40961 /* Color space information */
|
|
||||||
#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */
|
|
||||||
#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */
|
|
||||||
#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */
|
|
||||||
#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */
|
|
||||||
#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */
|
|
||||||
#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */
|
|
||||||
#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */
|
|
||||||
#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */
|
|
||||||
#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */
|
|
||||||
#define EXIFTAG_FILESOURCE 41728 /* File source */
|
|
||||||
#define EXIFTAG_SCENETYPE 41729 /* Scene type */
|
|
||||||
#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */
|
|
||||||
#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */
|
|
||||||
#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */
|
|
||||||
#define EXIFTAG_WHITEBALANCE 41987 /* White balance */
|
|
||||||
#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */
|
|
||||||
#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */
|
|
||||||
#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_CONTRAST 41992 /* Contrast */
|
|
||||||
#define EXIFTAG_SATURATION 41993 /* Saturation */
|
|
||||||
#define EXIFTAG_SHARPNESS 41994 /* Sharpness */
|
|
||||||
#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */
|
|
||||||
|
|
||||||
#endif /* _TIFF_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */
|
|
||||||
/*
|
|
||||||
Configuration defines for installed libtiff.
|
|
||||||
This file maintained for backward compatibility. Do not use definitions
|
|
||||||
from this file in your programs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFCONF_
|
|
||||||
#define _TIFFCONF_
|
|
||||||
|
|
||||||
/* Signed 16-bit type */
|
|
||||||
#define TIFF_INT16_T signed short
|
|
||||||
|
|
||||||
/* Signed 32-bit type */
|
|
||||||
#define TIFF_INT32_T signed int
|
|
||||||
|
|
||||||
/* Signed 64-bit type */
|
|
||||||
#define TIFF_INT64_T signed long
|
|
||||||
|
|
||||||
/* Signed 8-bit type */
|
|
||||||
#define TIFF_INT8_T signed char
|
|
||||||
|
|
||||||
/* Unsigned 16-bit type */
|
|
||||||
#define TIFF_UINT16_T unsigned short
|
|
||||||
|
|
||||||
/* Unsigned 32-bit type */
|
|
||||||
#define TIFF_UINT32_T unsigned int
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type */
|
|
||||||
#define TIFF_UINT64_T unsigned long
|
|
||||||
|
|
||||||
/* Unsigned 8-bit type */
|
|
||||||
#define TIFF_UINT8_T unsigned char
|
|
||||||
|
|
||||||
/* Signed size type */
|
|
||||||
#define TIFF_SSIZE_T signed long
|
|
||||||
|
|
||||||
/* Pointer difference type */
|
|
||||||
#define TIFF_PTRDIFF_T ptrdiff_t
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
/* #undef HAVE_INT16 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
/* #undef HAVE_INT32 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
/* #undef HAVE_INT8 */
|
|
||||||
|
|
||||||
/* Compatibility stuff. */
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#define HAVE_IEEEFP 1
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#define HOST_FILLORDER FILLORDER_LSB2MSB
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#define HOST_BIGENDIAN 0
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#define CCITT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
/* #undef JPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support JBIG compression (requires JBIG-KIT library) */
|
|
||||||
/* #undef JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#define LOGLUV_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#define LZW_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#define NEXT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
|
|
||||||
fails with unpatched IJG JPEG library) */
|
|
||||||
/* #undef OJPEG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#define PACKBITS_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
/* #undef PIXARLOG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#define THUNDER_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
/* #undef ZIP_SUPPORT */
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of ~8Kb to reduce memory usage) */
|
|
||||||
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#define SUBIFD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
|
|
||||||
|
|
||||||
/* Support MS MDI magic number files as TIFF */
|
|
||||||
#define MDI_SUPPORT 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature support definitions.
|
|
||||||
* XXX: These macros are obsoleted. Don't use them in your apps!
|
|
||||||
* Macros stays here for backward compatibility and should be always defined.
|
|
||||||
*/
|
|
||||||
#define COLORIMETRY_SUPPORT
|
|
||||||
#define YCBCR_SUPPORT
|
|
||||||
#define CMYK_SUPPORT
|
|
||||||
#define ICC_SUPPORT
|
|
||||||
#define PHOTOSHOP_SUPPORT
|
|
||||||
#define IPTC_SUPPORT
|
|
||||||
|
|
||||||
#endif /* _TIFFCONF_ */
|
|
||||||
|
|
@ -1,557 +0,0 @@
|
||||||
/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFIO_
|
|
||||||
#define _TIFFIO_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF I/O Library Definitions.
|
|
||||||
*/
|
|
||||||
#include "tiff.h"
|
|
||||||
#include "tiffvers.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF is defined as an incomplete type to hide the
|
|
||||||
* library's internal data structures from clients.
|
|
||||||
*/
|
|
||||||
typedef struct tiff TIFF;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following typedefs define the intrinsic size of
|
|
||||||
* data types used in the *exported* interfaces. These
|
|
||||||
* definitions depend on the proper definition of types
|
|
||||||
* in tiff.h. Note also that the varargs interface used
|
|
||||||
* to pass tag types and values uses the types defined in
|
|
||||||
* tiff.h directly.
|
|
||||||
*
|
|
||||||
* NB: ttag_t is unsigned int and not unsigned short because
|
|
||||||
* ANSI C requires that the type before the ellipsis be a
|
|
||||||
* promoted type (i.e. one of int, unsigned int, pointer,
|
|
||||||
* or double) and because we defined pseudo-tags that are
|
|
||||||
* outside the range of legal Aldus-assigned tags.
|
|
||||||
* NB: tsize_t is int32 and not uint32 because some functions
|
|
||||||
* return -1.
|
|
||||||
* NB: toff_t is not off_t for many reasons; TIFFs max out at
|
|
||||||
* 32-bit file offsets, and BigTIFF maxes out at 64-bit
|
|
||||||
* offsets being the most important, and to ensure use of
|
|
||||||
* a consistently unsigned type across architectures.
|
|
||||||
* Prior to libtiff 4.0, this was an unsigned 32 bit type.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* this is the machine addressing size type, only it's signed, so make it
|
|
||||||
* int32 on 32bit machines, int64 on 64bit machines
|
|
||||||
*/
|
|
||||||
typedef TIFF_SSIZE_T tmsize_t;
|
|
||||||
typedef uint64 toff_t; /* file offset */
|
|
||||||
/* the following are deprecated and should be replaced by their defining
|
|
||||||
counterparts */
|
|
||||||
typedef uint32 ttag_t; /* directory tag */
|
|
||||||
typedef uint16 tdir_t; /* directory index */
|
|
||||||
typedef uint16 tsample_t; /* sample number */
|
|
||||||
typedef uint32 tstrile_t; /* strip or tile number */
|
|
||||||
typedef tstrile_t tstrip_t; /* strip number */
|
|
||||||
typedef tstrile_t ttile_t; /* tile number */
|
|
||||||
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
|
||||||
typedef void* tdata_t; /* image data ref */
|
|
||||||
|
|
||||||
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
|
|
||||||
#define __WIN32__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c
|
|
||||||
* or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c).
|
|
||||||
*
|
|
||||||
* By default tif_unix.c is assumed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
|
||||||
# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
|
|
||||||
# define AVOID_WIN32_FILEIO
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_WIN32_FILEIO)
|
|
||||||
# define VC_EXTRALEAN
|
|
||||||
# include <windows.h>
|
|
||||||
# ifdef __WIN32__
|
|
||||||
DECLARE_HANDLE(thandle_t); /* Win32 file handle */
|
|
||||||
# else
|
|
||||||
typedef HFILE thandle_t; /* client data handle */
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
#else
|
|
||||||
typedef void* thandle_t; /* client data handle */
|
|
||||||
#endif /* USE_WIN32_FILEIO */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags to pass to TIFFPrintDirectory to control
|
|
||||||
* printing of data structures that are potentially
|
|
||||||
* very large. Bit-or these flags to enable printing
|
|
||||||
* multiple items.
|
|
||||||
*/
|
|
||||||
#define TIFFPRINT_NONE 0x0 /* no extra info */
|
|
||||||
#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
|
|
||||||
#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
|
|
||||||
#define TIFFPRINT_COLORMAP 0x4 /* colormap */
|
|
||||||
#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
|
|
||||||
#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
|
|
||||||
#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Colour conversion stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* reference white */
|
|
||||||
#define D65_X0 (95.0470F)
|
|
||||||
#define D65_Y0 (100.0F)
|
|
||||||
#define D65_Z0 (108.8827F)
|
|
||||||
|
|
||||||
#define D50_X0 (96.4250F)
|
|
||||||
#define D50_Y0 (100.0F)
|
|
||||||
#define D50_Z0 (82.4680F)
|
|
||||||
|
|
||||||
/* Structure for holding information about a display device. */
|
|
||||||
|
|
||||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
|
||||||
float d_YCR; /* Light o/p for reference white */
|
|
||||||
float d_YCG;
|
|
||||||
float d_YCB;
|
|
||||||
uint32 d_Vrwr; /* Pixel values for ref. white */
|
|
||||||
uint32 d_Vrwg;
|
|
||||||
uint32 d_Vrwb;
|
|
||||||
float d_Y0R; /* Residual light for black pixel */
|
|
||||||
float d_Y0G;
|
|
||||||
float d_Y0B;
|
|
||||||
float d_gammaR; /* Gamma values for the three guns */
|
|
||||||
float d_gammaG;
|
|
||||||
float d_gammaB;
|
|
||||||
} TIFFDisplay;
|
|
||||||
|
|
||||||
typedef struct { /* YCbCr->RGB support */
|
|
||||||
TIFFRGBValue* clamptab; /* range clamping table */
|
|
||||||
int* Cr_r_tab;
|
|
||||||
int* Cb_b_tab;
|
|
||||||
int32* Cr_g_tab;
|
|
||||||
int32* Cb_g_tab;
|
|
||||||
int32* Y_tab;
|
|
||||||
} TIFFYCbCrToRGB;
|
|
||||||
|
|
||||||
typedef struct { /* CIE Lab 1976->RGB support */
|
|
||||||
int range; /* Size of conversion table */
|
|
||||||
#define CIELABTORGB_TABLE_RANGE 1500
|
|
||||||
float rstep, gstep, bstep;
|
|
||||||
float X0, Y0, Z0; /* Reference white point */
|
|
||||||
TIFFDisplay display;
|
|
||||||
float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
|
|
||||||
float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
|
|
||||||
float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
|
|
||||||
} TIFFCIELabToRGB;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RGBA-style image support.
|
|
||||||
*/
|
|
||||||
typedef struct _TIFFRGBAImage TIFFRGBAImage;
|
|
||||||
/*
|
|
||||||
* The image reading and conversion routines invoke
|
|
||||||
* ``put routines'' to copy/image/whatever tiles of
|
|
||||||
* raw image data. A default set of routines are
|
|
||||||
* provided to convert/copy raw image data to 8-bit
|
|
||||||
* packed ABGR format rasters. Applications can supply
|
|
||||||
* alternate routines that unpack the data into a
|
|
||||||
* different format or, for example, unpack the data
|
|
||||||
* and draw the unpacked raster on the display.
|
|
||||||
*/
|
|
||||||
typedef void (*tileContigRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*);
|
|
||||||
typedef void (*tileSeparateRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
|
|
||||||
/*
|
|
||||||
* RGBA-reader state.
|
|
||||||
*/
|
|
||||||
struct _TIFFRGBAImage {
|
|
||||||
TIFF* tif; /* image handle */
|
|
||||||
int stoponerr; /* stop on read error */
|
|
||||||
int isContig; /* data is packed/separate */
|
|
||||||
int alpha; /* type of alpha data present */
|
|
||||||
uint32 width; /* image width */
|
|
||||||
uint32 height; /* image height */
|
|
||||||
uint16 bitspersample; /* image bits/sample */
|
|
||||||
uint16 samplesperpixel; /* image samples/pixel */
|
|
||||||
uint16 orientation; /* image orientation */
|
|
||||||
uint16 req_orientation; /* requested orientation */
|
|
||||||
uint16 photometric; /* image photometric interp */
|
|
||||||
uint16* redcmap; /* colormap pallete */
|
|
||||||
uint16* greencmap;
|
|
||||||
uint16* bluecmap;
|
|
||||||
/* get image data routine */
|
|
||||||
int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
/* put decoded strip/tile */
|
|
||||||
union {
|
|
||||||
void (*any)(TIFFRGBAImage*);
|
|
||||||
tileContigRoutine contig;
|
|
||||||
tileSeparateRoutine separate;
|
|
||||||
} put;
|
|
||||||
TIFFRGBValue* Map; /* sample mapping array */
|
|
||||||
uint32** BWmap; /* black&white map */
|
|
||||||
uint32** PALmap; /* palette image map */
|
|
||||||
TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
|
|
||||||
TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
|
|
||||||
|
|
||||||
uint8* UaToAa; /* Unassociated alpha to associated alpha convertion LUT */
|
|
||||||
uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
|
||||||
|
|
||||||
int row_offset;
|
|
||||||
int col_offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros for extracting components from the
|
|
||||||
* packed ABGR form returned by TIFFReadRGBAImage.
|
|
||||||
*/
|
|
||||||
#define TIFFGetR(abgr) ((abgr) & 0xff)
|
|
||||||
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
|
|
||||||
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
|
|
||||||
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A CODEC is a software package that implements decoding,
|
|
||||||
* encoding, or decoding+encoding of a compression algorithm.
|
|
||||||
* The library provides a collection of builtin codecs.
|
|
||||||
* More codecs may be registered through calls to the library
|
|
||||||
* and/or the builtin implementations may be overridden.
|
|
||||||
*/
|
|
||||||
typedef int (*TIFFInitMethod)(TIFF*, int);
|
|
||||||
typedef struct {
|
|
||||||
char* name;
|
|
||||||
uint16 scheme;
|
|
||||||
TIFFInitMethod init;
|
|
||||||
} TIFFCodec;
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
/* share internal LogLuv conversion routines? */
|
|
||||||
#ifndef LOGLUV_PUBLIC
|
|
||||||
#define LOGLUV_PUBLIC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
|
||||||
# define __attribute__(x) /*nothing*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
|
|
||||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
|
|
||||||
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t);
|
|
||||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
|
||||||
typedef int (*TIFFCloseProc)(thandle_t);
|
|
||||||
typedef toff_t (*TIFFSizeProc)(thandle_t);
|
|
||||||
typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size);
|
|
||||||
typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size);
|
|
||||||
typedef void (*TIFFExtendProc)(TIFF*);
|
|
||||||
|
|
||||||
extern const char* TIFFGetVersion(void);
|
|
||||||
|
|
||||||
extern const TIFFCodec* TIFFFindCODEC(uint16);
|
|
||||||
extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
|
|
||||||
extern void TIFFUnRegisterCODEC(TIFFCodec*);
|
|
||||||
extern int TIFFIsCODECConfigured(uint16);
|
|
||||||
extern TIFFCodec* TIFFGetConfiguredCODECs(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Auxiliary functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void* _TIFFmalloc(tmsize_t s);
|
|
||||||
extern void* _TIFFrealloc(void* p, tmsize_t s);
|
|
||||||
extern void _TIFFmemset(void* p, int v, tmsize_t c);
|
|
||||||
extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c);
|
|
||||||
extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c);
|
|
||||||
extern void _TIFFfree(void* p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Stuff, related to tag handling and creating custom tags.
|
|
||||||
*/
|
|
||||||
extern int TIFFGetTagListCount( TIFF * );
|
|
||||||
extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index );
|
|
||||||
|
|
||||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
|
||||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
|
||||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
|
||||||
#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
|
|
||||||
|
|
||||||
#define FIELD_CUSTOM 65
|
|
||||||
|
|
||||||
typedef struct _TIFFField TIFFField;
|
|
||||||
typedef struct _TIFFFieldArray TIFFFieldArray;
|
|
||||||
|
|
||||||
extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType);
|
|
||||||
extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32);
|
|
||||||
extern const TIFFField* TIFFFieldWithName(TIFF*, const char *);
|
|
||||||
|
|
||||||
extern uint32 TIFFFieldTag(const TIFFField*);
|
|
||||||
extern const char* TIFFFieldName(const TIFFField*);
|
|
||||||
extern TIFFDataType TIFFFieldDataType(const TIFFField*);
|
|
||||||
extern int TIFFFieldPassCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldReadCount(const TIFFField*);
|
|
||||||
extern int TIFFFieldWriteCount(const TIFFField*);
|
|
||||||
|
|
||||||
typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list);
|
|
||||||
typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
|
||||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
|
||||||
TIFFPrintMethod printdir; /* directory print routine */
|
|
||||||
} TIFFTagMethods;
|
|
||||||
|
|
||||||
extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
|
|
||||||
extern void *TIFFGetClientInfo(TIFF *, const char *);
|
|
||||||
extern void TIFFSetClientInfo(TIFF *, void *, const char *);
|
|
||||||
|
|
||||||
extern void TIFFCleanup(TIFF* tif);
|
|
||||||
extern void TIFFClose(TIFF* tif);
|
|
||||||
extern int TIFFFlush(TIFF* tif);
|
|
||||||
extern int TIFFFlushData(TIFF* tif);
|
|
||||||
extern int TIFFGetField(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...);
|
|
||||||
extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap);
|
|
||||||
extern int TIFFReadDirectory(TIFF* tif);
|
|
||||||
extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
|
|
||||||
extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff);
|
|
||||||
extern uint64 TIFFScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRasterScanlineSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFRasterScanlineSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFStripSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFStripSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip);
|
|
||||||
extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip);
|
|
||||||
extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint64 TIFFTileRowSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileRowSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFTileSize64(TIFF* tif);
|
|
||||||
extern tmsize_t TIFFTileSize(TIFF* tif);
|
|
||||||
extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows);
|
|
||||||
extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows);
|
|
||||||
extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request);
|
|
||||||
extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
|
|
||||||
extern int TIFFFileno(TIFF*);
|
|
||||||
extern int TIFFSetFileno(TIFF*, int);
|
|
||||||
extern thandle_t TIFFClientdata(TIFF*);
|
|
||||||
extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
|
|
||||||
extern int TIFFGetMode(TIFF*);
|
|
||||||
extern int TIFFSetMode(TIFF*, int);
|
|
||||||
extern int TIFFIsTiled(TIFF*);
|
|
||||||
extern int TIFFIsByteSwapped(TIFF*);
|
|
||||||
extern int TIFFIsUpSampled(TIFF*);
|
|
||||||
extern int TIFFIsMSB2LSB(TIFF*);
|
|
||||||
extern int TIFFIsBigEndian(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
|
|
||||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
|
|
||||||
extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
|
|
||||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
|
|
||||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
|
|
||||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentRow(TIFF*);
|
|
||||||
extern uint16 TIFFCurrentDirectory(TIFF*);
|
|
||||||
extern uint16 TIFFNumberOfDirectories(TIFF*);
|
|
||||||
extern uint64 TIFFCurrentDirOffset(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentStrip(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentTile(TIFF* tif);
|
|
||||||
extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
|
||||||
extern int TIFFSetupStrips(TIFF *);
|
|
||||||
extern int TIFFWriteCheck(TIFF*, int, const char *);
|
|
||||||
extern void TIFFFreeDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
|
|
||||||
extern int TIFFCreateEXIFDirectory(TIFF*);
|
|
||||||
extern int TIFFLastDirectory(TIFF*);
|
|
||||||
extern int TIFFSetDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetSubDirectory(TIFF*, uint64);
|
|
||||||
extern int TIFFUnlinkDirectory(TIFF*, uint16);
|
|
||||||
extern int TIFFSetField(TIFF*, uint32, ...);
|
|
||||||
extern int TIFFVSetField(TIFF*, uint32, va_list);
|
|
||||||
extern int TIFFUnsetField(TIFF*, uint32);
|
|
||||||
extern int TIFFWriteDirectory(TIFF *);
|
|
||||||
extern int TIFFWriteCustomDirectory(TIFF *, uint64 *);
|
|
||||||
extern int TIFFCheckpointDirectory(TIFF *);
|
|
||||||
extern int TIFFRewriteDirectory(TIFF *);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
|
|
||||||
int = ORIENTATION_BOTLEFT, int = 0);
|
|
||||||
#else
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long);
|
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * );
|
|
||||||
extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
|
|
||||||
extern int TIFFRGBAImageOK(TIFF*, char [1024]);
|
|
||||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
|
|
||||||
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
|
|
||||||
extern TIFF* TIFFOpen(const char*, const char*);
|
|
||||||
# ifdef __WIN32__
|
|
||||||
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
extern TIFF* TIFFFdOpen(int, const char*, const char*);
|
|
||||||
extern TIFF* TIFFClientOpen(const char*, const char*,
|
|
||||||
thandle_t,
|
|
||||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
|
||||||
TIFFSeekProc, TIFFCloseProc,
|
|
||||||
TIFFSizeProc,
|
|
||||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
|
||||||
extern const char* TIFFFileName(TIFF*);
|
|
||||||
extern const char* TIFFSetFileName(TIFF*, const char *);
|
|
||||||
extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
|
|
||||||
extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
|
|
||||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
|
||||||
extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFNumberOfTiles(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
|
||||||
extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16);
|
|
||||||
extern uint32 TIFFNumberOfStrips(TIFF*);
|
|
||||||
extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
|
||||||
extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
|
||||||
extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
|
|
||||||
extern void TIFFSetWriteOffset(TIFF* tif, toff_t off);
|
|
||||||
extern void TIFFSwabShort(uint16*);
|
|
||||||
extern void TIFFSwabLong(uint32*);
|
|
||||||
extern void TIFFSwabLong8(uint64*);
|
|
||||||
extern void TIFFSwabFloat(float*);
|
|
||||||
extern void TIFFSwabDouble(double*);
|
|
||||||
extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n);
|
|
||||||
extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n);
|
|
||||||
extern void TIFFReverseBits(uint8* cp, tmsize_t n);
|
|
||||||
extern const unsigned char* TIFFGetBitRevTable(int);
|
|
||||||
|
|
||||||
#ifdef LOGLUV_PUBLIC
|
|
||||||
#define U_NEU 0.210526316
|
|
||||||
#define V_NEU 0.473684211
|
|
||||||
#define UVSCALE 410.
|
|
||||||
extern double LogL16toY(int);
|
|
||||||
extern double LogL10toY(int);
|
|
||||||
extern void XYZtoRGB24(float*, uint8*);
|
|
||||||
extern int uv_decode(double*, double*, int);
|
|
||||||
extern void LogLuv24toXYZ(uint32, float*);
|
|
||||||
extern void LogLuv32toXYZ(uint32, float*);
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
#else
|
|
||||||
extern int LogL16fromY(double, int);
|
|
||||||
extern int LogL10fromY(double, int);
|
|
||||||
extern int uv_encode(double, double, int);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int);
|
|
||||||
#endif
|
|
||||||
#endif /* LOGLUV_PUBLIC */
|
|
||||||
|
|
||||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*);
|
|
||||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
|
|
||||||
float *, float *, float *);
|
|
||||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
|
|
||||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* O B S O L E T E D I N T E R F A C E S
|
|
||||||
*
|
|
||||||
* Don't use this stuff in your applications, it may be removed in the future
|
|
||||||
* libtiff versions.
|
|
||||||
****************************************************************************/
|
|
||||||
typedef struct {
|
|
||||||
ttag_t field_tag; /* field's tag */
|
|
||||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
|
||||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
|
||||||
TIFFDataType field_type; /* type of associated data */
|
|
||||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
|
||||||
unsigned char field_oktochange; /* if true, can change while writing */
|
|
||||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
|
||||||
char *field_name; /* ASCII name */
|
|
||||||
} TIFFFieldInfo;
|
|
||||||
|
|
||||||
extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _TIFFIO_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.6\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
|
|
||||||
/*
|
|
||||||
* This define can be used in code that requires
|
|
||||||
* compilation-related definitions specific to a
|
|
||||||
* version or versions of the library. Runtime
|
|
||||||
* version checking should be done based on the
|
|
||||||
* string returned by TIFFGetVersion.
|
|
||||||
*/
|
|
||||||
#define TIFFLIB_VERSION 20150912
|
|
||||||
Binary file not shown.
|
|
@ -70,9 +70,6 @@ elseif(WINDOWS)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
if(USE_SOCKET)
|
if(USE_SOCKET)
|
||||||
include(${CMAKE_CURRENT_LIST_DIR}/SocketRocket/CMakeLists.txt)
|
include(${CMAKE_CURRENT_LIST_DIR}/SocketRocket/CMakeLists.txt)
|
||||||
list(APPEND CC_EXTERNAL_LIBS
|
|
||||||
SocketRocket
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,26 +45,22 @@ set(SOCKET_ROCKET_SOURCES
|
||||||
${CMAKE_CURRENT_LIST_DIR}/NSURLRequest+SRWebSocket.m
|
${CMAKE_CURRENT_LIST_DIR}/NSURLRequest+SRWebSocket.m
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(SocketRocket ${SOCKET_ROCKET_SOURCES})
|
set(SOCKET_ROCKET_SOURCES_M ${SOCKET_ROCKET_SOURCES})
|
||||||
if(IOS)
|
list(FILTER SOCKET_ROCKET_SOURCES_M INCLUDE REGEX ".*m$")
|
||||||
set_property(TARGET SocketRocket PROPERTY XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${TARGET_IOS_VERSION})
|
set_source_files_properties(${SOCKET_ROCKET_SOURCES_M} PROPERTIES COMPILE_FLAGS
|
||||||
set_property(TARGET SocketRocket PROPERTY XCODE_ATTRIBUTE_ENABLE_BITCODE "NO")
|
|
||||||
set_property(TARGET SocketRocket PROPERTY XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "YES")
|
|
||||||
endif()
|
|
||||||
source_group(TREE ${CMAKE_CURRENT_LIST_DIR} PREFIX "Source Files" FILES ${SOCKET_ROCKET_SOURCES})
|
|
||||||
|
|
||||||
target_include_directories(SocketRocket
|
|
||||||
PUBLIC ${CMAKE_CURRENT_LIST_DIR}
|
|
||||||
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../
|
|
||||||
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Internal
|
|
||||||
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Internal/Utilities
|
|
||||||
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Internal/RunLoop
|
|
||||||
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Internal/Security
|
|
||||||
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Internal/Delegate
|
|
||||||
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Internal/IOConsumer
|
|
||||||
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Internal/Proxy
|
|
||||||
)
|
|
||||||
|
|
||||||
target_compile_options(SocketRocket PRIVATE
|
|
||||||
-fobjc-arc
|
-fobjc-arc
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
list(APPEND CC_EXTERNAL_PRIVATE_INCLUDES
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/Internal
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/Internal/Utilities
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/Internal/RunLoop
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/Internal/Security
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/Internal/Delegate
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/Internal/IOConsumer
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/Internal/Proxy
|
||||||
)
|
)
|
||||||
|
|
||||||
|
list(APPEND CC_EXTERNAL_SROUCES ${SOCKET_ROCKET_SOURCES})
|
||||||
|
list(APPEND CC_EXTERNAL_INCLUDES ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
|
|
||||||
add_library(google-breakpad
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/crash_generation/crash_generation_client.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/dump_writer_common/thread_info.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/dump_writer_common/ucontext_reader.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/handler/exception_handler.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/handler/minidump_descriptor.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/log/log.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/microdump_writer/microdump_writer.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/minidump_writer/linux_dumper.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/linux/minidump_writer/minidump_writer.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/client/minidump_file_writer.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/android/breakpad_getcontext.S
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/md5.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/string_conversion.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/linux/elfutils.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/linux/file_id.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/linux/guid_creator.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/linux/linux_libc_support.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/linux/memory_mapped_file.cc
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/linux/safe_readlink.cc
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(google-breakpad PRIVATE
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/common/android/include
|
|
||||||
)
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
# Copyright (c) 2012, Google Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above
|
|
||||||
# copyright notice, this list of conditions and the following disclaimer
|
|
||||||
# in the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
# * Neither the name of Google Inc. nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
# ndk-build module definition for the Google Breakpad client library
|
|
||||||
#
|
|
||||||
# To use this file, do the following:
|
|
||||||
#
|
|
||||||
# 1/ Include this file from your own Android.mk, either directly
|
|
||||||
# or with through the NDK's import-module function.
|
|
||||||
#
|
|
||||||
# 2/ Use the client static library in your project with:
|
|
||||||
#
|
|
||||||
# LOCAL_STATIC_LIBRARIES += breakpad_client
|
|
||||||
#
|
|
||||||
# 3/ In your source code, include "src/client/linux/exception_handler.h"
|
|
||||||
# and use the Linux instructions to use it.
|
|
||||||
#
|
|
||||||
# This module works with either the STLport or GNU libstdc++, but you need
|
|
||||||
# to select one in your Application.mk
|
|
||||||
#
|
|
||||||
|
|
||||||
# The top Google Breakpad directory.
|
|
||||||
# We assume this Android.mk to be under 'android/google_breakpad'
|
|
||||||
|
|
||||||
LOCAL_PATH := $(call my-dir)/../..
|
|
||||||
|
|
||||||
# Defube the client library module, as a simple static library that
|
|
||||||
# exports the right include path / linker flags to its users.
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := breakpad_client
|
|
||||||
|
|
||||||
LOCAL_CPP_EXTENSION := .cc
|
|
||||||
|
|
||||||
# Breakpad uses inline ARM assembly that requires the library
|
|
||||||
# to be built in ARM mode. Otherwise, the build will fail with
|
|
||||||
# cryptic assembler messages like:
|
|
||||||
# Compile++ thumb : google_breakpad_client <= crash_generation_client.cc
|
|
||||||
# /tmp/cc8aMSoD.s: Assembler messages:
|
|
||||||
# /tmp/cc8aMSoD.s:132: Error: invalid immediate: 288 is out of range
|
|
||||||
# /tmp/cc8aMSoD.s:244: Error: invalid immediate: 296 is out of range
|
|
||||||
LOCAL_ARM_MODE := arm
|
|
||||||
|
|
||||||
# List of client source files, directly taken from Makefile.am
|
|
||||||
LOCAL_SRC_FILES := \
|
|
||||||
src/client/linux/crash_generation/crash_generation_client.cc \
|
|
||||||
src/client/linux/dump_writer_common/thread_info.cc \
|
|
||||||
src/client/linux/dump_writer_common/ucontext_reader.cc \
|
|
||||||
src/client/linux/handler/exception_handler.cc \
|
|
||||||
src/client/linux/handler/minidump_descriptor.cc \
|
|
||||||
src/client/linux/log/log.cc \
|
|
||||||
src/client/linux/microdump_writer/microdump_writer.cc \
|
|
||||||
src/client/linux/minidump_writer/linux_dumper.cc \
|
|
||||||
src/client/linux/minidump_writer/linux_ptrace_dumper.cc \
|
|
||||||
src/client/linux/minidump_writer/minidump_writer.cc \
|
|
||||||
src/client/minidump_file_writer.cc \
|
|
||||||
src/common/android/breakpad_getcontext.S \
|
|
||||||
src/common/md5.cc \
|
|
||||||
src/common/string_conversion.cc \
|
|
||||||
src/common/linux/elfutils.cc \
|
|
||||||
src/common/linux/file_id.cc \
|
|
||||||
src/common/linux/guid_creator.cc \
|
|
||||||
src/common/linux/linux_libc_support.cc \
|
|
||||||
src/common/linux/memory_mapped_file.cc \
|
|
||||||
src/common/linux/safe_readlink.cc
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src/common/android/include \
|
|
||||||
$(LOCAL_PATH)/src
|
|
||||||
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
|
|
||||||
LOCAL_EXPORT_LDLIBS := -llog
|
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
# Done.
|
|
||||||
|
|
@ -1,105 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include "client/linux/crash_generation/crash_generation_client.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "common/linux/eintr_wrapper.h"
|
|
||||||
#include "common/linux/ignore_ret.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
class CrashGenerationClientImpl : public CrashGenerationClient {
|
|
||||||
public:
|
|
||||||
explicit CrashGenerationClientImpl(int server_fd) : server_fd_(server_fd) {}
|
|
||||||
virtual ~CrashGenerationClientImpl() {}
|
|
||||||
|
|
||||||
virtual bool RequestDump(const void* blob, size_t blob_size) {
|
|
||||||
int fds[2];
|
|
||||||
if (sys_pipe(fds) < 0)
|
|
||||||
return false;
|
|
||||||
static const unsigned kControlMsgSize = CMSG_SPACE(sizeof(int));
|
|
||||||
|
|
||||||
struct kernel_iovec iov;
|
|
||||||
iov.iov_base = const_cast<void*>(blob);
|
|
||||||
iov.iov_len = blob_size;
|
|
||||||
|
|
||||||
struct kernel_msghdr msg = { 0 };
|
|
||||||
msg.msg_iov = &iov;
|
|
||||||
msg.msg_iovlen = 1;
|
|
||||||
char cmsg[kControlMsgSize] = "";
|
|
||||||
msg.msg_control = cmsg;
|
|
||||||
msg.msg_controllen = sizeof(cmsg);
|
|
||||||
|
|
||||||
struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg);
|
|
||||||
hdr->cmsg_level = SOL_SOCKET;
|
|
||||||
hdr->cmsg_type = SCM_RIGHTS;
|
|
||||||
hdr->cmsg_len = CMSG_LEN(sizeof(int));
|
|
||||||
int* p = reinterpret_cast<int*>(CMSG_DATA(hdr));
|
|
||||||
*p = fds[1];
|
|
||||||
|
|
||||||
ssize_t ret = HANDLE_EINTR(sys_sendmsg(server_fd_, &msg, 0));
|
|
||||||
sys_close(fds[1]);
|
|
||||||
if (ret < 0) {
|
|
||||||
sys_close(fds[0]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for an ACK from the server.
|
|
||||||
char b;
|
|
||||||
IGNORE_RET(HANDLE_EINTR(sys_read(fds[0], &b, 1)));
|
|
||||||
sys_close(fds[0]);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int server_fd_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(CrashGenerationClientImpl);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
// static
|
|
||||||
CrashGenerationClient* CrashGenerationClient::TryCreate(int server_fd) {
|
|
||||||
if (server_fd < 0)
|
|
||||||
return NULL;
|
|
||||||
return new CrashGenerationClientImpl(server_fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
|
||||||
#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
|
||||||
|
|
||||||
#include "common/basictypes.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// CrashGenerationClient is an interface for implementing out-of-process crash
|
|
||||||
// dumping. The default implementation, accessed via the TryCreate() factory,
|
|
||||||
// works in conjunction with the CrashGenerationServer to generate a minidump
|
|
||||||
// via a remote process.
|
|
||||||
class CrashGenerationClient {
|
|
||||||
public:
|
|
||||||
CrashGenerationClient() {}
|
|
||||||
virtual ~CrashGenerationClient() {}
|
|
||||||
|
|
||||||
// Request the crash server to generate a dump. |blob| is an opaque
|
|
||||||
// CrashContext pointer from exception_handler.h.
|
|
||||||
// Returns true if the dump was successful; false otherwise.
|
|
||||||
virtual bool RequestDump(const void* blob, size_t blob_size) = 0;
|
|
||||||
|
|
||||||
// Returns a new CrashGenerationClient if |server_fd| is valid and
|
|
||||||
// connects to a CrashGenerationServer. Otherwise, return NULL.
|
|
||||||
// The returned CrashGenerationClient* is owned by the caller of
|
|
||||||
// this function.
|
|
||||||
static CrashGenerationClient* TryCreate(int server_fd);
|
|
||||||
|
|
||||||
private:
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(CrashGenerationClient);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
MODULE Linux x86 B8CFDE93002D54DA1900A40AA1BD67690 linux-gate.so
|
|
||||||
PUBLIC 400 0 __kernel_vsyscall
|
|
||||||
STACK WIN 4 400 100 1 1 0 0 0 0 0 1
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
MODULE Linux x86 4FBDA58B5A1DF5A379E3CF19A235EA090 linux-gate.so
|
|
||||||
PUBLIC 400 0 __kernel_vsyscall
|
|
||||||
STACK WIN 4 400 200 3 3 0 0 0 0 0 1
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_
|
|
||||||
#define CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <list>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// One of these is produced for each mapping in the process (i.e. line in
|
|
||||||
// /proc/$x/maps).
|
|
||||||
struct MappingInfo {
|
|
||||||
uintptr_t start_addr;
|
|
||||||
size_t size;
|
|
||||||
size_t offset; // offset into the backed file.
|
|
||||||
bool exec; // true if the mapping has the execute bit set.
|
|
||||||
char name[NAME_MAX];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MappingEntry {
|
|
||||||
MappingInfo first;
|
|
||||||
uint8_t second[sizeof(MDGUID)];
|
|
||||||
};
|
|
||||||
|
|
||||||
// A list of <MappingInfo, GUID>
|
|
||||||
typedef std::list<MappingEntry> MappingList;
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H
|
|
||||||
#define CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
#if defined(__i386__)
|
|
||||||
typedef MDRawContextX86 RawContextCPU;
|
|
||||||
#elif defined(__x86_64)
|
|
||||||
typedef MDRawContextAMD64 RawContextCPU;
|
|
||||||
#elif defined(__ARM_EABI__)
|
|
||||||
typedef MDRawContextARM RawContextCPU;
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
typedef MDRawContextARM64 RawContextCPU;
|
|
||||||
#elif defined(__mips__)
|
|
||||||
typedef MDRawContextMIPS RawContextCPU;
|
|
||||||
#else
|
|
||||||
#error "This code has not been ported to your platform yet."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H
|
|
||||||
|
|
@ -1,305 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/thread_info.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
#if defined(__i386__)
|
|
||||||
// Write a uint16_t to memory
|
|
||||||
// out: memory location to write to
|
|
||||||
// v: value to write.
|
|
||||||
void U16(void* out, uint16_t v) {
|
|
||||||
my_memcpy(out, &v, sizeof(v));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write a uint32_t to memory
|
|
||||||
// out: memory location to write to
|
|
||||||
// v: value to write.
|
|
||||||
void U32(void* out, uint32_t v) {
|
|
||||||
my_memcpy(out, &v, sizeof(v));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
#if defined(__i386__)
|
|
||||||
|
|
||||||
uintptr_t ThreadInfo::GetInstructionPointer() const {
|
|
||||||
return regs.eip;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
|
|
||||||
out->context_flags = MD_CONTEXT_X86_ALL;
|
|
||||||
|
|
||||||
out->dr0 = dregs[0];
|
|
||||||
out->dr1 = dregs[1];
|
|
||||||
out->dr2 = dregs[2];
|
|
||||||
out->dr3 = dregs[3];
|
|
||||||
// 4 and 5 deliberatly omitted because they aren't included in the minidump
|
|
||||||
// format.
|
|
||||||
out->dr6 = dregs[6];
|
|
||||||
out->dr7 = dregs[7];
|
|
||||||
|
|
||||||
out->gs = regs.xgs;
|
|
||||||
out->fs = regs.xfs;
|
|
||||||
out->es = regs.xes;
|
|
||||||
out->ds = regs.xds;
|
|
||||||
|
|
||||||
out->edi = regs.edi;
|
|
||||||
out->esi = regs.esi;
|
|
||||||
out->ebx = regs.ebx;
|
|
||||||
out->edx = regs.edx;
|
|
||||||
out->ecx = regs.ecx;
|
|
||||||
out->eax = regs.eax;
|
|
||||||
|
|
||||||
out->ebp = regs.ebp;
|
|
||||||
out->eip = regs.eip;
|
|
||||||
out->cs = regs.xcs;
|
|
||||||
out->eflags = regs.eflags;
|
|
||||||
out->esp = regs.esp;
|
|
||||||
out->ss = regs.xss;
|
|
||||||
|
|
||||||
out->float_save.control_word = fpregs.cwd;
|
|
||||||
out->float_save.status_word = fpregs.swd;
|
|
||||||
out->float_save.tag_word = fpregs.twd;
|
|
||||||
out->float_save.error_offset = fpregs.fip;
|
|
||||||
out->float_save.error_selector = fpregs.fcs;
|
|
||||||
out->float_save.data_offset = fpregs.foo;
|
|
||||||
out->float_save.data_selector = fpregs.fos;
|
|
||||||
|
|
||||||
// 8 registers * 10 bytes per register.
|
|
||||||
my_memcpy(out->float_save.register_area, fpregs.st_space, 10 * 8);
|
|
||||||
|
|
||||||
// This matches the Intel fpsave format.
|
|
||||||
U16(out->extended_registers + 0, fpregs.cwd);
|
|
||||||
U16(out->extended_registers + 2, fpregs.swd);
|
|
||||||
U16(out->extended_registers + 4, fpregs.twd);
|
|
||||||
U16(out->extended_registers + 6, fpxregs.fop);
|
|
||||||
U32(out->extended_registers + 8, fpxregs.fip);
|
|
||||||
U16(out->extended_registers + 12, fpxregs.fcs);
|
|
||||||
U32(out->extended_registers + 16, fpregs.foo);
|
|
||||||
U16(out->extended_registers + 20, fpregs.fos);
|
|
||||||
U32(out->extended_registers + 24, fpxregs.mxcsr);
|
|
||||||
|
|
||||||
my_memcpy(out->extended_registers + 32, &fpxregs.st_space, 128);
|
|
||||||
my_memcpy(out->extended_registers + 160, &fpxregs.xmm_space, 128);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__x86_64)
|
|
||||||
|
|
||||||
uintptr_t ThreadInfo::GetInstructionPointer() const {
|
|
||||||
return regs.rip;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
|
|
||||||
out->context_flags = MD_CONTEXT_AMD64_FULL |
|
|
||||||
MD_CONTEXT_AMD64_SEGMENTS;
|
|
||||||
|
|
||||||
out->cs = regs.cs;
|
|
||||||
|
|
||||||
out->ds = regs.ds;
|
|
||||||
out->es = regs.es;
|
|
||||||
out->fs = regs.fs;
|
|
||||||
out->gs = regs.gs;
|
|
||||||
|
|
||||||
out->ss = regs.ss;
|
|
||||||
out->eflags = regs.eflags;
|
|
||||||
|
|
||||||
out->dr0 = dregs[0];
|
|
||||||
out->dr1 = dregs[1];
|
|
||||||
out->dr2 = dregs[2];
|
|
||||||
out->dr3 = dregs[3];
|
|
||||||
// 4 and 5 deliberatly omitted because they aren't included in the minidump
|
|
||||||
// format.
|
|
||||||
out->dr6 = dregs[6];
|
|
||||||
out->dr7 = dregs[7];
|
|
||||||
|
|
||||||
out->rax = regs.rax;
|
|
||||||
out->rcx = regs.rcx;
|
|
||||||
out->rdx = regs.rdx;
|
|
||||||
out->rbx = regs.rbx;
|
|
||||||
|
|
||||||
out->rsp = regs.rsp;
|
|
||||||
|
|
||||||
out->rbp = regs.rbp;
|
|
||||||
out->rsi = regs.rsi;
|
|
||||||
out->rdi = regs.rdi;
|
|
||||||
out->r8 = regs.r8;
|
|
||||||
out->r9 = regs.r9;
|
|
||||||
out->r10 = regs.r10;
|
|
||||||
out->r11 = regs.r11;
|
|
||||||
out->r12 = regs.r12;
|
|
||||||
out->r13 = regs.r13;
|
|
||||||
out->r14 = regs.r14;
|
|
||||||
out->r15 = regs.r15;
|
|
||||||
|
|
||||||
out->rip = regs.rip;
|
|
||||||
|
|
||||||
out->flt_save.control_word = fpregs.cwd;
|
|
||||||
out->flt_save.status_word = fpregs.swd;
|
|
||||||
out->flt_save.tag_word = fpregs.ftw;
|
|
||||||
out->flt_save.error_opcode = fpregs.fop;
|
|
||||||
out->flt_save.error_offset = fpregs.rip;
|
|
||||||
out->flt_save.error_selector = 0; // We don't have this.
|
|
||||||
out->flt_save.data_offset = fpregs.rdp;
|
|
||||||
out->flt_save.data_selector = 0; // We don't have this.
|
|
||||||
out->flt_save.mx_csr = fpregs.mxcsr;
|
|
||||||
out->flt_save.mx_csr_mask = fpregs.mxcr_mask;
|
|
||||||
|
|
||||||
my_memcpy(&out->flt_save.float_registers, &fpregs.st_space, 8 * 16);
|
|
||||||
my_memcpy(&out->flt_save.xmm_registers, &fpregs.xmm_space, 16 * 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__ARM_EABI__)
|
|
||||||
|
|
||||||
uintptr_t ThreadInfo::GetInstructionPointer() const {
|
|
||||||
return regs.uregs[15];
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
|
|
||||||
out->context_flags = MD_CONTEXT_ARM_FULL;
|
|
||||||
|
|
||||||
for (int i = 0; i < MD_CONTEXT_ARM_GPR_COUNT; ++i)
|
|
||||||
out->iregs[i] = regs.uregs[i];
|
|
||||||
// No CPSR register in ThreadInfo(it's not accessible via ptrace)
|
|
||||||
out->cpsr = 0;
|
|
||||||
#if !defined(__ANDROID__)
|
|
||||||
out->float_save.fpscr = fpregs.fpsr |
|
|
||||||
(static_cast<uint64_t>(fpregs.fpcr) << 32);
|
|
||||||
// TODO: sort this out, actually collect floating point registers
|
|
||||||
my_memset(&out->float_save.regs, 0, sizeof(out->float_save.regs));
|
|
||||||
my_memset(&out->float_save.extra, 0, sizeof(out->float_save.extra));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
|
|
||||||
uintptr_t ThreadInfo::GetInstructionPointer() const {
|
|
||||||
return regs.pc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
|
|
||||||
out->context_flags = MD_CONTEXT_ARM64_FULL;
|
|
||||||
|
|
||||||
out->cpsr = static_cast<uint32_t>(regs.pstate);
|
|
||||||
for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i)
|
|
||||||
out->iregs[i] = regs.regs[i];
|
|
||||||
out->iregs[MD_CONTEXT_ARM64_REG_SP] = regs.sp;
|
|
||||||
out->iregs[MD_CONTEXT_ARM64_REG_PC] = regs.pc;
|
|
||||||
|
|
||||||
out->float_save.fpsr = fpregs.fpsr;
|
|
||||||
out->float_save.fpcr = fpregs.fpcr;
|
|
||||||
my_memcpy(&out->float_save.regs, &fpregs.vregs,
|
|
||||||
MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT * 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__mips__)
|
|
||||||
|
|
||||||
uintptr_t ThreadInfo::GetInstructionPointer() const {
|
|
||||||
return mcontext.pc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
|
|
||||||
#if _MIPS_SIM == _ABI64
|
|
||||||
out->context_flags = MD_CONTEXT_MIPS64_FULL;
|
|
||||||
#elif _MIPS_SIM == _ABIO32
|
|
||||||
out->context_flags = MD_CONTEXT_MIPS_FULL;
|
|
||||||
#else
|
|
||||||
# error "This mips ABI is currently not supported (n32)"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i)
|
|
||||||
out->iregs[i] = mcontext.gregs[i];
|
|
||||||
|
|
||||||
out->mdhi = mcontext.mdhi;
|
|
||||||
out->mdlo = mcontext.mdlo;
|
|
||||||
out->dsp_control = mcontext.dsp;
|
|
||||||
|
|
||||||
out->hi[0] = mcontext.hi1;
|
|
||||||
out->lo[0] = mcontext.lo1;
|
|
||||||
out->hi[1] = mcontext.hi2;
|
|
||||||
out->lo[1] = mcontext.lo2;
|
|
||||||
out->hi[2] = mcontext.hi3;
|
|
||||||
out->lo[2] = mcontext.lo3;
|
|
||||||
|
|
||||||
out->epc = mcontext.pc;
|
|
||||||
out->badvaddr = 0; // Not stored in mcontext
|
|
||||||
out->status = 0; // Not stored in mcontext
|
|
||||||
out->cause = 0; // Not stored in mcontext
|
|
||||||
|
|
||||||
for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i)
|
|
||||||
out->float_save.regs[i] = mcontext.fpregs.fp_r.fp_fregs[i]._fp_fregs;
|
|
||||||
|
|
||||||
out->float_save.fpcsr = mcontext.fpc_csr;
|
|
||||||
#if _MIPS_SIM == _ABIO32
|
|
||||||
out->float_save.fir = mcontext.fpc_eir;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif // __mips__
|
|
||||||
|
|
||||||
void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
|
|
||||||
assert(gp_regs || size);
|
|
||||||
#if defined(__mips__)
|
|
||||||
if (gp_regs)
|
|
||||||
*gp_regs = mcontext.gregs;
|
|
||||||
if (size)
|
|
||||||
*size = sizeof(mcontext.gregs);
|
|
||||||
#else
|
|
||||||
if (gp_regs)
|
|
||||||
*gp_regs = ®s;
|
|
||||||
if (size)
|
|
||||||
*size = sizeof(regs);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
|
|
||||||
assert(fp_regs || size);
|
|
||||||
#if defined(__mips__)
|
|
||||||
if (fp_regs)
|
|
||||||
*fp_regs = &mcontext.fpregs;
|
|
||||||
if (size)
|
|
||||||
*size = sizeof(mcontext.fpregs);
|
|
||||||
#else
|
|
||||||
if (fp_regs)
|
|
||||||
*fp_regs = &fpregs;
|
|
||||||
if (size)
|
|
||||||
*size = sizeof(fpregs);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_
|
|
||||||
#define CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_
|
|
||||||
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#include <sys/user.h>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/raw_context_cpu.h"
|
|
||||||
#include "common/memory.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
|
||||||
typedef __typeof__(((struct user*) 0)->u_debugreg[0]) debugreg_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// We produce one of these structures for each thread in the crashed process.
|
|
||||||
struct ThreadInfo {
|
|
||||||
pid_t tgid; // thread group id
|
|
||||||
pid_t ppid; // parent process
|
|
||||||
|
|
||||||
uintptr_t stack_pointer; // thread stack pointer
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
|
||||||
user_regs_struct regs;
|
|
||||||
user_fpregs_struct fpregs;
|
|
||||||
static const unsigned kNumDebugRegisters = 8;
|
|
||||||
debugreg_t dregs[8];
|
|
||||||
#if defined(__i386)
|
|
||||||
user_fpxregs_struct fpxregs;
|
|
||||||
#endif // defined(__i386)
|
|
||||||
|
|
||||||
#elif defined(__ARM_EABI__)
|
|
||||||
// Mimicking how strace does this(see syscall.c, search for GETREGS)
|
|
||||||
struct user_regs regs;
|
|
||||||
struct user_fpregs fpregs;
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
// Use the structures defined in <sys/user.h>
|
|
||||||
struct user_regs_struct regs;
|
|
||||||
struct user_fpsimd_struct fpregs;
|
|
||||||
#elif defined(__mips__)
|
|
||||||
// Use the structure defined in <sys/ucontext.h>.
|
|
||||||
mcontext_t mcontext;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Returns the instruction pointer (platform-dependent impl.).
|
|
||||||
uintptr_t GetInstructionPointer() const;
|
|
||||||
|
|
||||||
// Fills a RawContextCPU using the context in the ThreadInfo object.
|
|
||||||
void FillCPUContext(RawContextCPU* out) const;
|
|
||||||
|
|
||||||
// Returns the pointer and size of general purpose register area.
|
|
||||||
void GetGeneralPurposeRegisters(void** gp_regs, size_t* size);
|
|
||||||
|
|
||||||
// Returns the pointer and size of float point register area.
|
|
||||||
void GetFloatingPointRegisters(void** fp_regs, size_t* size);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_
|
|
||||||
|
|
@ -1,259 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/ucontext_reader.h"
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Minidump defines register structures which are different from the raw
|
|
||||||
// structures which we get from the kernel. These are platform specific
|
|
||||||
// functions to juggle the ucontext and user structures into minidump format.
|
|
||||||
|
|
||||||
#if defined(__i386__)
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.gregs[REG_ESP];
|
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.gregs[REG_EIP];
|
|
||||||
}
|
|
||||||
|
|
||||||
void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc,
|
|
||||||
const struct _libc_fpstate* fp) {
|
|
||||||
const greg_t* regs = uc->uc_mcontext.gregs;
|
|
||||||
|
|
||||||
out->context_flags = MD_CONTEXT_X86_FULL |
|
|
||||||
MD_CONTEXT_X86_FLOATING_POINT;
|
|
||||||
|
|
||||||
out->gs = regs[REG_GS];
|
|
||||||
out->fs = regs[REG_FS];
|
|
||||||
out->es = regs[REG_ES];
|
|
||||||
out->ds = regs[REG_DS];
|
|
||||||
|
|
||||||
out->edi = regs[REG_EDI];
|
|
||||||
out->esi = regs[REG_ESI];
|
|
||||||
out->ebx = regs[REG_EBX];
|
|
||||||
out->edx = regs[REG_EDX];
|
|
||||||
out->ecx = regs[REG_ECX];
|
|
||||||
out->eax = regs[REG_EAX];
|
|
||||||
|
|
||||||
out->ebp = regs[REG_EBP];
|
|
||||||
out->eip = regs[REG_EIP];
|
|
||||||
out->cs = regs[REG_CS];
|
|
||||||
out->eflags = regs[REG_EFL];
|
|
||||||
out->esp = regs[REG_UESP];
|
|
||||||
out->ss = regs[REG_SS];
|
|
||||||
|
|
||||||
out->float_save.control_word = fp->cw;
|
|
||||||
out->float_save.status_word = fp->sw;
|
|
||||||
out->float_save.tag_word = fp->tag;
|
|
||||||
out->float_save.error_offset = fp->ipoff;
|
|
||||||
out->float_save.error_selector = fp->cssel;
|
|
||||||
out->float_save.data_offset = fp->dataoff;
|
|
||||||
out->float_save.data_selector = fp->datasel;
|
|
||||||
|
|
||||||
// 8 registers * 10 bytes per register.
|
|
||||||
my_memcpy(out->float_save.register_area, fp->_st, 10 * 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__x86_64)
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.gregs[REG_RSP];
|
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.gregs[REG_RIP];
|
|
||||||
}
|
|
||||||
|
|
||||||
void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc,
|
|
||||||
const struct _libc_fpstate* fpregs) {
|
|
||||||
const greg_t* regs = uc->uc_mcontext.gregs;
|
|
||||||
|
|
||||||
out->context_flags = MD_CONTEXT_AMD64_FULL;
|
|
||||||
|
|
||||||
out->cs = regs[REG_CSGSFS] & 0xffff;
|
|
||||||
|
|
||||||
out->fs = (regs[REG_CSGSFS] >> 32) & 0xffff;
|
|
||||||
out->gs = (regs[REG_CSGSFS] >> 16) & 0xffff;
|
|
||||||
|
|
||||||
out->eflags = regs[REG_EFL];
|
|
||||||
|
|
||||||
out->rax = regs[REG_RAX];
|
|
||||||
out->rcx = regs[REG_RCX];
|
|
||||||
out->rdx = regs[REG_RDX];
|
|
||||||
out->rbx = regs[REG_RBX];
|
|
||||||
|
|
||||||
out->rsp = regs[REG_RSP];
|
|
||||||
out->rbp = regs[REG_RBP];
|
|
||||||
out->rsi = regs[REG_RSI];
|
|
||||||
out->rdi = regs[REG_RDI];
|
|
||||||
out->r8 = regs[REG_R8];
|
|
||||||
out->r9 = regs[REG_R9];
|
|
||||||
out->r10 = regs[REG_R10];
|
|
||||||
out->r11 = regs[REG_R11];
|
|
||||||
out->r12 = regs[REG_R12];
|
|
||||||
out->r13 = regs[REG_R13];
|
|
||||||
out->r14 = regs[REG_R14];
|
|
||||||
out->r15 = regs[REG_R15];
|
|
||||||
|
|
||||||
out->rip = regs[REG_RIP];
|
|
||||||
|
|
||||||
out->flt_save.control_word = fpregs->cwd;
|
|
||||||
out->flt_save.status_word = fpregs->swd;
|
|
||||||
out->flt_save.tag_word = fpregs->ftw;
|
|
||||||
out->flt_save.error_opcode = fpregs->fop;
|
|
||||||
out->flt_save.error_offset = fpregs->rip;
|
|
||||||
out->flt_save.data_offset = fpregs->rdp;
|
|
||||||
out->flt_save.error_selector = 0; // We don't have this.
|
|
||||||
out->flt_save.data_selector = 0; // We don't have this.
|
|
||||||
out->flt_save.mx_csr = fpregs->mxcsr;
|
|
||||||
out->flt_save.mx_csr_mask = fpregs->mxcr_mask;
|
|
||||||
my_memcpy(&out->flt_save.float_registers, &fpregs->_st, 8 * 16);
|
|
||||||
my_memcpy(&out->flt_save.xmm_registers, &fpregs->_xmm, 16 * 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__ARM_EABI__)
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.arm_sp;
|
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.arm_pc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc) {
|
|
||||||
out->context_flags = MD_CONTEXT_ARM_FULL;
|
|
||||||
|
|
||||||
out->iregs[0] = uc->uc_mcontext.arm_r0;
|
|
||||||
out->iregs[1] = uc->uc_mcontext.arm_r1;
|
|
||||||
out->iregs[2] = uc->uc_mcontext.arm_r2;
|
|
||||||
out->iregs[3] = uc->uc_mcontext.arm_r3;
|
|
||||||
out->iregs[4] = uc->uc_mcontext.arm_r4;
|
|
||||||
out->iregs[5] = uc->uc_mcontext.arm_r5;
|
|
||||||
out->iregs[6] = uc->uc_mcontext.arm_r6;
|
|
||||||
out->iregs[7] = uc->uc_mcontext.arm_r7;
|
|
||||||
out->iregs[8] = uc->uc_mcontext.arm_r8;
|
|
||||||
out->iregs[9] = uc->uc_mcontext.arm_r9;
|
|
||||||
out->iregs[10] = uc->uc_mcontext.arm_r10;
|
|
||||||
|
|
||||||
out->iregs[11] = uc->uc_mcontext.arm_fp;
|
|
||||||
out->iregs[12] = uc->uc_mcontext.arm_ip;
|
|
||||||
out->iregs[13] = uc->uc_mcontext.arm_sp;
|
|
||||||
out->iregs[14] = uc->uc_mcontext.arm_lr;
|
|
||||||
out->iregs[15] = uc->uc_mcontext.arm_pc;
|
|
||||||
|
|
||||||
out->cpsr = uc->uc_mcontext.arm_cpsr;
|
|
||||||
|
|
||||||
// TODO: fix this after fixing ExceptionHandler
|
|
||||||
out->float_save.fpscr = 0;
|
|
||||||
my_memset(&out->float_save.regs, 0, sizeof(out->float_save.regs));
|
|
||||||
my_memset(&out->float_save.extra, 0, sizeof(out->float_save.extra));
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.sp;
|
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.pc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc,
|
|
||||||
const struct fpsimd_context* fpregs) {
|
|
||||||
out->context_flags = MD_CONTEXT_ARM64_FULL;
|
|
||||||
|
|
||||||
out->cpsr = static_cast<uint32_t>(uc->uc_mcontext.pstate);
|
|
||||||
for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i)
|
|
||||||
out->iregs[i] = uc->uc_mcontext.regs[i];
|
|
||||||
out->iregs[MD_CONTEXT_ARM64_REG_SP] = uc->uc_mcontext.sp;
|
|
||||||
out->iregs[MD_CONTEXT_ARM64_REG_PC] = uc->uc_mcontext.pc;
|
|
||||||
|
|
||||||
out->float_save.fpsr = fpregs->fpsr;
|
|
||||||
out->float_save.fpcr = fpregs->fpcr;
|
|
||||||
my_memcpy(&out->float_save.regs, &fpregs->vregs,
|
|
||||||
MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT * 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__mips__)
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP];
|
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
|
|
||||||
return uc->uc_mcontext.pc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc) {
|
|
||||||
#if _MIPS_SIM == _ABI64
|
|
||||||
out->context_flags = MD_CONTEXT_MIPS64_FULL;
|
|
||||||
#elif _MIPS_SIM == _ABIO32
|
|
||||||
out->context_flags = MD_CONTEXT_MIPS_FULL;
|
|
||||||
#else
|
|
||||||
#error "This mips ABI is currently not supported (n32)"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i)
|
|
||||||
out->iregs[i] = uc->uc_mcontext.gregs[i];
|
|
||||||
|
|
||||||
out->mdhi = uc->uc_mcontext.mdhi;
|
|
||||||
out->mdlo = uc->uc_mcontext.mdlo;
|
|
||||||
|
|
||||||
out->hi[0] = uc->uc_mcontext.hi1;
|
|
||||||
out->hi[1] = uc->uc_mcontext.hi2;
|
|
||||||
out->hi[2] = uc->uc_mcontext.hi3;
|
|
||||||
out->lo[0] = uc->uc_mcontext.lo1;
|
|
||||||
out->lo[1] = uc->uc_mcontext.lo2;
|
|
||||||
out->lo[2] = uc->uc_mcontext.lo3;
|
|
||||||
out->dsp_control = uc->uc_mcontext.dsp;
|
|
||||||
|
|
||||||
out->epc = uc->uc_mcontext.pc;
|
|
||||||
out->badvaddr = 0; // Not reported in signal context.
|
|
||||||
out->status = 0; // Not reported in signal context.
|
|
||||||
out->cause = 0; // Not reported in signal context.
|
|
||||||
|
|
||||||
for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i)
|
|
||||||
out->float_save.regs[i] = uc->uc_mcontext.fpregs.fp_r.fp_dregs[i];
|
|
||||||
|
|
||||||
out->float_save.fpcsr = uc->uc_mcontext.fpc_csr;
|
|
||||||
#if _MIPS_SIM == _ABIO32
|
|
||||||
out->float_save.fir = uc->uc_mcontext.fpc_eir; // Unused.
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H
|
|
||||||
#define CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H
|
|
||||||
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#include <sys/user.h>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/raw_context_cpu.h"
|
|
||||||
#include "common/memory.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Wraps platform-dependent implementations of accessors to ucontext structs.
|
|
||||||
struct UContextReader {
|
|
||||||
static uintptr_t GetStackPointer(const struct ucontext* uc);
|
|
||||||
|
|
||||||
static uintptr_t GetInstructionPointer(const struct ucontext* uc);
|
|
||||||
|
|
||||||
// Juggle a arch-specific ucontext into a minidump format
|
|
||||||
// out: the minidump structure
|
|
||||||
// info: the collection of register structures.
|
|
||||||
#if defined(__i386__) || defined(__x86_64)
|
|
||||||
static void FillCPUContext(RawContextCPU *out, const ucontext *uc,
|
|
||||||
const struct _libc_fpstate* fp);
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
static void FillCPUContext(RawContextCPU *out, const ucontext *uc,
|
|
||||||
const struct fpsimd_context* fpregs);
|
|
||||||
#else
|
|
||||||
static void FillCPUContext(RawContextCPU *out, const ucontext *uc);
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H
|
|
||||||
|
|
@ -1,765 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// The ExceptionHandler object installs signal handlers for a number of
|
|
||||||
// signals. We rely on the signal handler running on the thread which crashed
|
|
||||||
// in order to identify it. This is true of the synchronous signals (SEGV etc),
|
|
||||||
// but not true of ABRT. Thus, if you send ABRT to yourself in a program which
|
|
||||||
// uses ExceptionHandler, you need to use tgkill to direct it to the current
|
|
||||||
// thread.
|
|
||||||
//
|
|
||||||
// The signal flow looks like this:
|
|
||||||
//
|
|
||||||
// SignalHandler (uses a global stack of ExceptionHandler objects to find
|
|
||||||
// | one to handle the signal. If the first rejects it, try
|
|
||||||
// | the second etc...)
|
|
||||||
// V
|
|
||||||
// HandleSignal ----------------------------| (clones a new process which
|
|
||||||
// | | shares an address space with
|
|
||||||
// (wait for cloned | the crashed process. This
|
|
||||||
// process) | allows us to ptrace the crashed
|
|
||||||
// | | process)
|
|
||||||
// V V
|
|
||||||
// (set signal handler to ThreadEntry (static function to bounce
|
|
||||||
// SIG_DFL and rethrow, | back into the object)
|
|
||||||
// killing the crashed |
|
|
||||||
// process) V
|
|
||||||
// DoDump (writes minidump)
|
|
||||||
// |
|
|
||||||
// V
|
|
||||||
// sys_exit
|
|
||||||
//
|
|
||||||
|
|
||||||
// This code is a little fragmented. Different functions of the ExceptionHandler
|
|
||||||
// class run in a number of different contexts. Some of them run in a normal
|
|
||||||
// context and are easy to code, others run in a compromised context and the
|
|
||||||
// restrictions at the top of minidump_writer.cc apply: no libc and use the
|
|
||||||
// alternative malloc. Each function should have comment above it detailing the
|
|
||||||
// context which it runs in.
|
|
||||||
|
|
||||||
#include "client/linux/handler/exception_handler.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <linux/limits.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <sched.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/prctl.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sys/signal.h>
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#include <sys/user.h>
|
|
||||||
#include <ucontext.h>
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <utility>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "common/basictypes.h"
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "common/memory.h"
|
|
||||||
#include "client/linux/log/log.h"
|
|
||||||
#include "client/linux/microdump_writer/microdump_writer.h"
|
|
||||||
#include "client/linux/minidump_writer/linux_dumper.h"
|
|
||||||
#include "client/linux/minidump_writer/minidump_writer.h"
|
|
||||||
#include "common/linux/eintr_wrapper.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
#include "linux/sched.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PR_SET_PTRACER
|
|
||||||
#define PR_SET_PTRACER 0x59616d61
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// A wrapper for the tgkill syscall: send a signal to a specific thread.
|
|
||||||
static int tgkill(pid_t tgid, pid_t tid, int sig) {
|
|
||||||
return syscall(__NR_tgkill, tgid, tid, sig);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
// The list of signals which we consider to be crashes. The default action for
|
|
||||||
// all these signals must be Core (see man 7 signal) because we rethrow the
|
|
||||||
// signal after handling it and expect that it'll be fatal.
|
|
||||||
const int kExceptionSignals[] = {
|
|
||||||
SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS
|
|
||||||
};
|
|
||||||
const int kNumHandledSignals =
|
|
||||||
sizeof(kExceptionSignals) / sizeof(kExceptionSignals[0]);
|
|
||||||
struct sigaction old_handlers[kNumHandledSignals];
|
|
||||||
bool handlers_installed = false;
|
|
||||||
|
|
||||||
// InstallAlternateStackLocked will store the newly installed stack in new_stack
|
|
||||||
// and (if it exists) the previously installed stack in old_stack.
|
|
||||||
stack_t old_stack;
|
|
||||||
stack_t new_stack;
|
|
||||||
bool stack_installed = false;
|
|
||||||
|
|
||||||
// Create an alternative stack to run the signal handlers on. This is done since
|
|
||||||
// the signal might have been caused by a stack overflow.
|
|
||||||
// Runs before crashing: normal context.
|
|
||||||
void InstallAlternateStackLocked() {
|
|
||||||
if (stack_installed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
memset(&old_stack, 0, sizeof(old_stack));
|
|
||||||
memset(&new_stack, 0, sizeof(new_stack));
|
|
||||||
|
|
||||||
// SIGSTKSZ may be too small to prevent the signal handlers from overrunning
|
|
||||||
// the alternative stack. Ensure that the size of the alternative stack is
|
|
||||||
// large enough.
|
|
||||||
static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);
|
|
||||||
|
|
||||||
// Only set an alternative stack if there isn't already one, or if the current
|
|
||||||
// one is too small.
|
|
||||||
if (sys_sigaltstack(NULL, &old_stack) == -1 || !old_stack.ss_sp ||
|
|
||||||
old_stack.ss_size < kSigStackSize) {
|
|
||||||
new_stack.ss_sp = calloc(1, kSigStackSize);
|
|
||||||
new_stack.ss_size = kSigStackSize;
|
|
||||||
|
|
||||||
if (sys_sigaltstack(&new_stack, NULL) == -1) {
|
|
||||||
free(new_stack.ss_sp);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
stack_installed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Runs before crashing: normal context.
|
|
||||||
void RestoreAlternateStackLocked() {
|
|
||||||
if (!stack_installed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
stack_t current_stack;
|
|
||||||
if (sys_sigaltstack(NULL, ¤t_stack) == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Only restore the old_stack if the current alternative stack is the one
|
|
||||||
// installed by the call to InstallAlternateStackLocked.
|
|
||||||
if (current_stack.ss_sp == new_stack.ss_sp) {
|
|
||||||
if (old_stack.ss_sp) {
|
|
||||||
if (sys_sigaltstack(&old_stack, NULL) == -1)
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
stack_t disable_stack;
|
|
||||||
disable_stack.ss_flags = SS_DISABLE;
|
|
||||||
if (sys_sigaltstack(&disable_stack, NULL) == -1)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(new_stack.ss_sp);
|
|
||||||
stack_installed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstallDefaultHandler(int sig) {
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
// Android L+ expose signal and sigaction symbols that override the system
|
|
||||||
// ones. There is a bug in these functions where a request to set the handler
|
|
||||||
// to SIG_DFL is ignored. In that case, an infinite loop is entered as the
|
|
||||||
// signal is repeatedly sent to breakpad's signal handler.
|
|
||||||
// To work around this, directly call the system's sigaction.
|
|
||||||
struct kernel_sigaction sa;
|
|
||||||
memset(&sa, 0, sizeof(sa));
|
|
||||||
sys_sigemptyset(&sa.sa_mask);
|
|
||||||
sa.sa_handler_ = SIG_DFL;
|
|
||||||
sa.sa_flags = SA_RESTART;
|
|
||||||
sys_rt_sigaction(sig, &sa, NULL, sizeof(kernel_sigset_t));
|
|
||||||
#else
|
|
||||||
signal(sig, SIG_DFL);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// The global exception handler stack. This is needed because there may exist
|
|
||||||
// multiple ExceptionHandler instances in a process. Each will have itself
|
|
||||||
// registered in this stack.
|
|
||||||
std::vector<ExceptionHandler*>* g_handler_stack_ = NULL;
|
|
||||||
pthread_mutex_t g_handler_stack_mutex_ = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
|
|
||||||
// sizeof(CrashContext) can be too big w.r.t the size of alternatate stack
|
|
||||||
// for SignalHandler(). Keep the crash context as a .bss field. Exception
|
|
||||||
// handlers are serialized by the |g_handler_stack_mutex_| and at most one at a
|
|
||||||
// time can use |g_crash_context_|.
|
|
||||||
ExceptionHandler::CrashContext g_crash_context_;
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
// Runs before crashing: normal context.
|
|
||||||
ExceptionHandler::ExceptionHandler(const MinidumpDescriptor& descriptor,
|
|
||||||
FilterCallback filter,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context,
|
|
||||||
bool install_handler,
|
|
||||||
const int server_fd)
|
|
||||||
: filter_(filter),
|
|
||||||
callback_(callback),
|
|
||||||
callback_context_(callback_context),
|
|
||||||
minidump_descriptor_(descriptor),
|
|
||||||
crash_handler_(NULL) {
|
|
||||||
if (server_fd >= 0)
|
|
||||||
crash_generation_client_.reset(CrashGenerationClient::TryCreate(server_fd));
|
|
||||||
|
|
||||||
if (!IsOutOfProcess() && !minidump_descriptor_.IsFD() &&
|
|
||||||
!minidump_descriptor_.IsMicrodumpOnConsole())
|
|
||||||
minidump_descriptor_.UpdatePath();
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
if (minidump_descriptor_.IsMicrodumpOnConsole())
|
|
||||||
logger::initializeCrashLogWriter();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pthread_mutex_lock(&g_handler_stack_mutex_);
|
|
||||||
|
|
||||||
// Pre-fault the crash context struct. This is to avoid failing due to OOM
|
|
||||||
// if handling an exception when the process ran out of virtual memory.
|
|
||||||
memset(&g_crash_context_, 0, sizeof(g_crash_context_));
|
|
||||||
|
|
||||||
if (!g_handler_stack_)
|
|
||||||
g_handler_stack_ = new std::vector<ExceptionHandler*>;
|
|
||||||
if (install_handler) {
|
|
||||||
InstallAlternateStackLocked();
|
|
||||||
InstallHandlersLocked();
|
|
||||||
}
|
|
||||||
g_handler_stack_->push_back(this);
|
|
||||||
pthread_mutex_unlock(&g_handler_stack_mutex_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Runs before crashing: normal context.
|
|
||||||
ExceptionHandler::~ExceptionHandler() {
|
|
||||||
pthread_mutex_lock(&g_handler_stack_mutex_);
|
|
||||||
std::vector<ExceptionHandler*>::iterator handler =
|
|
||||||
std::find(g_handler_stack_->begin(), g_handler_stack_->end(), this);
|
|
||||||
g_handler_stack_->erase(handler);
|
|
||||||
if (g_handler_stack_->empty()) {
|
|
||||||
delete g_handler_stack_;
|
|
||||||
g_handler_stack_ = NULL;
|
|
||||||
RestoreAlternateStackLocked();
|
|
||||||
RestoreHandlersLocked();
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&g_handler_stack_mutex_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Runs before crashing: normal context.
|
|
||||||
// static
|
|
||||||
bool ExceptionHandler::InstallHandlersLocked() {
|
|
||||||
if (handlers_installed)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Fail if unable to store all the old handlers.
|
|
||||||
for (int i = 0; i < kNumHandledSignals; ++i) {
|
|
||||||
if (sigaction(kExceptionSignals[i], NULL, &old_handlers[i]) == -1)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sigaction sa;
|
|
||||||
memset(&sa, 0, sizeof(sa));
|
|
||||||
sigemptyset(&sa.sa_mask);
|
|
||||||
|
|
||||||
// Mask all exception signals when we're handling one of them.
|
|
||||||
for (int i = 0; i < kNumHandledSignals; ++i)
|
|
||||||
sigaddset(&sa.sa_mask, kExceptionSignals[i]);
|
|
||||||
|
|
||||||
sa.sa_sigaction = SignalHandler;
|
|
||||||
sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
|
|
||||||
|
|
||||||
for (int i = 0; i < kNumHandledSignals; ++i) {
|
|
||||||
if (sigaction(kExceptionSignals[i], &sa, NULL) == -1) {
|
|
||||||
// At this point it is impractical to back out changes, and so failure to
|
|
||||||
// install a signal is intentionally ignored.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
handlers_installed = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function runs in a compromised context: see the top of the file.
|
|
||||||
// Runs on the crashing thread.
|
|
||||||
// static
|
|
||||||
void ExceptionHandler::RestoreHandlersLocked() {
|
|
||||||
if (!handlers_installed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (int i = 0; i < kNumHandledSignals; ++i) {
|
|
||||||
if (sigaction(kExceptionSignals[i], &old_handlers[i], NULL) == -1) {
|
|
||||||
InstallDefaultHandler(kExceptionSignals[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
handlers_installed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// void ExceptionHandler::set_crash_handler(HandlerCallback callback) {
|
|
||||||
// crash_handler_ = callback;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// This function runs in a compromised context: see the top of the file.
|
|
||||||
// Runs on the crashing thread.
|
|
||||||
// static
|
|
||||||
void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
|
|
||||||
// All the exception signals are blocked at this point.
|
|
||||||
pthread_mutex_lock(&g_handler_stack_mutex_);
|
|
||||||
|
|
||||||
// Sometimes, Breakpad runs inside a process where some other buggy code
|
|
||||||
// saves and restores signal handlers temporarily with 'signal'
|
|
||||||
// instead of 'sigaction'. This loses the SA_SIGINFO flag associated
|
|
||||||
// with this function. As a consequence, the values of 'info' and 'uc'
|
|
||||||
// become totally bogus, generally inducing a crash.
|
|
||||||
//
|
|
||||||
// The following code tries to detect this case. When it does, it
|
|
||||||
// resets the signal handlers with sigaction + SA_SIGINFO and returns.
|
|
||||||
// This forces the signal to be thrown again, but this time the kernel
|
|
||||||
// will call the function with the right arguments.
|
|
||||||
struct sigaction cur_handler;
|
|
||||||
if (sigaction(sig, NULL, &cur_handler) == 0 &&
|
|
||||||
(cur_handler.sa_flags & SA_SIGINFO) == 0) {
|
|
||||||
// Reset signal handler with the right flags.
|
|
||||||
sigemptyset(&cur_handler.sa_mask);
|
|
||||||
sigaddset(&cur_handler.sa_mask, sig);
|
|
||||||
|
|
||||||
cur_handler.sa_sigaction = SignalHandler;
|
|
||||||
cur_handler.sa_flags = SA_ONSTACK | SA_SIGINFO;
|
|
||||||
|
|
||||||
if (sigaction(sig, &cur_handler, NULL) == -1) {
|
|
||||||
// When resetting the handler fails, try to reset the
|
|
||||||
// default one to avoid an infinite loop here.
|
|
||||||
InstallDefaultHandler(sig);
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&g_handler_stack_mutex_);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool handled = false;
|
|
||||||
for (int i = g_handler_stack_->size() - 1; !handled && i >= 0; --i) {
|
|
||||||
handled = (*g_handler_stack_)[i]->HandleSignal(sig, info, uc);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Upon returning from this signal handler, sig will become unmasked and then
|
|
||||||
// it will be retriggered. If one of the ExceptionHandlers handled it
|
|
||||||
// successfully, restore the default handler. Otherwise, restore the
|
|
||||||
// previously installed handler. Then, when the signal is retriggered, it will
|
|
||||||
// be delivered to the appropriate handler.
|
|
||||||
if (handled) {
|
|
||||||
InstallDefaultHandler(sig);
|
|
||||||
} else {
|
|
||||||
RestoreHandlersLocked();
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&g_handler_stack_mutex_);
|
|
||||||
|
|
||||||
// info->si_code <= 0 iff SI_FROMUSER (SI_FROMKERNEL otherwise).
|
|
||||||
if (info->si_code <= 0 || sig == SIGABRT) {
|
|
||||||
// This signal was triggered by somebody sending us the signal with kill().
|
|
||||||
// In order to retrigger it, we have to queue a new signal by calling
|
|
||||||
// kill() ourselves. The special case (si_pid == 0 && sig == SIGABRT) is
|
|
||||||
// due to the kernel sending a SIGABRT from a user request via SysRQ.
|
|
||||||
if (tgkill(getpid(), syscall(__NR_gettid), sig) < 0) {
|
|
||||||
// If we failed to kill ourselves (e.g. because a sandbox disallows us
|
|
||||||
// to do so), we instead resort to terminating our process. This will
|
|
||||||
// result in an incorrect exit code.
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// This was a synchronous signal triggered by a hard fault (e.g. SIGSEGV).
|
|
||||||
// No need to reissue the signal. It will automatically trigger again,
|
|
||||||
// when we return from the signal handler.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ThreadArgument {
|
|
||||||
pid_t pid; // the crashing process
|
|
||||||
const MinidumpDescriptor* minidump_descriptor;
|
|
||||||
ExceptionHandler* handler;
|
|
||||||
const void* context; // a CrashContext structure
|
|
||||||
size_t context_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
// This is the entry function for the cloned process. We are in a compromised
|
|
||||||
// context here: see the top of the file.
|
|
||||||
// static
|
|
||||||
int ExceptionHandler::ThreadEntry(void *arg) {
|
|
||||||
const ThreadArgument *thread_arg = reinterpret_cast<ThreadArgument*>(arg);
|
|
||||||
|
|
||||||
// Block here until the crashing process unblocks us when
|
|
||||||
// we're allowed to use ptrace
|
|
||||||
thread_arg->handler->WaitForContinueSignal();
|
|
||||||
|
|
||||||
return thread_arg->handler->DoDump(thread_arg->pid, thread_arg->context,
|
|
||||||
thread_arg->context_size) == false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function runs in a compromised context: see the top of the file.
|
|
||||||
// Runs on the crashing thread.
|
|
||||||
bool ExceptionHandler::HandleSignal(int sig, siginfo_t* info, void* uc) {
|
|
||||||
if (filter_ && !filter_(callback_context_))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Allow ourselves to be dumped if the signal is trusted.
|
|
||||||
bool signal_trusted = info->si_code > 0;
|
|
||||||
bool signal_pid_trusted = info->si_code == SI_USER ||
|
|
||||||
info->si_code == SI_TKILL;
|
|
||||||
if (signal_trusted || (signal_pid_trusted && info->si_pid == getpid())) {
|
|
||||||
sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill in all the holes in the struct to make Valgrind happy.
|
|
||||||
memset(&g_crash_context_, 0, sizeof(g_crash_context_));
|
|
||||||
memcpy(&g_crash_context_.siginfo, info, sizeof(siginfo_t));
|
|
||||||
memcpy(&g_crash_context_.context, uc, sizeof(struct ucontext));
|
|
||||||
#if defined(__aarch64__)
|
|
||||||
struct ucontext* uc_ptr = (struct ucontext*)uc;
|
|
||||||
struct fpsimd_context* fp_ptr =
|
|
||||||
(struct fpsimd_context*)&uc_ptr->uc_mcontext.__reserved;
|
|
||||||
if (fp_ptr->head.magic == FPSIMD_MAGIC) {
|
|
||||||
memcpy(&g_crash_context_.float_state, fp_ptr,
|
|
||||||
sizeof(g_crash_context_.float_state));
|
|
||||||
}
|
|
||||||
#elif !defined(__ARM_EABI__) && !defined(__mips__)
|
|
||||||
// FP state is not part of user ABI on ARM Linux.
|
|
||||||
// In case of MIPS Linux FP state is already part of struct ucontext
|
|
||||||
// and 'float_state' is not a member of CrashContext.
|
|
||||||
struct ucontext* uc_ptr = (struct ucontext*)uc;
|
|
||||||
if (uc_ptr->uc_mcontext.fpregs) {
|
|
||||||
memcpy(&g_crash_context_.float_state, uc_ptr->uc_mcontext.fpregs,
|
|
||||||
sizeof(g_crash_context_.float_state));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
g_crash_context_.tid = syscall(__NR_gettid);
|
|
||||||
if (crash_handler_ != NULL) {
|
|
||||||
if (crash_handler_(&g_crash_context_, sizeof(g_crash_context_),
|
|
||||||
callback_context_)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return GenerateDump(&g_crash_context_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is a public interface to HandleSignal that allows the client to
|
|
||||||
// generate a crash dump. This function may run in a compromised context.
|
|
||||||
bool ExceptionHandler::SimulateSignalDelivery(int sig) {
|
|
||||||
siginfo_t siginfo = {};
|
|
||||||
// Mimic a trusted signal to allow tracing the process (see
|
|
||||||
// ExceptionHandler::HandleSignal().
|
|
||||||
siginfo.si_code = SI_USER;
|
|
||||||
siginfo.si_pid = getpid();
|
|
||||||
struct ucontext context;
|
|
||||||
getcontext(&context);
|
|
||||||
return HandleSignal(sig, &siginfo, &context);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function may run in a compromised context: see the top of the file.
|
|
||||||
bool ExceptionHandler::GenerateDump(CrashContext *context) {
|
|
||||||
if (IsOutOfProcess())
|
|
||||||
return crash_generation_client_->RequestDump(context, sizeof(*context));
|
|
||||||
|
|
||||||
// Allocating too much stack isn't a problem, and better to err on the side
|
|
||||||
// of caution than smash it into random locations.
|
|
||||||
static const unsigned kChildStackSize = 16000;
|
|
||||||
PageAllocator allocator;
|
|
||||||
uint8_t* stack = reinterpret_cast<uint8_t*>(allocator.Alloc(kChildStackSize));
|
|
||||||
if (!stack)
|
|
||||||
return false;
|
|
||||||
// clone() needs the top-most address. (scrub just to be safe)
|
|
||||||
stack += kChildStackSize;
|
|
||||||
my_memset(stack - 16, 0, 16);
|
|
||||||
|
|
||||||
ThreadArgument thread_arg;
|
|
||||||
thread_arg.handler = this;
|
|
||||||
thread_arg.minidump_descriptor = &minidump_descriptor_;
|
|
||||||
thread_arg.pid = getpid();
|
|
||||||
thread_arg.context = context;
|
|
||||||
thread_arg.context_size = sizeof(*context);
|
|
||||||
|
|
||||||
// We need to explicitly enable ptrace of parent processes on some
|
|
||||||
// kernels, but we need to know the PID of the cloned process before we
|
|
||||||
// can do this. Create a pipe here which we can use to block the
|
|
||||||
// cloned process after creating it, until we have explicitly enabled ptrace
|
|
||||||
if (sys_pipe(fdes) == -1) {
|
|
||||||
// Creating the pipe failed. We'll log an error but carry on anyway,
|
|
||||||
// as we'll probably still get a useful crash report. All that will happen
|
|
||||||
// is the write() and read() calls will fail with EBADF
|
|
||||||
static const char no_pipe_msg[] = "ExceptionHandler::GenerateDump "
|
|
||||||
"sys_pipe failed:";
|
|
||||||
logger::write(no_pipe_msg, sizeof(no_pipe_msg) - 1);
|
|
||||||
logger::write(strerror(errno), strlen(strerror(errno)));
|
|
||||||
logger::write("\n", 1);
|
|
||||||
|
|
||||||
// Ensure fdes[0] and fdes[1] are invalid file descriptors.
|
|
||||||
fdes[0] = fdes[1] = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const pid_t child = sys_clone(
|
|
||||||
ThreadEntry, stack, CLONE_FILES | CLONE_FS | CLONE_UNTRACED,
|
|
||||||
&thread_arg, NULL, NULL, NULL);
|
|
||||||
if (child == -1) {
|
|
||||||
sys_close(fdes[0]);
|
|
||||||
sys_close(fdes[1]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow the child to ptrace us
|
|
||||||
sys_prctl(PR_SET_PTRACER, child, 0, 0, 0);
|
|
||||||
SendContinueSignalToChild();
|
|
||||||
int status;
|
|
||||||
const int r = HANDLE_EINTR(sys_waitpid(child, &status, __WALL));
|
|
||||||
|
|
||||||
sys_close(fdes[0]);
|
|
||||||
sys_close(fdes[1]);
|
|
||||||
|
|
||||||
if (r == -1) {
|
|
||||||
static const char msg[] = "ExceptionHandler::GenerateDump waitpid failed:";
|
|
||||||
logger::write(msg, sizeof(msg) - 1);
|
|
||||||
logger::write(strerror(errno), strlen(strerror(errno)));
|
|
||||||
logger::write("\n", 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool success = r != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0;
|
|
||||||
if (callback_)
|
|
||||||
success = callback_(minidump_descriptor_, callback_context_, success);
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function runs in a compromised context: see the top of the file.
|
|
||||||
void ExceptionHandler::SendContinueSignalToChild() {
|
|
||||||
static const char okToContinueMessage = 'a';
|
|
||||||
int r;
|
|
||||||
r = HANDLE_EINTR(sys_write(fdes[1], &okToContinueMessage, sizeof(char)));
|
|
||||||
if (r == -1) {
|
|
||||||
static const char msg[] = "ExceptionHandler::SendContinueSignalToChild "
|
|
||||||
"sys_write failed:";
|
|
||||||
logger::write(msg, sizeof(msg) - 1);
|
|
||||||
logger::write(strerror(errno), strlen(strerror(errno)));
|
|
||||||
logger::write("\n", 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function runs in a compromised context: see the top of the file.
|
|
||||||
// Runs on the cloned process.
|
|
||||||
void ExceptionHandler::WaitForContinueSignal() {
|
|
||||||
int r;
|
|
||||||
char receivedMessage;
|
|
||||||
r = HANDLE_EINTR(sys_read(fdes[0], &receivedMessage, sizeof(char)));
|
|
||||||
if (r == -1) {
|
|
||||||
static const char msg[] = "ExceptionHandler::WaitForContinueSignal "
|
|
||||||
"sys_read failed:";
|
|
||||||
logger::write(msg, sizeof(msg) - 1);
|
|
||||||
logger::write(strerror(errno), strlen(strerror(errno)));
|
|
||||||
logger::write("\n", 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function runs in a compromised context: see the top of the file.
|
|
||||||
// Runs on the cloned process.
|
|
||||||
bool ExceptionHandler::DoDump(pid_t crashing_process, const void* context,
|
|
||||||
size_t context_size) {
|
|
||||||
if (minidump_descriptor_.IsMicrodumpOnConsole()) {
|
|
||||||
return google_breakpad::WriteMicrodump(
|
|
||||||
crashing_process,
|
|
||||||
context,
|
|
||||||
context_size,
|
|
||||||
mapping_list_,
|
|
||||||
*minidump_descriptor_.microdump_extra_info());
|
|
||||||
}
|
|
||||||
if (minidump_descriptor_.IsFD()) {
|
|
||||||
return google_breakpad::WriteMinidump(minidump_descriptor_.fd(),
|
|
||||||
minidump_descriptor_.size_limit(),
|
|
||||||
crashing_process,
|
|
||||||
context,
|
|
||||||
context_size,
|
|
||||||
mapping_list_,
|
|
||||||
app_memory_list_);
|
|
||||||
}
|
|
||||||
return google_breakpad::WriteMinidump(minidump_descriptor_.path(),
|
|
||||||
minidump_descriptor_.size_limit(),
|
|
||||||
crashing_process,
|
|
||||||
context,
|
|
||||||
context_size,
|
|
||||||
mapping_list_,
|
|
||||||
app_memory_list_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
bool ExceptionHandler::WriteMinidump(const string& dump_path,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context) {
|
|
||||||
MinidumpDescriptor descriptor(dump_path);
|
|
||||||
ExceptionHandler eh(descriptor, NULL, callback, callback_context, false, -1);
|
|
||||||
return eh.WriteMinidump();
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to making using EBP to calculate the desired value for ESP
|
|
||||||
// a valid operation, ensure that this function is compiled with a
|
|
||||||
// frame pointer using the following attribute. This attribute
|
|
||||||
// is supported on GCC but not on clang.
|
|
||||||
#if defined(__i386__) && defined(__GNUC__) && !defined(__clang__)
|
|
||||||
__attribute__((optimize("no-omit-frame-pointer")))
|
|
||||||
#endif
|
|
||||||
bool ExceptionHandler::WriteMinidump() {
|
|
||||||
if (!IsOutOfProcess() && !minidump_descriptor_.IsFD() &&
|
|
||||||
!minidump_descriptor_.IsMicrodumpOnConsole()) {
|
|
||||||
// Update the path of the minidump so that this can be called multiple times
|
|
||||||
// and new files are created for each minidump. This is done before the
|
|
||||||
// generation happens, as clients may want to access the MinidumpDescriptor
|
|
||||||
// after this call to find the exact path to the minidump file.
|
|
||||||
minidump_descriptor_.UpdatePath();
|
|
||||||
} else if (minidump_descriptor_.IsFD()) {
|
|
||||||
// Reposition the FD to its beginning and resize it to get rid of the
|
|
||||||
// previous minidump info.
|
|
||||||
lseek(minidump_descriptor_.fd(), 0, SEEK_SET);
|
|
||||||
ignore_result(ftruncate(minidump_descriptor_.fd(), 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow this process to be dumped.
|
|
||||||
sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
|
|
||||||
|
|
||||||
CrashContext context;
|
|
||||||
int getcontext_result = getcontext(&context.context);
|
|
||||||
if (getcontext_result)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
#if defined(__i386__)
|
|
||||||
// In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
|
|
||||||
// from REG_UESP instead of from REG_ESP. REG_UESP is the user stack pointer
|
|
||||||
// and it only makes sense when running in kernel mode with a different stack
|
|
||||||
// pointer. When WriteMiniDump is called during normal processing REG_UESP is
|
|
||||||
// zero which leads to bad minidump files.
|
|
||||||
if (!context.context.uc_mcontext.gregs[REG_UESP]) {
|
|
||||||
// If REG_UESP is set to REG_ESP then that includes the stack space for the
|
|
||||||
// CrashContext object in this function, which is about 128 KB. Since the
|
|
||||||
// Linux dumper only records 32 KB of stack this would mean that nothing
|
|
||||||
// useful would be recorded. A better option is to set REG_UESP to REG_EBP,
|
|
||||||
// perhaps with a small negative offset in case there is any code that
|
|
||||||
// objects to them being equal.
|
|
||||||
context.context.uc_mcontext.gregs[REG_UESP] =
|
|
||||||
context.context.uc_mcontext.gregs[REG_EBP] - 16;
|
|
||||||
// The stack saving is based off of REG_ESP so it must be set to match the
|
|
||||||
// new REG_UESP.
|
|
||||||
context.context.uc_mcontext.gregs[REG_ESP] =
|
|
||||||
context.context.uc_mcontext.gregs[REG_UESP];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__)
|
|
||||||
// FPU state is not part of ARM EABI ucontext_t.
|
|
||||||
memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
|
|
||||||
sizeof(context.float_state));
|
|
||||||
#endif
|
|
||||||
context.tid = sys_gettid();
|
|
||||||
|
|
||||||
// Add an exception stream to the minidump for better reporting.
|
|
||||||
memset(&context.siginfo, 0, sizeof(context.siginfo));
|
|
||||||
context.siginfo.si_signo = MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED;
|
|
||||||
#if defined(__i386__)
|
|
||||||
context.siginfo.si_addr =
|
|
||||||
reinterpret_cast<void*>(context.context.uc_mcontext.gregs[REG_EIP]);
|
|
||||||
#elif defined(__x86_64__)
|
|
||||||
context.siginfo.si_addr =
|
|
||||||
reinterpret_cast<void*>(context.context.uc_mcontext.gregs[REG_RIP]);
|
|
||||||
#elif defined(__arm__)
|
|
||||||
context.siginfo.si_addr =
|
|
||||||
reinterpret_cast<void*>(context.context.uc_mcontext.arm_pc);
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
context.siginfo.si_addr =
|
|
||||||
reinterpret_cast<void*>(context.context.uc_mcontext.pc);
|
|
||||||
#elif defined(__mips__)
|
|
||||||
context.siginfo.si_addr =
|
|
||||||
reinterpret_cast<void*>(context.context.uc_mcontext.pc);
|
|
||||||
#else
|
|
||||||
#error "This code has not been ported to your platform yet."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return GenerateDump(&context);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExceptionHandler::AddMappingInfo(const string& name,
|
|
||||||
const uint8_t identifier[sizeof(MDGUID)],
|
|
||||||
uintptr_t start_address,
|
|
||||||
size_t mapping_size,
|
|
||||||
size_t file_offset) {
|
|
||||||
MappingInfo info;
|
|
||||||
info.start_addr = start_address;
|
|
||||||
info.size = mapping_size;
|
|
||||||
info.offset = file_offset;
|
|
||||||
strncpy(info.name, name.c_str(), sizeof(info.name) - 1);
|
|
||||||
info.name[sizeof(info.name) - 1] = '\0';
|
|
||||||
|
|
||||||
MappingEntry mapping;
|
|
||||||
mapping.first = info;
|
|
||||||
memcpy(mapping.second, identifier, sizeof(MDGUID));
|
|
||||||
mapping_list_.push_back(mapping);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExceptionHandler::RegisterAppMemory(void* ptr, size_t length) {
|
|
||||||
AppMemoryList::iterator iter =
|
|
||||||
std::find(app_memory_list_.begin(), app_memory_list_.end(), ptr);
|
|
||||||
if (iter != app_memory_list_.end()) {
|
|
||||||
// Don't allow registering the same pointer twice.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
AppMemory app_memory;
|
|
||||||
app_memory.ptr = ptr;
|
|
||||||
app_memory.length = length;
|
|
||||||
app_memory_list_.push_back(app_memory);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExceptionHandler::UnregisterAppMemory(void* ptr) {
|
|
||||||
AppMemoryList::iterator iter =
|
|
||||||
std::find(app_memory_list_.begin(), app_memory_list_.end(), ptr);
|
|
||||||
if (iter != app_memory_list_.end()) {
|
|
||||||
app_memory_list_.erase(iter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
bool ExceptionHandler::WriteMinidumpForChild(pid_t child,
|
|
||||||
pid_t child_blamed_thread,
|
|
||||||
const string& dump_path,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context) {
|
|
||||||
// This function is not run in a compromised context.
|
|
||||||
MinidumpDescriptor descriptor(dump_path);
|
|
||||||
descriptor.UpdatePath();
|
|
||||||
if (!google_breakpad::WriteMinidump(descriptor.path(),
|
|
||||||
child,
|
|
||||||
child_blamed_thread))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return callback ? callback(descriptor, callback_context, true) : true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,278 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
|
||||||
#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "client/linux/crash_generation/crash_generation_client.h"
|
|
||||||
#include "client/linux/handler/minidump_descriptor.h"
|
|
||||||
#include "client/linux/minidump_writer/minidump_writer.h"
|
|
||||||
#include "common/scoped_ptr.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// ExceptionHandler
|
|
||||||
//
|
|
||||||
// ExceptionHandler can write a minidump file when an exception occurs,
|
|
||||||
// or when WriteMinidump() is called explicitly by your program.
|
|
||||||
//
|
|
||||||
// To have the exception handler write minidumps when an uncaught exception
|
|
||||||
// (crash) occurs, you should create an instance early in the execution
|
|
||||||
// of your program, and keep it around for the entire time you want to
|
|
||||||
// have crash handling active (typically, until shutdown).
|
|
||||||
// (NOTE): There should be only be one this kind of exception handler
|
|
||||||
// object per process.
|
|
||||||
//
|
|
||||||
// If you want to write minidumps without installing the exception handler,
|
|
||||||
// you can create an ExceptionHandler with install_handler set to false,
|
|
||||||
// then call WriteMinidump. You can also use this technique if you want to
|
|
||||||
// use different minidump callbacks for different call sites.
|
|
||||||
//
|
|
||||||
// In either case, a callback function is called when a minidump is written,
|
|
||||||
// which receives the full path or file descriptor of the minidump. The
|
|
||||||
// caller can collect and write additional application state to that minidump,
|
|
||||||
// and launch an external crash-reporting application.
|
|
||||||
//
|
|
||||||
// Caller should try to make the callbacks as crash-friendly as possible,
|
|
||||||
// it should avoid use heap memory allocation as much as possible.
|
|
||||||
|
|
||||||
class ExceptionHandler {
|
|
||||||
public:
|
|
||||||
// A callback function to run before Breakpad performs any substantial
|
|
||||||
// processing of an exception. A FilterCallback is called before writing
|
|
||||||
// a minidump. |context| is the parameter supplied by the user as
|
|
||||||
// callback_context when the handler was created.
|
|
||||||
//
|
|
||||||
// If a FilterCallback returns true, Breakpad will continue processing,
|
|
||||||
// attempting to write a minidump. If a FilterCallback returns false,
|
|
||||||
// Breakpad will immediately report the exception as unhandled without
|
|
||||||
// writing a minidump, allowing another handler the opportunity to handle it.
|
|
||||||
typedef bool (*FilterCallback)(void *context);
|
|
||||||
|
|
||||||
// A callback function to run after the minidump has been written.
|
|
||||||
// |descriptor| contains the file descriptor or file path containing the
|
|
||||||
// minidump. |context| is the parameter supplied by the user as
|
|
||||||
// callback_context when the handler was created. |succeeded| indicates
|
|
||||||
// whether a minidump file was successfully written.
|
|
||||||
//
|
|
||||||
// If an exception occurred and the callback returns true, Breakpad will
|
|
||||||
// treat the exception as fully-handled, suppressing any other handlers from
|
|
||||||
// being notified of the exception. If the callback returns false, Breakpad
|
|
||||||
// will treat the exception as unhandled, and allow another handler to handle
|
|
||||||
// it. If there are no other handlers, Breakpad will report the exception to
|
|
||||||
// the system as unhandled, allowing a debugger or native crash dialog the
|
|
||||||
// opportunity to handle the exception. Most callback implementations
|
|
||||||
// should normally return the value of |succeeded|, or when they wish to
|
|
||||||
// not report an exception of handled, false. Callbacks will rarely want to
|
|
||||||
// return true directly (unless |succeeded| is true).
|
|
||||||
typedef bool (*MinidumpCallback)(const MinidumpDescriptor& descriptor,
|
|
||||||
void* context,
|
|
||||||
bool succeeded);
|
|
||||||
|
|
||||||
// In certain cases, a user may wish to handle the generation of the minidump
|
|
||||||
// themselves. In this case, they can install a handler callback which is
|
|
||||||
// called when a crash has occurred. If this function returns true, no other
|
|
||||||
// processing of occurs and the process will shortly be crashed. If this
|
|
||||||
// returns false, the normal processing continues.
|
|
||||||
typedef bool (*HandlerCallback)(const void* crash_context,
|
|
||||||
size_t crash_context_size,
|
|
||||||
void* context);
|
|
||||||
|
|
||||||
// Creates a new ExceptionHandler instance to handle writing minidumps.
|
|
||||||
// Before writing a minidump, the optional |filter| callback will be called.
|
|
||||||
// Its return value determines whether or not Breakpad should write a
|
|
||||||
// minidump. The minidump content will be written to the file path or file
|
|
||||||
// descriptor from |descriptor|, and the optional |callback| is called after
|
|
||||||
// writing the dump file, as described above.
|
|
||||||
// If install_handler is true, then a minidump will be written whenever
|
|
||||||
// an unhandled exception occurs. If it is false, minidumps will only
|
|
||||||
// be written when WriteMinidump is called.
|
|
||||||
// If |server_fd| is valid, the minidump is generated out-of-process. If it
|
|
||||||
// is -1, in-process generation will always be used.
|
|
||||||
ExceptionHandler(const MinidumpDescriptor& descriptor,
|
|
||||||
FilterCallback filter,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context,
|
|
||||||
bool install_handler,
|
|
||||||
const int server_fd);
|
|
||||||
~ExceptionHandler();
|
|
||||||
|
|
||||||
const MinidumpDescriptor& minidump_descriptor() const {
|
|
||||||
return minidump_descriptor_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_minidump_descriptor(const MinidumpDescriptor& descriptor) {
|
|
||||||
minidump_descriptor_ = descriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_crash_handler(HandlerCallback callback) {
|
|
||||||
crash_handler_ = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_crash_generation_client(CrashGenerationClient* client) {
|
|
||||||
crash_generation_client_.reset(client);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes a minidump immediately. This can be used to capture the execution
|
|
||||||
// state independently of a crash.
|
|
||||||
// Returns true on success.
|
|
||||||
// If the ExceptionHandler has been created with a path, a new file is
|
|
||||||
// generated for each minidump. The file path can be retrieved in the
|
|
||||||
// MinidumpDescriptor passed to the MinidumpCallback or by accessing the
|
|
||||||
// MinidumpDescriptor directly from the ExceptionHandler (with
|
|
||||||
// minidump_descriptor()).
|
|
||||||
// If the ExceptionHandler has been created with a file descriptor, the file
|
|
||||||
// descriptor is repositioned to its beginning and the previous generated
|
|
||||||
// minidump is overwritten.
|
|
||||||
// Note that this method is not supposed to be called from a compromised
|
|
||||||
// context as it uses the heap.
|
|
||||||
bool WriteMinidump();
|
|
||||||
|
|
||||||
// Convenience form of WriteMinidump which does not require an
|
|
||||||
// ExceptionHandler instance.
|
|
||||||
static bool WriteMinidump(const string& dump_path,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context);
|
|
||||||
|
|
||||||
// Write a minidump of |child| immediately. This can be used to
|
|
||||||
// capture the execution state of |child| independently of a crash.
|
|
||||||
// Pass a meaningful |child_blamed_thread| to make that thread in
|
|
||||||
// the child process the one from which a crash signature is
|
|
||||||
// extracted.
|
|
||||||
//
|
|
||||||
// WARNING: the return of this function *must* happen before
|
|
||||||
// the code that will eventually reap |child| executes.
|
|
||||||
// Otherwise there's a pernicious race condition in which |child|
|
|
||||||
// exits, is reaped, another process created with its pid, then that
|
|
||||||
// new process dumped.
|
|
||||||
static bool WriteMinidumpForChild(pid_t child,
|
|
||||||
pid_t child_blamed_thread,
|
|
||||||
const string& dump_path,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context);
|
|
||||||
|
|
||||||
// This structure is passed to minidump_writer.h:WriteMinidump via an opaque
|
|
||||||
// blob. It shouldn't be needed in any user code.
|
|
||||||
struct CrashContext {
|
|
||||||
siginfo_t siginfo;
|
|
||||||
pid_t tid; // the crashing thread.
|
|
||||||
struct ucontext context;
|
|
||||||
#if !defined(__ARM_EABI__) && !defined(__mips__)
|
|
||||||
// #ifdef this out because FP state is not part of user ABI for Linux ARM.
|
|
||||||
// In case of MIPS Linux FP state is already part of struct
|
|
||||||
// ucontext so 'float_state' is not required.
|
|
||||||
fpstate_t float_state;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
// Returns whether out-of-process dump generation is used or not.
|
|
||||||
bool IsOutOfProcess() const {
|
|
||||||
return crash_generation_client_.get() != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add information about a memory mapping. This can be used if
|
|
||||||
// a custom library loader is used that maps things in a way
|
|
||||||
// that the linux dumper can't handle by reading the maps file.
|
|
||||||
void AddMappingInfo(const string& name,
|
|
||||||
const uint8_t identifier[sizeof(MDGUID)],
|
|
||||||
uintptr_t start_address,
|
|
||||||
size_t mapping_size,
|
|
||||||
size_t file_offset);
|
|
||||||
|
|
||||||
// Register a block of memory of length bytes starting at address ptr
|
|
||||||
// to be copied to the minidump when a crash happens.
|
|
||||||
void RegisterAppMemory(void* ptr, size_t length);
|
|
||||||
|
|
||||||
// Unregister a block of memory that was registered with RegisterAppMemory.
|
|
||||||
void UnregisterAppMemory(void* ptr);
|
|
||||||
|
|
||||||
// Force signal handling for the specified signal.
|
|
||||||
bool SimulateSignalDelivery(int sig);
|
|
||||||
|
|
||||||
// Report a crash signal from an SA_SIGINFO signal handler.
|
|
||||||
bool HandleSignal(int sig, siginfo_t* info, void* uc);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Save the old signal handlers and install new ones.
|
|
||||||
static bool InstallHandlersLocked();
|
|
||||||
// Restore the old signal handlers.
|
|
||||||
static void RestoreHandlersLocked();
|
|
||||||
|
|
||||||
void PreresolveSymbols();
|
|
||||||
bool GenerateDump(CrashContext *context);
|
|
||||||
void SendContinueSignalToChild();
|
|
||||||
void WaitForContinueSignal();
|
|
||||||
|
|
||||||
static void SignalHandler(int sig, siginfo_t* info, void* uc);
|
|
||||||
static int ThreadEntry(void* arg);
|
|
||||||
bool DoDump(pid_t crashing_process, const void* context,
|
|
||||||
size_t context_size);
|
|
||||||
|
|
||||||
const FilterCallback filter_;
|
|
||||||
const MinidumpCallback callback_;
|
|
||||||
void* const callback_context_;
|
|
||||||
|
|
||||||
scoped_ptr<CrashGenerationClient> crash_generation_client_;
|
|
||||||
|
|
||||||
MinidumpDescriptor minidump_descriptor_;
|
|
||||||
|
|
||||||
// Must be volatile. The compiler is unaware of the code which runs in
|
|
||||||
// the signal handler which reads this variable. Without volatile the
|
|
||||||
// compiler is free to optimise away writes to this variable which it
|
|
||||||
// believes are never read.
|
|
||||||
volatile HandlerCallback crash_handler_;
|
|
||||||
|
|
||||||
// We need to explicitly enable ptrace of parent processes on some
|
|
||||||
// kernels, but we need to know the PID of the cloned process before we
|
|
||||||
// can do this. We create a pipe which we can use to block the
|
|
||||||
// cloned process after creating it, until we have explicitly enabled
|
|
||||||
// ptrace. This is used to store the file descriptors for the pipe
|
|
||||||
int fdes[2];
|
|
||||||
|
|
||||||
// Callers can add extra info about mappings for cases where the
|
|
||||||
// dumper code cannot extract enough information from /proc/<pid>/maps.
|
|
||||||
MappingList mapping_list_;
|
|
||||||
|
|
||||||
// Callers can request additional memory regions to be included in
|
|
||||||
// the dump.
|
|
||||||
AppMemoryList app_memory_list_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
// Copyright 2015 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_
|
|
||||||
#define CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
struct MicrodumpExtraInfo {
|
|
||||||
// Strings pointed to by this struct are not copied, and are
|
|
||||||
// expected to remain valid for the lifetime of the process.
|
|
||||||
const char* build_fingerprint;
|
|
||||||
const char* product_info;
|
|
||||||
const char* gpu_fingerprint;
|
|
||||||
|
|
||||||
MicrodumpExtraInfo()
|
|
||||||
: build_fingerprint(NULL), product_info(NULL), gpu_fingerprint(NULL) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
// Copyright (c) 2012 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "client/linux/handler/minidump_descriptor.h"
|
|
||||||
|
|
||||||
#include "common/linux/guid_creator.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
//static
|
|
||||||
const MinidumpDescriptor::MicrodumpOnConsole
|
|
||||||
MinidumpDescriptor::kMicrodumpOnConsole = {};
|
|
||||||
|
|
||||||
MinidumpDescriptor::MinidumpDescriptor(const MinidumpDescriptor& descriptor)
|
|
||||||
: mode_(descriptor.mode_),
|
|
||||||
fd_(descriptor.fd_),
|
|
||||||
directory_(descriptor.directory_),
|
|
||||||
c_path_(NULL),
|
|
||||||
size_limit_(descriptor.size_limit_),
|
|
||||||
microdump_extra_info_(descriptor.microdump_extra_info_) {
|
|
||||||
// The copy constructor is not allowed to be called on a MinidumpDescriptor
|
|
||||||
// with a valid path_, as getting its c_path_ would require the heap which
|
|
||||||
// can cause problems in compromised environments.
|
|
||||||
assert(descriptor.path_.empty());
|
|
||||||
}
|
|
||||||
|
|
||||||
MinidumpDescriptor& MinidumpDescriptor::operator=(
|
|
||||||
const MinidumpDescriptor& descriptor) {
|
|
||||||
assert(descriptor.path_.empty());
|
|
||||||
|
|
||||||
mode_ = descriptor.mode_;
|
|
||||||
fd_ = descriptor.fd_;
|
|
||||||
directory_ = descriptor.directory_;
|
|
||||||
path_.clear();
|
|
||||||
if (c_path_) {
|
|
||||||
// This descriptor already had a path set, so generate a new one.
|
|
||||||
c_path_ = NULL;
|
|
||||||
UpdatePath();
|
|
||||||
}
|
|
||||||
size_limit_ = descriptor.size_limit_;
|
|
||||||
microdump_extra_info_ = descriptor.microdump_extra_info_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinidumpDescriptor::UpdatePath() {
|
|
||||||
assert(mode_ == kWriteMinidumpToFile && !directory_.empty());
|
|
||||||
|
|
||||||
GUID guid;
|
|
||||||
char guid_str[kGUIDStringLength + 1];
|
|
||||||
if (!CreateGUID(&guid) || !GUIDToString(&guid, guid_str, sizeof(guid_str))) {
|
|
||||||
assert(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
path_.clear();
|
|
||||||
path_ = directory_ + "/" + guid_str + ".dmp";
|
|
||||||
c_path_ = path_.c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,149 +0,0 @@
|
||||||
// Copyright (c) 2012 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_
|
|
||||||
#define CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "client/linux/handler/microdump_extra_info.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
// This class describes how a crash dump should be generated, either:
|
|
||||||
// - Writing a full minidump to a file in a given directory (the actual path,
|
|
||||||
// inside the directory, is determined by this class).
|
|
||||||
// - Writing a full minidump to a given fd.
|
|
||||||
// - Writing a reduced microdump to the console (logcat on Android).
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class MinidumpDescriptor {
|
|
||||||
public:
|
|
||||||
struct MicrodumpOnConsole {};
|
|
||||||
static const MicrodumpOnConsole kMicrodumpOnConsole;
|
|
||||||
|
|
||||||
MinidumpDescriptor()
|
|
||||||
: mode_(kUninitialized),
|
|
||||||
fd_(-1),
|
|
||||||
size_limit_(-1) {}
|
|
||||||
|
|
||||||
explicit MinidumpDescriptor(const string& directory)
|
|
||||||
: mode_(kWriteMinidumpToFile),
|
|
||||||
fd_(-1),
|
|
||||||
directory_(directory),
|
|
||||||
c_path_(NULL),
|
|
||||||
size_limit_(-1) {
|
|
||||||
assert(!directory.empty());
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit MinidumpDescriptor(int fd)
|
|
||||||
: mode_(kWriteMinidumpToFd),
|
|
||||||
fd_(fd),
|
|
||||||
c_path_(NULL),
|
|
||||||
size_limit_(-1) {
|
|
||||||
assert(fd != -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit MinidumpDescriptor(const MicrodumpOnConsole&)
|
|
||||||
: mode_(kWriteMicrodumpToConsole),
|
|
||||||
fd_(-1),
|
|
||||||
size_limit_(-1) {}
|
|
||||||
|
|
||||||
explicit MinidumpDescriptor(const MinidumpDescriptor& descriptor);
|
|
||||||
MinidumpDescriptor& operator=(const MinidumpDescriptor& descriptor);
|
|
||||||
|
|
||||||
static MinidumpDescriptor getMicrodumpDescriptor();
|
|
||||||
|
|
||||||
bool IsFD() const { return mode_ == kWriteMinidumpToFd; }
|
|
||||||
|
|
||||||
int fd() const { return fd_; }
|
|
||||||
|
|
||||||
string directory() const { return directory_; }
|
|
||||||
|
|
||||||
const char* path() const { return c_path_; }
|
|
||||||
|
|
||||||
bool IsMicrodumpOnConsole() const {
|
|
||||||
return mode_ == kWriteMicrodumpToConsole;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Updates the path so it is unique.
|
|
||||||
// Should be called from a normal context: this methods uses the heap.
|
|
||||||
void UpdatePath();
|
|
||||||
|
|
||||||
off_t size_limit() const { return size_limit_; }
|
|
||||||
void set_size_limit(off_t limit) { size_limit_ = limit; }
|
|
||||||
|
|
||||||
MicrodumpExtraInfo* microdump_extra_info() {
|
|
||||||
assert(IsMicrodumpOnConsole());
|
|
||||||
return µdump_extra_info_;
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum DumpMode {
|
|
||||||
kUninitialized = 0,
|
|
||||||
kWriteMinidumpToFile,
|
|
||||||
kWriteMinidumpToFd,
|
|
||||||
kWriteMicrodumpToConsole
|
|
||||||
};
|
|
||||||
|
|
||||||
// Specifies the dump mode (see DumpMode).
|
|
||||||
DumpMode mode_;
|
|
||||||
|
|
||||||
// The file descriptor where the minidump is generated.
|
|
||||||
int fd_;
|
|
||||||
|
|
||||||
// The directory where the minidump should be generated.
|
|
||||||
string directory_;
|
|
||||||
|
|
||||||
// The full path to the generated minidump.
|
|
||||||
string path_;
|
|
||||||
|
|
||||||
// The C string of |path_|. Precomputed so it can be access from a compromised
|
|
||||||
// context.
|
|
||||||
const char* c_path_;
|
|
||||||
|
|
||||||
off_t size_limit_;
|
|
||||||
|
|
||||||
// The extra microdump data (e.g. product name/version, build
|
|
||||||
// fingerprint, gpu fingerprint) that should be appended to the dump
|
|
||||||
// (microdump only). Microdumps don't have the ability of appending
|
|
||||||
// extra metadata after the dump is generated (as opposite to
|
|
||||||
// minidumps MIME fields), therefore the extra data must be provided
|
|
||||||
// upfront. Any memory pointed to by members of the
|
|
||||||
// MicrodumpExtraInfo struct must be valid for the lifetime of the
|
|
||||||
// process (read: the caller has to guarantee that it is stored in
|
|
||||||
// global static storage.)
|
|
||||||
MicrodumpExtraInfo microdump_extra_info_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
// Copyright (c) 2012 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include "client/linux/log/log.h"
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
#include <android/log.h>
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#else
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace logger {
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
// __android_log_buf_write() is not exported in the NDK and is being used by
|
|
||||||
// dynamic runtime linking. Its declaration is taken from Android's
|
|
||||||
// system/core/include/log/log.h.
|
|
||||||
using AndroidLogBufferWriteFunc = int (*)(int bufID, int prio, const char *tag,
|
|
||||||
const char *text);
|
|
||||||
const int kAndroidCrashLogId = 4; // From LOG_ID_CRASH in log.h.
|
|
||||||
const char kAndroidLogTag[] = "google-breakpad";
|
|
||||||
|
|
||||||
bool g_crash_log_initialized = false;
|
|
||||||
AndroidLogBufferWriteFunc g_android_log_buf_write = nullptr;
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
void initializeCrashLogWriter() {
|
|
||||||
if (g_crash_log_initialized)
|
|
||||||
return;
|
|
||||||
g_android_log_buf_write = reinterpret_cast<AndroidLogBufferWriteFunc>(
|
|
||||||
dlsym(RTLD_DEFAULT, "__android_log_buf_write"));
|
|
||||||
g_crash_log_initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int writeToCrashLog(const char* buf) {
|
|
||||||
// Try writing to the crash log ring buffer. If not available, fall back to
|
|
||||||
// the standard log buffer.
|
|
||||||
if (g_android_log_buf_write) {
|
|
||||||
return g_android_log_buf_write(kAndroidCrashLogId, ANDROID_LOG_FATAL,
|
|
||||||
kAndroidLogTag, buf);
|
|
||||||
}
|
|
||||||
return __android_log_write(ANDROID_LOG_FATAL, kAndroidLogTag, buf);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int write(const char* buf, size_t nbytes) {
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
return __android_log_write(ANDROID_LOG_WARN, kAndroidLogTag, buf);
|
|
||||||
#else
|
|
||||||
return sys_write(2, buf, nbytes);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace logger
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_LOG_LOG_H_
|
|
||||||
#define CLIENT_LINUX_LOG_LOG_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
namespace logger {
|
|
||||||
|
|
||||||
int write(const char* buf, size_t nbytes);
|
|
||||||
|
|
||||||
// In the case of Android the log can be written to the default system log
|
|
||||||
// (default behavior of write() above, or to the crash log (see
|
|
||||||
// writeToCrashLog() below).
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
|
|
||||||
// The logger must be initialized in a non-compromised context.
|
|
||||||
void initializeCrashLogWriter();
|
|
||||||
|
|
||||||
// Once initialized, writeToCrashLog is safe to use in a compromised context,
|
|
||||||
// even if the initialization failed, in which case this will silently fall
|
|
||||||
// back on write().
|
|
||||||
int writeToCrashLog(const char* buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace logger
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_LOG_LOG_H_
|
|
||||||
|
|
@ -1,439 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// This translation unit generates microdumps into the console (logcat on
|
|
||||||
// Android). See crbug.com/410294 for more info and design docs.
|
|
||||||
|
|
||||||
#include "client/linux/microdump_writer/microdump_writer.h"
|
|
||||||
|
|
||||||
#include <sys/utsname.h>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/thread_info.h"
|
|
||||||
#include "client/linux/dump_writer_common/ucontext_reader.h"
|
|
||||||
#include "client/linux/handler/exception_handler.h"
|
|
||||||
#include "client/linux/handler/microdump_extra_info.h"
|
|
||||||
#include "client/linux/log/log.h"
|
|
||||||
#include "client/linux/minidump_writer/linux_ptrace_dumper.h"
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
using google_breakpad::ExceptionHandler;
|
|
||||||
using google_breakpad::LinuxDumper;
|
|
||||||
using google_breakpad::LinuxPtraceDumper;
|
|
||||||
using google_breakpad::MappingInfo;
|
|
||||||
using google_breakpad::MappingList;
|
|
||||||
using google_breakpad::MicrodumpExtraInfo;
|
|
||||||
using google_breakpad::RawContextCPU;
|
|
||||||
using google_breakpad::ThreadInfo;
|
|
||||||
using google_breakpad::UContextReader;
|
|
||||||
|
|
||||||
const size_t kLineBufferSize = 2048;
|
|
||||||
|
|
||||||
class MicrodumpWriter {
|
|
||||||
public:
|
|
||||||
MicrodumpWriter(const ExceptionHandler::CrashContext* context,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const MicrodumpExtraInfo& microdump_extra_info,
|
|
||||||
LinuxDumper* dumper)
|
|
||||||
: ucontext_(context ? &context->context : NULL),
|
|
||||||
#if !defined(__ARM_EABI__) && !defined(__mips__)
|
|
||||||
float_state_(context ? &context->float_state : NULL),
|
|
||||||
#endif
|
|
||||||
dumper_(dumper),
|
|
||||||
mapping_list_(mappings),
|
|
||||||
microdump_extra_info_(microdump_extra_info),
|
|
||||||
log_line_(NULL) {
|
|
||||||
log_line_ = reinterpret_cast<char*>(Alloc(kLineBufferSize));
|
|
||||||
if (log_line_)
|
|
||||||
log_line_[0] = '\0'; // Clear out the log line buffer.
|
|
||||||
}
|
|
||||||
|
|
||||||
~MicrodumpWriter() { dumper_->ThreadsResume(); }
|
|
||||||
|
|
||||||
bool Init() {
|
|
||||||
// In the exceptional case where the system was out of memory and there
|
|
||||||
// wasn't even room to allocate the line buffer, bail out. There is nothing
|
|
||||||
// useful we can possibly achieve without the ability to Log. At least let's
|
|
||||||
// try to not crash.
|
|
||||||
if (!dumper_->Init() || !log_line_)
|
|
||||||
return false;
|
|
||||||
return dumper_->ThreadsSuspend() && dumper_->LateInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Dump() {
|
|
||||||
bool success;
|
|
||||||
LogLine("-----BEGIN BREAKPAD MICRODUMP-----");
|
|
||||||
DumpProductInformation();
|
|
||||||
DumpOSInformation();
|
|
||||||
DumpGPUInformation();
|
|
||||||
success = DumpCrashingThread();
|
|
||||||
if (success)
|
|
||||||
success = DumpMappings();
|
|
||||||
LogLine("-----END BREAKPAD MICRODUMP-----");
|
|
||||||
dumper_->ThreadsResume();
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Writes one line to the system log.
|
|
||||||
void LogLine(const char* msg) {
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
logger::writeToCrashLog(msg);
|
|
||||||
#else
|
|
||||||
logger::write(msg, my_strlen(msg));
|
|
||||||
logger::write("\n", 1);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stages the given string in the current line buffer.
|
|
||||||
void LogAppend(const char* str) {
|
|
||||||
my_strlcat(log_line_, str, kLineBufferSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
// As above (required to take precedence over template specialization below).
|
|
||||||
void LogAppend(char* str) {
|
|
||||||
LogAppend(const_cast<const char*>(str));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stages the hex repr. of the given int type in the current line buffer.
|
|
||||||
template<typename T>
|
|
||||||
void LogAppend(T value) {
|
|
||||||
// Make enough room to hex encode the largest int type + NUL.
|
|
||||||
static const char HEX[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
|
||||||
'A', 'B', 'C', 'D', 'E', 'F'};
|
|
||||||
char hexstr[sizeof(T) * 2 + 1];
|
|
||||||
for (int i = sizeof(T) * 2 - 1; i >= 0; --i, value >>= 4)
|
|
||||||
hexstr[i] = HEX[static_cast<uint8_t>(value) & 0x0F];
|
|
||||||
hexstr[sizeof(T) * 2] = '\0';
|
|
||||||
LogAppend(hexstr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stages the buffer content hex-encoded in the current line buffer.
|
|
||||||
void LogAppend(const void* buf, size_t length) {
|
|
||||||
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(buf);
|
|
||||||
for (size_t i = 0; i < length; ++i, ++ptr)
|
|
||||||
LogAppend(*ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes out the current line buffer on the system log.
|
|
||||||
void LogCommitLine() {
|
|
||||||
LogLine(log_line_);
|
|
||||||
my_strlcpy(log_line_, "", kLineBufferSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DumpProductInformation() {
|
|
||||||
LogAppend("V ");
|
|
||||||
if (microdump_extra_info_.product_info) {
|
|
||||||
LogAppend(microdump_extra_info_.product_info);
|
|
||||||
} else {
|
|
||||||
LogAppend("UNKNOWN:0.0.0.0");
|
|
||||||
}
|
|
||||||
LogCommitLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DumpOSInformation() {
|
|
||||||
const uint8_t n_cpus = static_cast<uint8_t>(sysconf(_SC_NPROCESSORS_CONF));
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
const char kOSId[] = "A";
|
|
||||||
#else
|
|
||||||
const char kOSId[] = "L";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Dump the runtime architecture. On multiarch devices it might not match the
|
|
||||||
// hw architecture (the one returned by uname()), for instance in the case of
|
|
||||||
// a 32-bit app running on a aarch64 device.
|
|
||||||
#if defined(__aarch64__)
|
|
||||||
const char kArch[] = "arm64";
|
|
||||||
#elif defined(__ARMEL__)
|
|
||||||
const char kArch[] = "arm";
|
|
||||||
#elif defined(__x86_64__)
|
|
||||||
const char kArch[] = "x86_64";
|
|
||||||
#elif defined(__i386__)
|
|
||||||
const char kArch[] = "x86";
|
|
||||||
#elif defined(__mips__)
|
|
||||||
# if _MIPS_SIM == _ABIO32
|
|
||||||
const char kArch[] = "mips";
|
|
||||||
# elif _MIPS_SIM == _ABI64
|
|
||||||
const char kArch[] = "mips64";
|
|
||||||
# else
|
|
||||||
# error "This mips ABI is currently not supported (n32)"
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#error "This code has not been ported to your platform yet"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LogAppend("O ");
|
|
||||||
LogAppend(kOSId);
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(kArch);
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(n_cpus);
|
|
||||||
LogAppend(" ");
|
|
||||||
|
|
||||||
// Dump the HW architecture (e.g., armv7l, aarch64).
|
|
||||||
struct utsname uts;
|
|
||||||
const bool has_uts_info = (uname(&uts) == 0);
|
|
||||||
const char* hwArch = has_uts_info ? uts.machine : "unknown_hw_arch";
|
|
||||||
LogAppend(hwArch);
|
|
||||||
LogAppend(" ");
|
|
||||||
|
|
||||||
// If the client has attached a build fingerprint to the MinidumpDescriptor
|
|
||||||
// use that one. Otherwise try to get some basic info from uname().
|
|
||||||
if (microdump_extra_info_.build_fingerprint) {
|
|
||||||
LogAppend(microdump_extra_info_.build_fingerprint);
|
|
||||||
} else if (has_uts_info) {
|
|
||||||
LogAppend(uts.release);
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(uts.version);
|
|
||||||
} else {
|
|
||||||
LogAppend("no build fingerprint available");
|
|
||||||
}
|
|
||||||
LogCommitLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DumpGPUInformation() {
|
|
||||||
LogAppend("G ");
|
|
||||||
if (microdump_extra_info_.gpu_fingerprint) {
|
|
||||||
LogAppend(microdump_extra_info_.gpu_fingerprint);
|
|
||||||
} else {
|
|
||||||
LogAppend("UNKNOWN");
|
|
||||||
}
|
|
||||||
LogCommitLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DumpThreadStack(uint32_t thread_id,
|
|
||||||
uintptr_t stack_pointer,
|
|
||||||
int max_stack_len,
|
|
||||||
uint8_t** stack_copy) {
|
|
||||||
*stack_copy = NULL;
|
|
||||||
const void* stack;
|
|
||||||
size_t stack_len;
|
|
||||||
|
|
||||||
if (!dumper_->GetStackInfo(&stack, &stack_len, stack_pointer)) {
|
|
||||||
// The stack pointer might not be available. In this case we don't hard
|
|
||||||
// fail, just produce a (almost useless) microdump w/o a stack section.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
LogAppend("S 0 ");
|
|
||||||
LogAppend(stack_pointer);
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(reinterpret_cast<uintptr_t>(stack));
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(stack_len);
|
|
||||||
LogCommitLine();
|
|
||||||
|
|
||||||
if (max_stack_len >= 0 &&
|
|
||||||
stack_len > static_cast<unsigned int>(max_stack_len)) {
|
|
||||||
stack_len = max_stack_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
*stack_copy = reinterpret_cast<uint8_t*>(Alloc(stack_len));
|
|
||||||
dumper_->CopyFromProcess(*stack_copy, thread_id, stack, stack_len);
|
|
||||||
|
|
||||||
// Dump the content of the stack, splicing it into chunks which size is
|
|
||||||
// compatible with the max logcat line size (see LOGGER_ENTRY_MAX_PAYLOAD).
|
|
||||||
const size_t STACK_DUMP_CHUNK_SIZE = 384;
|
|
||||||
for (size_t stack_off = 0; stack_off < stack_len;
|
|
||||||
stack_off += STACK_DUMP_CHUNK_SIZE) {
|
|
||||||
LogAppend("S ");
|
|
||||||
LogAppend(reinterpret_cast<uintptr_t>(stack) + stack_off);
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(*stack_copy + stack_off,
|
|
||||||
std::min(STACK_DUMP_CHUNK_SIZE, stack_len - stack_off));
|
|
||||||
LogCommitLine();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write information about the crashing thread.
|
|
||||||
bool DumpCrashingThread() {
|
|
||||||
const unsigned num_threads = dumper_->threads().size();
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < num_threads; ++i) {
|
|
||||||
MDRawThread thread;
|
|
||||||
my_memset(&thread, 0, sizeof(thread));
|
|
||||||
thread.thread_id = dumper_->threads()[i];
|
|
||||||
|
|
||||||
// Dump only the crashing thread.
|
|
||||||
if (static_cast<pid_t>(thread.thread_id) != dumper_->crash_thread())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
assert(ucontext_);
|
|
||||||
assert(!dumper_->IsPostMortem());
|
|
||||||
|
|
||||||
uint8_t* stack_copy;
|
|
||||||
const uintptr_t stack_ptr = UContextReader::GetStackPointer(ucontext_);
|
|
||||||
if (!DumpThreadStack(thread.thread_id, stack_ptr, -1, &stack_copy))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
RawContextCPU cpu;
|
|
||||||
my_memset(&cpu, 0, sizeof(RawContextCPU));
|
|
||||||
#if !defined(__ARM_EABI__) && !defined(__mips__)
|
|
||||||
UContextReader::FillCPUContext(&cpu, ucontext_, float_state_);
|
|
||||||
#else
|
|
||||||
UContextReader::FillCPUContext(&cpu, ucontext_);
|
|
||||||
#endif
|
|
||||||
DumpCPUState(&cpu);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DumpCPUState(RawContextCPU* cpu) {
|
|
||||||
LogAppend("C ");
|
|
||||||
LogAppend(cpu, sizeof(*cpu));
|
|
||||||
LogCommitLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is caller-provided information about this mapping
|
|
||||||
// in the mapping_list_ list, return true. Otherwise, return false.
|
|
||||||
bool HaveMappingInfo(const MappingInfo& mapping) {
|
|
||||||
for (MappingList::const_iterator iter = mapping_list_.begin();
|
|
||||||
iter != mapping_list_.end();
|
|
||||||
++iter) {
|
|
||||||
// Ignore any mappings that are wholly contained within
|
|
||||||
// mappings in the mapping_info_ list.
|
|
||||||
if (mapping.start_addr >= iter->first.start_addr &&
|
|
||||||
(mapping.start_addr + mapping.size) <=
|
|
||||||
(iter->first.start_addr + iter->first.size)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dump information about the provided |mapping|. If |identifier| is non-NULL,
|
|
||||||
// use it instead of calculating a file ID from the mapping.
|
|
||||||
void DumpModule(const MappingInfo& mapping,
|
|
||||||
bool member,
|
|
||||||
unsigned int mapping_id,
|
|
||||||
const uint8_t* identifier) {
|
|
||||||
MDGUID module_identifier;
|
|
||||||
if (identifier) {
|
|
||||||
// GUID was provided by caller.
|
|
||||||
my_memcpy(&module_identifier, identifier, sizeof(MDGUID));
|
|
||||||
} else {
|
|
||||||
dumper_->ElfFileIdentifierForMapping(
|
|
||||||
mapping,
|
|
||||||
member,
|
|
||||||
mapping_id,
|
|
||||||
reinterpret_cast<uint8_t*>(&module_identifier));
|
|
||||||
}
|
|
||||||
|
|
||||||
char file_name[NAME_MAX];
|
|
||||||
char file_path[NAME_MAX];
|
|
||||||
dumper_->GetMappingEffectiveNameAndPath(
|
|
||||||
mapping, file_path, sizeof(file_path), file_name, sizeof(file_name));
|
|
||||||
|
|
||||||
LogAppend("M ");
|
|
||||||
LogAppend(static_cast<uintptr_t>(mapping.start_addr));
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(mapping.offset);
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(mapping.size);
|
|
||||||
LogAppend(" ");
|
|
||||||
LogAppend(module_identifier.data1);
|
|
||||||
LogAppend(module_identifier.data2);
|
|
||||||
LogAppend(module_identifier.data3);
|
|
||||||
LogAppend(module_identifier.data4[0]);
|
|
||||||
LogAppend(module_identifier.data4[1]);
|
|
||||||
LogAppend(module_identifier.data4[2]);
|
|
||||||
LogAppend(module_identifier.data4[3]);
|
|
||||||
LogAppend(module_identifier.data4[4]);
|
|
||||||
LogAppend(module_identifier.data4[5]);
|
|
||||||
LogAppend(module_identifier.data4[6]);
|
|
||||||
LogAppend(module_identifier.data4[7]);
|
|
||||||
LogAppend("0 "); // Age is always 0 on Linux.
|
|
||||||
LogAppend(file_name);
|
|
||||||
LogCommitLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write information about the mappings in effect.
|
|
||||||
bool DumpMappings() {
|
|
||||||
// First write all the mappings from the dumper
|
|
||||||
for (unsigned i = 0; i < dumper_->mappings().size(); ++i) {
|
|
||||||
const MappingInfo& mapping = *dumper_->mappings()[i];
|
|
||||||
if (mapping.name[0] == 0 || // only want modules with filenames.
|
|
||||||
!mapping.exec || // only want executable mappings.
|
|
||||||
mapping.size < 4096 || // too small to get a signature for.
|
|
||||||
HaveMappingInfo(mapping)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
DumpModule(mapping, true, i, NULL);
|
|
||||||
}
|
|
||||||
// Next write all the mappings provided by the caller
|
|
||||||
for (MappingList::const_iterator iter = mapping_list_.begin();
|
|
||||||
iter != mapping_list_.end();
|
|
||||||
++iter) {
|
|
||||||
DumpModule(iter->first, false, 0, iter->second);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); }
|
|
||||||
|
|
||||||
const struct ucontext* const ucontext_;
|
|
||||||
#if !defined(__ARM_EABI__) && !defined(__mips__)
|
|
||||||
const google_breakpad::fpstate_t* const float_state_;
|
|
||||||
#endif
|
|
||||||
LinuxDumper* dumper_;
|
|
||||||
const MappingList& mapping_list_;
|
|
||||||
const MicrodumpExtraInfo microdump_extra_info_;
|
|
||||||
char* log_line_;
|
|
||||||
};
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
bool WriteMicrodump(pid_t crashing_process,
|
|
||||||
const void* blob,
|
|
||||||
size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const MicrodumpExtraInfo& microdump_extra_info) {
|
|
||||||
LinuxPtraceDumper dumper(crashing_process);
|
|
||||||
const ExceptionHandler::CrashContext* context = NULL;
|
|
||||||
if (blob) {
|
|
||||||
if (blob_size != sizeof(ExceptionHandler::CrashContext))
|
|
||||||
return false;
|
|
||||||
context = reinterpret_cast<const ExceptionHandler::CrashContext*>(blob);
|
|
||||||
dumper.set_crash_address(
|
|
||||||
reinterpret_cast<uintptr_t>(context->siginfo.si_addr));
|
|
||||||
dumper.set_crash_signal(context->siginfo.si_signo);
|
|
||||||
dumper.set_crash_thread(context->tid);
|
|
||||||
}
|
|
||||||
MicrodumpWriter writer(context, mappings, microdump_extra_info, &dumper);
|
|
||||||
if (!writer.Init())
|
|
||||||
return false;
|
|
||||||
return writer.Dump();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/mapping_info.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
struct MicrodumpExtraInfo;
|
|
||||||
|
|
||||||
// Writes a microdump (a reduced dump containing only the state of the crashing
|
|
||||||
// thread) on the console (logcat on Android). These functions do not malloc nor
|
|
||||||
// use libc functions which may. Thus, it can be used in contexts where the
|
|
||||||
// state of the heap may be corrupt.
|
|
||||||
// Args:
|
|
||||||
// crashing_process: the pid of the crashing process. This must be trusted.
|
|
||||||
// blob: a blob of data from the crashing process. See exception_handler.h
|
|
||||||
// blob_size: the length of |blob| in bytes.
|
|
||||||
// mappings: a list of additional mappings provided by the application.
|
|
||||||
// build_fingerprint: a (optional) C string which determines the OS
|
|
||||||
// build fingerprint (e.g., aosp/occam/mako:5.1.1/LMY47W/1234:eng/dev-keys).
|
|
||||||
// product_info: a (optional) C string which determines the product name and
|
|
||||||
// version (e.g., WebView:42.0.2311.136).
|
|
||||||
//
|
|
||||||
// Returns true iff successful.
|
|
||||||
bool WriteMicrodump(pid_t crashing_process,
|
|
||||||
const void* blob,
|
|
||||||
size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const MicrodumpExtraInfo& microdump_extra_info);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
||||||
// Copyright (c) 2013, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Helper class used to model a set of CPUs, as read from sysfs
|
|
||||||
// files like /sys/devices/system/cpu/present
|
|
||||||
// See See http://www.kernel.org/doc/Documentation/cputopology.txt
|
|
||||||
class CpuSet {
|
|
||||||
public:
|
|
||||||
// The maximum number of supported CPUs.
|
|
||||||
static const size_t kMaxCpus = 1024;
|
|
||||||
|
|
||||||
CpuSet() {
|
|
||||||
my_memset(mask_, 0, sizeof(mask_));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse a sysfs file to extract the corresponding CPU set.
|
|
||||||
bool ParseSysFile(int fd) {
|
|
||||||
char buffer[512];
|
|
||||||
int ret = sys_read(fd, buffer, sizeof(buffer)-1);
|
|
||||||
if (ret < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
buffer[ret] = '\0';
|
|
||||||
|
|
||||||
// Expected format: comma-separated list of items, where each
|
|
||||||
// item can be a decimal integer, or two decimal integers separated
|
|
||||||
// by a dash.
|
|
||||||
// E.g.:
|
|
||||||
// 0
|
|
||||||
// 0,1,2,3
|
|
||||||
// 0-3
|
|
||||||
// 1,10-23
|
|
||||||
const char* p = buffer;
|
|
||||||
const char* p_end = p + ret;
|
|
||||||
while (p < p_end) {
|
|
||||||
// Skip leading space, if any
|
|
||||||
while (p < p_end && my_isspace(*p))
|
|
||||||
p++;
|
|
||||||
|
|
||||||
// Find start and size of current item.
|
|
||||||
const char* item = p;
|
|
||||||
size_t item_len = static_cast<size_t>(p_end - p);
|
|
||||||
const char* item_next =
|
|
||||||
static_cast<const char*>(my_memchr(p, ',', item_len));
|
|
||||||
if (item_next != NULL) {
|
|
||||||
p = item_next + 1;
|
|
||||||
item_len = static_cast<size_t>(item_next - item);
|
|
||||||
} else {
|
|
||||||
p = p_end;
|
|
||||||
item_next = p_end;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore trailing spaces.
|
|
||||||
while (item_next > item && my_isspace(item_next[-1]))
|
|
||||||
item_next--;
|
|
||||||
|
|
||||||
// skip empty items.
|
|
||||||
if (item_next == item)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// read first decimal value.
|
|
||||||
uintptr_t start = 0;
|
|
||||||
const char* next = my_read_decimal_ptr(&start, item);
|
|
||||||
uintptr_t end = start;
|
|
||||||
if (*next == '-')
|
|
||||||
my_read_decimal_ptr(&end, next+1);
|
|
||||||
|
|
||||||
while (start <= end)
|
|
||||||
SetBit(start++);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Intersect this CPU set with another one.
|
|
||||||
void IntersectWith(const CpuSet& other) {
|
|
||||||
for (size_t nn = 0; nn < kMaskWordCount; ++nn)
|
|
||||||
mask_[nn] &= other.mask_[nn];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the number of CPUs in this set.
|
|
||||||
int GetCount() {
|
|
||||||
int result = 0;
|
|
||||||
for (size_t nn = 0; nn < kMaskWordCount; ++nn) {
|
|
||||||
result += __builtin_popcount(mask_[nn]);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void SetBit(uintptr_t index) {
|
|
||||||
size_t nn = static_cast<size_t>(index);
|
|
||||||
if (nn < kMaxCpus)
|
|
||||||
mask_[nn / kMaskWordBits] |= (1U << (nn % kMaskWordBits));
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef uint32_t MaskWordType;
|
|
||||||
static const size_t kMaskWordBits = 8*sizeof(MaskWordType);
|
|
||||||
static const size_t kMaskWordCount =
|
|
||||||
(kMaxCpus + kMaskWordBits - 1) / kMaskWordBits;
|
|
||||||
|
|
||||||
MaskWordType mask_[kMaskWordCount];
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class for enumerating a directory without using diropen/readdir or other
|
|
||||||
// functions which may allocate memory.
|
|
||||||
class DirectoryReader {
|
|
||||||
public:
|
|
||||||
DirectoryReader(int fd)
|
|
||||||
: fd_(fd),
|
|
||||||
buf_used_(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the next entry from the directory
|
|
||||||
// name: (output) the NUL terminated entry name
|
|
||||||
//
|
|
||||||
// Returns true iff successful (false on EOF).
|
|
||||||
//
|
|
||||||
// After calling this, one must call |PopEntry| otherwise you'll get the same
|
|
||||||
// entry over and over.
|
|
||||||
bool GetNextEntry(const char** name) {
|
|
||||||
struct kernel_dirent* const dent =
|
|
||||||
reinterpret_cast<kernel_dirent*>(buf_);
|
|
||||||
|
|
||||||
if (buf_used_ == 0) {
|
|
||||||
// need to read more entries.
|
|
||||||
const int n = sys_getdents(fd_, dent, sizeof(buf_));
|
|
||||||
if (n < 0) {
|
|
||||||
return false;
|
|
||||||
} else if (n == 0) {
|
|
||||||
hit_eof_ = true;
|
|
||||||
} else {
|
|
||||||
buf_used_ += n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buf_used_ == 0 && hit_eof_)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
assert(buf_used_ > 0);
|
|
||||||
|
|
||||||
*name = dent->d_name;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PopEntry() {
|
|
||||||
if (!buf_used_)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const struct kernel_dirent* const dent =
|
|
||||||
reinterpret_cast<kernel_dirent*>(buf_);
|
|
||||||
|
|
||||||
buf_used_ -= dent->d_reclen;
|
|
||||||
my_memmove(buf_, buf_ + dent->d_reclen, buf_used_);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const int fd_;
|
|
||||||
bool hit_eof_;
|
|
||||||
unsigned buf_used_;
|
|
||||||
uint8_t buf_[sizeof(struct kernel_dirent) + NAME_MAX + 1];
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class for reading a file, line by line, without using fopen/fgets or other
|
|
||||||
// functions which may allocate memory.
|
|
||||||
class LineReader {
|
|
||||||
public:
|
|
||||||
LineReader(int fd)
|
|
||||||
: fd_(fd),
|
|
||||||
hit_eof_(false),
|
|
||||||
buf_used_(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// The maximum length of a line.
|
|
||||||
static const size_t kMaxLineLen = 512;
|
|
||||||
|
|
||||||
// Return the next line from the file.
|
|
||||||
// line: (output) a pointer to the start of the line. The line is NUL
|
|
||||||
// terminated.
|
|
||||||
// len: (output) the length of the line (not inc the NUL byte)
|
|
||||||
//
|
|
||||||
// Returns true iff successful (false on EOF).
|
|
||||||
//
|
|
||||||
// One must call |PopLine| after this function, otherwise you'll continue to
|
|
||||||
// get the same line over and over.
|
|
||||||
bool GetNextLine(const char **line, unsigned *len) {
|
|
||||||
for (;;) {
|
|
||||||
if (buf_used_ == 0 && hit_eof_)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < buf_used_; ++i) {
|
|
||||||
if (buf_[i] == '\n' || buf_[i] == 0) {
|
|
||||||
buf_[i] = 0;
|
|
||||||
*len = i;
|
|
||||||
*line = buf_;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buf_used_ == sizeof(buf_)) {
|
|
||||||
// we scanned the whole buffer and didn't find an end-of-line marker.
|
|
||||||
// This line is too long to process.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We didn't find any end-of-line terminators in the buffer. However, if
|
|
||||||
// this is the last line in the file it might not have one:
|
|
||||||
if (hit_eof_) {
|
|
||||||
assert(buf_used_);
|
|
||||||
// There's room for the NUL because of the buf_used_ == sizeof(buf_)
|
|
||||||
// check above.
|
|
||||||
buf_[buf_used_] = 0;
|
|
||||||
*len = buf_used_;
|
|
||||||
buf_used_ += 1; // since we appended the NUL.
|
|
||||||
*line = buf_;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, we should pull in more data from the file
|
|
||||||
const ssize_t n = sys_read(fd_, buf_ + buf_used_,
|
|
||||||
sizeof(buf_) - buf_used_);
|
|
||||||
if (n < 0) {
|
|
||||||
return false;
|
|
||||||
} else if (n == 0) {
|
|
||||||
hit_eof_ = true;
|
|
||||||
} else {
|
|
||||||
buf_used_ += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// At this point, we have either set the hit_eof_ flag, or we have more
|
|
||||||
// data to process...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PopLine(unsigned len) {
|
|
||||||
// len doesn't include the NUL byte at the end.
|
|
||||||
|
|
||||||
assert(buf_used_ >= len + 1);
|
|
||||||
buf_used_ -= len + 1;
|
|
||||||
my_memmove(buf_, buf_ + len + 1, buf_used_);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const int fd_;
|
|
||||||
|
|
||||||
bool hit_eof_;
|
|
||||||
unsigned buf_used_;
|
|
||||||
char buf_[kMaxLineLen];
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
|
|
||||||
|
|
@ -1,258 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_core_dumper.cc: Implement google_breakpad::LinuxCoreDumper.
|
|
||||||
// See linux_core_dumper.h for details.
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_core_dumper.h"
|
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <elf.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/procfs.h>
|
|
||||||
#if defined(__mips__) && defined(__ANDROID__)
|
|
||||||
// To get register definitions.
|
|
||||||
#include <asm/reg.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
LinuxCoreDumper::LinuxCoreDumper(pid_t pid,
|
|
||||||
const char* core_path,
|
|
||||||
const char* procfs_path,
|
|
||||||
const char* root_prefix)
|
|
||||||
: LinuxDumper(pid, root_prefix),
|
|
||||||
core_path_(core_path),
|
|
||||||
procfs_path_(procfs_path),
|
|
||||||
thread_infos_(&allocator_, 8) {
|
|
||||||
assert(core_path_);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxCoreDumper::BuildProcPath(char* path, pid_t pid,
|
|
||||||
const char* node) const {
|
|
||||||
if (!path || !node)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
size_t node_len = my_strlen(node);
|
|
||||||
if (node_len == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
size_t procfs_path_len = my_strlen(procfs_path_);
|
|
||||||
size_t total_length = procfs_path_len + 1 + node_len;
|
|
||||||
if (total_length >= NAME_MAX)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
memcpy(path, procfs_path_, procfs_path_len);
|
|
||||||
path[procfs_path_len] = '/';
|
|
||||||
memcpy(path + procfs_path_len + 1, node, node_len);
|
|
||||||
path[total_length] = '\0';
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxCoreDumper::CopyFromProcess(void* dest, pid_t child,
|
|
||||||
const void* src, size_t length) {
|
|
||||||
ElfCoreDump::Addr virtual_address = reinterpret_cast<ElfCoreDump::Addr>(src);
|
|
||||||
// TODO(benchan): Investigate whether the data to be copied could span
|
|
||||||
// across multiple segments in the core dump file. ElfCoreDump::CopyData
|
|
||||||
// and this method do not handle that case yet.
|
|
||||||
if (!core_.CopyData(dest, virtual_address, length)) {
|
|
||||||
// If the data segment is not found in the core dump, fill the result
|
|
||||||
// with marker characters.
|
|
||||||
memset(dest, 0xab, length);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
|
|
||||||
if (index >= thread_infos_.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
*info = thread_infos_[index];
|
|
||||||
const uint8_t* stack_pointer;
|
|
||||||
#if defined(__i386)
|
|
||||||
memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp));
|
|
||||||
#elif defined(__x86_64)
|
|
||||||
memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp));
|
|
||||||
#elif defined(__ARM_EABI__)
|
|
||||||
memcpy(&stack_pointer, &info->regs.ARM_sp, sizeof(info->regs.ARM_sp));
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
memcpy(&stack_pointer, &info->regs.sp, sizeof(info->regs.sp));
|
|
||||||
#elif defined(__mips__)
|
|
||||||
stack_pointer =
|
|
||||||
reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
|
|
||||||
#else
|
|
||||||
#error "This code hasn't been ported to your platform yet."
|
|
||||||
#endif
|
|
||||||
info->stack_pointer = reinterpret_cast<uintptr_t>(stack_pointer);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxCoreDumper::IsPostMortem() const {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxCoreDumper::ThreadsSuspend() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxCoreDumper::ThreadsResume() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxCoreDumper::EnumerateThreads() {
|
|
||||||
if (!mapped_core_file_.Map(core_path_, 0)) {
|
|
||||||
fprintf(stderr, "Could not map core dump file into memory\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_.SetContent(mapped_core_file_.content());
|
|
||||||
if (!core_.IsValid()) {
|
|
||||||
fprintf(stderr, "Invalid core dump file\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ElfCoreDump::Note note = core_.GetFirstNote();
|
|
||||||
if (!note.IsValid()) {
|
|
||||||
fprintf(stderr, "PT_NOTE section not found\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool first_thread = true;
|
|
||||||
do {
|
|
||||||
ElfCoreDump::Word type = note.GetType();
|
|
||||||
MemoryRange name = note.GetName();
|
|
||||||
MemoryRange description = note.GetDescription();
|
|
||||||
|
|
||||||
if (type == 0 || name.IsEmpty() || description.IsEmpty()) {
|
|
||||||
fprintf(stderr, "Could not found a valid PT_NOTE.\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Based on write_note_info() in linux/kernel/fs/binfmt_elf.c, notes are
|
|
||||||
// ordered as follows (NT_PRXFPREG and NT_386_TLS are i386 specific):
|
|
||||||
// Thread Name Type
|
|
||||||
// -------------------------------------------------------------------
|
|
||||||
// 1st thread CORE NT_PRSTATUS
|
|
||||||
// process-wide CORE NT_PRPSINFO
|
|
||||||
// process-wide CORE NT_AUXV
|
|
||||||
// 1st thread CORE NT_FPREGSET
|
|
||||||
// 1st thread LINUX NT_PRXFPREG
|
|
||||||
// 1st thread LINUX NT_386_TLS
|
|
||||||
//
|
|
||||||
// 2nd thread CORE NT_PRSTATUS
|
|
||||||
// 2nd thread CORE NT_FPREGSET
|
|
||||||
// 2nd thread LINUX NT_PRXFPREG
|
|
||||||
// 2nd thread LINUX NT_386_TLS
|
|
||||||
//
|
|
||||||
// 3rd thread CORE NT_PRSTATUS
|
|
||||||
// 3rd thread CORE NT_FPREGSET
|
|
||||||
// 3rd thread LINUX NT_PRXFPREG
|
|
||||||
// 3rd thread LINUX NT_386_TLS
|
|
||||||
//
|
|
||||||
// The following code only works if notes are ordered as expected.
|
|
||||||
switch (type) {
|
|
||||||
case NT_PRSTATUS: {
|
|
||||||
if (description.length() != sizeof(elf_prstatus)) {
|
|
||||||
fprintf(stderr, "Found NT_PRSTATUS descriptor of unexpected size\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const elf_prstatus* status =
|
|
||||||
reinterpret_cast<const elf_prstatus*>(description.data());
|
|
||||||
pid_t pid = status->pr_pid;
|
|
||||||
ThreadInfo info;
|
|
||||||
memset(&info, 0, sizeof(ThreadInfo));
|
|
||||||
info.tgid = status->pr_pgrp;
|
|
||||||
info.ppid = status->pr_ppid;
|
|
||||||
#if defined(__mips__)
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
for (int i = EF_R0; i <= EF_R31; i++)
|
|
||||||
info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
|
|
||||||
#else // __ANDROID__
|
|
||||||
for (int i = EF_REG0; i <= EF_REG31; i++)
|
|
||||||
info.mcontext.gregs[i - EF_REG0] = status->pr_reg[i];
|
|
||||||
#endif // __ANDROID__
|
|
||||||
info.mcontext.mdlo = status->pr_reg[EF_LO];
|
|
||||||
info.mcontext.mdhi = status->pr_reg[EF_HI];
|
|
||||||
info.mcontext.pc = status->pr_reg[EF_CP0_EPC];
|
|
||||||
#else // __mips__
|
|
||||||
memcpy(&info.regs, status->pr_reg, sizeof(info.regs));
|
|
||||||
#endif // __mips__
|
|
||||||
if (first_thread) {
|
|
||||||
crash_thread_ = pid;
|
|
||||||
crash_signal_ = status->pr_info.si_signo;
|
|
||||||
}
|
|
||||||
first_thread = false;
|
|
||||||
threads_.push_back(pid);
|
|
||||||
thread_infos_.push_back(info);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
|
||||||
case NT_FPREGSET: {
|
|
||||||
if (thread_infos_.empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ThreadInfo* info = &thread_infos_.back();
|
|
||||||
if (description.length() != sizeof(info->fpregs)) {
|
|
||||||
fprintf(stderr, "Found NT_FPREGSET descriptor of unexpected size\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&info->fpregs, description.data(), sizeof(info->fpregs));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(__i386)
|
|
||||||
case NT_PRXFPREG: {
|
|
||||||
if (thread_infos_.empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ThreadInfo* info = &thread_infos_.back();
|
|
||||||
if (description.length() != sizeof(info->fpxregs)) {
|
|
||||||
fprintf(stderr, "Found NT_PRXFPREG descriptor of unexpected size\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&info->fpxregs, description.data(), sizeof(info->fpxregs));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
note = note.GetNextNote();
|
|
||||||
} while (note.IsValid());
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,125 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_core_dumper.h: Define the google_breakpad::LinuxCoreDumper
|
|
||||||
// class, which is derived from google_breakpad::LinuxDumper to extract
|
|
||||||
// information from a crashed process via its core dump and proc files.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_dumper.h"
|
|
||||||
#include "common/linux/elf_core_dump.h"
|
|
||||||
#include "common/linux/memory_mapped_file.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class LinuxCoreDumper : public LinuxDumper {
|
|
||||||
public:
|
|
||||||
// Constructs a dumper for extracting information of a given process
|
|
||||||
// with a process ID of |pid| via its core dump file at |core_path| and
|
|
||||||
// its proc files at |procfs_path|. If |procfs_path| is a copy of
|
|
||||||
// /proc/<pid>, it should contain the following files:
|
|
||||||
// auxv, cmdline, environ, exe, maps, status
|
|
||||||
// See LinuxDumper for the purpose of |root_prefix|.
|
|
||||||
LinuxCoreDumper(pid_t pid, const char* core_path, const char* procfs_path,
|
|
||||||
const char* root_prefix = "");
|
|
||||||
|
|
||||||
// Implements LinuxDumper::BuildProcPath().
|
|
||||||
// Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).
|
|
||||||
// |path| is a character array of at least NAME_MAX bytes to return the
|
|
||||||
// result.|node| is the final node without any slashes. Return true on
|
|
||||||
// success.
|
|
||||||
//
|
|
||||||
// As this dumper performs a post-mortem dump and makes use of a copy
|
|
||||||
// of the proc files of the crashed process, this derived method does
|
|
||||||
// not actually make use of |pid| and always returns a subpath of
|
|
||||||
// |procfs_path_| regardless of whether |pid| corresponds to the main
|
|
||||||
// process or a thread of the process, i.e. assuming both the main process
|
|
||||||
// and its threads have the following proc files with the same content:
|
|
||||||
// auxv, cmdline, environ, exe, maps, status
|
|
||||||
virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const;
|
|
||||||
|
|
||||||
// Implements LinuxDumper::CopyFromProcess().
|
|
||||||
// Copies content of |length| bytes from a given process |child|,
|
|
||||||
// starting from |src|, into |dest|. This method extracts the content
|
|
||||||
// the core dump and fills |dest| with a sequence of marker bytes
|
|
||||||
// if the expected data is not found in the core dump. Returns true if
|
|
||||||
// the expected data is found in the core dump.
|
|
||||||
virtual bool CopyFromProcess(void* dest, pid_t child, const void* src,
|
|
||||||
size_t length);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::GetThreadInfoByIndex().
|
|
||||||
// Reads information about the |index|-th thread of |threads_|.
|
|
||||||
// Returns true on success. One must have called |ThreadsSuspend| first.
|
|
||||||
virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::IsPostMortem().
|
|
||||||
// Always returns true to indicate that this dumper performs a
|
|
||||||
// post-mortem dump of a crashed process via a core dump file.
|
|
||||||
virtual bool IsPostMortem() const;
|
|
||||||
|
|
||||||
// Implements LinuxDumper::ThreadsSuspend().
|
|
||||||
// As the dumper performs a post-mortem dump via a core dump file,
|
|
||||||
// there is no threads to suspend. This method does nothing and
|
|
||||||
// always returns true.
|
|
||||||
virtual bool ThreadsSuspend();
|
|
||||||
|
|
||||||
// Implements LinuxDumper::ThreadsResume().
|
|
||||||
// As the dumper performs a post-mortem dump via a core dump file,
|
|
||||||
// there is no threads to resume. This method does nothing and
|
|
||||||
// always returns true.
|
|
||||||
virtual bool ThreadsResume();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// Implements LinuxDumper::EnumerateThreads().
|
|
||||||
// Enumerates all threads of the given process into |threads_|.
|
|
||||||
virtual bool EnumerateThreads();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Path of the core dump file.
|
|
||||||
const char* core_path_;
|
|
||||||
|
|
||||||
// Path of the directory containing the proc files of the given process,
|
|
||||||
// which is usually a copy of /proc/<pid>.
|
|
||||||
const char* procfs_path_;
|
|
||||||
|
|
||||||
// Memory-mapped core dump file at |core_path_|.
|
|
||||||
MemoryMappedFile mapped_core_file_;
|
|
||||||
|
|
||||||
// Content of the core dump file.
|
|
||||||
ElfCoreDump core_;
|
|
||||||
|
|
||||||
// Thread info found in the core dump file.
|
|
||||||
wasteful_vector<ThreadInfo> thread_infos_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_LINUX_CORE_DUMPER_H_
|
|
||||||
|
|
@ -1,606 +0,0 @@
|
||||||
// Copyright (c) 2010, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_dumper.cc: Implement google_breakpad::LinuxDumper.
|
|
||||||
// See linux_dumper.h for details.
|
|
||||||
|
|
||||||
// This code deals with the mechanics of getting information about a crashed
|
|
||||||
// process. Since this code may run in a compromised address space, the same
|
|
||||||
// rules apply as detailed at the top of minidump_writer.h: no libc calls and
|
|
||||||
// use the alternative allocator.
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_dumper.h"
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <elf.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/line_reader.h"
|
|
||||||
#include "common/linux/elfutils.h"
|
|
||||||
#include "common/linux/file_id.h"
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "common/linux/memory_mapped_file.h"
|
|
||||||
#include "common/linux/safe_readlink.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
|
|
||||||
// Android packed relocations definitions are not yet available from the
|
|
||||||
// NDK header files, so we have to provide them manually here.
|
|
||||||
#ifndef DT_LOOS
|
|
||||||
#define DT_LOOS 0x6000000d
|
|
||||||
#endif
|
|
||||||
#ifndef DT_ANDROID_REL
|
|
||||||
static const int DT_ANDROID_REL = DT_LOOS + 2;
|
|
||||||
#endif
|
|
||||||
#ifndef DT_ANDROID_RELA
|
|
||||||
static const int DT_ANDROID_RELA = DT_LOOS + 4;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // __ANDROID __
|
|
||||||
|
|
||||||
static const char kMappedFileUnsafePrefix[] = "/dev/";
|
|
||||||
static const char kDeletedSuffix[] = " (deleted)";
|
|
||||||
static const char kReservedFlags[] = " ---p";
|
|
||||||
|
|
||||||
inline static bool IsMappedFileOpenUnsafe(
|
|
||||||
const google_breakpad::MappingInfo& mapping) {
|
|
||||||
// It is unsafe to attempt to open a mapped file that lives under /dev,
|
|
||||||
// because the semantics of the open may be driver-specific so we'd risk
|
|
||||||
// hanging the crash dumper. And a file in /dev/ almost certainly has no
|
|
||||||
// ELF file identifier anyways.
|
|
||||||
return my_strncmp(mapping.name,
|
|
||||||
kMappedFileUnsafePrefix,
|
|
||||||
sizeof(kMappedFileUnsafePrefix) - 1) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// All interesting auvx entry types are below AT_SYSINFO_EHDR
|
|
||||||
#define AT_MAX AT_SYSINFO_EHDR
|
|
||||||
|
|
||||||
LinuxDumper::LinuxDumper(pid_t pid, const char* root_prefix)
|
|
||||||
: pid_(pid),
|
|
||||||
root_prefix_(root_prefix),
|
|
||||||
crash_address_(0),
|
|
||||||
crash_signal_(0),
|
|
||||||
crash_thread_(pid),
|
|
||||||
threads_(&allocator_, 8),
|
|
||||||
mappings_(&allocator_),
|
|
||||||
auxv_(&allocator_, AT_MAX + 1) {
|
|
||||||
assert(root_prefix_ && my_strlen(root_prefix_) < PATH_MAX);
|
|
||||||
// The passed-in size to the constructor (above) is only a hint.
|
|
||||||
// Must call .resize() to do actual initialization of the elements.
|
|
||||||
auxv_.resize(AT_MAX + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
LinuxDumper::~LinuxDumper() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxDumper::Init() {
|
|
||||||
return ReadAuxv() && EnumerateThreads() && EnumerateMappings();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxDumper::LateInit() {
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
LatePostprocessMappings();
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
LinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping,
|
|
||||||
bool member,
|
|
||||||
unsigned int mapping_id,
|
|
||||||
uint8_t identifier[sizeof(MDGUID)]) {
|
|
||||||
assert(!member || mapping_id < mappings_.size());
|
|
||||||
my_memset(identifier, 0, sizeof(MDGUID));
|
|
||||||
if (IsMappedFileOpenUnsafe(mapping))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Special-case linux-gate because it's not a real file.
|
|
||||||
if (my_strcmp(mapping.name, kLinuxGateLibraryName) == 0) {
|
|
||||||
void* linux_gate = NULL;
|
|
||||||
if (pid_ == sys_getpid()) {
|
|
||||||
linux_gate = reinterpret_cast<void*>(mapping.start_addr);
|
|
||||||
} else {
|
|
||||||
linux_gate = allocator_.Alloc(mapping.size);
|
|
||||||
CopyFromProcess(linux_gate, pid_,
|
|
||||||
reinterpret_cast<const void*>(mapping.start_addr),
|
|
||||||
mapping.size);
|
|
||||||
}
|
|
||||||
return FileID::ElfFileIdentifierFromMappedFile(linux_gate, identifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
char filename[PATH_MAX];
|
|
||||||
if (!GetMappingAbsolutePath(mapping, filename))
|
|
||||||
return false;
|
|
||||||
bool filename_modified = HandleDeletedFileInMapping(filename);
|
|
||||||
|
|
||||||
MemoryMappedFile mapped_file(filename, mapping.offset);
|
|
||||||
if (!mapped_file.data() || mapped_file.size() < SELFMAG)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
bool success =
|
|
||||||
FileID::ElfFileIdentifierFromMappedFile(mapped_file.data(), identifier);
|
|
||||||
if (success && member && filename_modified) {
|
|
||||||
mappings_[mapping_id]->name[my_strlen(mapping.name) -
|
|
||||||
sizeof(kDeletedSuffix) + 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxDumper::GetMappingAbsolutePath(const MappingInfo& mapping,
|
|
||||||
char path[PATH_MAX]) const {
|
|
||||||
return my_strlcpy(path, root_prefix_, PATH_MAX) < PATH_MAX &&
|
|
||||||
my_strlcat(path, mapping.name, PATH_MAX) < PATH_MAX;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
bool ElfFileSoNameFromMappedFile(
|
|
||||||
const void* elf_base, char* soname, size_t soname_size) {
|
|
||||||
if (!IsValidElf(elf_base)) {
|
|
||||||
// Not ELF
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const void* segment_start;
|
|
||||||
size_t segment_size;
|
|
||||||
int elf_class;
|
|
||||||
if (!FindElfSection(elf_base, ".dynamic", SHT_DYNAMIC,
|
|
||||||
&segment_start, &segment_size, &elf_class)) {
|
|
||||||
// No dynamic section
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const void* dynstr_start;
|
|
||||||
size_t dynstr_size;
|
|
||||||
if (!FindElfSection(elf_base, ".dynstr", SHT_STRTAB,
|
|
||||||
&dynstr_start, &dynstr_size, &elf_class)) {
|
|
||||||
// No dynstr section
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ElfW(Dyn)* dynamic = static_cast<const ElfW(Dyn)*>(segment_start);
|
|
||||||
size_t dcount = segment_size / sizeof(ElfW(Dyn));
|
|
||||||
for (const ElfW(Dyn)* dyn = dynamic; dyn < dynamic + dcount; ++dyn) {
|
|
||||||
if (dyn->d_tag == DT_SONAME) {
|
|
||||||
const char* dynstr = static_cast<const char*>(dynstr_start);
|
|
||||||
if (dyn->d_un.d_val >= dynstr_size) {
|
|
||||||
// Beyond the end of the dynstr section
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const char* str = dynstr + dyn->d_un.d_val;
|
|
||||||
const size_t maxsize = dynstr_size - dyn->d_un.d_val;
|
|
||||||
my_strlcpy(soname, str, maxsize < soname_size ? maxsize : soname_size);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Did not find SONAME
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the shared object name (SONAME) by examining the ELF information
|
|
||||||
// for |mapping|. If the SONAME is found copy it into the passed buffer
|
|
||||||
// |soname| and return true. The size of the buffer is |soname_size|.
|
|
||||||
// The SONAME will be truncated if it is too long to fit in the buffer.
|
|
||||||
bool ElfFileSoName(const LinuxDumper& dumper,
|
|
||||||
const MappingInfo& mapping, char* soname, size_t soname_size) {
|
|
||||||
if (IsMappedFileOpenUnsafe(mapping)) {
|
|
||||||
// Not safe
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
char filename[PATH_MAX];
|
|
||||||
if (!dumper.GetMappingAbsolutePath(mapping, filename))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
MemoryMappedFile mapped_file(filename, mapping.offset);
|
|
||||||
if (!mapped_file.data() || mapped_file.size() < SELFMAG) {
|
|
||||||
// mmap failed
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ElfFileSoNameFromMappedFile(mapped_file.data(), soname, soname_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
|
|
||||||
void LinuxDumper::GetMappingEffectiveNameAndPath(const MappingInfo& mapping,
|
|
||||||
char* file_path,
|
|
||||||
size_t file_path_size,
|
|
||||||
char* file_name,
|
|
||||||
size_t file_name_size) {
|
|
||||||
my_strlcpy(file_path, mapping.name, file_path_size);
|
|
||||||
|
|
||||||
// If an executable is mapped from a non-zero offset, this is likely because
|
|
||||||
// the executable was loaded directly from inside an archive file (e.g., an
|
|
||||||
// apk on Android). We try to find the name of the shared object (SONAME) by
|
|
||||||
// looking in the file for ELF sections.
|
|
||||||
bool mapped_from_archive = false;
|
|
||||||
if (mapping.exec && mapping.offset != 0) {
|
|
||||||
mapped_from_archive =
|
|
||||||
ElfFileSoName(*this, mapping, file_name, file_name_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mapped_from_archive) {
|
|
||||||
// Some tools (e.g., stackwalk) extract the basename from the pathname. In
|
|
||||||
// this case, we append the file_name to the mapped archive path as follows:
|
|
||||||
// file_name := libname.so
|
|
||||||
// file_path := /path/to/ARCHIVE.APK/libname.so
|
|
||||||
if (my_strlen(file_path) + 1 + my_strlen(file_name) < file_path_size) {
|
|
||||||
my_strlcat(file_path, "/", file_path_size);
|
|
||||||
my_strlcat(file_path, file_name, file_path_size);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Common case:
|
|
||||||
// file_path := /path/to/libname.so
|
|
||||||
// file_name := libname.so
|
|
||||||
const char* basename = my_strrchr(file_path, '/');
|
|
||||||
basename = basename == NULL ? file_path : (basename + 1);
|
|
||||||
my_strlcpy(file_name, basename, file_name_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxDumper::ReadAuxv() {
|
|
||||||
char auxv_path[NAME_MAX];
|
|
||||||
if (!BuildProcPath(auxv_path, pid_, "auxv")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fd = sys_open(auxv_path, O_RDONLY, 0);
|
|
||||||
if (fd < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
elf_aux_entry one_aux_entry;
|
|
||||||
bool res = false;
|
|
||||||
while (sys_read(fd,
|
|
||||||
&one_aux_entry,
|
|
||||||
sizeof(elf_aux_entry)) == sizeof(elf_aux_entry) &&
|
|
||||||
one_aux_entry.a_type != AT_NULL) {
|
|
||||||
if (one_aux_entry.a_type <= AT_MAX) {
|
|
||||||
auxv_[one_aux_entry.a_type] = one_aux_entry.a_un.a_val;
|
|
||||||
res = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sys_close(fd);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxDumper::EnumerateMappings() {
|
|
||||||
char maps_path[NAME_MAX];
|
|
||||||
if (!BuildProcPath(maps_path, pid_, "maps"))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// linux_gate_loc is the beginning of the kernel's mapping of
|
|
||||||
// linux-gate.so in the process. It doesn't actually show up in the
|
|
||||||
// maps list as a filename, but it can be found using the AT_SYSINFO_EHDR
|
|
||||||
// aux vector entry, which gives the information necessary to special
|
|
||||||
// case its entry when creating the list of mappings.
|
|
||||||
// See http://www.trilithium.com/johan/2005/08/linux-gate/ for more
|
|
||||||
// information.
|
|
||||||
const void* linux_gate_loc =
|
|
||||||
reinterpret_cast<void *>(auxv_[AT_SYSINFO_EHDR]);
|
|
||||||
// Although the initial executable is usually the first mapping, it's not
|
|
||||||
// guaranteed (see http://crosbug.com/25355); therefore, try to use the
|
|
||||||
// actual entry point to find the mapping.
|
|
||||||
const void* entry_point_loc = reinterpret_cast<void *>(auxv_[AT_ENTRY]);
|
|
||||||
|
|
||||||
const int fd = sys_open(maps_path, O_RDONLY, 0);
|
|
||||||
if (fd < 0)
|
|
||||||
return false;
|
|
||||||
LineReader* const line_reader = new(allocator_) LineReader(fd);
|
|
||||||
|
|
||||||
const char* line;
|
|
||||||
unsigned line_len;
|
|
||||||
while (line_reader->GetNextLine(&line, &line_len)) {
|
|
||||||
uintptr_t start_addr, end_addr, offset;
|
|
||||||
|
|
||||||
const char* i1 = my_read_hex_ptr(&start_addr, line);
|
|
||||||
if (*i1 == '-') {
|
|
||||||
const char* i2 = my_read_hex_ptr(&end_addr, i1 + 1);
|
|
||||||
if (*i2 == ' ') {
|
|
||||||
bool exec = (*(i2 + 3) == 'x');
|
|
||||||
const char* i3 = my_read_hex_ptr(&offset, i2 + 6 /* skip ' rwxp ' */);
|
|
||||||
if (*i3 == ' ') {
|
|
||||||
const char* name = NULL;
|
|
||||||
// Only copy name if the name is a valid path name, or if
|
|
||||||
// it's the VDSO image.
|
|
||||||
if (((name = my_strchr(line, '/')) == NULL) &&
|
|
||||||
linux_gate_loc &&
|
|
||||||
reinterpret_cast<void*>(start_addr) == linux_gate_loc) {
|
|
||||||
name = kLinuxGateLibraryName;
|
|
||||||
offset = 0;
|
|
||||||
}
|
|
||||||
// Merge adjacent mappings with the same name into one module,
|
|
||||||
// assuming they're a single library mapped by the dynamic linker
|
|
||||||
if (name && !mappings_.empty()) {
|
|
||||||
MappingInfo* module = mappings_.back();
|
|
||||||
if ((start_addr == module->start_addr + module->size) &&
|
|
||||||
(my_strlen(name) == my_strlen(module->name)) &&
|
|
||||||
(my_strncmp(name, module->name, my_strlen(name)) == 0) &&
|
|
||||||
(exec == module->exec)) {
|
|
||||||
module->size = end_addr - module->start_addr;
|
|
||||||
line_reader->PopLine(line_len);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Also merge mappings that result from address ranges that the
|
|
||||||
// linker reserved but which a loaded library did not use. These
|
|
||||||
// appear as an anonymous private mapping with no access flags set
|
|
||||||
// and which directly follow an executable mapping.
|
|
||||||
if (!name && !mappings_.empty()) {
|
|
||||||
MappingInfo* module = mappings_.back();
|
|
||||||
if ((start_addr == module->start_addr + module->size) &&
|
|
||||||
module->exec &&
|
|
||||||
module->name[0] == '/' &&
|
|
||||||
offset == 0 && my_strncmp(i2,
|
|
||||||
kReservedFlags,
|
|
||||||
sizeof(kReservedFlags) - 1) == 0) {
|
|
||||||
module->size = end_addr - module->start_addr;
|
|
||||||
line_reader->PopLine(line_len);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MappingInfo* const module = new(allocator_) MappingInfo;
|
|
||||||
my_memset(module, 0, sizeof(MappingInfo));
|
|
||||||
module->start_addr = start_addr;
|
|
||||||
module->size = end_addr - start_addr;
|
|
||||||
module->offset = offset;
|
|
||||||
module->exec = exec;
|
|
||||||
if (name != NULL) {
|
|
||||||
const unsigned l = my_strlen(name);
|
|
||||||
if (l < sizeof(module->name))
|
|
||||||
my_memcpy(module->name, name, l);
|
|
||||||
}
|
|
||||||
// If this is the entry-point mapping, and it's not already the
|
|
||||||
// first one, then we need to make it be first. This is because
|
|
||||||
// the minidump format assumes the first module is the one that
|
|
||||||
// corresponds to the main executable (as codified in
|
|
||||||
// processor/minidump.cc:MinidumpModuleList::GetMainModule()).
|
|
||||||
if (entry_point_loc &&
|
|
||||||
(entry_point_loc >=
|
|
||||||
reinterpret_cast<void*>(module->start_addr)) &&
|
|
||||||
(entry_point_loc <
|
|
||||||
reinterpret_cast<void*>(module->start_addr+module->size)) &&
|
|
||||||
!mappings_.empty()) {
|
|
||||||
// push the module onto the front of the list.
|
|
||||||
mappings_.resize(mappings_.size() + 1);
|
|
||||||
for (size_t idx = mappings_.size() - 1; idx > 0; idx--)
|
|
||||||
mappings_[idx] = mappings_[idx - 1];
|
|
||||||
mappings_[0] = module;
|
|
||||||
} else {
|
|
||||||
mappings_.push_back(module);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
line_reader->PopLine(line_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
sys_close(fd);
|
|
||||||
|
|
||||||
return !mappings_.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
|
|
||||||
bool LinuxDumper::GetLoadedElfHeader(uintptr_t start_addr, ElfW(Ehdr)* ehdr) {
|
|
||||||
CopyFromProcess(ehdr, pid_,
|
|
||||||
reinterpret_cast<const void*>(start_addr),
|
|
||||||
sizeof(*ehdr));
|
|
||||||
return my_memcmp(&ehdr->e_ident, ELFMAG, SELFMAG) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LinuxDumper::ParseLoadedElfProgramHeaders(ElfW(Ehdr)* ehdr,
|
|
||||||
uintptr_t start_addr,
|
|
||||||
uintptr_t* min_vaddr_ptr,
|
|
||||||
uintptr_t* dyn_vaddr_ptr,
|
|
||||||
size_t* dyn_count_ptr) {
|
|
||||||
uintptr_t phdr_addr = start_addr + ehdr->e_phoff;
|
|
||||||
|
|
||||||
const uintptr_t max_addr = UINTPTR_MAX;
|
|
||||||
uintptr_t min_vaddr = max_addr;
|
|
||||||
uintptr_t dyn_vaddr = 0;
|
|
||||||
size_t dyn_count = 0;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < ehdr->e_phnum; ++i) {
|
|
||||||
ElfW(Phdr) phdr;
|
|
||||||
CopyFromProcess(&phdr, pid_,
|
|
||||||
reinterpret_cast<const void*>(phdr_addr),
|
|
||||||
sizeof(phdr));
|
|
||||||
if (phdr.p_type == PT_LOAD && phdr.p_vaddr < min_vaddr) {
|
|
||||||
min_vaddr = phdr.p_vaddr;
|
|
||||||
}
|
|
||||||
if (phdr.p_type == PT_DYNAMIC) {
|
|
||||||
dyn_vaddr = phdr.p_vaddr;
|
|
||||||
dyn_count = phdr.p_memsz / sizeof(ElfW(Dyn));
|
|
||||||
}
|
|
||||||
phdr_addr += sizeof(phdr);
|
|
||||||
}
|
|
||||||
|
|
||||||
*min_vaddr_ptr = min_vaddr;
|
|
||||||
*dyn_vaddr_ptr = dyn_vaddr;
|
|
||||||
*dyn_count_ptr = dyn_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxDumper::HasAndroidPackedRelocations(uintptr_t load_bias,
|
|
||||||
uintptr_t dyn_vaddr,
|
|
||||||
size_t dyn_count) {
|
|
||||||
uintptr_t dyn_addr = load_bias + dyn_vaddr;
|
|
||||||
for (size_t i = 0; i < dyn_count; ++i) {
|
|
||||||
ElfW(Dyn) dyn;
|
|
||||||
CopyFromProcess(&dyn, pid_,
|
|
||||||
reinterpret_cast<const void*>(dyn_addr),
|
|
||||||
sizeof(dyn));
|
|
||||||
if (dyn.d_tag == DT_ANDROID_REL || dyn.d_tag == DT_ANDROID_RELA) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
dyn_addr += sizeof(dyn);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t LinuxDumper::GetEffectiveLoadBias(ElfW(Ehdr)* ehdr,
|
|
||||||
uintptr_t start_addr) {
|
|
||||||
uintptr_t min_vaddr = 0;
|
|
||||||
uintptr_t dyn_vaddr = 0;
|
|
||||||
size_t dyn_count = 0;
|
|
||||||
ParseLoadedElfProgramHeaders(ehdr, start_addr,
|
|
||||||
&min_vaddr, &dyn_vaddr, &dyn_count);
|
|
||||||
// If |min_vaddr| is non-zero and we find Android packed relocation tags,
|
|
||||||
// return the effective load bias.
|
|
||||||
if (min_vaddr != 0) {
|
|
||||||
const uintptr_t load_bias = start_addr - min_vaddr;
|
|
||||||
if (HasAndroidPackedRelocations(load_bias, dyn_vaddr, dyn_count)) {
|
|
||||||
return load_bias;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Either |min_vaddr| is zero, or it is non-zero but we did not find the
|
|
||||||
// expected Android packed relocations tags.
|
|
||||||
return start_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LinuxDumper::LatePostprocessMappings() {
|
|
||||||
for (size_t i = 0; i < mappings_.size(); ++i) {
|
|
||||||
// Only consider exec mappings that indicate a file path was mapped, and
|
|
||||||
// where the ELF header indicates a mapped shared library.
|
|
||||||
MappingInfo* mapping = mappings_[i];
|
|
||||||
if (!(mapping->exec && mapping->name[0] == '/')) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
ElfW(Ehdr) ehdr;
|
|
||||||
if (!GetLoadedElfHeader(mapping->start_addr, &ehdr)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (ehdr.e_type == ET_DYN) {
|
|
||||||
// Compute the effective load bias for this mapped library, and update
|
|
||||||
// the mapping to hold that rather than |start_addr|, at the same time
|
|
||||||
// adjusting |size| to account for the change in |start_addr|. Where
|
|
||||||
// the library does not contain Android packed relocations,
|
|
||||||
// GetEffectiveLoadBias() returns |start_addr| and the mapping entry
|
|
||||||
// is not changed.
|
|
||||||
const uintptr_t load_bias = GetEffectiveLoadBias(&ehdr,
|
|
||||||
mapping->start_addr);
|
|
||||||
mapping->size += mapping->start_addr - load_bias;
|
|
||||||
mapping->start_addr = load_bias;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // __ANDROID__
|
|
||||||
|
|
||||||
// Get information about the stack, given the stack pointer. We don't try to
|
|
||||||
// walk the stack since we might not have all the information needed to do
|
|
||||||
// unwind. So we just grab, up to, 32k of stack.
|
|
||||||
bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
|
|
||||||
uintptr_t int_stack_pointer) {
|
|
||||||
// Move the stack pointer to the bottom of the page that it's in.
|
|
||||||
const uintptr_t page_size = getpagesize();
|
|
||||||
|
|
||||||
uint8_t* const stack_pointer =
|
|
||||||
reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
|
|
||||||
|
|
||||||
// The number of bytes of stack which we try to capture.
|
|
||||||
static const ptrdiff_t kStackToCapture = 32 * 1024;
|
|
||||||
|
|
||||||
const MappingInfo* mapping = FindMapping(stack_pointer);
|
|
||||||
if (!mapping)
|
|
||||||
return false;
|
|
||||||
const ptrdiff_t offset = stack_pointer -
|
|
||||||
reinterpret_cast<uint8_t*>(mapping->start_addr);
|
|
||||||
const ptrdiff_t distance_to_end =
|
|
||||||
static_cast<ptrdiff_t>(mapping->size) - offset;
|
|
||||||
*stack_len = distance_to_end > kStackToCapture ?
|
|
||||||
kStackToCapture : distance_to_end;
|
|
||||||
*stack = stack_pointer;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the mapping which the given memory address falls in.
|
|
||||||
const MappingInfo* LinuxDumper::FindMapping(const void* address) const {
|
|
||||||
const uintptr_t addr = (uintptr_t) address;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < mappings_.size(); ++i) {
|
|
||||||
const uintptr_t start = static_cast<uintptr_t>(mappings_[i]->start_addr);
|
|
||||||
if (addr >= start && addr - start < mappings_[i]->size)
|
|
||||||
return mappings_[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxDumper::HandleDeletedFileInMapping(char* path) const {
|
|
||||||
static const size_t kDeletedSuffixLen = sizeof(kDeletedSuffix) - 1;
|
|
||||||
|
|
||||||
// Check for ' (deleted)' in |path|.
|
|
||||||
// |path| has to be at least as long as "/x (deleted)".
|
|
||||||
const size_t path_len = my_strlen(path);
|
|
||||||
if (path_len < kDeletedSuffixLen + 2)
|
|
||||||
return false;
|
|
||||||
if (my_strncmp(path + path_len - kDeletedSuffixLen, kDeletedSuffix,
|
|
||||||
kDeletedSuffixLen) != 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check |path| against the /proc/pid/exe 'symlink'.
|
|
||||||
char exe_link[NAME_MAX];
|
|
||||||
if (!BuildProcPath(exe_link, pid_, "exe"))
|
|
||||||
return false;
|
|
||||||
MappingInfo new_mapping = {0};
|
|
||||||
if (!SafeReadLink(exe_link, new_mapping.name))
|
|
||||||
return false;
|
|
||||||
char new_path[PATH_MAX];
|
|
||||||
if (!GetMappingAbsolutePath(new_mapping, new_path))
|
|
||||||
return false;
|
|
||||||
if (my_strcmp(path, new_path) != 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Check to see if someone actually named their executable 'foo (deleted)'.
|
|
||||||
struct kernel_stat exe_stat;
|
|
||||||
struct kernel_stat new_path_stat;
|
|
||||||
if (sys_stat(exe_link, &exe_stat) == 0 &&
|
|
||||||
sys_stat(new_path, &new_path_stat) == 0 &&
|
|
||||||
exe_stat.st_dev == new_path_stat.st_dev &&
|
|
||||||
exe_stat.st_ino == new_path_stat.st_ino) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
my_memcpy(path, exe_link, NAME_MAX);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,264 +0,0 @@
|
||||||
// Copyright (c) 2010, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_dumper.h: Define the google_breakpad::LinuxDumper class, which
|
|
||||||
// is a base class for extracting information of a crashed process. It
|
|
||||||
// was originally a complete implementation using the ptrace API, but
|
|
||||||
// has been refactored to allow derived implementations supporting both
|
|
||||||
// ptrace and core dump. A portion of the original implementation is now
|
|
||||||
// in google_breakpad::LinuxPtraceDumper (see linux_ptrace_dumper.h for
|
|
||||||
// details).
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_
|
|
||||||
|
|
||||||
#include <elf.h>
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
#include <link.h>
|
|
||||||
#endif
|
|
||||||
#include <linux/limits.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/user.h>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/mapping_info.h"
|
|
||||||
#include "client/linux/dump_writer_common/thread_info.h"
|
|
||||||
#include "common/memory.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Typedef for our parsing of the auxv variables in /proc/pid/auxv.
|
|
||||||
#if defined(__i386) || defined(__ARM_EABI__) || \
|
|
||||||
(defined(__mips__) && _MIPS_SIM == _ABIO32)
|
|
||||||
typedef Elf32_auxv_t elf_aux_entry;
|
|
||||||
#elif defined(__x86_64) || defined(__aarch64__) || \
|
|
||||||
(defined(__mips__) && _MIPS_SIM != _ABIO32)
|
|
||||||
typedef Elf64_auxv_t elf_aux_entry;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef __typeof__(((elf_aux_entry*) 0)->a_un.a_val) elf_aux_val_t;
|
|
||||||
|
|
||||||
// When we find the VDSO mapping in the process's address space, this
|
|
||||||
// is the name we use for it when writing it to the minidump.
|
|
||||||
// This should always be less than NAME_MAX!
|
|
||||||
const char kLinuxGateLibraryName[] = "linux-gate.so";
|
|
||||||
|
|
||||||
class LinuxDumper {
|
|
||||||
public:
|
|
||||||
// The |root_prefix| is prepended to mapping paths before opening them, which
|
|
||||||
// is useful if the crash originates from a chroot.
|
|
||||||
explicit LinuxDumper(pid_t pid, const char* root_prefix = "");
|
|
||||||
|
|
||||||
virtual ~LinuxDumper();
|
|
||||||
|
|
||||||
// Parse the data for |threads| and |mappings|.
|
|
||||||
virtual bool Init();
|
|
||||||
|
|
||||||
// Take any actions that could not be taken in Init(). LateInit() is
|
|
||||||
// called after all other caller's initialization is complete, and in
|
|
||||||
// particular after it has called ThreadsSuspend(), so that ptrace is
|
|
||||||
// available.
|
|
||||||
virtual bool LateInit();
|
|
||||||
|
|
||||||
// Return true if the dumper performs a post-mortem dump.
|
|
||||||
virtual bool IsPostMortem() const = 0;
|
|
||||||
|
|
||||||
// Suspend/resume all threads in the given process.
|
|
||||||
virtual bool ThreadsSuspend() = 0;
|
|
||||||
virtual bool ThreadsResume() = 0;
|
|
||||||
|
|
||||||
// Read information about the |index|-th thread of |threads_|.
|
|
||||||
// Returns true on success. One must have called |ThreadsSuspend| first.
|
|
||||||
virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info) = 0;
|
|
||||||
|
|
||||||
// These are only valid after a call to |Init|.
|
|
||||||
const wasteful_vector<pid_t> &threads() { return threads_; }
|
|
||||||
const wasteful_vector<MappingInfo*> &mappings() { return mappings_; }
|
|
||||||
const MappingInfo* FindMapping(const void* address) const;
|
|
||||||
const wasteful_vector<elf_aux_val_t>& auxv() { return auxv_; }
|
|
||||||
|
|
||||||
// Find a block of memory to take as the stack given the top of stack pointer.
|
|
||||||
// stack: (output) the lowest address in the memory area
|
|
||||||
// stack_len: (output) the length of the memory area
|
|
||||||
// stack_top: the current top of the stack
|
|
||||||
bool GetStackInfo(const void** stack, size_t* stack_len, uintptr_t stack_top);
|
|
||||||
|
|
||||||
PageAllocator* allocator() { return &allocator_; }
|
|
||||||
|
|
||||||
// Copy content of |length| bytes from a given process |child|,
|
|
||||||
// starting from |src|, into |dest|. Returns true on success.
|
|
||||||
virtual bool CopyFromProcess(void* dest, pid_t child, const void* src,
|
|
||||||
size_t length) = 0;
|
|
||||||
|
|
||||||
// Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).
|
|
||||||
// |path| is a character array of at least NAME_MAX bytes to return the
|
|
||||||
// result.|node| is the final node without any slashes. Returns true on
|
|
||||||
// success.
|
|
||||||
virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const = 0;
|
|
||||||
|
|
||||||
// Generate a File ID from the .text section of a mapped entry.
|
|
||||||
// If not a member, mapping_id is ignored. This method can also manipulate the
|
|
||||||
// |mapping|.name to truncate "(deleted)" from the file name if necessary.
|
|
||||||
bool ElfFileIdentifierForMapping(const MappingInfo& mapping,
|
|
||||||
bool member,
|
|
||||||
unsigned int mapping_id,
|
|
||||||
uint8_t identifier[sizeof(MDGUID)]);
|
|
||||||
|
|
||||||
uintptr_t crash_address() const { return crash_address_; }
|
|
||||||
void set_crash_address(uintptr_t crash_address) {
|
|
||||||
crash_address_ = crash_address;
|
|
||||||
}
|
|
||||||
|
|
||||||
int crash_signal() const { return crash_signal_; }
|
|
||||||
void set_crash_signal(int crash_signal) { crash_signal_ = crash_signal; }
|
|
||||||
|
|
||||||
pid_t crash_thread() const { return crash_thread_; }
|
|
||||||
void set_crash_thread(pid_t crash_thread) { crash_thread_ = crash_thread; }
|
|
||||||
|
|
||||||
// Concatenates the |root_prefix_| and |mapping| path. Writes into |path| and
|
|
||||||
// returns true unless the string is too long.
|
|
||||||
bool GetMappingAbsolutePath(const MappingInfo& mapping,
|
|
||||||
char path[PATH_MAX]) const;
|
|
||||||
|
|
||||||
// Extracts the effective path and file name of from |mapping|. In most cases
|
|
||||||
// the effective name/path are just the mapping's path and basename. In some
|
|
||||||
// other cases, however, a library can be mapped from an archive (e.g., when
|
|
||||||
// loading .so libs from an apk on Android) and this method is able to
|
|
||||||
// reconstruct the original file name.
|
|
||||||
void GetMappingEffectiveNameAndPath(const MappingInfo& mapping,
|
|
||||||
char* file_path,
|
|
||||||
size_t file_path_size,
|
|
||||||
char* file_name,
|
|
||||||
size_t file_name_size);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool ReadAuxv();
|
|
||||||
|
|
||||||
virtual bool EnumerateMappings();
|
|
||||||
|
|
||||||
virtual bool EnumerateThreads() = 0;
|
|
||||||
|
|
||||||
// For the case where a running program has been deleted, it'll show up in
|
|
||||||
// /proc/pid/maps as "/path/to/program (deleted)". If this is the case, then
|
|
||||||
// see if '/path/to/program (deleted)' matches /proc/pid/exe and return
|
|
||||||
// /proc/pid/exe in |path| so ELF identifier generation works correctly. This
|
|
||||||
// also checks to see if '/path/to/program (deleted)' exists, so it does not
|
|
||||||
// get fooled by a poorly named binary.
|
|
||||||
// For programs that don't end with ' (deleted)', this is a no-op.
|
|
||||||
// This assumes |path| is a buffer with length NAME_MAX.
|
|
||||||
// Returns true if |path| is modified.
|
|
||||||
bool HandleDeletedFileInMapping(char* path) const;
|
|
||||||
|
|
||||||
// ID of the crashed process.
|
|
||||||
const pid_t pid_;
|
|
||||||
|
|
||||||
// Path of the root directory to which mapping paths are relative.
|
|
||||||
const char* const root_prefix_;
|
|
||||||
|
|
||||||
// Virtual address at which the process crashed.
|
|
||||||
uintptr_t crash_address_;
|
|
||||||
|
|
||||||
// Signal that terminated the crashed process.
|
|
||||||
int crash_signal_;
|
|
||||||
|
|
||||||
// ID of the crashed thread.
|
|
||||||
pid_t crash_thread_;
|
|
||||||
|
|
||||||
mutable PageAllocator allocator_;
|
|
||||||
|
|
||||||
// IDs of all the threads.
|
|
||||||
wasteful_vector<pid_t> threads_;
|
|
||||||
|
|
||||||
// Info from /proc/<pid>/maps.
|
|
||||||
wasteful_vector<MappingInfo*> mappings_;
|
|
||||||
|
|
||||||
// Info from /proc/<pid>/auxv
|
|
||||||
wasteful_vector<elf_aux_val_t> auxv_;
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
private:
|
|
||||||
// Android M and later support packed ELF relocations in shared libraries.
|
|
||||||
// Packing relocations changes the vaddr of the LOAD segments, such that
|
|
||||||
// the effective load bias is no longer the same as the start address of
|
|
||||||
// the memory mapping containing the executable parts of the library. The
|
|
||||||
// packing is applied to the stripped library run on the target, but not to
|
|
||||||
// any other library, and in particular not to the library used to generate
|
|
||||||
// breakpad symbols. As a result, we need to adjust the |start_addr| for
|
|
||||||
// any mapping that results from a shared library that contains Android
|
|
||||||
// packed relocations, so that it properly represents the effective library
|
|
||||||
// load bias. The following functions support this adjustment.
|
|
||||||
|
|
||||||
// Check that a given mapping at |start_addr| is for an ELF shared library.
|
|
||||||
// If it is, place the ELF header in |ehdr| and return true.
|
|
||||||
// The first LOAD segment in an ELF shared library has offset zero, so the
|
|
||||||
// ELF file header is at the start of this map entry, and in already mapped
|
|
||||||
// memory.
|
|
||||||
bool GetLoadedElfHeader(uintptr_t start_addr, ElfW(Ehdr)* ehdr);
|
|
||||||
|
|
||||||
// For the ELF file mapped at |start_addr|, iterate ELF program headers to
|
|
||||||
// find the min vaddr of all program header LOAD segments, the vaddr for
|
|
||||||
// the DYNAMIC segment, and a count of DYNAMIC entries. Return values in
|
|
||||||
// |min_vaddr_ptr|, |dyn_vaddr_ptr|, and |dyn_count_ptr|.
|
|
||||||
// The program header table is also in already mapped memory.
|
|
||||||
void ParseLoadedElfProgramHeaders(ElfW(Ehdr)* ehdr,
|
|
||||||
uintptr_t start_addr,
|
|
||||||
uintptr_t* min_vaddr_ptr,
|
|
||||||
uintptr_t* dyn_vaddr_ptr,
|
|
||||||
size_t* dyn_count_ptr);
|
|
||||||
|
|
||||||
// Search the DYNAMIC tags for the ELF file with the given |load_bias|, and
|
|
||||||
// return true if the tags indicate that the file contains Android packed
|
|
||||||
// relocations. Dynamic tags are found at |dyn_vaddr| past the |load_bias|.
|
|
||||||
bool HasAndroidPackedRelocations(uintptr_t load_bias,
|
|
||||||
uintptr_t dyn_vaddr,
|
|
||||||
size_t dyn_count);
|
|
||||||
|
|
||||||
// If the ELF file mapped at |start_addr| contained Android packed
|
|
||||||
// relocations, return the load bias that the system linker (or Chromium
|
|
||||||
// crazy linker) will have used. If the file did not contain Android
|
|
||||||
// packed relocations, returns |start_addr|, indicating that no adjustment
|
|
||||||
// is necessary.
|
|
||||||
// The effective load bias is |start_addr| adjusted downwards by the
|
|
||||||
// min vaddr in the library LOAD segments.
|
|
||||||
uintptr_t GetEffectiveLoadBias(ElfW(Ehdr)* ehdr, uintptr_t start_addr);
|
|
||||||
|
|
||||||
// Called from LateInit(). Iterates |mappings_| and rewrites the |start_addr|
|
|
||||||
// field of any that represent ELF shared libraries with Android packed
|
|
||||||
// relocations, so that |start_addr| is the load bias that the system linker
|
|
||||||
// (or Chromium crazy linker) used. This value matches the addresses produced
|
|
||||||
// when the non-relocation-packed library is used for breakpad symbol
|
|
||||||
// generation.
|
|
||||||
void LatePostprocessMappings();
|
|
||||||
#endif // __ANDROID__
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_LINUX_DUMPER_H_
|
|
||||||
|
|
@ -1,355 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_ptrace_dumper.cc: Implement google_breakpad::LinuxPtraceDumper.
|
|
||||||
// See linux_ptrace_dumper.h for detals.
|
|
||||||
// This class was originally splitted from google_breakpad::LinuxDumper.
|
|
||||||
|
|
||||||
// This code deals with the mechanics of getting information about a crashed
|
|
||||||
// process. Since this code may run in a compromised address space, the same
|
|
||||||
// rules apply as detailed at the top of minidump_writer.h: no libc calls and
|
|
||||||
// use the alternative allocator.
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_ptrace_dumper.h"
|
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/ptrace.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
#if defined(__i386)
|
|
||||||
#include <cpuid.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/directory_reader.h"
|
|
||||||
#include "client/linux/minidump_writer/line_reader.h"
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
// Suspends a thread by attaching to it.
|
|
||||||
static bool SuspendThread(pid_t pid) {
|
|
||||||
// This may fail if the thread has just died or debugged.
|
|
||||||
errno = 0;
|
|
||||||
if (sys_ptrace(PTRACE_ATTACH, pid, NULL, NULL) != 0 &&
|
|
||||||
errno != 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
while (sys_waitpid(pid, NULL, __WALL) < 0) {
|
|
||||||
if (errno != EINTR) {
|
|
||||||
sys_ptrace(PTRACE_DETACH, pid, NULL, NULL);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
|
||||||
// On x86, the stack pointer is NULL or -1, when executing trusted code in
|
|
||||||
// the seccomp sandbox. Not only does this cause difficulties down the line
|
|
||||||
// when trying to dump the thread's stack, it also results in the minidumps
|
|
||||||
// containing information about the trusted threads. This information is
|
|
||||||
// generally completely meaningless and just pollutes the minidumps.
|
|
||||||
// We thus test the stack pointer and exclude any threads that are part of
|
|
||||||
// the seccomp sandbox's trusted code.
|
|
||||||
user_regs_struct regs;
|
|
||||||
if (sys_ptrace(PTRACE_GETREGS, pid, NULL, ®s) == -1 ||
|
|
||||||
#if defined(__i386)
|
|
||||||
!regs.esp
|
|
||||||
#elif defined(__x86_64)
|
|
||||||
!regs.rsp
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
sys_ptrace(PTRACE_DETACH, pid, NULL, NULL);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resumes a thread by detaching from it.
|
|
||||||
static bool ResumeThread(pid_t pid) {
|
|
||||||
return sys_ptrace(PTRACE_DETACH, pid, NULL, NULL) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
LinuxPtraceDumper::LinuxPtraceDumper(pid_t pid)
|
|
||||||
: LinuxDumper(pid),
|
|
||||||
threads_suspended_(false) {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxPtraceDumper::BuildProcPath(char* path, pid_t pid,
|
|
||||||
const char* node) const {
|
|
||||||
if (!path || !node || pid <= 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
size_t node_len = my_strlen(node);
|
|
||||||
if (node_len == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const unsigned pid_len = my_uint_len(pid);
|
|
||||||
const size_t total_length = 6 + pid_len + 1 + node_len;
|
|
||||||
if (total_length >= NAME_MAX)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
my_memcpy(path, "/proc/", 6);
|
|
||||||
my_uitos(path + 6, pid, pid_len);
|
|
||||||
path[6 + pid_len] = '/';
|
|
||||||
my_memcpy(path + 6 + pid_len + 1, node, node_len);
|
|
||||||
path[total_length] = '\0';
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
|
|
||||||
const void* src, size_t length) {
|
|
||||||
unsigned long tmp = 55;
|
|
||||||
size_t done = 0;
|
|
||||||
static const size_t word_size = sizeof(tmp);
|
|
||||||
uint8_t* const local = (uint8_t*) dest;
|
|
||||||
uint8_t* const remote = (uint8_t*) src;
|
|
||||||
|
|
||||||
while (done < length) {
|
|
||||||
const size_t l = (length - done > word_size) ? word_size : (length - done);
|
|
||||||
if (sys_ptrace(PTRACE_PEEKDATA, child, remote + done, &tmp) == -1) {
|
|
||||||
tmp = 0;
|
|
||||||
}
|
|
||||||
my_memcpy(local + done, &tmp, l);
|
|
||||||
done += l;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read thread info from /proc/$pid/status.
|
|
||||||
// Fill out the |tgid|, |ppid| and |pid| members of |info|. If unavailable,
|
|
||||||
// these members are set to -1. Returns true iff all three members are
|
|
||||||
// available.
|
|
||||||
bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
|
|
||||||
if (index >= threads_.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
pid_t tid = threads_[index];
|
|
||||||
|
|
||||||
assert(info != NULL);
|
|
||||||
char status_path[NAME_MAX];
|
|
||||||
if (!BuildProcPath(status_path, tid, "status"))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const int fd = sys_open(status_path, O_RDONLY, 0);
|
|
||||||
if (fd < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
LineReader* const line_reader = new(allocator_) LineReader(fd);
|
|
||||||
const char* line;
|
|
||||||
unsigned line_len;
|
|
||||||
|
|
||||||
info->ppid = info->tgid = -1;
|
|
||||||
|
|
||||||
while (line_reader->GetNextLine(&line, &line_len)) {
|
|
||||||
if (my_strncmp("Tgid:\t", line, 6) == 0) {
|
|
||||||
my_strtoui(&info->tgid, line + 6);
|
|
||||||
} else if (my_strncmp("PPid:\t", line, 6) == 0) {
|
|
||||||
my_strtoui(&info->ppid, line + 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
line_reader->PopLine(line_len);
|
|
||||||
}
|
|
||||||
sys_close(fd);
|
|
||||||
|
|
||||||
if (info->ppid == -1 || info->tgid == -1)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
#ifdef PTRACE_GETREGSET
|
|
||||||
struct iovec io;
|
|
||||||
info->GetGeneralPurposeRegisters(&io.iov_base, &io.iov_len);
|
|
||||||
if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
info->GetFloatingPointRegisters(&io.iov_base, &io.iov_len);
|
|
||||||
if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#else // PTRACE_GETREGSET
|
|
||||||
void* gp_addr;
|
|
||||||
info->GetGeneralPurposeRegisters(&gp_addr, NULL);
|
|
||||||
if (sys_ptrace(PTRACE_GETREGS, tid, NULL, gp_addr) == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !(defined(__ANDROID__) && defined(__ARM_EABI__))
|
|
||||||
// When running an arm build on an arm64 device, attempting to get the
|
|
||||||
// floating point registers fails. On Android, the floating point registers
|
|
||||||
// aren't written to the cpu context anyway, so just don't get them here.
|
|
||||||
// See http://crbug.com/508324
|
|
||||||
void* fp_addr;
|
|
||||||
info->GetFloatingPointRegisters(&fp_addr, NULL);
|
|
||||||
if (sys_ptrace(PTRACE_GETFPREGS, tid, NULL, fp_addr) == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif // PTRACE_GETREGSET
|
|
||||||
|
|
||||||
#if defined(__i386)
|
|
||||||
#if !defined(bit_FXSAVE) // e.g. Clang
|
|
||||||
#define bit_FXSAVE bit_FXSR
|
|
||||||
#endif
|
|
||||||
// Detect if the CPU supports the FXSAVE/FXRSTOR instructions
|
|
||||||
int eax, ebx, ecx, edx;
|
|
||||||
__cpuid(1, eax, ebx, ecx, edx);
|
|
||||||
if (edx & bit_FXSAVE) {
|
|
||||||
if (sys_ptrace(PTRACE_GETFPXREGS, tid, NULL, &info->fpxregs) == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
memset(&info->fpxregs, 0, sizeof(info->fpxregs));
|
|
||||||
}
|
|
||||||
#endif // defined(__i386)
|
|
||||||
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
|
||||||
for (unsigned i = 0; i < ThreadInfo::kNumDebugRegisters; ++i) {
|
|
||||||
if (sys_ptrace(
|
|
||||||
PTRACE_PEEKUSER, tid,
|
|
||||||
reinterpret_cast<void*> (offsetof(struct user,
|
|
||||||
u_debugreg[0]) + i *
|
|
||||||
sizeof(debugreg_t)),
|
|
||||||
&info->dregs[i]) == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__mips__)
|
|
||||||
sys_ptrace(PTRACE_PEEKUSER, tid,
|
|
||||||
reinterpret_cast<void*>(DSP_BASE), &info->mcontext.hi1);
|
|
||||||
sys_ptrace(PTRACE_PEEKUSER, tid,
|
|
||||||
reinterpret_cast<void*>(DSP_BASE + 1), &info->mcontext.lo1);
|
|
||||||
sys_ptrace(PTRACE_PEEKUSER, tid,
|
|
||||||
reinterpret_cast<void*>(DSP_BASE + 2), &info->mcontext.hi2);
|
|
||||||
sys_ptrace(PTRACE_PEEKUSER, tid,
|
|
||||||
reinterpret_cast<void*>(DSP_BASE + 3), &info->mcontext.lo2);
|
|
||||||
sys_ptrace(PTRACE_PEEKUSER, tid,
|
|
||||||
reinterpret_cast<void*>(DSP_BASE + 4), &info->mcontext.hi3);
|
|
||||||
sys_ptrace(PTRACE_PEEKUSER, tid,
|
|
||||||
reinterpret_cast<void*>(DSP_BASE + 5), &info->mcontext.lo3);
|
|
||||||
sys_ptrace(PTRACE_PEEKUSER, tid,
|
|
||||||
reinterpret_cast<void*>(DSP_CONTROL), &info->mcontext.dsp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const uint8_t* stack_pointer;
|
|
||||||
#if defined(__i386)
|
|
||||||
my_memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp));
|
|
||||||
#elif defined(__x86_64)
|
|
||||||
my_memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp));
|
|
||||||
#elif defined(__ARM_EABI__)
|
|
||||||
my_memcpy(&stack_pointer, &info->regs.ARM_sp, sizeof(info->regs.ARM_sp));
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
my_memcpy(&stack_pointer, &info->regs.sp, sizeof(info->regs.sp));
|
|
||||||
#elif defined(__mips__)
|
|
||||||
stack_pointer =
|
|
||||||
reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
|
|
||||||
#else
|
|
||||||
#error "This code hasn't been ported to your platform yet."
|
|
||||||
#endif
|
|
||||||
info->stack_pointer = reinterpret_cast<uintptr_t>(stack_pointer);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxPtraceDumper::IsPostMortem() const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxPtraceDumper::ThreadsSuspend() {
|
|
||||||
if (threads_suspended_)
|
|
||||||
return true;
|
|
||||||
for (size_t i = 0; i < threads_.size(); ++i) {
|
|
||||||
if (!SuspendThread(threads_[i])) {
|
|
||||||
// If the thread either disappeared before we could attach to it, or if
|
|
||||||
// it was part of the seccomp sandbox's trusted code, it is OK to
|
|
||||||
// silently drop it from the minidump.
|
|
||||||
if (i < threads_.size() - 1) {
|
|
||||||
my_memmove(&threads_[i], &threads_[i + 1],
|
|
||||||
(threads_.size() - i - 1) * sizeof(threads_[i]));
|
|
||||||
}
|
|
||||||
threads_.resize(threads_.size() - 1);
|
|
||||||
--i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
threads_suspended_ = true;
|
|
||||||
return threads_.size() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LinuxPtraceDumper::ThreadsResume() {
|
|
||||||
if (!threads_suspended_)
|
|
||||||
return false;
|
|
||||||
bool good = true;
|
|
||||||
for (size_t i = 0; i < threads_.size(); ++i)
|
|
||||||
good &= ResumeThread(threads_[i]);
|
|
||||||
threads_suspended_ = false;
|
|
||||||
return good;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse /proc/$pid/task to list all the threads of the process identified by
|
|
||||||
// pid.
|
|
||||||
bool LinuxPtraceDumper::EnumerateThreads() {
|
|
||||||
char task_path[NAME_MAX];
|
|
||||||
if (!BuildProcPath(task_path, pid_, "task"))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const int fd = sys_open(task_path, O_RDONLY | O_DIRECTORY, 0);
|
|
||||||
if (fd < 0)
|
|
||||||
return false;
|
|
||||||
DirectoryReader* dir_reader = new(allocator_) DirectoryReader(fd);
|
|
||||||
|
|
||||||
// The directory may contain duplicate entries which we filter by assuming
|
|
||||||
// that they are consecutive.
|
|
||||||
int last_tid = -1;
|
|
||||||
const char* dent_name;
|
|
||||||
while (dir_reader->GetNextEntry(&dent_name)) {
|
|
||||||
if (my_strcmp(dent_name, ".") &&
|
|
||||||
my_strcmp(dent_name, "..")) {
|
|
||||||
int tid = 0;
|
|
||||||
if (my_strtoui(&tid, dent_name) &&
|
|
||||||
last_tid != tid) {
|
|
||||||
last_tid = tid;
|
|
||||||
threads_.push_back(tid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dir_reader->PopEntry();
|
|
||||||
}
|
|
||||||
|
|
||||||
sys_close(fd);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_ptrace_dumper.h: Define the google_breakpad::LinuxPtraceDumper
|
|
||||||
// class, which is derived from google_breakpad::LinuxDumper to extract
|
|
||||||
// information from a crashed process via ptrace.
|
|
||||||
// This class was originally splitted from google_breakpad::LinuxDumper.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_dumper.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class LinuxPtraceDumper : public LinuxDumper {
|
|
||||||
public:
|
|
||||||
// Constructs a dumper for extracting information of a given process
|
|
||||||
// with a process ID of |pid|.
|
|
||||||
explicit LinuxPtraceDumper(pid_t pid);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::BuildProcPath().
|
|
||||||
// Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).
|
|
||||||
// |path| is a character array of at least NAME_MAX bytes to return the
|
|
||||||
// result. |node| is the final node without any slashes. Returns true on
|
|
||||||
// success.
|
|
||||||
virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const;
|
|
||||||
|
|
||||||
// Implements LinuxDumper::CopyFromProcess().
|
|
||||||
// Copies content of |length| bytes from a given process |child|,
|
|
||||||
// starting from |src|, into |dest|. This method uses ptrace to extract
|
|
||||||
// the content from the target process. Always returns true.
|
|
||||||
virtual bool CopyFromProcess(void* dest, pid_t child, const void* src,
|
|
||||||
size_t length);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::GetThreadInfoByIndex().
|
|
||||||
// Reads information about the |index|-th thread of |threads_|.
|
|
||||||
// Returns true on success. One must have called |ThreadsSuspend| first.
|
|
||||||
virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::IsPostMortem().
|
|
||||||
// Always returns false to indicate this dumper performs a dump of
|
|
||||||
// a crashed process via ptrace.
|
|
||||||
virtual bool IsPostMortem() const;
|
|
||||||
|
|
||||||
// Implements LinuxDumper::ThreadsSuspend().
|
|
||||||
// Suspends all threads in the given process. Returns true on success.
|
|
||||||
virtual bool ThreadsSuspend();
|
|
||||||
|
|
||||||
// Implements LinuxDumper::ThreadsResume().
|
|
||||||
// Resumes all threads in the given process. Returns true on success.
|
|
||||||
virtual bool ThreadsResume();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// Implements LinuxDumper::EnumerateThreads().
|
|
||||||
// Enumerates all threads of the given process into |threads_|.
|
|
||||||
virtual bool EnumerateThreads();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Set to true if all threads of the crashed process are suspended.
|
|
||||||
bool threads_suspended_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_LINUX_PTRACE_DUMPER_H_
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,124 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_dumper.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class ExceptionHandler;
|
|
||||||
|
|
||||||
#if defined(__aarch64__)
|
|
||||||
typedef struct fpsimd_context fpstate_t;
|
|
||||||
#elif !defined(__ARM_EABI__) && !defined(__mips__)
|
|
||||||
typedef struct _libc_fpstate fpstate_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// These entries store a list of memory regions that the client wants included
|
|
||||||
// in the minidump.
|
|
||||||
struct AppMemory {
|
|
||||||
void* ptr;
|
|
||||||
size_t length;
|
|
||||||
|
|
||||||
bool operator==(const struct AppMemory& other) const {
|
|
||||||
return ptr == other.ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const void* other) const {
|
|
||||||
return ptr == other;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
typedef std::list<AppMemory> AppMemoryList;
|
|
||||||
|
|
||||||
// Writes a minidump to the filesystem. These functions do not malloc nor use
|
|
||||||
// libc functions which may. Thus, it can be used in contexts where the state
|
|
||||||
// of the heap may be corrupt.
|
|
||||||
// minidump_path: the path to the file to write to. This is opened O_EXCL and
|
|
||||||
// fails open fails.
|
|
||||||
// crashing_process: the pid of the crashing process. This must be trusted.
|
|
||||||
// blob: a blob of data from the crashing process. See exception_handler.h
|
|
||||||
// blob_size: the length of |blob|, in bytes
|
|
||||||
//
|
|
||||||
// Returns true iff successful.
|
|
||||||
bool WriteMinidump(const char* minidump_path, pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size);
|
|
||||||
// Same as above but takes an open file descriptor instead of a path.
|
|
||||||
bool WriteMinidump(int minidump_fd, pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size);
|
|
||||||
|
|
||||||
// Alternate form of WriteMinidump() that works with processes that
|
|
||||||
// are not expected to have crashed. If |process_blamed_thread| is
|
|
||||||
// meaningful, it will be the one from which a crash signature is
|
|
||||||
// extracted. It is not expected that this function will be called
|
|
||||||
// from a compromised context, but it is safe to do so.
|
|
||||||
bool WriteMinidump(const char* minidump_path, pid_t process,
|
|
||||||
pid_t process_blamed_thread);
|
|
||||||
|
|
||||||
// These overloads also allow passing a list of known mappings and
|
|
||||||
// a list of additional memory regions to be included in the minidump.
|
|
||||||
bool WriteMinidump(const char* minidump_path, pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata);
|
|
||||||
bool WriteMinidump(int minidump_fd, pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata);
|
|
||||||
|
|
||||||
// These overloads also allow passing a file size limit for the minidump.
|
|
||||||
bool WriteMinidump(const char* minidump_path, off_t minidump_size_limit,
|
|
||||||
pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata);
|
|
||||||
bool WriteMinidump(int minidump_fd, off_t minidump_size_limit,
|
|
||||||
pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata);
|
|
||||||
|
|
||||||
bool WriteMinidump(const char* filename,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata,
|
|
||||||
LinuxDumper* dumper);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
|
|
||||||
|
|
@ -1,130 +0,0 @@
|
||||||
// Copyright (c) 2013, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/line_reader.h"
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class for reading /proc/cpuinfo without using fopen/fgets or other
|
|
||||||
// functions which may allocate memory.
|
|
||||||
class ProcCpuInfoReader {
|
|
||||||
public:
|
|
||||||
ProcCpuInfoReader(int fd)
|
|
||||||
: line_reader_(fd), pop_count_(-1) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the next field name, or NULL in case of EOF.
|
|
||||||
// field: (output) Pointer to zero-terminated field name.
|
|
||||||
// Returns true on success, or false on EOF or error (line too long).
|
|
||||||
bool GetNextField(const char** field) {
|
|
||||||
for (;;) {
|
|
||||||
const char* line;
|
|
||||||
unsigned line_len;
|
|
||||||
|
|
||||||
// Try to read next line.
|
|
||||||
if (pop_count_ >= 0) {
|
|
||||||
line_reader_.PopLine(pop_count_);
|
|
||||||
pop_count_ = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!line_reader_.GetNextLine(&line, &line_len))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
pop_count_ = static_cast<int>(line_len);
|
|
||||||
|
|
||||||
const char* line_end = line + line_len;
|
|
||||||
|
|
||||||
// Expected format: <field-name> <space>+ ':' <space> <value>
|
|
||||||
// Note that:
|
|
||||||
// - empty lines happen.
|
|
||||||
// - <field-name> can contain spaces.
|
|
||||||
// - some fields have an empty <value>
|
|
||||||
char* sep = static_cast<char*>(my_memchr(line, ':', line_len));
|
|
||||||
if (sep == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Record the value. Skip leading space after the column to get
|
|
||||||
// its start.
|
|
||||||
const char* val = sep+1;
|
|
||||||
while (val < line_end && my_isspace(*val))
|
|
||||||
val++;
|
|
||||||
|
|
||||||
value_ = val;
|
|
||||||
value_len_ = static_cast<size_t>(line_end - val);
|
|
||||||
|
|
||||||
// Remove trailing spaces before the column to properly 0-terminate
|
|
||||||
// the field name.
|
|
||||||
while (sep > line && my_isspace(sep[-1]))
|
|
||||||
sep--;
|
|
||||||
|
|
||||||
if (sep == line)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// zero-terminate field name.
|
|
||||||
*sep = '\0';
|
|
||||||
|
|
||||||
*field = line;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the field value. This must be called after a succesful
|
|
||||||
// call to GetNextField().
|
|
||||||
const char* GetValue() {
|
|
||||||
assert(value_);
|
|
||||||
return value_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Same as GetValue(), but also returns the length in characters of
|
|
||||||
// the value.
|
|
||||||
const char* GetValueAndLen(size_t* length) {
|
|
||||||
assert(value_);
|
|
||||||
*length = value_len_;
|
|
||||||
return value_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
LineReader line_reader_;
|
|
||||||
int pop_count_;
|
|
||||||
const char* value_;
|
|
||||||
size_t value_len_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// minidump_file_writer-inl.h: Minidump file writer implementation.
|
|
||||||
//
|
|
||||||
// See minidump_file_writer.h for documentation.
|
|
||||||
|
|
||||||
#ifndef CLIENT_MINIDUMP_FILE_WRITER_INL_H__
|
|
||||||
#define CLIENT_MINIDUMP_FILE_WRITER_INL_H__
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "client/minidump_file_writer.h"
|
|
||||||
#include "google_breakpad/common/minidump_size.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
template<typename MDType>
|
|
||||||
inline bool TypedMDRVA<MDType>::Allocate() {
|
|
||||||
allocation_state_ = SINGLE_OBJECT;
|
|
||||||
return UntypedMDRVA::Allocate(minidump_size<MDType>::size());
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename MDType>
|
|
||||||
inline bool TypedMDRVA<MDType>::Allocate(size_t additional) {
|
|
||||||
allocation_state_ = SINGLE_OBJECT;
|
|
||||||
return UntypedMDRVA::Allocate(minidump_size<MDType>::size() + additional);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename MDType>
|
|
||||||
inline bool TypedMDRVA<MDType>::AllocateArray(size_t count) {
|
|
||||||
assert(count);
|
|
||||||
allocation_state_ = ARRAY;
|
|
||||||
return UntypedMDRVA::Allocate(minidump_size<MDType>::size() * count);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename MDType>
|
|
||||||
inline bool TypedMDRVA<MDType>::AllocateObjectAndArray(size_t count,
|
|
||||||
size_t length) {
|
|
||||||
assert(count && length);
|
|
||||||
allocation_state_ = SINGLE_OBJECT_WITH_ARRAY;
|
|
||||||
return UntypedMDRVA::Allocate(minidump_size<MDType>::size() + count * length);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename MDType>
|
|
||||||
inline bool TypedMDRVA<MDType>::CopyIndex(unsigned int index, MDType *item) {
|
|
||||||
assert(allocation_state_ == ARRAY);
|
|
||||||
return writer_->Copy(
|
|
||||||
static_cast<MDRVA>(position_ + index * minidump_size<MDType>::size()),
|
|
||||||
item, minidump_size<MDType>::size());
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename MDType>
|
|
||||||
inline bool TypedMDRVA<MDType>::CopyIndexAfterObject(unsigned int index,
|
|
||||||
const void *src,
|
|
||||||
size_t length) {
|
|
||||||
assert(allocation_state_ == SINGLE_OBJECT_WITH_ARRAY);
|
|
||||||
return writer_->Copy(
|
|
||||||
static_cast<MDRVA>(position_ + minidump_size<MDType>::size()
|
|
||||||
+ index * length),
|
|
||||||
src, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename MDType>
|
|
||||||
inline bool TypedMDRVA<MDType>::Flush() {
|
|
||||||
return writer_->Copy(position_, &data_, minidump_size<MDType>::size());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_MINIDUMP_FILE_WRITER_INL_H__
|
|
||||||
|
|
@ -1,350 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// minidump_file_writer.cc: Minidump file writer implementation.
|
|
||||||
//
|
|
||||||
// See minidump_file_writer.h for documentation.
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "client/minidump_file_writer-inl.h"
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "common/string_conversion.h"
|
|
||||||
#if defined(__linux__) && __linux__
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
bool g_need_ftruncate_workaround = false;
|
|
||||||
bool g_checked_need_ftruncate_workaround = false;
|
|
||||||
|
|
||||||
void CheckNeedsFTruncateWorkAround(int file) {
|
|
||||||
if (g_checked_need_ftruncate_workaround) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_checked_need_ftruncate_workaround = true;
|
|
||||||
|
|
||||||
// Attempt an idempotent truncate that chops off nothing and see if we
|
|
||||||
// run into any sort of errors.
|
|
||||||
off_t offset = sys_lseek(file, 0, SEEK_END);
|
|
||||||
if (offset == -1) {
|
|
||||||
// lseek failed. Don't apply work around. It's unlikely that we can write
|
|
||||||
// to a minidump with either method.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int result = ftruncate(file, offset);
|
|
||||||
if (result == -1 && errno == EACCES) {
|
|
||||||
// It very likely that we are running into the kernel bug in M devices.
|
|
||||||
// We are going to deploy the workaround for writing minidump files
|
|
||||||
// without uses of ftruncate(). This workaround should be fine even
|
|
||||||
// for kernels without the bug.
|
|
||||||
// See http://crbug.com/542840 for more details.
|
|
||||||
g_need_ftruncate_workaround = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NeedsFTruncateWorkAround() {
|
|
||||||
return g_need_ftruncate_workaround;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
#endif // defined(__ANDROID__)
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
const MDRVA MinidumpFileWriter::kInvalidMDRVA = static_cast<MDRVA>(-1);
|
|
||||||
|
|
||||||
MinidumpFileWriter::MinidumpFileWriter()
|
|
||||||
: file_(-1),
|
|
||||||
close_file_when_destroyed_(true),
|
|
||||||
position_(0),
|
|
||||||
size_(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
MinidumpFileWriter::~MinidumpFileWriter() {
|
|
||||||
if (close_file_when_destroyed_)
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinidumpFileWriter::Open(const char *path) {
|
|
||||||
assert(file_ == -1);
|
|
||||||
#if defined(__linux__) && __linux__
|
|
||||||
file_ = sys_open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);
|
|
||||||
#else
|
|
||||||
file_ = open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return file_ != -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinidumpFileWriter::SetFile(const int file) {
|
|
||||||
assert(file_ == -1);
|
|
||||||
file_ = file;
|
|
||||||
close_file_when_destroyed_ = false;
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
CheckNeedsFTruncateWorkAround(file);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinidumpFileWriter::Close() {
|
|
||||||
bool result = true;
|
|
||||||
|
|
||||||
if (file_ != -1) {
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
if (!NeedsFTruncateWorkAround() && ftruncate(file_, position_)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (ftruncate(file_, position_)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(__linux__) && __linux__
|
|
||||||
result = (sys_close(file_) == 0);
|
|
||||||
#else
|
|
||||||
result = (close(file_) == 0);
|
|
||||||
#endif
|
|
||||||
file_ = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinidumpFileWriter::CopyStringToMDString(const wchar_t *str,
|
|
||||||
unsigned int length,
|
|
||||||
TypedMDRVA<MDString> *mdstring) {
|
|
||||||
bool result = true;
|
|
||||||
if (sizeof(wchar_t) == sizeof(uint16_t)) {
|
|
||||||
// Shortcut if wchar_t is the same size as MDString's buffer
|
|
||||||
result = mdstring->Copy(str, mdstring->get()->length);
|
|
||||||
} else {
|
|
||||||
uint16_t out[2];
|
|
||||||
int out_idx = 0;
|
|
||||||
|
|
||||||
// Copy the string character by character
|
|
||||||
while (length && result) {
|
|
||||||
UTF32ToUTF16Char(*str, out);
|
|
||||||
if (!out[0])
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Process one character at a time
|
|
||||||
--length;
|
|
||||||
++str;
|
|
||||||
|
|
||||||
// Append the one or two UTF-16 characters. The first one will be non-
|
|
||||||
// zero, but the second one may be zero, depending on the conversion from
|
|
||||||
// UTF-32.
|
|
||||||
int out_count = out[1] ? 2 : 1;
|
|
||||||
size_t out_size = sizeof(uint16_t) * out_count;
|
|
||||||
result = mdstring->CopyIndexAfterObject(out_idx, out, out_size);
|
|
||||||
out_idx += out_count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinidumpFileWriter::CopyStringToMDString(const char *str,
|
|
||||||
unsigned int length,
|
|
||||||
TypedMDRVA<MDString> *mdstring) {
|
|
||||||
bool result = true;
|
|
||||||
uint16_t out[2];
|
|
||||||
int out_idx = 0;
|
|
||||||
|
|
||||||
// Copy the string character by character
|
|
||||||
while (length && result) {
|
|
||||||
int conversion_count = UTF8ToUTF16Char(str, length, out);
|
|
||||||
if (!conversion_count)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Move the pointer along based on the nubmer of converted characters
|
|
||||||
length -= conversion_count;
|
|
||||||
str += conversion_count;
|
|
||||||
|
|
||||||
// Append the one or two UTF-16 characters
|
|
||||||
int out_count = out[1] ? 2 : 1;
|
|
||||||
size_t out_size = sizeof(uint16_t) * out_count;
|
|
||||||
result = mdstring->CopyIndexAfterObject(out_idx, out, out_size);
|
|
||||||
out_idx += out_count;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename CharType>
|
|
||||||
bool MinidumpFileWriter::WriteStringCore(const CharType *str,
|
|
||||||
unsigned int length,
|
|
||||||
MDLocationDescriptor *location) {
|
|
||||||
assert(str);
|
|
||||||
assert(location);
|
|
||||||
// Calculate the mdstring length by either limiting to |length| as passed in
|
|
||||||
// or by finding the location of the NULL character.
|
|
||||||
unsigned int mdstring_length = 0;
|
|
||||||
if (!length)
|
|
||||||
length = INT_MAX;
|
|
||||||
for (; mdstring_length < length && str[mdstring_length]; ++mdstring_length)
|
|
||||||
;
|
|
||||||
|
|
||||||
// Allocate the string buffer
|
|
||||||
TypedMDRVA<MDString> mdstring(this);
|
|
||||||
if (!mdstring.AllocateObjectAndArray(mdstring_length + 1, sizeof(uint16_t)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Set length excluding the NULL and copy the string
|
|
||||||
mdstring.get()->length =
|
|
||||||
static_cast<uint32_t>(mdstring_length * sizeof(uint16_t));
|
|
||||||
bool result = CopyStringToMDString(str, mdstring_length, &mdstring);
|
|
||||||
|
|
||||||
// NULL terminate
|
|
||||||
if (result) {
|
|
||||||
uint16_t ch = 0;
|
|
||||||
result = mdstring.CopyIndexAfterObject(mdstring_length, &ch, sizeof(ch));
|
|
||||||
|
|
||||||
if (result)
|
|
||||||
*location = mdstring.location();
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinidumpFileWriter::WriteString(const wchar_t *str, unsigned int length,
|
|
||||||
MDLocationDescriptor *location) {
|
|
||||||
return WriteStringCore(str, length, location);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinidumpFileWriter::WriteString(const char *str, unsigned int length,
|
|
||||||
MDLocationDescriptor *location) {
|
|
||||||
return WriteStringCore(str, length, location);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinidumpFileWriter::WriteMemory(const void *src, size_t size,
|
|
||||||
MDMemoryDescriptor *output) {
|
|
||||||
assert(src);
|
|
||||||
assert(output);
|
|
||||||
UntypedMDRVA mem(this);
|
|
||||||
|
|
||||||
if (!mem.Allocate(size))
|
|
||||||
return false;
|
|
||||||
if (!mem.Copy(src, mem.size()))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
output->start_of_memory_range = reinterpret_cast<uint64_t>(src);
|
|
||||||
output->memory = mem.location();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
MDRVA MinidumpFileWriter::Allocate(size_t size) {
|
|
||||||
assert(size);
|
|
||||||
assert(file_ != -1);
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
if (NeedsFTruncateWorkAround()) {
|
|
||||||
// If ftruncate() is not available. We simply increase the size beyond the
|
|
||||||
// current file size. sys_write() will expand the file when data is written
|
|
||||||
// to it. Because we did not over allocate to fit memory pages, we also
|
|
||||||
// do not need to ftruncate() the file once we are done.
|
|
||||||
size_ += size;
|
|
||||||
|
|
||||||
// We don't need to seek since the file is unchanged.
|
|
||||||
MDRVA current_position = position_;
|
|
||||||
position_ += static_cast<MDRVA>(size);
|
|
||||||
return current_position;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
size_t aligned_size = (size + 7) & ~7; // 64-bit alignment
|
|
||||||
|
|
||||||
if (position_ + aligned_size > size_) {
|
|
||||||
size_t growth = aligned_size;
|
|
||||||
size_t minimal_growth = getpagesize();
|
|
||||||
|
|
||||||
// Ensure that the file grows by at least the size of a memory page
|
|
||||||
if (growth < minimal_growth)
|
|
||||||
growth = minimal_growth;
|
|
||||||
|
|
||||||
size_t new_size = size_ + growth;
|
|
||||||
if (ftruncate(file_, new_size) != 0)
|
|
||||||
return kInvalidMDRVA;
|
|
||||||
|
|
||||||
size_ = new_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
MDRVA current_position = position_;
|
|
||||||
position_ += static_cast<MDRVA>(aligned_size);
|
|
||||||
|
|
||||||
return current_position;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinidumpFileWriter::Copy(MDRVA position, const void *src, ssize_t size) {
|
|
||||||
assert(src);
|
|
||||||
assert(size);
|
|
||||||
assert(file_ != -1);
|
|
||||||
|
|
||||||
// Ensure that the data will fit in the allocated space
|
|
||||||
if (static_cast<size_t>(size + position) > size_)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Seek and write the data
|
|
||||||
#if defined(__linux__) && __linux__
|
|
||||||
if (sys_lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {
|
|
||||||
if (sys_write(file_, src, size) == size) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {
|
|
||||||
if (write(file_, src, size) == size) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UntypedMDRVA::Allocate(size_t size) {
|
|
||||||
assert(size_ == 0);
|
|
||||||
size_ = size;
|
|
||||||
position_ = writer_->Allocate(size_);
|
|
||||||
return position_ != MinidumpFileWriter::kInvalidMDRVA;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UntypedMDRVA::Copy(MDRVA pos, const void *src, size_t size) {
|
|
||||||
assert(src);
|
|
||||||
assert(size);
|
|
||||||
assert(pos + size <= position_ + size_);
|
|
||||||
return writer_->Copy(pos, src, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,272 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// minidump_file_writer.h: Implements file-based minidump generation. It's
|
|
||||||
// intended to be used with the Google Breakpad open source crash handling
|
|
||||||
// project.
|
|
||||||
|
|
||||||
#ifndef CLIENT_MINIDUMP_FILE_WRITER_H__
|
|
||||||
#define CLIENT_MINIDUMP_FILE_WRITER_H__
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class UntypedMDRVA;
|
|
||||||
template<typename MDType> class TypedMDRVA;
|
|
||||||
|
|
||||||
// The user of this class can Open() a file and add minidump streams, data, and
|
|
||||||
// strings using the definitions in minidump_format.h. Since this class is
|
|
||||||
// expected to be used in a situation where the current process may be
|
|
||||||
// damaged, it will not allocate heap memory.
|
|
||||||
// Sample usage:
|
|
||||||
// MinidumpFileWriter writer;
|
|
||||||
// writer.Open("/tmp/minidump.dmp");
|
|
||||||
// TypedMDRVA<MDRawHeader> header(&writer_);
|
|
||||||
// header.Allocate();
|
|
||||||
// header->get()->signature = MD_HEADER_SIGNATURE;
|
|
||||||
// :
|
|
||||||
// writer.Close();
|
|
||||||
//
|
|
||||||
// An alternative is to use SetFile and provide a file descriptor:
|
|
||||||
// MinidumpFileWriter writer;
|
|
||||||
// writer.SetFile(minidump_fd);
|
|
||||||
// TypedMDRVA<MDRawHeader> header(&writer_);
|
|
||||||
// header.Allocate();
|
|
||||||
// header->get()->signature = MD_HEADER_SIGNATURE;
|
|
||||||
// :
|
|
||||||
// writer.Close();
|
|
||||||
|
|
||||||
class MinidumpFileWriter {
|
|
||||||
public:
|
|
||||||
// Invalid MDRVA (Minidump Relative Virtual Address)
|
|
||||||
// returned on failed allocation
|
|
||||||
static const MDRVA kInvalidMDRVA;
|
|
||||||
|
|
||||||
MinidumpFileWriter();
|
|
||||||
~MinidumpFileWriter();
|
|
||||||
|
|
||||||
// Open |path| as the destination of the minidump data. If |path| already
|
|
||||||
// exists, then Open() will fail.
|
|
||||||
// Return true on success, or false on failure.
|
|
||||||
bool Open(const char *path);
|
|
||||||
|
|
||||||
// Sets the file descriptor |file| as the destination of the minidump data.
|
|
||||||
// Can be used as an alternative to Open() when a file descriptor is
|
|
||||||
// available.
|
|
||||||
// Note that |fd| is not closed when the instance of MinidumpFileWriter is
|
|
||||||
// destroyed.
|
|
||||||
void SetFile(const int file);
|
|
||||||
|
|
||||||
// Close the current file (that was either created when Open was called, or
|
|
||||||
// specified with SetFile).
|
|
||||||
// Return true on success, or false on failure.
|
|
||||||
bool Close();
|
|
||||||
|
|
||||||
// Copy the contents of |str| to a MDString and write it to the file.
|
|
||||||
// |str| is expected to be either UTF-16 or UTF-32 depending on the size
|
|
||||||
// of wchar_t.
|
|
||||||
// Maximum |length| of characters to copy from |str|, or specify 0 to use the
|
|
||||||
// entire NULL terminated string. Copying will stop at the first NULL.
|
|
||||||
// |location| the allocated location
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool WriteString(const wchar_t *str, unsigned int length,
|
|
||||||
MDLocationDescriptor *location);
|
|
||||||
|
|
||||||
// Same as above, except with |str| as a UTF-8 string
|
|
||||||
bool WriteString(const char *str, unsigned int length,
|
|
||||||
MDLocationDescriptor *location);
|
|
||||||
|
|
||||||
// Write |size| bytes starting at |src| into the current position.
|
|
||||||
// Return true on success and set |output| to position, or false on failure
|
|
||||||
bool WriteMemory(const void *src, size_t size, MDMemoryDescriptor *output);
|
|
||||||
|
|
||||||
// Copies |size| bytes from |src| to |position|
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool Copy(MDRVA position, const void *src, ssize_t size);
|
|
||||||
|
|
||||||
// Return the current position for writing to the minidump
|
|
||||||
inline MDRVA position() const { return position_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class UntypedMDRVA;
|
|
||||||
|
|
||||||
// Allocates an area of |size| bytes.
|
|
||||||
// Returns the position of the allocation, or kInvalidMDRVA if it was
|
|
||||||
// unable to allocate the bytes.
|
|
||||||
MDRVA Allocate(size_t size);
|
|
||||||
|
|
||||||
// The file descriptor for the output file.
|
|
||||||
int file_;
|
|
||||||
|
|
||||||
// Whether |file_| should be closed when the instance is destroyed.
|
|
||||||
bool close_file_when_destroyed_;
|
|
||||||
|
|
||||||
// Current position in buffer
|
|
||||||
MDRVA position_;
|
|
||||||
|
|
||||||
// Current allocated size
|
|
||||||
size_t size_;
|
|
||||||
|
|
||||||
// Copy |length| characters from |str| to |mdstring|. These are distinct
|
|
||||||
// because the underlying MDString is a UTF-16 based string. The wchar_t
|
|
||||||
// variant may need to create a MDString that has more characters than the
|
|
||||||
// source |str|, whereas the UTF-8 variant may coalesce characters to form
|
|
||||||
// a single UTF-16 character.
|
|
||||||
bool CopyStringToMDString(const wchar_t *str, unsigned int length,
|
|
||||||
TypedMDRVA<MDString> *mdstring);
|
|
||||||
bool CopyStringToMDString(const char *str, unsigned int length,
|
|
||||||
TypedMDRVA<MDString> *mdstring);
|
|
||||||
|
|
||||||
// The common templated code for writing a string
|
|
||||||
template <typename CharType>
|
|
||||||
bool WriteStringCore(const CharType *str, unsigned int length,
|
|
||||||
MDLocationDescriptor *location);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Represents an untyped allocated chunk
|
|
||||||
class UntypedMDRVA {
|
|
||||||
public:
|
|
||||||
explicit UntypedMDRVA(MinidumpFileWriter *writer)
|
|
||||||
: writer_(writer),
|
|
||||||
position_(writer->position()),
|
|
||||||
size_(0) {}
|
|
||||||
|
|
||||||
// Allocates |size| bytes. Must not call more than once.
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool Allocate(size_t size);
|
|
||||||
|
|
||||||
// Returns the current position or kInvalidMDRVA if allocation failed
|
|
||||||
inline MDRVA position() const { return position_; }
|
|
||||||
|
|
||||||
// Number of bytes allocated
|
|
||||||
inline size_t size() const { return size_; }
|
|
||||||
|
|
||||||
// Return size and position
|
|
||||||
inline MDLocationDescriptor location() const {
|
|
||||||
MDLocationDescriptor location = { static_cast<uint32_t>(size_),
|
|
||||||
position_ };
|
|
||||||
return location;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy |size| bytes starting at |src| into the minidump at |position|
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool Copy(MDRVA position, const void *src, size_t size);
|
|
||||||
|
|
||||||
// Copy |size| bytes from |src| to the current position
|
|
||||||
inline bool Copy(const void *src, size_t size) {
|
|
||||||
return Copy(position_, src, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// Writer we associate with
|
|
||||||
MinidumpFileWriter *writer_;
|
|
||||||
|
|
||||||
// Position of the start of the data
|
|
||||||
MDRVA position_;
|
|
||||||
|
|
||||||
// Allocated size
|
|
||||||
size_t size_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Represents a Minidump object chunk. Additional memory can be allocated at
|
|
||||||
// the end of the object as a:
|
|
||||||
// - single allocation
|
|
||||||
// - Array of MDType objects
|
|
||||||
// - A MDType object followed by an array
|
|
||||||
template<typename MDType>
|
|
||||||
class TypedMDRVA : public UntypedMDRVA {
|
|
||||||
public:
|
|
||||||
// Constructs an unallocated MDRVA
|
|
||||||
explicit TypedMDRVA(MinidumpFileWriter *writer)
|
|
||||||
: UntypedMDRVA(writer),
|
|
||||||
data_(),
|
|
||||||
allocation_state_(UNALLOCATED) {}
|
|
||||||
|
|
||||||
inline ~TypedMDRVA() {
|
|
||||||
// Ensure that the data_ object is written out
|
|
||||||
if (allocation_state_ != ARRAY)
|
|
||||||
Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Address of object data_ of MDType. This is not declared const as the
|
|
||||||
// typical usage will be to access the underlying |data_| object as to
|
|
||||||
// alter its contents.
|
|
||||||
MDType *get() { return &data_; }
|
|
||||||
|
|
||||||
// Allocates minidump_size<MDType>::size() bytes.
|
|
||||||
// Must not call more than once.
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool Allocate();
|
|
||||||
|
|
||||||
// Allocates minidump_size<MDType>::size() + |additional| bytes.
|
|
||||||
// Must not call more than once.
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool Allocate(size_t additional);
|
|
||||||
|
|
||||||
// Allocate an array of |count| elements of MDType.
|
|
||||||
// Must not call more than once.
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool AllocateArray(size_t count);
|
|
||||||
|
|
||||||
// Allocate an array of |count| elements of |size| after object of MDType
|
|
||||||
// Must not call more than once.
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool AllocateObjectAndArray(size_t count, size_t size);
|
|
||||||
|
|
||||||
// Copy |item| to |index|
|
|
||||||
// Must have been allocated using AllocateArray().
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool CopyIndex(unsigned int index, MDType *item);
|
|
||||||
|
|
||||||
// Copy |size| bytes starting at |str| to |index|
|
|
||||||
// Must have been allocated using AllocateObjectAndArray().
|
|
||||||
// Return true on success, or false on failure
|
|
||||||
bool CopyIndexAfterObject(unsigned int index, const void *src, size_t size);
|
|
||||||
|
|
||||||
// Write data_
|
|
||||||
bool Flush();
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum AllocationState {
|
|
||||||
UNALLOCATED = 0,
|
|
||||||
SINGLE_OBJECT,
|
|
||||||
ARRAY,
|
|
||||||
SINGLE_OBJECT_WITH_ARRAY
|
|
||||||
};
|
|
||||||
|
|
||||||
MDType data_;
|
|
||||||
AllocationState allocation_state_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_MINIDUMP_FILE_WRITER_H__
|
|
||||||
|
|
@ -1,489 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// A minimalistic implementation of getcontext() to be used by
|
|
||||||
// Google Breakpad on Android.
|
|
||||||
|
|
||||||
#include "common/android/ucontext_constants.h"
|
|
||||||
|
|
||||||
/* int getcontext (ucontext_t *ucp) */
|
|
||||||
|
|
||||||
#if defined(__arm__)
|
|
||||||
|
|
||||||
.text
|
|
||||||
.global breakpad_getcontext
|
|
||||||
.hidden breakpad_getcontext
|
|
||||||
.type breakpad_getcontext, #function
|
|
||||||
.align 0
|
|
||||||
.fnstart
|
|
||||||
breakpad_getcontext:
|
|
||||||
|
|
||||||
/* First, save r4-r11 */
|
|
||||||
add r1, r0, #(MCONTEXT_GREGS_OFFSET + 4*4)
|
|
||||||
stm r1, {r4-r11}
|
|
||||||
|
|
||||||
/* r12 is a scratch register, don't save it */
|
|
||||||
|
|
||||||
/* Save sp and lr explicitly. */
|
|
||||||
/* - sp can't be stored with stmia in Thumb-2 */
|
|
||||||
/* - STM instructions that store sp and pc are deprecated in ARM */
|
|
||||||
str sp, [r0, #(MCONTEXT_GREGS_OFFSET + 13*4)]
|
|
||||||
str lr, [r0, #(MCONTEXT_GREGS_OFFSET + 14*4)]
|
|
||||||
|
|
||||||
/* Save the caller's address in 'pc' */
|
|
||||||
str lr, [r0, #(MCONTEXT_GREGS_OFFSET + 15*4)]
|
|
||||||
|
|
||||||
/* Save ucontext_t* pointer across next call */
|
|
||||||
mov r4, r0
|
|
||||||
|
|
||||||
/* Call sigprocmask(SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */
|
|
||||||
mov r0, #0 /* SIG_BLOCK */
|
|
||||||
mov r1, #0 /* NULL */
|
|
||||||
add r2, r4, #UCONTEXT_SIGMASK_OFFSET
|
|
||||||
bl sigprocmask(PLT)
|
|
||||||
|
|
||||||
/* Intentionally do not save the FPU state here. This is because on
|
|
||||||
* Linux/ARM, one should instead use ptrace(PTRACE_GETFPREGS) or
|
|
||||||
* ptrace(PTRACE_GETVFPREGS) to get it.
|
|
||||||
*
|
|
||||||
* Note that a real implementation of getcontext() would need to save
|
|
||||||
* this here to allow setcontext()/swapcontext() to work correctly.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Restore the values of r4 and lr */
|
|
||||||
mov r0, r4
|
|
||||||
ldr lr, [r0, #(MCONTEXT_GREGS_OFFSET + 14*4)]
|
|
||||||
ldr r4, [r0, #(MCONTEXT_GREGS_OFFSET + 4*4)]
|
|
||||||
|
|
||||||
/* Return 0 */
|
|
||||||
mov r0, #0
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
.fnend
|
|
||||||
.size breakpad_getcontext, . - breakpad_getcontext
|
|
||||||
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
|
|
||||||
#define _NSIG 64
|
|
||||||
#define __NR_rt_sigprocmask 135
|
|
||||||
|
|
||||||
.text
|
|
||||||
.global breakpad_getcontext
|
|
||||||
.hidden breakpad_getcontext
|
|
||||||
.type breakpad_getcontext, #function
|
|
||||||
.align 4
|
|
||||||
.cfi_startproc
|
|
||||||
breakpad_getcontext:
|
|
||||||
|
|
||||||
/* The saved context will return to the getcontext() call point
|
|
||||||
with a return value of 0 */
|
|
||||||
str xzr, [x0, MCONTEXT_GREGS_OFFSET + 0 * REGISTER_SIZE]
|
|
||||||
|
|
||||||
stp x18, x19, [x0, MCONTEXT_GREGS_OFFSET + 18 * REGISTER_SIZE]
|
|
||||||
stp x20, x21, [x0, MCONTEXT_GREGS_OFFSET + 20 * REGISTER_SIZE]
|
|
||||||
stp x22, x23, [x0, MCONTEXT_GREGS_OFFSET + 22 * REGISTER_SIZE]
|
|
||||||
stp x24, x25, [x0, MCONTEXT_GREGS_OFFSET + 24 * REGISTER_SIZE]
|
|
||||||
stp x26, x27, [x0, MCONTEXT_GREGS_OFFSET + 26 * REGISTER_SIZE]
|
|
||||||
stp x28, x29, [x0, MCONTEXT_GREGS_OFFSET + 28 * REGISTER_SIZE]
|
|
||||||
str x30, [x0, MCONTEXT_GREGS_OFFSET + 30 * REGISTER_SIZE]
|
|
||||||
|
|
||||||
/* Place LR into the saved PC, this will ensure that when
|
|
||||||
switching to this saved context with setcontext() control
|
|
||||||
will pass back to the caller of getcontext(), we have
|
|
||||||
already arranged to return the appropriate return value in x0
|
|
||||||
above. */
|
|
||||||
str x30, [x0, MCONTEXT_PC_OFFSET]
|
|
||||||
|
|
||||||
/* Save the current SP */
|
|
||||||
mov x2, sp
|
|
||||||
str x2, [x0, MCONTEXT_SP_OFFSET]
|
|
||||||
|
|
||||||
/* Initialize the pstate. */
|
|
||||||
str xzr, [x0, MCONTEXT_PSTATE_OFFSET]
|
|
||||||
|
|
||||||
/* Figure out where to place the first context extension
|
|
||||||
block. */
|
|
||||||
add x2, x0, #MCONTEXT_EXTENSION_OFFSET
|
|
||||||
|
|
||||||
/* Write the context extension fpsimd header. */
|
|
||||||
mov w3, #(FPSIMD_MAGIC & 0xffff)
|
|
||||||
movk w3, #(FPSIMD_MAGIC >> 16), lsl #16
|
|
||||||
str w3, [x2, #FPSIMD_CONTEXT_MAGIC_OFFSET]
|
|
||||||
mov w3, #FPSIMD_CONTEXT_SIZE
|
|
||||||
str w3, [x2, #FPSIMD_CONTEXT_SIZE_OFFSET]
|
|
||||||
|
|
||||||
/* Fill in the FP SIMD context. */
|
|
||||||
add x3, x2, #(FPSIMD_CONTEXT_VREGS_OFFSET + 8 * SIMD_REGISTER_SIZE)
|
|
||||||
stp d8, d9, [x3], #(2 * SIMD_REGISTER_SIZE)
|
|
||||||
stp d10, d11, [x3], #(2 * SIMD_REGISTER_SIZE)
|
|
||||||
stp d12, d13, [x3], #(2 * SIMD_REGISTER_SIZE)
|
|
||||||
stp d14, d15, [x3], #(2 * SIMD_REGISTER_SIZE)
|
|
||||||
|
|
||||||
add x3, x2, FPSIMD_CONTEXT_FPSR_OFFSET
|
|
||||||
|
|
||||||
mrs x4, fpsr
|
|
||||||
str w4, [x3]
|
|
||||||
|
|
||||||
mrs x4, fpcr
|
|
||||||
str w4, [x3, FPSIMD_CONTEXT_FPCR_OFFSET - FPSIMD_CONTEXT_FPSR_OFFSET]
|
|
||||||
|
|
||||||
/* Write the termination context extension header. */
|
|
||||||
add x2, x2, #FPSIMD_CONTEXT_SIZE
|
|
||||||
|
|
||||||
str xzr, [x2, #FPSIMD_CONTEXT_MAGIC_OFFSET]
|
|
||||||
str xzr, [x2, #FPSIMD_CONTEXT_SIZE_OFFSET]
|
|
||||||
|
|
||||||
/* Grab the signal mask */
|
|
||||||
/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
|
|
||||||
add x2, x0, #UCONTEXT_SIGMASK_OFFSET
|
|
||||||
mov x0, #0 /* SIG_BLOCK */
|
|
||||||
mov x1, #0 /* NULL */
|
|
||||||
mov x3, #(_NSIG / 8)
|
|
||||||
mov x8, #__NR_rt_sigprocmask
|
|
||||||
svc 0
|
|
||||||
|
|
||||||
/* Return x0 for success */
|
|
||||||
mov x0, 0
|
|
||||||
ret
|
|
||||||
|
|
||||||
.cfi_endproc
|
|
||||||
.size breakpad_getcontext, . - breakpad_getcontext
|
|
||||||
|
|
||||||
#elif defined(__i386__)
|
|
||||||
|
|
||||||
.text
|
|
||||||
.global breakpad_getcontext
|
|
||||||
.hidden breakpad_getcontext
|
|
||||||
.align 4
|
|
||||||
.type breakpad_getcontext, @function
|
|
||||||
|
|
||||||
breakpad_getcontext:
|
|
||||||
|
|
||||||
movl 4(%esp), %eax /* eax = uc */
|
|
||||||
|
|
||||||
/* Save register values */
|
|
||||||
movl %ecx, MCONTEXT_ECX_OFFSET(%eax)
|
|
||||||
movl %edx, MCONTEXT_EDX_OFFSET(%eax)
|
|
||||||
movl %ebx, MCONTEXT_EBX_OFFSET(%eax)
|
|
||||||
movl %edi, MCONTEXT_EDI_OFFSET(%eax)
|
|
||||||
movl %esi, MCONTEXT_ESI_OFFSET(%eax)
|
|
||||||
movl %ebp, MCONTEXT_EBP_OFFSET(%eax)
|
|
||||||
|
|
||||||
movl (%esp), %edx /* return address */
|
|
||||||
lea 4(%esp), %ecx /* exclude return address from stack */
|
|
||||||
mov %edx, MCONTEXT_EIP_OFFSET(%eax)
|
|
||||||
mov %ecx, MCONTEXT_ESP_OFFSET(%eax)
|
|
||||||
|
|
||||||
xorl %ecx, %ecx
|
|
||||||
movw %fs, %cx
|
|
||||||
mov %ecx, MCONTEXT_FS_OFFSET(%eax)
|
|
||||||
|
|
||||||
movl $0, MCONTEXT_EAX_OFFSET(%eax)
|
|
||||||
|
|
||||||
/* Save floating point state to fpregstate, then update
|
|
||||||
* the fpregs pointer to point to it */
|
|
||||||
leal UCONTEXT_FPREGS_MEM_OFFSET(%eax), %ecx
|
|
||||||
fnstenv (%ecx)
|
|
||||||
fldenv (%ecx)
|
|
||||||
mov %ecx, UCONTEXT_FPREGS_OFFSET(%eax)
|
|
||||||
|
|
||||||
/* Save signal mask: sigprocmask(SIGBLOCK, NULL, &uc->uc_sigmask) */
|
|
||||||
leal UCONTEXT_SIGMASK_OFFSET(%eax), %edx
|
|
||||||
xorl %ecx, %ecx
|
|
||||||
push %edx /* &uc->uc_sigmask */
|
|
||||||
push %ecx /* NULL */
|
|
||||||
push %ecx /* SIGBLOCK == 0 on i386 */
|
|
||||||
call sigprocmask@PLT
|
|
||||||
addl $12, %esp
|
|
||||||
|
|
||||||
movl $0, %eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
.size breakpad_getcontext, . - breakpad_getcontext
|
|
||||||
|
|
||||||
#elif defined(__mips__)
|
|
||||||
|
|
||||||
// This implementation is inspired by implementation of getcontext in glibc.
|
|
||||||
#if _MIPS_SIM == _ABIO32
|
|
||||||
#include <asm/asm.h>
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
#include <asm/fpregdef.h>
|
|
||||||
#else
|
|
||||||
#include <machine/asm.h>
|
|
||||||
#include <machine/regdef.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// from asm/asm.h
|
|
||||||
#if _MIPS_SIM == _ABIO32
|
|
||||||
#define ALSZ 7
|
|
||||||
#define ALMASK ~7
|
|
||||||
#define SZREG 4
|
|
||||||
#else // _MIPS_SIM != _ABIO32
|
|
||||||
#define ALSZ 15
|
|
||||||
#define ALMASK ~15
|
|
||||||
#define SZREG 8
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <asm/unistd.h> // for __NR_rt_sigprocmask
|
|
||||||
|
|
||||||
#define _NSIG8 128 / 8
|
|
||||||
#define SIG_BLOCK 1
|
|
||||||
|
|
||||||
|
|
||||||
.text
|
|
||||||
LOCALS_NUM = 1 // save gp on stack
|
|
||||||
FRAME_SIZE = ((LOCALS_NUM * SZREG) + ALSZ) & ALMASK
|
|
||||||
|
|
||||||
GP_FRAME_OFFSET = FRAME_SIZE - (1 * SZREG)
|
|
||||||
MCONTEXT_REG_SIZE = 8
|
|
||||||
|
|
||||||
#if _MIPS_SIM == _ABIO32
|
|
||||||
|
|
||||||
NESTED (breakpad_getcontext, FRAME_SIZE, ra)
|
|
||||||
.mask 0x00000000, 0
|
|
||||||
.fmask 0x00000000, 0
|
|
||||||
|
|
||||||
.set noreorder
|
|
||||||
.cpload t9
|
|
||||||
.set reorder
|
|
||||||
|
|
||||||
move a2, sp
|
|
||||||
#define _SP a2
|
|
||||||
|
|
||||||
addiu sp, -FRAME_SIZE
|
|
||||||
.cprestore GP_FRAME_OFFSET
|
|
||||||
|
|
||||||
sw s0, (16 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw s1, (17 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw s2, (18 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw s3, (19 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw s4, (20 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw s5, (21 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw s6, (22 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw s7, (23 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw _SP, (29 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw fp, (30 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw ra, (31 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sw ra, MCONTEXT_PC_OFFSET(a0)
|
|
||||||
|
|
||||||
#ifdef __mips_hard_float
|
|
||||||
s.d fs0, (20 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d fs1, (22 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d fs2, (24 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d fs3, (26 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d fs4, (28 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d fs5, (30 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
|
|
||||||
cfc1 v1, fcr31
|
|
||||||
sw v1, MCONTEXT_FPC_CSR(a0)
|
|
||||||
#endif // __mips_hard_float
|
|
||||||
|
|
||||||
/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
|
|
||||||
li a3, _NSIG8
|
|
||||||
addu a2, a0, UCONTEXT_SIGMASK_OFFSET
|
|
||||||
move a1, zero
|
|
||||||
li a0, SIG_BLOCK
|
|
||||||
li v0, __NR_rt_sigprocmask
|
|
||||||
syscall
|
|
||||||
|
|
||||||
addiu sp, FRAME_SIZE
|
|
||||||
jr ra
|
|
||||||
|
|
||||||
END (breakpad_getcontext)
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifndef NESTED
|
|
||||||
/*
|
|
||||||
* NESTED - declare nested routine entry point
|
|
||||||
*/
|
|
||||||
#define NESTED(symbol, framesize, rpc) \
|
|
||||||
.globl symbol; \
|
|
||||||
.align 2; \
|
|
||||||
.type symbol,@function; \
|
|
||||||
.ent symbol,0; \
|
|
||||||
symbol: .frame sp, framesize, rpc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* END - mark end of function
|
|
||||||
*/
|
|
||||||
#ifndef END
|
|
||||||
# define END(function) \
|
|
||||||
.end function; \
|
|
||||||
.size function,.-function
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* int getcontext (ucontext_t *ucp) */
|
|
||||||
|
|
||||||
NESTED (breakpad_getcontext, FRAME_SIZE, ra)
|
|
||||||
.mask 0x10000000, 0
|
|
||||||
.fmask 0x00000000, 0
|
|
||||||
|
|
||||||
move a2, sp
|
|
||||||
#define _SP a2
|
|
||||||
move a3, gp
|
|
||||||
#define _GP a3
|
|
||||||
|
|
||||||
daddiu sp, -FRAME_SIZE
|
|
||||||
.cpsetup $25, GP_FRAME_OFFSET, breakpad_getcontext
|
|
||||||
|
|
||||||
/* Store a magic flag. */
|
|
||||||
li v1, 1
|
|
||||||
sd v1, (0 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) /* zero */
|
|
||||||
|
|
||||||
sd s0, (16 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd s1, (17 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd s2, (18 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd s3, (19 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd s4, (20 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd s5, (21 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd s6, (22 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd s7, (23 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd _GP, (28 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd _SP, (29 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd s8, (30 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd ra, (31 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0)
|
|
||||||
sd ra, MCONTEXT_PC_OFFSET(a0)
|
|
||||||
|
|
||||||
#ifdef __mips_hard_float
|
|
||||||
s.d $f24, (24 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d $f25, (25 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d $f26, (26 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d $f27, (27 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d $f28, (28 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d $f29, (29 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d $f30, (30 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
s.d $f31, (31 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0)
|
|
||||||
|
|
||||||
cfc1 v1, $31
|
|
||||||
sw v1, MCONTEXT_FPC_CSR(a0)
|
|
||||||
#endif /* __mips_hard_float */
|
|
||||||
|
|
||||||
/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
|
|
||||||
li a3, _NSIG8
|
|
||||||
daddu a2, a0, UCONTEXT_SIGMASK_OFFSET
|
|
||||||
move a1, zero
|
|
||||||
li a0, SIG_BLOCK
|
|
||||||
|
|
||||||
li v0, __NR_rt_sigprocmask
|
|
||||||
syscall
|
|
||||||
|
|
||||||
.cpreturn
|
|
||||||
daddiu sp, FRAME_SIZE
|
|
||||||
move v0, zero
|
|
||||||
jr ra
|
|
||||||
|
|
||||||
END (breakpad_getcontext)
|
|
||||||
#endif // _MIPS_SIM == _ABIO32
|
|
||||||
|
|
||||||
#elif defined(__x86_64__)
|
|
||||||
/* The x64 implementation of breakpad_getcontext was derived in part
|
|
||||||
from the implementation of libunwind which requires the following
|
|
||||||
notice. */
|
|
||||||
/* libunwind - a platform-independent unwind library
|
|
||||||
Copyright (C) 2008 Google, Inc
|
|
||||||
Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
|
|
||||||
Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
|
|
||||||
|
|
||||||
This file is part of libunwind.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
||||||
|
|
||||||
.text
|
|
||||||
.global breakpad_getcontext
|
|
||||||
.hidden breakpad_getcontext
|
|
||||||
.align 4
|
|
||||||
.type breakpad_getcontext, @function
|
|
||||||
|
|
||||||
breakpad_getcontext:
|
|
||||||
.cfi_startproc
|
|
||||||
|
|
||||||
/* Callee saved: RBX, RBP, R12-R15 */
|
|
||||||
movq %r12, MCONTEXT_GREGS_R12(%rdi)
|
|
||||||
movq %r13, MCONTEXT_GREGS_R13(%rdi)
|
|
||||||
movq %r14, MCONTEXT_GREGS_R14(%rdi)
|
|
||||||
movq %r15, MCONTEXT_GREGS_R15(%rdi)
|
|
||||||
movq %rbp, MCONTEXT_GREGS_RBP(%rdi)
|
|
||||||
movq %rbx, MCONTEXT_GREGS_RBX(%rdi)
|
|
||||||
|
|
||||||
/* Save argument registers (not strictly needed, but setcontext
|
|
||||||
restores them, so don't restore garbage). */
|
|
||||||
movq %r8, MCONTEXT_GREGS_R8(%rdi)
|
|
||||||
movq %r9, MCONTEXT_GREGS_R9(%rdi)
|
|
||||||
movq %rdi, MCONTEXT_GREGS_RDI(%rdi)
|
|
||||||
movq %rsi, MCONTEXT_GREGS_RSI(%rdi)
|
|
||||||
movq %rdx, MCONTEXT_GREGS_RDX(%rdi)
|
|
||||||
movq %rax, MCONTEXT_GREGS_RAX(%rdi)
|
|
||||||
movq %rcx, MCONTEXT_GREGS_RCX(%rdi)
|
|
||||||
|
|
||||||
/* Save fp state (not needed, except for setcontext not
|
|
||||||
restoring garbage). */
|
|
||||||
leaq MCONTEXT_FPREGS_MEM(%rdi),%r8
|
|
||||||
movq %r8, MCONTEXT_FPREGS_PTR(%rdi)
|
|
||||||
fnstenv (%r8)
|
|
||||||
stmxcsr FPREGS_OFFSET_MXCSR(%r8)
|
|
||||||
|
|
||||||
leaq 8(%rsp), %rax /* exclude this call. */
|
|
||||||
movq %rax, MCONTEXT_GREGS_RSP(%rdi)
|
|
||||||
|
|
||||||
movq 0(%rsp), %rax
|
|
||||||
movq %rax, MCONTEXT_GREGS_RIP(%rdi)
|
|
||||||
|
|
||||||
/* Save signal mask: sigprocmask(SIGBLOCK, NULL, &uc->uc_sigmask) */
|
|
||||||
leaq UCONTEXT_SIGMASK_OFFSET(%rdi), %rdx // arg3
|
|
||||||
xorq %rsi, %rsi // arg2 NULL
|
|
||||||
xorq %rdi, %rdi // arg1 SIGBLOCK == 0
|
|
||||||
call sigprocmask@PLT
|
|
||||||
|
|
||||||
/* Always return 0 for success, even if sigprocmask failed. */
|
|
||||||
xorl %eax, %eax
|
|
||||||
ret
|
|
||||||
.cfi_endproc
|
|
||||||
.size breakpad_getcontext, . - breakpad_getcontext
|
|
||||||
|
|
||||||
#else
|
|
||||||
#error "This file has not been ported for your CPU!"
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,168 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ELF_H
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ELF_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <libgen.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
// The Android <elf.h> provides BSD-based definitions for the ElfXX_Nhdr
|
|
||||||
// types
|
|
||||||
// always source-compatible with the GLibc/kernel ones. To overcome this
|
|
||||||
// issue without modifying a lot of code in Breakpad, use an ugly macro
|
|
||||||
// renaming trick with #include_next
|
|
||||||
|
|
||||||
// Avoid conflict with BSD-based definition of ElfXX_Nhdr.
|
|
||||||
// Unfortunately, their field member names do not use a 'n_' prefix.
|
|
||||||
#define Elf32_Nhdr __bsd_Elf32_Nhdr
|
|
||||||
#define Elf64_Nhdr __bsd_Elf64_Nhdr
|
|
||||||
|
|
||||||
// In case they are defined by the NDK version
|
|
||||||
#define Elf32_auxv_t __bionic_Elf32_auxv_t
|
|
||||||
#define Elf64_auxv_t __bionic_Elf64_auxv_t
|
|
||||||
|
|
||||||
#define Elf32_Dyn __bionic_Elf32_Dyn
|
|
||||||
#define Elf64_Dyn __bionic_Elf64_Dyn
|
|
||||||
|
|
||||||
#include_next <elf.h>
|
|
||||||
|
|
||||||
#undef Elf32_Nhdr
|
|
||||||
#undef Elf64_Nhdr
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Elf32_Word n_namesz;
|
|
||||||
Elf32_Word n_descsz;
|
|
||||||
Elf32_Word n_type;
|
|
||||||
} Elf32_Nhdr;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Elf64_Word n_namesz;
|
|
||||||
Elf64_Word n_descsz;
|
|
||||||
Elf64_Word n_type;
|
|
||||||
} Elf64_Nhdr;
|
|
||||||
|
|
||||||
#undef Elf32_auxv_t
|
|
||||||
#undef Elf64_auxv_t
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t a_type;
|
|
||||||
union {
|
|
||||||
uint32_t a_val;
|
|
||||||
} a_un;
|
|
||||||
} Elf32_auxv_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint64_t a_type;
|
|
||||||
union {
|
|
||||||
uint64_t a_val;
|
|
||||||
} a_un;
|
|
||||||
} Elf64_auxv_t;
|
|
||||||
|
|
||||||
#undef Elf32_Dyn
|
|
||||||
#undef Elf64_Dyn
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Elf32_Sword d_tag;
|
|
||||||
union {
|
|
||||||
Elf32_Word d_val;
|
|
||||||
Elf32_Addr d_ptr;
|
|
||||||
} d_un;
|
|
||||||
} Elf32_Dyn;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Elf64_Sxword d_tag;
|
|
||||||
union {
|
|
||||||
Elf64_Xword d_val;
|
|
||||||
Elf64_Addr d_ptr;
|
|
||||||
} d_un;
|
|
||||||
} Elf64_Dyn;
|
|
||||||
|
|
||||||
|
|
||||||
// __WORDSIZE is GLibc-specific and used by Google Breakpad on Linux.
|
|
||||||
#ifndef __WORDSIZE
|
|
||||||
#if defined(__i386__) || defined(__ARM_EABI__) || defined(__mips__)
|
|
||||||
#define __WORDSIZE 32
|
|
||||||
#elif defined(__x86_64__) || defined(__aarch64__)
|
|
||||||
#define __WORDSIZE 64
|
|
||||||
#else
|
|
||||||
#error "Unsupported Android CPU ABI"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The Android headers don't always define this constant.
|
|
||||||
#ifndef EM_X86_64
|
|
||||||
#define EM_X86_64 62
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EM_PPC64
|
|
||||||
#define EM_PPC64 21
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EM_S390
|
|
||||||
#define EM_S390 22
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(AT_SYSINFO_EHDR)
|
|
||||||
#define AT_SYSINFO_EHDR 33
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(NT_PRSTATUS)
|
|
||||||
#define NT_PRSTATUS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(NT_PRPSINFO)
|
|
||||||
#define NT_PRPSINFO 3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(NT_AUXV)
|
|
||||||
#define NT_AUXV 6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(NT_PRXFPREG)
|
|
||||||
#define NT_PRXFPREG 0x46e62b7f
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(NT_FPREGSET)
|
|
||||||
#define NT_FPREGSET 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(SHT_MIPS_DWARF)
|
|
||||||
#define SHT_MIPS_DWARF 0x7000001e
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ELF_H
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_ANDROID_INCLUDE_LINK_H
|
|
||||||
#define GOOGLE_BREAKPAD_ANDROID_INCLUDE_LINK_H
|
|
||||||
|
|
||||||
/* Android doesn't provide all the data-structures required in its <link.h>.
|
|
||||||
Provide custom version here. */
|
|
||||||
#include_next <link.h>
|
|
||||||
|
|
||||||
// TODO(rmcilroy): Remove this file once the ndk is updated for other
|
|
||||||
// architectures - crbug.com/358831
|
|
||||||
#if !defined(__aarch64__) && !defined(__x86_64__) && \
|
|
||||||
!(defined(__mips__) && _MIPS_SIM == _ABI64)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
struct r_debug {
|
|
||||||
int r_version;
|
|
||||||
struct link_map* r_map;
|
|
||||||
ElfW(Addr) r_brk;
|
|
||||||
enum {
|
|
||||||
RT_CONSISTENT,
|
|
||||||
RT_ADD,
|
|
||||||
RT_DELETE } r_state;
|
|
||||||
ElfW(Addr) r_ldbase;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct link_map {
|
|
||||||
ElfW(Addr) l_addr;
|
|
||||||
char* l_name;
|
|
||||||
ElfW(Dyn)* l_ld;
|
|
||||||
struct link_map* l_next;
|
|
||||||
struct link_map* l_prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !defined(__aarch64__) && !defined(__x86_64__)
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_ANDROID_INCLUDE_LINK_H */
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
// Copyright (c) 2013, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_ANDROID_INCLUDE_SGIDEFS_H
|
|
||||||
#define GOOGLE_BREAKPAD_ANDROID_INCLUDE_SGIDEFS_H
|
|
||||||
|
|
||||||
#ifdef __mips__
|
|
||||||
|
|
||||||
// Android doesn't contain sgidefs.h, but does have <asm/sgidefs.h> which
|
|
||||||
// contains what we need.
|
|
||||||
#include <asm/sgidefs.h>
|
|
||||||
|
|
||||||
#endif // __mips__
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_ANDROID_INCLUDE_SGIDEFS_H
|
|
||||||
|
|
@ -1,100 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_STAB_H
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_STAB_H
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
|
|
||||||
#ifdef __BIONIC_HAVE_STAB_H
|
|
||||||
#include <stab.h>
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#define _STAB_CODE_LIST \
|
|
||||||
_STAB_CODE_DEF(UNDF,0x00) \
|
|
||||||
_STAB_CODE_DEF(GSYM,0x20) \
|
|
||||||
_STAB_CODE_DEF(FNAME,0x22) \
|
|
||||||
_STAB_CODE_DEF(FUN,0x24) \
|
|
||||||
_STAB_CODE_DEF(STSYM,0x26) \
|
|
||||||
_STAB_CODE_DEF(LCSYM,0x28) \
|
|
||||||
_STAB_CODE_DEF(MAIN,0x2a) \
|
|
||||||
_STAB_CODE_DEF(PC,0x30) \
|
|
||||||
_STAB_CODE_DEF(NSYMS,0x32) \
|
|
||||||
_STAB_CODE_DEF(NOMAP,0x34) \
|
|
||||||
_STAB_CODE_DEF(OBJ,0x38) \
|
|
||||||
_STAB_CODE_DEF(OPT,0x3c) \
|
|
||||||
_STAB_CODE_DEF(RSYM,0x40) \
|
|
||||||
_STAB_CODE_DEF(M2C,0x42) \
|
|
||||||
_STAB_CODE_DEF(SLINE,0x44) \
|
|
||||||
_STAB_CODE_DEF(DSLINE,0x46) \
|
|
||||||
_STAB_CODE_DEF(BSLINE,0x48) \
|
|
||||||
_STAB_CODE_DEF(BROWS,0x48) \
|
|
||||||
_STAB_CODE_DEF(DEFD,0x4a) \
|
|
||||||
_STAB_CODE_DEF(EHDECL,0x50) \
|
|
||||||
_STAB_CODE_DEF(MOD2,0x50) \
|
|
||||||
_STAB_CODE_DEF(CATCH,0x54) \
|
|
||||||
_STAB_CODE_DEF(SSYM,0x60) \
|
|
||||||
_STAB_CODE_DEF(SO,0x64) \
|
|
||||||
_STAB_CODE_DEF(LSYM,0x80) \
|
|
||||||
_STAB_CODE_DEF(BINCL,0x82) \
|
|
||||||
_STAB_CODE_DEF(SOL,0x84) \
|
|
||||||
_STAB_CODE_DEF(PSYM,0xa0) \
|
|
||||||
_STAB_CODE_DEF(EINCL,0xa2) \
|
|
||||||
_STAB_CODE_DEF(ENTRY,0xa4) \
|
|
||||||
_STAB_CODE_DEF(LBRAC,0xc0) \
|
|
||||||
_STAB_CODE_DEF(EXCL,0xc2) \
|
|
||||||
_STAB_CODE_DEF(SCOPE,0xc4) \
|
|
||||||
_STAB_CODE_DEF(RBRAC,0xe0) \
|
|
||||||
_STAB_CODE_DEF(BCOMM,0xe2) \
|
|
||||||
_STAB_CODE_DEF(ECOMM,0xe4) \
|
|
||||||
_STAB_CODE_DEF(ECOML,0xe8) \
|
|
||||||
_STAB_CODE_DEF(NBTEXT,0xf0) \
|
|
||||||
_STAB_CODE_DEF(NBDATA,0xf2) \
|
|
||||||
_STAB_CODE_DEF(NBBSS,0xf4) \
|
|
||||||
_STAB_CODE_DEF(NBSTS,0xf6) \
|
|
||||||
_STAB_CODE_DEF(NBLCS,0xf8) \
|
|
||||||
_STAB_CODE_DEF(LENG,0xfe)
|
|
||||||
|
|
||||||
enum __stab_debug_code {
|
|
||||||
#define _STAB_CODE_DEF(x,y) N_##x = y,
|
|
||||||
_STAB_CODE_LIST
|
|
||||||
#undef _STAB_CODE_DEF
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // __BIONIC_HAVE_STAB_H
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_STAB_H
|
|
||||||
|
|
@ -1,124 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_SYS_PROCFS_H
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_ANDROID_SYS_PROCFS_H
|
|
||||||
|
|
||||||
#ifdef __BIONIC_HAVE_SYS_PROCFS_H
|
|
||||||
|
|
||||||
#include_next <sys/procfs.h>
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
#if defined (__mips__)
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/user.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__aarch64__)
|
|
||||||
typedef unsigned long long elf_greg_t;
|
|
||||||
#else
|
|
||||||
typedef unsigned long elf_greg_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __arm__
|
|
||||||
#define ELF_NGREG (sizeof(struct user_regs) / sizeof(elf_greg_t))
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
#define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t))
|
|
||||||
#elif defined(__mips__)
|
|
||||||
#define ELF_NGREG 45
|
|
||||||
#else
|
|
||||||
#define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
|
||||||
|
|
||||||
struct elf_siginfo {
|
|
||||||
int si_signo;
|
|
||||||
int si_code;
|
|
||||||
int si_errno;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct elf_prstatus {
|
|
||||||
struct elf_siginfo pr_info;
|
|
||||||
short pr_cursig;
|
|
||||||
unsigned long pr_sigpend;
|
|
||||||
unsigned long pr_sighold;
|
|
||||||
pid_t pr_pid;
|
|
||||||
pid_t pr_ppid;
|
|
||||||
pid_t pr_pgrp;
|
|
||||||
pid_t pd_sid;
|
|
||||||
struct timeval pr_utime;
|
|
||||||
struct timeval pr_stime;
|
|
||||||
struct timeval pr_cutime;
|
|
||||||
struct timeval pr_cstime;
|
|
||||||
elf_gregset_t pr_reg;
|
|
||||||
int pr_fpvalid;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ELF_PRARGSZ 80
|
|
||||||
|
|
||||||
struct elf_prpsinfo {
|
|
||||||
char pr_state;
|
|
||||||
char pr_sname;
|
|
||||||
char pr_zomb;
|
|
||||||
char pr_nice;
|
|
||||||
unsigned long pr_flags;
|
|
||||||
#ifdef __x86_64__
|
|
||||||
unsigned int pr_uid;
|
|
||||||
unsigned int pr_gid;
|
|
||||||
#elif defined(__mips__)
|
|
||||||
__kernel_uid_t pr_uid;
|
|
||||||
__kernel_gid_t pr_gid;
|
|
||||||
#else
|
|
||||||
unsigned short pr_uid;
|
|
||||||
unsigned short pr_gid;
|
|
||||||
#endif
|
|
||||||
int pr_pid;
|
|
||||||
int pr_ppid;
|
|
||||||
int pr_pgrp;
|
|
||||||
int pr_sid;
|
|
||||||
char pr_fname[16];
|
|
||||||
char pr_psargs[ELF_PRARGSZ];
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // __BIONIC_HAVE_SYS_PROCFS_H
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_SYS_PROCFS_H
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_SIGNAL_H
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_SIGNAL_H
|
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_SIGNAL_H
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H
|
|
||||||
|
|
||||||
// The purpose of this file is to glue the mismatching headers (Android NDK vs
|
|
||||||
// glibc) and therefore avoid doing otherwise awkward #ifdefs in the code.
|
|
||||||
// The following quirks are currently handled by this file:
|
|
||||||
// - i386: Use the Android NDK but alias user_fxsr_struct > user_fpxregs_struct.
|
|
||||||
// - aarch64: Add missing user_regs_struct and user_fpsimd_struct structs.
|
|
||||||
// - Other platforms: Just use the Android NDK unchanged.
|
|
||||||
|
|
||||||
// TODO(primiano): remove these changes after Chromium has stably rolled to
|
|
||||||
// an NDK with the appropriate fixes.
|
|
||||||
|
|
||||||
#if __ANDROID_API__ < 21
|
|
||||||
#include_next <sys/user.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __i386__
|
|
||||||
#if __ANDROID_API__ >= 21
|
|
||||||
#include_next <sys/user.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
typedef struct user_fxsr_struct user_fpxregs_struct;
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
#endif // __i386__
|
|
||||||
|
|
||||||
#ifdef __aarch64__
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
struct user_regs_struct {
|
|
||||||
__u64 regs[31];
|
|
||||||
__u64 sp;
|
|
||||||
__u64 pc;
|
|
||||||
__u64 pstate;
|
|
||||||
};
|
|
||||||
struct user_fpsimd_struct {
|
|
||||||
__uint128_t vregs[32];
|
|
||||||
__u32 fpsr;
|
|
||||||
__u32 fpcr;
|
|
||||||
};
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
#endif // __aarch64__
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_UCONTEXT_H
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_UCONTEXT_H
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
|
|
||||||
#ifdef __BIONIC_UCONTEXT_H
|
|
||||||
#include <ucontext.h>
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
// Provided by src/android/common/breakpad_getcontext.S
|
|
||||||
int breakpad_getcontext(ucontext_t* ucp);
|
|
||||||
|
|
||||||
#define getcontext(x) breakpad_getcontext(x)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // __BIONIC_UCONTEXT_H
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_UCONTEXT_H
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// This header can be included either from a C, C++ or Assembly file.
|
|
||||||
// Its purpose is to contain constants that must match the offsets of
|
|
||||||
// various fields in ucontext_t.
|
|
||||||
//
|
|
||||||
// They should match the definitions from
|
|
||||||
// src/common/android/include/sys/ucontext.h
|
|
||||||
//
|
|
||||||
// Used by src/common/android/breakpad_getcontext.S
|
|
||||||
// Tested by src/common/android/testing/breakpad_getcontext_unittest.cc
|
|
||||||
|
|
||||||
#ifndef GOOGLEBREAKPAD_COMMON_ANDROID_UCONTEXT_CONSTANTS_H
|
|
||||||
#define GOOGLEBREAKPAD_COMMON_ANDROID_UCONTEXT_CONSTANTS_H
|
|
||||||
|
|
||||||
#if defined(__arm__)
|
|
||||||
|
|
||||||
#define MCONTEXT_GREGS_OFFSET 32
|
|
||||||
#define UCONTEXT_SIGMASK_OFFSET 104
|
|
||||||
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
|
|
||||||
#define UCONTEXT_SIGMASK_OFFSET 40
|
|
||||||
|
|
||||||
#define MCONTEXT_GREGS_OFFSET 184
|
|
||||||
#define MCONTEXT_SP_OFFSET 432
|
|
||||||
#define MCONTEXT_PC_OFFSET 440
|
|
||||||
#define MCONTEXT_PSTATE_OFFSET 448
|
|
||||||
#define MCONTEXT_EXTENSION_OFFSET 464
|
|
||||||
|
|
||||||
#define FPSIMD_MAGIC 0x46508001
|
|
||||||
|
|
||||||
#define FPSIMD_CONTEXT_MAGIC_OFFSET 0
|
|
||||||
#define FPSIMD_CONTEXT_SIZE_OFFSET 4
|
|
||||||
#define FPSIMD_CONTEXT_FPSR_OFFSET 8
|
|
||||||
#define FPSIMD_CONTEXT_FPCR_OFFSET 12
|
|
||||||
#define FPSIMD_CONTEXT_VREGS_OFFSET 16
|
|
||||||
#define FPSIMD_CONTEXT_SIZE 528
|
|
||||||
|
|
||||||
#define REGISTER_SIZE 8
|
|
||||||
#define SIMD_REGISTER_SIZE 16
|
|
||||||
|
|
||||||
#elif defined(__i386__)
|
|
||||||
|
|
||||||
#define MCONTEXT_GREGS_OFFSET 20
|
|
||||||
#define MCONTEXT_GS_OFFSET (MCONTEXT_GREGS_OFFSET + 0*4)
|
|
||||||
#define MCONTEXT_FS_OFFSET (MCONTEXT_GREGS_OFFSET + 1*4)
|
|
||||||
#define MCONTEXT_ES_OFFSET (MCONTEXT_GREGS_OFFSET + 2*4)
|
|
||||||
#define MCONTEXT_DS_OFFSET (MCONTEXT_GREGS_OFFSET + 3*4)
|
|
||||||
#define MCONTEXT_EDI_OFFSET (MCONTEXT_GREGS_OFFSET + 4*4)
|
|
||||||
#define MCONTEXT_ESI_OFFSET (MCONTEXT_GREGS_OFFSET + 5*4)
|
|
||||||
#define MCONTEXT_EBP_OFFSET (MCONTEXT_GREGS_OFFSET + 6*4)
|
|
||||||
#define MCONTEXT_ESP_OFFSET (MCONTEXT_GREGS_OFFSET + 7*4)
|
|
||||||
#define MCONTEXT_EBX_OFFSET (MCONTEXT_GREGS_OFFSET + 8*4)
|
|
||||||
#define MCONTEXT_EDX_OFFSET (MCONTEXT_GREGS_OFFSET + 9*4)
|
|
||||||
#define MCONTEXT_ECX_OFFSET (MCONTEXT_GREGS_OFFSET + 10*4)
|
|
||||||
#define MCONTEXT_EAX_OFFSET (MCONTEXT_GREGS_OFFSET + 11*4)
|
|
||||||
#define MCONTEXT_TRAPNO_OFFSET (MCONTEXT_GREGS_OFFSET + 12*4)
|
|
||||||
#define MCONTEXT_ERR_OFFSET (MCONTEXT_GREGS_OFFSET + 13*4)
|
|
||||||
#define MCONTEXT_EIP_OFFSET (MCONTEXT_GREGS_OFFSET + 14*4)
|
|
||||||
#define MCONTEXT_CS_OFFSET (MCONTEXT_GREGS_OFFSET + 15*4)
|
|
||||||
#define MCONTEXT_EFL_OFFSET (MCONTEXT_GREGS_OFFSET + 16*4)
|
|
||||||
#define MCONTEXT_UESP_OFFSET (MCONTEXT_GREGS_OFFSET + 17*4)
|
|
||||||
#define MCONTEXT_SS_OFFSET (MCONTEXT_GREGS_OFFSET + 18*4)
|
|
||||||
|
|
||||||
#define UCONTEXT_SIGMASK_OFFSET 108
|
|
||||||
|
|
||||||
#define UCONTEXT_FPREGS_OFFSET 96
|
|
||||||
#define UCONTEXT_FPREGS_MEM_OFFSET 116
|
|
||||||
|
|
||||||
#elif defined(__mips__)
|
|
||||||
|
|
||||||
#if _MIPS_SIM == _ABIO32
|
|
||||||
#define MCONTEXT_PC_OFFSET 32
|
|
||||||
#define MCONTEXT_GREGS_OFFSET 40
|
|
||||||
#define MCONTEXT_FPREGS_OFFSET 296
|
|
||||||
#define MCONTEXT_FPC_CSR 556
|
|
||||||
#define UCONTEXT_SIGMASK_OFFSET 616
|
|
||||||
#else
|
|
||||||
#define MCONTEXT_GREGS_OFFSET 40
|
|
||||||
#define MCONTEXT_FPREGS_OFFSET 296
|
|
||||||
#define MCONTEXT_PC_OFFSET 616
|
|
||||||
#define MCONTEXT_FPC_CSR 624
|
|
||||||
#define UCONTEXT_SIGMASK_OFFSET 640
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(__x86_64__)
|
|
||||||
|
|
||||||
#define MCONTEXT_GREGS_OFFSET 40
|
|
||||||
#define UCONTEXT_SIGMASK_OFFSET 296
|
|
||||||
|
|
||||||
#define MCONTEXT_GREGS_R8 40
|
|
||||||
#define MCONTEXT_GREGS_R9 48
|
|
||||||
#define MCONTEXT_GREGS_R10 56
|
|
||||||
#define MCONTEXT_GREGS_R11 64
|
|
||||||
#define MCONTEXT_GREGS_R12 72
|
|
||||||
#define MCONTEXT_GREGS_R13 80
|
|
||||||
#define MCONTEXT_GREGS_R14 88
|
|
||||||
#define MCONTEXT_GREGS_R15 96
|
|
||||||
#define MCONTEXT_GREGS_RDI 104
|
|
||||||
#define MCONTEXT_GREGS_RSI 112
|
|
||||||
#define MCONTEXT_GREGS_RBP 120
|
|
||||||
#define MCONTEXT_GREGS_RBX 128
|
|
||||||
#define MCONTEXT_GREGS_RDX 136
|
|
||||||
#define MCONTEXT_GREGS_RAX 144
|
|
||||||
#define MCONTEXT_GREGS_RCX 152
|
|
||||||
#define MCONTEXT_GREGS_RSP 160
|
|
||||||
#define MCONTEXT_GREGS_RIP 168
|
|
||||||
#define MCONTEXT_FPREGS_PTR 224
|
|
||||||
#define MCONTEXT_FPREGS_MEM 304
|
|
||||||
#define FPREGS_OFFSET_MXCSR 24
|
|
||||||
|
|
||||||
#else
|
|
||||||
#error "This header has not been ported for your CPU"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // GOOGLEBREAKPAD_COMMON_ANDROID_UCONTEXT_CONSTANTS_H
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
// Copyright (c) 2011 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_BASICTYPES_H_
|
|
||||||
#define COMMON_BASICTYPES_H_
|
|
||||||
|
|
||||||
// A macro to disallow the copy constructor and operator= functions
|
|
||||||
// This should be used in the private: declarations for a class
|
|
||||||
#ifndef DISALLOW_COPY_AND_ASSIGN
|
|
||||||
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
|
||||||
TypeName(const TypeName&); \
|
|
||||||
void operator=(const TypeName&)
|
|
||||||
#endif // DISALLOW_COPY_AND_ASSIGN
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Used to explicitly mark the return value of a function as unused. If you are
|
|
||||||
// really sure you don't want to do anything with the return value of a function
|
|
||||||
// that has been marked with __attribute__((warn_unused_result)), wrap it with
|
|
||||||
// this. Example:
|
|
||||||
//
|
|
||||||
// scoped_ptr<MyType> my_var = ...;
|
|
||||||
// if (TakeOwnership(my_var.get()) == SUCCESS)
|
|
||||||
// ignore_result(my_var.release());
|
|
||||||
//
|
|
||||||
template<typename T>
|
|
||||||
inline void ignore_result(const T&) {
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_BASICTYPES_H_
|
|
||||||
|
|
@ -1,265 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// byte_cursor.h: Classes for parsing values from a buffer of bytes.
|
|
||||||
// The ByteCursor class provides a convenient interface for reading
|
|
||||||
// fixed-size integers of arbitrary endianness, being thorough about
|
|
||||||
// checking for buffer overruns.
|
|
||||||
|
|
||||||
#ifndef COMMON_BYTE_CURSOR_H_
|
|
||||||
#define COMMON_BYTE_CURSOR_H_
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A buffer holding a series of bytes.
|
|
||||||
struct ByteBuffer {
|
|
||||||
ByteBuffer() : start(0), end(0) { }
|
|
||||||
ByteBuffer(const uint8_t *set_start, size_t set_size)
|
|
||||||
: start(set_start), end(set_start + set_size) { }
|
|
||||||
~ByteBuffer() { };
|
|
||||||
|
|
||||||
// Equality operators. Useful in unit tests, and when we're using
|
|
||||||
// ByteBuffers to refer to regions of a larger buffer.
|
|
||||||
bool operator==(const ByteBuffer &that) const {
|
|
||||||
return start == that.start && end == that.end;
|
|
||||||
}
|
|
||||||
bool operator!=(const ByteBuffer &that) const {
|
|
||||||
return start != that.start || end != that.end;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not C++ style guide compliant, but this definitely belongs here.
|
|
||||||
size_t Size() const {
|
|
||||||
assert(start <= end);
|
|
||||||
return end - start;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint8_t *start, *end;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A cursor pointing into a ByteBuffer that can parse numbers of various
|
|
||||||
// widths and representations, strings, and data blocks, advancing through
|
|
||||||
// the buffer as it goes. All ByteCursor operations check that accesses
|
|
||||||
// haven't gone beyond the end of the enclosing ByteBuffer.
|
|
||||||
class ByteCursor {
|
|
||||||
public:
|
|
||||||
// Create a cursor reading bytes from the start of BUFFER. By default, the
|
|
||||||
// cursor reads multi-byte values in little-endian form.
|
|
||||||
ByteCursor(const ByteBuffer *buffer, bool big_endian = false)
|
|
||||||
: buffer_(buffer), here_(buffer->start),
|
|
||||||
big_endian_(big_endian), complete_(true) { }
|
|
||||||
|
|
||||||
// Accessor and setter for this cursor's endianness flag.
|
|
||||||
bool big_endian() const { return big_endian_; }
|
|
||||||
void set_big_endian(bool big_endian) { big_endian_ = big_endian; }
|
|
||||||
|
|
||||||
// Accessor and setter for this cursor's current position. The setter
|
|
||||||
// returns a reference to this cursor.
|
|
||||||
const uint8_t *here() const { return here_; }
|
|
||||||
ByteCursor &set_here(const uint8_t *here) {
|
|
||||||
assert(buffer_->start <= here && here <= buffer_->end);
|
|
||||||
here_ = here;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the number of bytes available to read at the cursor.
|
|
||||||
size_t Available() const { return size_t(buffer_->end - here_); }
|
|
||||||
|
|
||||||
// Return true if this cursor is at the end of its buffer.
|
|
||||||
bool AtEnd() const { return Available() == 0; }
|
|
||||||
|
|
||||||
// When used as a boolean value this cursor converts to true if all
|
|
||||||
// prior reads have been completed, or false if we ran off the end
|
|
||||||
// of the buffer.
|
|
||||||
operator bool() const { return complete_; }
|
|
||||||
|
|
||||||
// Read a SIZE-byte integer at this cursor, signed if IS_SIGNED is true,
|
|
||||||
// unsigned otherwise, using the cursor's established endianness, and set
|
|
||||||
// *RESULT to the number. If we read off the end of our buffer, clear
|
|
||||||
// this cursor's complete_ flag, and store a dummy value in *RESULT.
|
|
||||||
// Return a reference to this cursor.
|
|
||||||
template<typename T>
|
|
||||||
ByteCursor &Read(size_t size, bool is_signed, T *result) {
|
|
||||||
if (CheckAvailable(size)) {
|
|
||||||
T v = 0;
|
|
||||||
if (big_endian_) {
|
|
||||||
for (size_t i = 0; i < size; i++)
|
|
||||||
v = (v << 8) + here_[i];
|
|
||||||
} else {
|
|
||||||
// This loop condition looks weird, but size_t is unsigned, so
|
|
||||||
// decrementing i after it is zero yields the largest size_t value.
|
|
||||||
for (size_t i = size - 1; i < size; i--)
|
|
||||||
v = (v << 8) + here_[i];
|
|
||||||
}
|
|
||||||
if (is_signed && size < sizeof(T)) {
|
|
||||||
size_t sign_bit = (T)1 << (size * 8 - 1);
|
|
||||||
v = (v ^ sign_bit) - sign_bit;
|
|
||||||
}
|
|
||||||
here_ += size;
|
|
||||||
*result = v;
|
|
||||||
} else {
|
|
||||||
*result = (T) 0xdeadbeef;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read an integer, using the cursor's established endianness and
|
|
||||||
// *RESULT's size and signedness, and set *RESULT to the number. If we
|
|
||||||
// read off the end of our buffer, clear this cursor's complete_ flag.
|
|
||||||
// Return a reference to this cursor.
|
|
||||||
template<typename T>
|
|
||||||
ByteCursor &operator>>(T &result) {
|
|
||||||
bool T_is_signed = (T)-1 < 0;
|
|
||||||
return Read(sizeof(T), T_is_signed, &result);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy the SIZE bytes at the cursor to BUFFER, and advance this
|
|
||||||
// cursor to the end of them. If we read off the end of our buffer,
|
|
||||||
// clear this cursor's complete_ flag, and set *POINTER to NULL.
|
|
||||||
// Return a reference to this cursor.
|
|
||||||
ByteCursor &Read(uint8_t *buffer, size_t size) {
|
|
||||||
if (CheckAvailable(size)) {
|
|
||||||
memcpy(buffer, here_, size);
|
|
||||||
here_ += size;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set STR to a copy of the '\0'-terminated string at the cursor. If the
|
|
||||||
// byte buffer does not contain a terminating zero, clear this cursor's
|
|
||||||
// complete_ flag, and set STR to the empty string. Return a reference to
|
|
||||||
// this cursor.
|
|
||||||
ByteCursor &CString(string *str) {
|
|
||||||
const uint8_t *end
|
|
||||||
= static_cast<const uint8_t *>(memchr(here_, '\0', Available()));
|
|
||||||
if (end) {
|
|
||||||
str->assign(reinterpret_cast<const char *>(here_), end - here_);
|
|
||||||
here_ = end + 1;
|
|
||||||
} else {
|
|
||||||
str->clear();
|
|
||||||
here_ = buffer_->end;
|
|
||||||
complete_ = false;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Like CString(STR), but extract the string from a fixed-width buffer
|
|
||||||
// LIMIT bytes long, which may or may not contain a terminating '\0'
|
|
||||||
// byte. Specifically:
|
|
||||||
//
|
|
||||||
// - If there are not LIMIT bytes available at the cursor, clear the
|
|
||||||
// cursor's complete_ flag and set STR to the empty string.
|
|
||||||
//
|
|
||||||
// - Otherwise, if the LIMIT bytes at the cursor contain any '\0'
|
|
||||||
// characters, set *STR to a copy of the bytes before the first '\0',
|
|
||||||
// and advance the cursor by LIMIT bytes.
|
|
||||||
//
|
|
||||||
// - Otherwise, set *STR to a copy of those LIMIT bytes, and advance the
|
|
||||||
// cursor by LIMIT bytes.
|
|
||||||
ByteCursor &CString(string *str, size_t limit) {
|
|
||||||
if (CheckAvailable(limit)) {
|
|
||||||
const uint8_t *end
|
|
||||||
= static_cast<const uint8_t *>(memchr(here_, '\0', limit));
|
|
||||||
if (end)
|
|
||||||
str->assign(reinterpret_cast<const char *>(here_), end - here_);
|
|
||||||
else
|
|
||||||
str->assign(reinterpret_cast<const char *>(here_), limit);
|
|
||||||
here_ += limit;
|
|
||||||
} else {
|
|
||||||
str->clear();
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set *POINTER to point to the SIZE bytes at the cursor, and advance
|
|
||||||
// this cursor to the end of them. If SIZE is omitted, don't move the
|
|
||||||
// cursor. If we read off the end of our buffer, clear this cursor's
|
|
||||||
// complete_ flag, and set *POINTER to NULL. Return a reference to this
|
|
||||||
// cursor.
|
|
||||||
ByteCursor &PointTo(const uint8_t **pointer, size_t size = 0) {
|
|
||||||
if (CheckAvailable(size)) {
|
|
||||||
*pointer = here_;
|
|
||||||
here_ += size;
|
|
||||||
} else {
|
|
||||||
*pointer = NULL;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip SIZE bytes at the cursor. If doing so would advance us off
|
|
||||||
// the end of our buffer, clear this cursor's complete_ flag, and
|
|
||||||
// set *POINTER to NULL. Return a reference to this cursor.
|
|
||||||
ByteCursor &Skip(size_t size) {
|
|
||||||
if (CheckAvailable(size))
|
|
||||||
here_ += size;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// If there are at least SIZE bytes available to read from the buffer,
|
|
||||||
// return true. Otherwise, set here_ to the end of the buffer, set
|
|
||||||
// complete_ to false, and return false.
|
|
||||||
bool CheckAvailable(size_t size) {
|
|
||||||
if (Available() >= size) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
here_ = buffer_->end;
|
|
||||||
complete_ = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The buffer we're reading bytes from.
|
|
||||||
const ByteBuffer *buffer_;
|
|
||||||
|
|
||||||
// The next byte within buffer_ that we'll read.
|
|
||||||
const uint8_t *here_;
|
|
||||||
|
|
||||||
// True if we should read numbers in big-endian form; false if we
|
|
||||||
// should read in little-endian form.
|
|
||||||
bool big_endian_;
|
|
||||||
|
|
||||||
// True if we've been able to read all we've been asked to.
|
|
||||||
bool complete_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_BYTE_CURSOR_H_
|
|
||||||
|
|
@ -1,554 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 1991-2015 Unicode, Inc. All rights reserved.
|
|
||||||
* Distributed under the Terms of Use in
|
|
||||||
* http://www.unicode.org/copyright.html.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of the Unicode data files and any associated documentation
|
|
||||||
* (the "Data Files") or Unicode software and any associated documentation
|
|
||||||
* (the "Software") to deal in the Data Files or Software
|
|
||||||
* without restriction, including without limitation the rights to use,
|
|
||||||
* copy, modify, merge, publish, distribute, and/or sell copies of
|
|
||||||
* the Data Files or Software, and to permit persons to whom the Data Files
|
|
||||||
* or Software are furnished to do so, provided that
|
|
||||||
* (a) this copyright and permission notice appear with all copies
|
|
||||||
* of the Data Files or Software,
|
|
||||||
* (b) this copyright and permission notice appear in associated
|
|
||||||
* documentation, and
|
|
||||||
* (c) there is clear notice in each modified Data File or in the Software
|
|
||||||
* as well as in the documentation associated with the Data File(s) or
|
|
||||||
* Software that the data or software has been modified.
|
|
||||||
*
|
|
||||||
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
||||||
* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
||||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
* NONINFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
||||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
|
|
||||||
* NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
|
|
||||||
* DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
* PERFORMANCE OF THE DATA FILES OR SOFTWARE.
|
|
||||||
*
|
|
||||||
* Except as contained in this notice, the name of a copyright holder
|
|
||||||
* shall not be used in advertising or otherwise to promote the sale,
|
|
||||||
* use or other dealings in these Data Files or Software without prior
|
|
||||||
* written authorization of the copyright holder.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------
|
|
||||||
|
|
||||||
Conversions between UTF32, UTF-16, and UTF-8. Source code file.
|
|
||||||
Author: Mark E. Davis, 1994.
|
|
||||||
Rev History: Rick McGowan, fixes & updates May 2001.
|
|
||||||
Sept 2001: fixed const & error conditions per
|
|
||||||
mods suggested by S. Parent & A. Lillich.
|
|
||||||
June 2002: Tim Dodd added detection and handling of incomplete
|
|
||||||
source sequences, enhanced error detection, added casts
|
|
||||||
to eliminate compiler warnings.
|
|
||||||
July 2003: slight mods to back out aggressive FFFE detection.
|
|
||||||
Jan 2004: updated switches in from-UTF8 conversions.
|
|
||||||
Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.
|
|
||||||
|
|
||||||
See the header file "ConvertUTF.h" for complete documentation.
|
|
||||||
|
|
||||||
------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#include "convert_UTF.h"
|
|
||||||
#ifdef CVTUTF_DEBUG
|
|
||||||
#include <stdio.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const int halfShift = 10; /* used for shifting by 10 bits */
|
|
||||||
|
|
||||||
static const UTF32 halfBase = 0x0010000UL;
|
|
||||||
static const UTF32 halfMask = 0x3FFUL;
|
|
||||||
|
|
||||||
#define UNI_SUR_HIGH_START (UTF32)0xD800
|
|
||||||
#define UNI_SUR_HIGH_END (UTF32)0xDBFF
|
|
||||||
#define UNI_SUR_LOW_START (UTF32)0xDC00
|
|
||||||
#define UNI_SUR_LOW_END (UTF32)0xDFFF
|
|
||||||
|
|
||||||
#ifndef false
|
|
||||||
#define false 0
|
|
||||||
#endif
|
|
||||||
#ifndef true
|
|
||||||
#define true 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd,
|
|
||||||
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
|
|
||||||
ConversionResult result = conversionOK;
|
|
||||||
const UTF32* source = *sourceStart;
|
|
||||||
UTF16* target = *targetStart;
|
|
||||||
while (source < sourceEnd) {
|
|
||||||
UTF32 ch;
|
|
||||||
if (target >= targetEnd) {
|
|
||||||
result = targetExhausted; break;
|
|
||||||
}
|
|
||||||
ch = *source++;
|
|
||||||
if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
|
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */
|
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
|
||||||
if (flags == strictConversion) {
|
|
||||||
--source; /* return to the illegal value itself */
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
*target++ = (UTF16)ch; /* normal case */
|
|
||||||
}
|
|
||||||
} else if (ch > UNI_MAX_LEGAL_UTF32) {
|
|
||||||
if (flags == strictConversion) {
|
|
||||||
result = sourceIllegal;
|
|
||||||
} else {
|
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* target is a character in range 0xFFFF - 0x10FFFF. */
|
|
||||||
if (target + 1 >= targetEnd) {
|
|
||||||
--source; /* Back up source pointer! */
|
|
||||||
result = targetExhausted; break;
|
|
||||||
}
|
|
||||||
ch -= halfBase;
|
|
||||||
*target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
|
|
||||||
*target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*sourceStart = source;
|
|
||||||
*targetStart = target;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd,
|
|
||||||
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
|
|
||||||
ConversionResult result = conversionOK;
|
|
||||||
const UTF16* source = *sourceStart;
|
|
||||||
UTF32* target = *targetStart;
|
|
||||||
UTF32 ch, ch2;
|
|
||||||
while (source < sourceEnd) {
|
|
||||||
const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */
|
|
||||||
ch = *source++;
|
|
||||||
/* If we have a surrogate pair, convert to UTF32 first. */
|
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
|
|
||||||
/* If the 16 bits following the high surrogate are in the source buffer... */
|
|
||||||
if (source < sourceEnd) {
|
|
||||||
ch2 = *source;
|
|
||||||
/* If it's a low surrogate, convert to UTF32. */
|
|
||||||
if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
|
|
||||||
ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
|
|
||||||
+ (ch2 - UNI_SUR_LOW_START) + halfBase;
|
|
||||||
++source;
|
|
||||||
} else if (flags == strictConversion) { /* it's an unpaired high surrogate */
|
|
||||||
--source; /* return to the illegal value itself */
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else { /* We don't have the 16 bits following the high surrogate. */
|
|
||||||
--source; /* return to the high surrogate */
|
|
||||||
result = sourceExhausted;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (flags == strictConversion) {
|
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32 */
|
|
||||||
if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
|
|
||||||
--source; /* return to the illegal value itself */
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (target >= targetEnd) {
|
|
||||||
source = oldSource; /* Back up source pointer! */
|
|
||||||
result = targetExhausted; break;
|
|
||||||
}
|
|
||||||
*target++ = ch;
|
|
||||||
}
|
|
||||||
*sourceStart = source;
|
|
||||||
*targetStart = target;
|
|
||||||
#ifdef CVTUTF_DEBUG
|
|
||||||
if (result == sourceIllegal) {
|
|
||||||
fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2);
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Index into the table below with the first byte of a UTF-8 sequence to
|
|
||||||
* get the number of trailing bytes that are supposed to follow it.
|
|
||||||
* Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is
|
|
||||||
* left as-is for anyone who may want to do such conversion, which was
|
|
||||||
* allowed in earlier algorithms.
|
|
||||||
*/
|
|
||||||
static const char trailingBytesForUTF8[256] = {
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
||||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
||||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Magic values subtracted from a buffer value during UTF8 conversion.
|
|
||||||
* This table contains as many values as there might be trailing bytes
|
|
||||||
* in a UTF-8 sequence.
|
|
||||||
*/
|
|
||||||
static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
|
|
||||||
0x03C82080UL, 0xFA082080UL, 0x82082080UL };
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Once the bits are split out into bytes of UTF-8, this is a mask OR-ed
|
|
||||||
* into the first byte, depending on how many bytes follow. There are
|
|
||||||
* as many entries in this table as there are UTF-8 sequence types.
|
|
||||||
* (I.e., one byte sequence, two byte... etc.). Remember that sequencs
|
|
||||||
* for *legal* UTF-8 will be 4 or fewer bytes total.
|
|
||||||
*/
|
|
||||||
static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* The interface converts a whole buffer to avoid function-call overhead.
|
|
||||||
* Constants have been gathered. Loops & conditionals have been removed as
|
|
||||||
* much as possible for efficiency, in favor of drop-through switches.
|
|
||||||
* (See "Note A" at the bottom of the file for equivalent code.)
|
|
||||||
* If your compiler supports it, the "isLegalUTF8" call can be turned
|
|
||||||
* into an inline function.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd,
|
|
||||||
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
|
|
||||||
ConversionResult result = conversionOK;
|
|
||||||
const UTF16* source = *sourceStart;
|
|
||||||
UTF8* target = *targetStart;
|
|
||||||
while (source < sourceEnd) {
|
|
||||||
UTF32 ch;
|
|
||||||
unsigned short bytesToWrite = 0;
|
|
||||||
const UTF32 byteMask = 0xBF;
|
|
||||||
const UTF32 byteMark = 0x80;
|
|
||||||
const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */
|
|
||||||
ch = *source++;
|
|
||||||
/* If we have a surrogate pair, convert to UTF32 first. */
|
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
|
|
||||||
/* If the 16 bits following the high surrogate are in the source buffer... */
|
|
||||||
if (source < sourceEnd) {
|
|
||||||
UTF32 ch2 = *source;
|
|
||||||
/* If it's a low surrogate, convert to UTF32. */
|
|
||||||
if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
|
|
||||||
ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
|
|
||||||
+ (ch2 - UNI_SUR_LOW_START) + halfBase;
|
|
||||||
++source;
|
|
||||||
} else if (flags == strictConversion) { /* it's an unpaired high surrogate */
|
|
||||||
--source; /* return to the illegal value itself */
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else { /* We don't have the 16 bits following the high surrogate. */
|
|
||||||
--source; /* return to the high surrogate */
|
|
||||||
result = sourceExhausted;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (flags == strictConversion) {
|
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32 */
|
|
||||||
if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
|
|
||||||
--source; /* return to the illegal value itself */
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Figure out how many bytes the result will require */
|
|
||||||
if (ch < (UTF32)0x80) { bytesToWrite = 1;
|
|
||||||
} else if (ch < (UTF32)0x800) { bytesToWrite = 2;
|
|
||||||
} else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
|
|
||||||
} else if (ch < (UTF32)0x110000) { bytesToWrite = 4;
|
|
||||||
} else { bytesToWrite = 3;
|
|
||||||
ch = UNI_REPLACEMENT_CHAR;
|
|
||||||
}
|
|
||||||
|
|
||||||
target += bytesToWrite;
|
|
||||||
if (target > targetEnd) {
|
|
||||||
source = oldSource; /* Back up source pointer! */
|
|
||||||
target -= bytesToWrite; result = targetExhausted; break;
|
|
||||||
}
|
|
||||||
switch (bytesToWrite) { /* note: everything falls through. */
|
|
||||||
case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
|
||||||
case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
|
||||||
case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
|
||||||
case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]);
|
|
||||||
}
|
|
||||||
target += bytesToWrite;
|
|
||||||
}
|
|
||||||
*sourceStart = source;
|
|
||||||
*targetStart = target;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Utility routine to tell whether a sequence of bytes is legal UTF-8.
|
|
||||||
* This must be called with the length pre-determined by the first byte.
|
|
||||||
* If not calling this from ConvertUTF8to*, then the length can be set by:
|
|
||||||
* length = trailingBytesForUTF8[*source]+1;
|
|
||||||
* and the sequence is illegal right away if there aren't that many bytes
|
|
||||||
* available.
|
|
||||||
* If presented with a length > 4, this returns false. The Unicode
|
|
||||||
* definition of UTF-8 goes up to 4-byte sequences.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static Boolean isLegalUTF8(const UTF8 *source, int length) {
|
|
||||||
UTF8 a;
|
|
||||||
const UTF8 *srcptr = source+length;
|
|
||||||
switch (length) {
|
|
||||||
default: return false;
|
|
||||||
/* Everything else falls through when "true"... */
|
|
||||||
case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
|
|
||||||
case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
|
|
||||||
case 2: if ((a = (*--srcptr)) > 0xBF) return false;
|
|
||||||
|
|
||||||
switch (*source) {
|
|
||||||
/* no fall-through in this inner switch */
|
|
||||||
case 0xE0: if (a < 0xA0) return false; break;
|
|
||||||
case 0xED: if (a > 0x9F) return false; break;
|
|
||||||
case 0xF0: if (a < 0x90) return false; break;
|
|
||||||
case 0xF4: if (a > 0x8F) return false; break;
|
|
||||||
default: if (a < 0x80) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 1: if (*source >= 0x80 && *source < 0xC2) return false;
|
|
||||||
}
|
|
||||||
if (*source > 0xF4) return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exported function to return whether a UTF-8 sequence is legal or not.
|
|
||||||
* This is not used here; it's just exported.
|
|
||||||
*/
|
|
||||||
Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {
|
|
||||||
int length = trailingBytesForUTF8[*source]+1;
|
|
||||||
if (source+length > sourceEnd) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return isLegalUTF8(source, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd,
|
|
||||||
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
|
|
||||||
ConversionResult result = conversionOK;
|
|
||||||
const UTF8* source = *sourceStart;
|
|
||||||
UTF16* target = *targetStart;
|
|
||||||
while (source < sourceEnd) {
|
|
||||||
UTF32 ch = 0;
|
|
||||||
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
|
||||||
if (source + extraBytesToRead >= sourceEnd) {
|
|
||||||
result = sourceExhausted; break;
|
|
||||||
}
|
|
||||||
/* Do this check whether lenient or strict */
|
|
||||||
if (! isLegalUTF8(source, extraBytesToRead+1)) {
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* The cases all fall through. See "Note A" below.
|
|
||||||
*/
|
|
||||||
switch (extraBytesToRead) {
|
|
||||||
case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
|
|
||||||
case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
|
|
||||||
case 3: ch += *source++; ch <<= 6;
|
|
||||||
case 2: ch += *source++; ch <<= 6;
|
|
||||||
case 1: ch += *source++; ch <<= 6;
|
|
||||||
case 0: ch += *source++;
|
|
||||||
}
|
|
||||||
ch -= offsetsFromUTF8[extraBytesToRead];
|
|
||||||
|
|
||||||
if (target >= targetEnd) {
|
|
||||||
source -= (extraBytesToRead+1); /* Back up source pointer! */
|
|
||||||
result = targetExhausted; break;
|
|
||||||
}
|
|
||||||
if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
|
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32 */
|
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
|
||||||
if (flags == strictConversion) {
|
|
||||||
source -= (extraBytesToRead+1); /* return to the illegal value itself */
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
*target++ = (UTF16)ch; /* normal case */
|
|
||||||
}
|
|
||||||
} else if (ch > UNI_MAX_UTF16) {
|
|
||||||
if (flags == strictConversion) {
|
|
||||||
result = sourceIllegal;
|
|
||||||
source -= (extraBytesToRead+1); /* return to the start */
|
|
||||||
break; /* Bail out; shouldn't continue */
|
|
||||||
} else {
|
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* target is a character in range 0xFFFF - 0x10FFFF. */
|
|
||||||
if (target + 1 >= targetEnd) {
|
|
||||||
source -= (extraBytesToRead+1); /* Back up source pointer! */
|
|
||||||
result = targetExhausted; break;
|
|
||||||
}
|
|
||||||
ch -= halfBase;
|
|
||||||
*target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
|
|
||||||
*target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*sourceStart = source;
|
|
||||||
*targetStart = target;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd,
|
|
||||||
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
|
|
||||||
ConversionResult result = conversionOK;
|
|
||||||
const UTF32* source = *sourceStart;
|
|
||||||
UTF8* target = *targetStart;
|
|
||||||
while (source < sourceEnd) {
|
|
||||||
UTF32 ch;
|
|
||||||
unsigned short bytesToWrite = 0;
|
|
||||||
const UTF32 byteMask = 0xBF;
|
|
||||||
const UTF32 byteMark = 0x80;
|
|
||||||
ch = *source++;
|
|
||||||
if (flags == strictConversion ) {
|
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32 */
|
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
|
||||||
--source; /* return to the illegal value itself */
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Figure out how many bytes the result will require. Turn any
|
|
||||||
* illegally large UTF32 things (> Plane 17) into replacement chars.
|
|
||||||
*/
|
|
||||||
if (ch < (UTF32)0x80) { bytesToWrite = 1;
|
|
||||||
} else if (ch < (UTF32)0x800) { bytesToWrite = 2;
|
|
||||||
} else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
|
|
||||||
} else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4;
|
|
||||||
} else { bytesToWrite = 3;
|
|
||||||
ch = UNI_REPLACEMENT_CHAR;
|
|
||||||
result = sourceIllegal;
|
|
||||||
}
|
|
||||||
|
|
||||||
target += bytesToWrite;
|
|
||||||
if (target > targetEnd) {
|
|
||||||
--source; /* Back up source pointer! */
|
|
||||||
target -= bytesToWrite; result = targetExhausted; break;
|
|
||||||
}
|
|
||||||
switch (bytesToWrite) { /* note: everything falls through. */
|
|
||||||
case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
|
||||||
case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
|
||||||
case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
|
||||||
case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);
|
|
||||||
}
|
|
||||||
target += bytesToWrite;
|
|
||||||
}
|
|
||||||
*sourceStart = source;
|
|
||||||
*targetStart = target;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd,
|
|
||||||
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
|
|
||||||
ConversionResult result = conversionOK;
|
|
||||||
const UTF8* source = *sourceStart;
|
|
||||||
UTF32* target = *targetStart;
|
|
||||||
while (source < sourceEnd) {
|
|
||||||
UTF32 ch = 0;
|
|
||||||
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
|
||||||
if (source + extraBytesToRead >= sourceEnd) {
|
|
||||||
result = sourceExhausted; break;
|
|
||||||
}
|
|
||||||
/* Do this check whether lenient or strict */
|
|
||||||
if (! isLegalUTF8(source, extraBytesToRead+1)) {
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* The cases all fall through. See "Note A" below.
|
|
||||||
*/
|
|
||||||
switch (extraBytesToRead) {
|
|
||||||
case 5: ch += *source++; ch <<= 6;
|
|
||||||
case 4: ch += *source++; ch <<= 6;
|
|
||||||
case 3: ch += *source++; ch <<= 6;
|
|
||||||
case 2: ch += *source++; ch <<= 6;
|
|
||||||
case 1: ch += *source++; ch <<= 6;
|
|
||||||
case 0: ch += *source++;
|
|
||||||
}
|
|
||||||
ch -= offsetsFromUTF8[extraBytesToRead];
|
|
||||||
|
|
||||||
if (target >= targetEnd) {
|
|
||||||
source -= (extraBytesToRead+1); /* Back up the source pointer! */
|
|
||||||
result = targetExhausted; break;
|
|
||||||
}
|
|
||||||
if (ch <= UNI_MAX_LEGAL_UTF32) {
|
|
||||||
/*
|
|
||||||
* UTF-16 surrogate values are illegal in UTF-32, and anything
|
|
||||||
* over Plane 17 (> 0x10FFFF) is illegal.
|
|
||||||
*/
|
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
|
||||||
if (flags == strictConversion) {
|
|
||||||
source -= (extraBytesToRead+1); /* return to the illegal value itself */
|
|
||||||
result = sourceIllegal;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
*target++ = ch;
|
|
||||||
}
|
|
||||||
} else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */
|
|
||||||
result = sourceIllegal;
|
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*sourceStart = source;
|
|
||||||
*targetStart = target;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------
|
|
||||||
|
|
||||||
Note A.
|
|
||||||
The fall-through switches in UTF-8 reading code save a
|
|
||||||
temp variable, some decrements & conditionals. The switches
|
|
||||||
are equivalent to the following loop:
|
|
||||||
{
|
|
||||||
int tmpBytesToRead = extraBytesToRead+1;
|
|
||||||
do {
|
|
||||||
ch += *source++;
|
|
||||||
--tmpBytesToRead;
|
|
||||||
if (tmpBytesToRead) ch <<= 6;
|
|
||||||
} while (tmpBytesToRead > 0);
|
|
||||||
}
|
|
||||||
In UTF-8 writing code, the switches on "bytesToWrite" are
|
|
||||||
similarly unrolled loops.
|
|
||||||
|
|
||||||
--------------------------------------------------------------------- */
|
|
||||||
|
|
@ -1,164 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 1991-2015 Unicode, Inc. All rights reserved.
|
|
||||||
* Distributed under the Terms of Use in
|
|
||||||
* http://www.unicode.org/copyright.html.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of the Unicode data files and any associated documentation
|
|
||||||
* (the "Data Files") or Unicode software and any associated documentation
|
|
||||||
* (the "Software") to deal in the Data Files or Software
|
|
||||||
* without restriction, including without limitation the rights to use,
|
|
||||||
* copy, modify, merge, publish, distribute, and/or sell copies of
|
|
||||||
* the Data Files or Software, and to permit persons to whom the Data Files
|
|
||||||
* or Software are furnished to do so, provided that
|
|
||||||
* (a) this copyright and permission notice appear with all copies
|
|
||||||
* of the Data Files or Software,
|
|
||||||
* (b) this copyright and permission notice appear in associated
|
|
||||||
* documentation, and
|
|
||||||
* (c) there is clear notice in each modified Data File or in the Software
|
|
||||||
* as well as in the documentation associated with the Data File(s) or
|
|
||||||
* Software that the data or software has been modified.
|
|
||||||
*
|
|
||||||
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
||||||
* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
||||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
* NONINFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
||||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
|
|
||||||
* NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
|
|
||||||
* DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
* PERFORMANCE OF THE DATA FILES OR SOFTWARE.
|
|
||||||
*
|
|
||||||
* Except as contained in this notice, the name of a copyright holder
|
|
||||||
* shall not be used in advertising or otherwise to promote the sale,
|
|
||||||
* use or other dealings in these Data Files or Software without prior
|
|
||||||
* written authorization of the copyright holder.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef COMMON_CONVERT_UTF_H_
|
|
||||||
#define COMMON_CONVERT_UTF_H_
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------
|
|
||||||
|
|
||||||
Conversions between UTF32, UTF-16, and UTF-8. Header file.
|
|
||||||
|
|
||||||
Several funtions are included here, forming a complete set of
|
|
||||||
conversions between the three formats. UTF-7 is not included
|
|
||||||
here, but is handled in a separate source file.
|
|
||||||
|
|
||||||
Each of these routines takes pointers to input buffers and output
|
|
||||||
buffers. The input buffers are const.
|
|
||||||
|
|
||||||
Each routine converts the text between *sourceStart and sourceEnd,
|
|
||||||
putting the result into the buffer between *targetStart and
|
|
||||||
targetEnd. Note: the end pointers are *after* the last item: e.g.
|
|
||||||
*(sourceEnd - 1) is the last item.
|
|
||||||
|
|
||||||
The return result indicates whether the conversion was successful,
|
|
||||||
and if not, whether the problem was in the source or target buffers.
|
|
||||||
(Only the first encountered problem is indicated.)
|
|
||||||
|
|
||||||
After the conversion, *sourceStart and *targetStart are both
|
|
||||||
updated to point to the end of last text successfully converted in
|
|
||||||
the respective buffers.
|
|
||||||
|
|
||||||
Input parameters:
|
|
||||||
sourceStart - pointer to a pointer to the source buffer.
|
|
||||||
The contents of this are modified on return so that
|
|
||||||
it points at the next thing to be converted.
|
|
||||||
targetStart - similarly, pointer to pointer to the target buffer.
|
|
||||||
sourceEnd, targetEnd - respectively pointers to the ends of the
|
|
||||||
two buffers, for overflow checking only.
|
|
||||||
|
|
||||||
These conversion functions take a ConversionFlags argument. When this
|
|
||||||
flag is set to strict, both irregular sequences and isolated surrogates
|
|
||||||
will cause an error. When the flag is set to lenient, both irregular
|
|
||||||
sequences and isolated surrogates are converted.
|
|
||||||
|
|
||||||
Whether the flag is strict or lenient, all illegal sequences will cause
|
|
||||||
an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,
|
|
||||||
or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code
|
|
||||||
must check for illegal sequences.
|
|
||||||
|
|
||||||
When the flag is set to lenient, characters over 0x10FFFF are converted
|
|
||||||
to the replacement character; otherwise (when the flag is set to strict)
|
|
||||||
they constitute an error.
|
|
||||||
|
|
||||||
Output parameters:
|
|
||||||
The value "sourceIllegal" is returned from some routines if the input
|
|
||||||
sequence is malformed. When "sourceIllegal" is returned, the source
|
|
||||||
value will point to the illegal value that caused the problem. E.g.,
|
|
||||||
in UTF-8 when a sequence is malformed, it points to the start of the
|
|
||||||
malformed sequence.
|
|
||||||
|
|
||||||
Author: Mark E. Davis, 1994.
|
|
||||||
Rev History: Rick McGowan, fixes & updates May 2001.
|
|
||||||
Fixes & updates, Sept 2001.
|
|
||||||
|
|
||||||
------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------
|
|
||||||
The following 4 definitions are compiler-specific.
|
|
||||||
The C standard does not guarantee that wchar_t has at least
|
|
||||||
16 bits, so wchar_t is no less portable than unsigned short!
|
|
||||||
All should be unsigned values to avoid sign extension during
|
|
||||||
bit mask & shift operations.
|
|
||||||
------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
typedef unsigned long UTF32; /* at least 32 bits */
|
|
||||||
typedef unsigned short UTF16; /* at least 16 bits */
|
|
||||||
typedef unsigned char UTF8; /* typically 8 bits */
|
|
||||||
typedef unsigned char Boolean; /* 0 or 1 */
|
|
||||||
|
|
||||||
/* Some fundamental constants */
|
|
||||||
#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
|
|
||||||
#define UNI_MAX_BMP (UTF32)0x0000FFFF
|
|
||||||
#define UNI_MAX_UTF16 (UTF32)0x0010FFFF
|
|
||||||
#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
|
|
||||||
#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
conversionOK, /* conversion successful */
|
|
||||||
sourceExhausted, /* partial character in source, but hit end */
|
|
||||||
targetExhausted, /* insuff. room in target for conversion */
|
|
||||||
sourceIllegal /* source sequence is illegal/malformed */
|
|
||||||
} ConversionResult;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
strictConversion = 0,
|
|
||||||
lenientConversion
|
|
||||||
} ConversionFlags;
|
|
||||||
|
|
||||||
/* This is for C++ and does no harm in C */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd,
|
|
||||||
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd,
|
|
||||||
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd,
|
|
||||||
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd,
|
|
||||||
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd,
|
|
||||||
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd,
|
|
||||||
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#endif // COMMON_CONVERT_UTF_H_
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_EINTR_WRAPPER_H_
|
|
||||||
#define COMMON_LINUX_EINTR_WRAPPER_H_
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
// This provides a wrapper around system calls which may be interrupted by a
|
|
||||||
// signal and return EINTR. See man 7 signal.
|
|
||||||
//
|
|
||||||
|
|
||||||
#define HANDLE_EINTR(x) ({ \
|
|
||||||
__typeof__(x) eintr_wrapper_result; \
|
|
||||||
do { \
|
|
||||||
eintr_wrapper_result = (x); \
|
|
||||||
} while (eintr_wrapper_result == -1 && errno == EINTR); \
|
|
||||||
eintr_wrapper_result; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define IGNORE_EINTR(x) ({ \
|
|
||||||
__typeof__(x) eintr_wrapper_result; \
|
|
||||||
do { \
|
|
||||||
eintr_wrapper_result = (x); \
|
|
||||||
if (eintr_wrapper_result == -1 && errno == EINTR) { \
|
|
||||||
eintr_wrapper_result = 0; \
|
|
||||||
} \
|
|
||||||
} while (0); \
|
|
||||||
eintr_wrapper_result; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_EINTR_WRAPPER_H_
|
|
||||||
|
|
@ -1,179 +0,0 @@
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// elf_core_dump.cc: Implement google_breakpad::ElfCoreDump.
|
|
||||||
// See elf_core_dump.h for details.
|
|
||||||
|
|
||||||
#include "common/linux/elf_core_dump.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Implementation of ElfCoreDump::Note.
|
|
||||||
|
|
||||||
ElfCoreDump::Note::Note() {}
|
|
||||||
|
|
||||||
ElfCoreDump::Note::Note(const MemoryRange& content) : content_(content) {}
|
|
||||||
|
|
||||||
bool ElfCoreDump::Note::IsValid() const {
|
|
||||||
return GetHeader() != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ElfCoreDump::Nhdr* ElfCoreDump::Note::GetHeader() const {
|
|
||||||
return content_.GetData<Nhdr>(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ElfCoreDump::Word ElfCoreDump::Note::GetType() const {
|
|
||||||
const Nhdr* header = GetHeader();
|
|
||||||
// 0 is not being used as a NOTE type.
|
|
||||||
return header ? header->n_type : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
MemoryRange ElfCoreDump::Note::GetName() const {
|
|
||||||
const Nhdr* header = GetHeader();
|
|
||||||
if (header) {
|
|
||||||
return content_.Subrange(sizeof(Nhdr), header->n_namesz);
|
|
||||||
}
|
|
||||||
return MemoryRange();
|
|
||||||
}
|
|
||||||
|
|
||||||
MemoryRange ElfCoreDump::Note::GetDescription() const {
|
|
||||||
const Nhdr* header = GetHeader();
|
|
||||||
if (header) {
|
|
||||||
return content_.Subrange(AlignedSize(sizeof(Nhdr) + header->n_namesz),
|
|
||||||
header->n_descsz);
|
|
||||||
}
|
|
||||||
return MemoryRange();
|
|
||||||
}
|
|
||||||
|
|
||||||
ElfCoreDump::Note ElfCoreDump::Note::GetNextNote() const {
|
|
||||||
MemoryRange next_content;
|
|
||||||
const Nhdr* header = GetHeader();
|
|
||||||
if (header) {
|
|
||||||
size_t next_offset = AlignedSize(sizeof(Nhdr) + header->n_namesz);
|
|
||||||
next_offset = AlignedSize(next_offset + header->n_descsz);
|
|
||||||
next_content =
|
|
||||||
content_.Subrange(next_offset, content_.length() - next_offset);
|
|
||||||
}
|
|
||||||
return Note(next_content);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
size_t ElfCoreDump::Note::AlignedSize(size_t size) {
|
|
||||||
size_t mask = sizeof(Word) - 1;
|
|
||||||
return (size + mask) & ~mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Implementation of ElfCoreDump.
|
|
||||||
|
|
||||||
ElfCoreDump::ElfCoreDump() {}
|
|
||||||
|
|
||||||
ElfCoreDump::ElfCoreDump(const MemoryRange& content)
|
|
||||||
: content_(content) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void ElfCoreDump::SetContent(const MemoryRange& content) {
|
|
||||||
content_ = content;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ElfCoreDump::IsValid() const {
|
|
||||||
const Ehdr* header = GetHeader();
|
|
||||||
return (header &&
|
|
||||||
header->e_ident[0] == ELFMAG0 &&
|
|
||||||
header->e_ident[1] == ELFMAG1 &&
|
|
||||||
header->e_ident[2] == ELFMAG2 &&
|
|
||||||
header->e_ident[3] == ELFMAG3 &&
|
|
||||||
header->e_ident[4] == kClass &&
|
|
||||||
header->e_version == EV_CURRENT &&
|
|
||||||
header->e_type == ET_CORE);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ElfCoreDump::Ehdr* ElfCoreDump::GetHeader() const {
|
|
||||||
return content_.GetData<Ehdr>(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ElfCoreDump::Phdr* ElfCoreDump::GetProgramHeader(unsigned index) const {
|
|
||||||
const Ehdr* header = GetHeader();
|
|
||||||
if (header) {
|
|
||||||
return reinterpret_cast<const Phdr*>(content_.GetArrayElement(
|
|
||||||
header->e_phoff, header->e_phentsize, index));
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ElfCoreDump::Phdr* ElfCoreDump::GetFirstProgramHeaderOfType(
|
|
||||||
Word type) const {
|
|
||||||
for (unsigned i = 0, n = GetProgramHeaderCount(); i < n; ++i) {
|
|
||||||
const Phdr* program = GetProgramHeader(i);
|
|
||||||
if (program->p_type == type) {
|
|
||||||
return program;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned ElfCoreDump::GetProgramHeaderCount() const {
|
|
||||||
const Ehdr* header = GetHeader();
|
|
||||||
return header ? header->e_phnum : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ElfCoreDump::CopyData(void* buffer, Addr virtual_address, size_t length) {
|
|
||||||
for (unsigned i = 0, n = GetProgramHeaderCount(); i < n; ++i) {
|
|
||||||
const Phdr* program = GetProgramHeader(i);
|
|
||||||
if (program->p_type != PT_LOAD)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
size_t offset_in_segment = virtual_address - program->p_vaddr;
|
|
||||||
if (virtual_address >= program->p_vaddr &&
|
|
||||||
offset_in_segment < program->p_filesz) {
|
|
||||||
const void* data =
|
|
||||||
content_.GetData(program->p_offset + offset_in_segment, length);
|
|
||||||
if (data) {
|
|
||||||
memcpy(buffer, data, length);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ElfCoreDump::Note ElfCoreDump::GetFirstNote() const {
|
|
||||||
MemoryRange note_content;
|
|
||||||
const Phdr* program_header = GetFirstProgramHeaderOfType(PT_NOTE);
|
|
||||||
if (program_header) {
|
|
||||||
note_content = content_.Subrange(program_header->p_offset,
|
|
||||||
program_header->p_filesz);
|
|
||||||
}
|
|
||||||
return Note(note_content);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,148 +0,0 @@
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// elf_core_dump.h: Define the google_breakpad::ElfCoreDump class, which
|
|
||||||
// encapsulates an ELF core dump file mapped into memory.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_ELF_CORE_DUMP_H_
|
|
||||||
#define COMMON_LINUX_ELF_CORE_DUMP_H_
|
|
||||||
|
|
||||||
#include <elf.h>
|
|
||||||
#include <link.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "common/memory_range.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class encapsulating an ELF core dump file mapped into memory, which
|
|
||||||
// provides methods for accessing program headers and the note section.
|
|
||||||
class ElfCoreDump {
|
|
||||||
public:
|
|
||||||
// ELF types based on the value of __WORDSIZE.
|
|
||||||
typedef ElfW(Ehdr) Ehdr;
|
|
||||||
typedef ElfW(Nhdr) Nhdr;
|
|
||||||
typedef ElfW(Phdr) Phdr;
|
|
||||||
typedef ElfW(Word) Word;
|
|
||||||
typedef ElfW(Addr) Addr;
|
|
||||||
#if __WORDSIZE == 32
|
|
||||||
static const int kClass = ELFCLASS32;
|
|
||||||
#elif __WORDSIZE == 64
|
|
||||||
static const int kClass = ELFCLASS64;
|
|
||||||
#else
|
|
||||||
#error "Unsupported __WORDSIZE for ElfCoreDump."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// A class encapsulating the note content in a core dump, which provides
|
|
||||||
// methods for accessing the name and description of a note.
|
|
||||||
class Note {
|
|
||||||
public:
|
|
||||||
Note();
|
|
||||||
|
|
||||||
// Constructor that takes the note content from |content|.
|
|
||||||
explicit Note(const MemoryRange& content);
|
|
||||||
|
|
||||||
// Returns true if this note is valid, i,e. a note header is found in
|
|
||||||
// |content_|, or false otherwise.
|
|
||||||
bool IsValid() const;
|
|
||||||
|
|
||||||
// Returns the note header, or NULL if no note header is found in
|
|
||||||
// |content_|.
|
|
||||||
const Nhdr* GetHeader() const;
|
|
||||||
|
|
||||||
// Returns the note type, or 0 if no note header is found in |content_|.
|
|
||||||
Word GetType() const;
|
|
||||||
|
|
||||||
// Returns a memory range covering the note name, or an empty range
|
|
||||||
// if no valid note name is found in |content_|.
|
|
||||||
MemoryRange GetName() const;
|
|
||||||
|
|
||||||
// Returns a memory range covering the note description, or an empty
|
|
||||||
// range if no valid note description is found in |content_|.
|
|
||||||
MemoryRange GetDescription() const;
|
|
||||||
|
|
||||||
// Returns the note following this note, or an empty note if no valid
|
|
||||||
// note is found after this note.
|
|
||||||
Note GetNextNote() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Returns the size in bytes round up to the word alignment, specified
|
|
||||||
// for the note section, of a given size in bytes.
|
|
||||||
static size_t AlignedSize(size_t size);
|
|
||||||
|
|
||||||
// Note content.
|
|
||||||
MemoryRange content_;
|
|
||||||
};
|
|
||||||
|
|
||||||
ElfCoreDump();
|
|
||||||
|
|
||||||
// Constructor that takes the core dump content from |content|.
|
|
||||||
explicit ElfCoreDump(const MemoryRange& content);
|
|
||||||
|
|
||||||
// Sets the core dump content to |content|.
|
|
||||||
void SetContent(const MemoryRange& content);
|
|
||||||
|
|
||||||
// Returns true if a valid ELF header in the core dump, or false otherwise.
|
|
||||||
bool IsValid() const;
|
|
||||||
|
|
||||||
// Returns the ELF header in the core dump, or NULL if no ELF header
|
|
||||||
// is found in |content_|.
|
|
||||||
const Ehdr* GetHeader() const;
|
|
||||||
|
|
||||||
// Returns the |index|-th program header in the core dump, or NULL if no
|
|
||||||
// ELF header is found in |content_| or |index| is out of bounds.
|
|
||||||
const Phdr* GetProgramHeader(unsigned index) const;
|
|
||||||
|
|
||||||
// Returns the first program header of |type| in the core dump, or NULL if
|
|
||||||
// no ELF header is found in |content_| or no program header of |type| is
|
|
||||||
// found.
|
|
||||||
const Phdr* GetFirstProgramHeaderOfType(Word type) const;
|
|
||||||
|
|
||||||
// Returns the number of program headers in the core dump, or 0 if no
|
|
||||||
// ELF header is found in |content_|.
|
|
||||||
unsigned GetProgramHeaderCount() const;
|
|
||||||
|
|
||||||
// Copies |length| bytes of data starting at |virtual_address| in the core
|
|
||||||
// dump to |buffer|. |buffer| should be a valid pointer to a buffer of at
|
|
||||||
// least |length| bytes. Returns true if the data to be copied is found in
|
|
||||||
// the core dump, or false otherwise.
|
|
||||||
bool CopyData(void* buffer, Addr virtual_address, size_t length);
|
|
||||||
|
|
||||||
// Returns the first note found in the note section of the core dump, or
|
|
||||||
// an empty note if no note is found.
|
|
||||||
Note GetFirstNote() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Core dump content.
|
|
||||||
MemoryRange content_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_ELF_CORE_DUMP_H_
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
// -*- mode: C++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2013, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Lei Zhang <thestig@google.com>
|
|
||||||
|
|
||||||
// elf_gnu_compat.h: #defines unique to glibc's elf.h.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_ELF_GNU_COMPAT_H_
|
|
||||||
#define COMMON_LINUX_ELF_GNU_COMPAT_H_
|
|
||||||
|
|
||||||
#include <elf.h>
|
|
||||||
|
|
||||||
// A note type on GNU systems corresponding to the .note.gnu.build-id section.
|
|
||||||
#ifndef NT_GNU_BUILD_ID
|
|
||||||
#define NT_GNU_BUILD_ID 3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_ELF_GNU_COMPAT_H_
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_ELFUTILS_INL_H__
|
|
||||||
#define COMMON_LINUX_ELFUTILS_INL_H__
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "elfutils.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
template<typename ElfClass, typename T>
|
|
||||||
const T* GetOffset(const typename ElfClass::Ehdr* elf_header,
|
|
||||||
typename ElfClass::Off offset) {
|
|
||||||
return reinterpret_cast<const T*>(reinterpret_cast<uintptr_t>(elf_header) +
|
|
||||||
offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ElfClass>
|
|
||||||
const typename ElfClass::Shdr* FindElfSectionByName(
|
|
||||||
const char* name,
|
|
||||||
typename ElfClass::Word section_type,
|
|
||||||
const typename ElfClass::Shdr* sections,
|
|
||||||
const char* section_names,
|
|
||||||
const char* names_end,
|
|
||||||
int nsection) {
|
|
||||||
assert(name != NULL);
|
|
||||||
assert(sections != NULL);
|
|
||||||
assert(nsection > 0);
|
|
||||||
|
|
||||||
int name_len = my_strlen(name);
|
|
||||||
if (name_len == 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (int i = 0; i < nsection; ++i) {
|
|
||||||
const char* section_name = section_names + sections[i].sh_name;
|
|
||||||
if (sections[i].sh_type == section_type &&
|
|
||||||
names_end - section_name >= name_len + 1 &&
|
|
||||||
my_strcmp(name, section_name) == 0) {
|
|
||||||
return sections + i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_ELFUTILS_INL_H__
|
|
||||||
|
|
@ -1,194 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include "common/linux/elfutils.h"
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "common/linux/elfutils-inl.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
template<typename ElfClass>
|
|
||||||
void FindElfClassSection(const char *elf_base,
|
|
||||||
const char *section_name,
|
|
||||||
typename ElfClass::Word section_type,
|
|
||||||
const void **section_start,
|
|
||||||
size_t *section_size) {
|
|
||||||
typedef typename ElfClass::Ehdr Ehdr;
|
|
||||||
typedef typename ElfClass::Shdr Shdr;
|
|
||||||
|
|
||||||
assert(elf_base);
|
|
||||||
assert(section_start);
|
|
||||||
assert(section_size);
|
|
||||||
|
|
||||||
assert(my_strncmp(elf_base, ELFMAG, SELFMAG) == 0);
|
|
||||||
|
|
||||||
const Ehdr* elf_header = reinterpret_cast<const Ehdr*>(elf_base);
|
|
||||||
assert(elf_header->e_ident[EI_CLASS] == ElfClass::kClass);
|
|
||||||
|
|
||||||
const Shdr* sections =
|
|
||||||
GetOffset<ElfClass, Shdr>(elf_header, elf_header->e_shoff);
|
|
||||||
const Shdr* section_names = sections + elf_header->e_shstrndx;
|
|
||||||
const char* names =
|
|
||||||
GetOffset<ElfClass, char>(elf_header, section_names->sh_offset);
|
|
||||||
const char *names_end = names + section_names->sh_size;
|
|
||||||
|
|
||||||
const Shdr* section =
|
|
||||||
FindElfSectionByName<ElfClass>(section_name, section_type,
|
|
||||||
sections, names, names_end,
|
|
||||||
elf_header->e_shnum);
|
|
||||||
|
|
||||||
if (section != NULL && section->sh_size > 0) {
|
|
||||||
*section_start = elf_base + section->sh_offset;
|
|
||||||
*section_size = section->sh_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ElfClass>
|
|
||||||
void FindElfClassSegment(const char *elf_base,
|
|
||||||
typename ElfClass::Word segment_type,
|
|
||||||
const void **segment_start,
|
|
||||||
size_t *segment_size) {
|
|
||||||
typedef typename ElfClass::Ehdr Ehdr;
|
|
||||||
typedef typename ElfClass::Phdr Phdr;
|
|
||||||
|
|
||||||
assert(elf_base);
|
|
||||||
assert(segment_start);
|
|
||||||
assert(segment_size);
|
|
||||||
|
|
||||||
assert(my_strncmp(elf_base, ELFMAG, SELFMAG) == 0);
|
|
||||||
|
|
||||||
const Ehdr* elf_header = reinterpret_cast<const Ehdr*>(elf_base);
|
|
||||||
assert(elf_header->e_ident[EI_CLASS] == ElfClass::kClass);
|
|
||||||
|
|
||||||
const Phdr* phdrs =
|
|
||||||
GetOffset<ElfClass, Phdr>(elf_header, elf_header->e_phoff);
|
|
||||||
|
|
||||||
for (int i = 0; i < elf_header->e_phnum; ++i) {
|
|
||||||
if (phdrs[i].p_type == segment_type) {
|
|
||||||
*segment_start = elf_base + phdrs[i].p_offset;
|
|
||||||
*segment_size = phdrs[i].p_filesz;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
bool IsValidElf(const void* elf_base) {
|
|
||||||
return my_strncmp(reinterpret_cast<const char*>(elf_base),
|
|
||||||
ELFMAG, SELFMAG) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ElfClass(const void* elf_base) {
|
|
||||||
const ElfW(Ehdr)* elf_header =
|
|
||||||
reinterpret_cast<const ElfW(Ehdr)*>(elf_base);
|
|
||||||
|
|
||||||
return elf_header->e_ident[EI_CLASS];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FindElfSection(const void *elf_mapped_base,
|
|
||||||
const char *section_name,
|
|
||||||
uint32_t section_type,
|
|
||||||
const void **section_start,
|
|
||||||
size_t *section_size,
|
|
||||||
int *elfclass) {
|
|
||||||
assert(elf_mapped_base);
|
|
||||||
assert(section_start);
|
|
||||||
assert(section_size);
|
|
||||||
|
|
||||||
*section_start = NULL;
|
|
||||||
*section_size = 0;
|
|
||||||
|
|
||||||
if (!IsValidElf(elf_mapped_base))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int cls = ElfClass(elf_mapped_base);
|
|
||||||
if (elfclass) {
|
|
||||||
*elfclass = cls;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* elf_base =
|
|
||||||
static_cast<const char*>(elf_mapped_base);
|
|
||||||
|
|
||||||
if (cls == ELFCLASS32) {
|
|
||||||
FindElfClassSection<ElfClass32>(elf_base, section_name, section_type,
|
|
||||||
section_start, section_size);
|
|
||||||
return *section_start != NULL;
|
|
||||||
} else if (cls == ELFCLASS64) {
|
|
||||||
FindElfClassSection<ElfClass64>(elf_base, section_name, section_type,
|
|
||||||
section_start, section_size);
|
|
||||||
return *section_start != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FindElfSegment(const void *elf_mapped_base,
|
|
||||||
uint32_t segment_type,
|
|
||||||
const void **segment_start,
|
|
||||||
size_t *segment_size,
|
|
||||||
int *elfclass) {
|
|
||||||
assert(elf_mapped_base);
|
|
||||||
assert(segment_start);
|
|
||||||
assert(segment_size);
|
|
||||||
|
|
||||||
*segment_start = NULL;
|
|
||||||
*segment_size = 0;
|
|
||||||
|
|
||||||
if (!IsValidElf(elf_mapped_base))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int cls = ElfClass(elf_mapped_base);
|
|
||||||
if (elfclass) {
|
|
||||||
*elfclass = cls;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* elf_base =
|
|
||||||
static_cast<const char*>(elf_mapped_base);
|
|
||||||
|
|
||||||
if (cls == ELFCLASS32) {
|
|
||||||
FindElfClassSegment<ElfClass32>(elf_base, segment_type,
|
|
||||||
segment_start, segment_size);
|
|
||||||
return *segment_start != NULL;
|
|
||||||
} else if (cls == ELFCLASS64) {
|
|
||||||
FindElfClassSegment<ElfClass64>(elf_base, segment_type,
|
|
||||||
segment_start, segment_size);
|
|
||||||
return *segment_start != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// elfutils.h: Utilities for dealing with ELF files.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_ELFUTILS_H_
|
|
||||||
#define COMMON_LINUX_ELFUTILS_H_
|
|
||||||
|
|
||||||
#include <elf.h>
|
|
||||||
#include <link.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Traits classes so consumers can write templatized code to deal
|
|
||||||
// with specific ELF bits.
|
|
||||||
struct ElfClass32 {
|
|
||||||
typedef Elf32_Addr Addr;
|
|
||||||
typedef Elf32_Ehdr Ehdr;
|
|
||||||
typedef Elf32_Nhdr Nhdr;
|
|
||||||
typedef Elf32_Phdr Phdr;
|
|
||||||
typedef Elf32_Shdr Shdr;
|
|
||||||
typedef Elf32_Half Half;
|
|
||||||
typedef Elf32_Off Off;
|
|
||||||
typedef Elf32_Word Word;
|
|
||||||
static const int kClass = ELFCLASS32;
|
|
||||||
static const size_t kAddrSize = sizeof(Elf32_Addr);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ElfClass64 {
|
|
||||||
typedef Elf64_Addr Addr;
|
|
||||||
typedef Elf64_Ehdr Ehdr;
|
|
||||||
typedef Elf64_Nhdr Nhdr;
|
|
||||||
typedef Elf64_Phdr Phdr;
|
|
||||||
typedef Elf64_Shdr Shdr;
|
|
||||||
typedef Elf64_Half Half;
|
|
||||||
typedef Elf64_Off Off;
|
|
||||||
typedef Elf64_Word Word;
|
|
||||||
static const int kClass = ELFCLASS64;
|
|
||||||
static const size_t kAddrSize = sizeof(Elf64_Addr);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool IsValidElf(const void* elf_header);
|
|
||||||
int ElfClass(const void* elf_base);
|
|
||||||
|
|
||||||
// Attempt to find a section named |section_name| of type |section_type|
|
|
||||||
// in the ELF binary data at |elf_mapped_base|. On success, returns true
|
|
||||||
// and sets |*section_start| to point to the start of the section data,
|
|
||||||
// and |*section_size| to the size of the section's data. If |elfclass|
|
|
||||||
// is not NULL, set |*elfclass| to the ELF file class.
|
|
||||||
bool FindElfSection(const void *elf_mapped_base,
|
|
||||||
const char *section_name,
|
|
||||||
uint32_t section_type,
|
|
||||||
const void **section_start,
|
|
||||||
size_t *section_size,
|
|
||||||
int *elfclass);
|
|
||||||
|
|
||||||
// Internal helper method, exposed for convenience for callers
|
|
||||||
// that already have more info.
|
|
||||||
template<typename ElfClass>
|
|
||||||
const typename ElfClass::Shdr*
|
|
||||||
FindElfSectionByName(const char* name,
|
|
||||||
typename ElfClass::Word section_type,
|
|
||||||
const typename ElfClass::Shdr* sections,
|
|
||||||
const char* section_names,
|
|
||||||
const char* names_end,
|
|
||||||
int nsection);
|
|
||||||
|
|
||||||
// Attempt to find the first segment of type |segment_type| in the ELF
|
|
||||||
// binary data at |elf_mapped_base|. On success, returns true and sets
|
|
||||||
// |*segment_start| to point to the start of the segment data, and
|
|
||||||
// and |*segment_size| to the size of the segment's data. If |elfclass|
|
|
||||||
// is not NULL, set |*elfclass| to the ELF file class.
|
|
||||||
bool FindElfSegment(const void *elf_mapped_base,
|
|
||||||
uint32_t segment_type,
|
|
||||||
const void **segment_start,
|
|
||||||
size_t *segment_size,
|
|
||||||
int *elfclass);
|
|
||||||
|
|
||||||
// Convert an offset from an Elf header into a pointer to the mapped
|
|
||||||
// address in the current process. Takes an extra template parameter
|
|
||||||
// to specify the return type to avoid having to dynamic_cast the
|
|
||||||
// result.
|
|
||||||
template<typename ElfClass, typename T>
|
|
||||||
const T*
|
|
||||||
GetOffset(const typename ElfClass::Ehdr* elf_header,
|
|
||||||
typename ElfClass::Off offset);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_ELFUTILS_H_
|
|
||||||
|
|
@ -1,191 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// file_id.cc: Return a unique identifier for a file
|
|
||||||
//
|
|
||||||
// See file_id.h for documentation
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "common/linux/file_id.h"
|
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "common/linux/elf_gnu_compat.h"
|
|
||||||
#include "common/linux/elfutils.h"
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "common/linux/memory_mapped_file.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
FileID::FileID(const char* path) : path_(path) {}
|
|
||||||
|
|
||||||
// ELF note name and desc are 32-bits word padded.
|
|
||||||
#define NOTE_PADDING(a) ((a + 3) & ~3)
|
|
||||||
|
|
||||||
// These functions are also used inside the crashed process, so be safe
|
|
||||||
// and use the syscall/libc wrappers instead of direct syscalls or libc.
|
|
||||||
|
|
||||||
template<typename ElfClass>
|
|
||||||
static bool ElfClassBuildIDNoteIdentifier(const void *section, size_t length,
|
|
||||||
uint8_t identifier[kMDGUIDSize]) {
|
|
||||||
typedef typename ElfClass::Nhdr Nhdr;
|
|
||||||
|
|
||||||
const void* section_end = reinterpret_cast<const char*>(section) + length;
|
|
||||||
const Nhdr* note_header = reinterpret_cast<const Nhdr*>(section);
|
|
||||||
while (reinterpret_cast<const void *>(note_header) < section_end) {
|
|
||||||
if (note_header->n_type == NT_GNU_BUILD_ID)
|
|
||||||
break;
|
|
||||||
note_header = reinterpret_cast<const Nhdr*>(
|
|
||||||
reinterpret_cast<const char*>(note_header) + sizeof(Nhdr) +
|
|
||||||
NOTE_PADDING(note_header->n_namesz) +
|
|
||||||
NOTE_PADDING(note_header->n_descsz));
|
|
||||||
}
|
|
||||||
if (reinterpret_cast<const void *>(note_header) >= section_end ||
|
|
||||||
note_header->n_descsz == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* build_id = reinterpret_cast<const char*>(note_header) +
|
|
||||||
sizeof(Nhdr) + NOTE_PADDING(note_header->n_namesz);
|
|
||||||
// Copy as many bits of the build ID as will fit
|
|
||||||
// into the GUID space.
|
|
||||||
my_memset(identifier, 0, kMDGUIDSize);
|
|
||||||
memcpy(identifier, build_id,
|
|
||||||
std::min(kMDGUIDSize, (size_t)note_header->n_descsz));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attempt to locate a .note.gnu.build-id section in an ELF binary
|
|
||||||
// and copy as many bytes of it as will fit into |identifier|.
|
|
||||||
static bool FindElfBuildIDNote(const void *elf_mapped_base,
|
|
||||||
uint8_t identifier[kMDGUIDSize]) {
|
|
||||||
void* note_section;
|
|
||||||
size_t note_size;
|
|
||||||
int elfclass;
|
|
||||||
if ((!FindElfSegment(elf_mapped_base, PT_NOTE,
|
|
||||||
(const void**)¬e_section, ¬e_size, &elfclass) ||
|
|
||||||
note_size == 0) &&
|
|
||||||
(!FindElfSection(elf_mapped_base, ".note.gnu.build-id", SHT_NOTE,
|
|
||||||
(const void**)¬e_section, ¬e_size, &elfclass) ||
|
|
||||||
note_size == 0)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (elfclass == ELFCLASS32) {
|
|
||||||
return ElfClassBuildIDNoteIdentifier<ElfClass32>(note_section, note_size,
|
|
||||||
identifier);
|
|
||||||
} else if (elfclass == ELFCLASS64) {
|
|
||||||
return ElfClassBuildIDNoteIdentifier<ElfClass64>(note_section, note_size,
|
|
||||||
identifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attempt to locate the .text section of an ELF binary and generate
|
|
||||||
// a simple hash by XORing the first page worth of bytes into |identifier|.
|
|
||||||
static bool HashElfTextSection(const void *elf_mapped_base,
|
|
||||||
uint8_t identifier[kMDGUIDSize]) {
|
|
||||||
void* text_section;
|
|
||||||
size_t text_size;
|
|
||||||
if (!FindElfSection(elf_mapped_base, ".text", SHT_PROGBITS,
|
|
||||||
(const void**)&text_section, &text_size, NULL) ||
|
|
||||||
text_size == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
my_memset(identifier, 0, kMDGUIDSize);
|
|
||||||
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(text_section);
|
|
||||||
const uint8_t* ptr_end = ptr + std::min(text_size, static_cast<size_t>(4096));
|
|
||||||
while (ptr < ptr_end) {
|
|
||||||
for (unsigned i = 0; i < kMDGUIDSize; i++)
|
|
||||||
identifier[i] ^= ptr[i];
|
|
||||||
ptr += kMDGUIDSize;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
bool FileID::ElfFileIdentifierFromMappedFile(const void* base,
|
|
||||||
uint8_t identifier[kMDGUIDSize]) {
|
|
||||||
// Look for a build id note first.
|
|
||||||
if (FindElfBuildIDNote(base, identifier))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Fall back on hashing the first page of the text section.
|
|
||||||
return HashElfTextSection(base, identifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FileID::ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]) {
|
|
||||||
MemoryMappedFile mapped_file(path_.c_str(), 0);
|
|
||||||
if (!mapped_file.data()) // Should probably check if size >= ElfW(Ehdr)?
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return ElfFileIdentifierFromMappedFile(mapped_file.data(), identifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
void FileID::ConvertIdentifierToString(const uint8_t identifier[kMDGUIDSize],
|
|
||||||
char* buffer, int buffer_length) {
|
|
||||||
uint8_t identifier_swapped[kMDGUIDSize];
|
|
||||||
|
|
||||||
// Endian-ness swap to match dump processor expectation.
|
|
||||||
memcpy(identifier_swapped, identifier, kMDGUIDSize);
|
|
||||||
uint32_t* data1 = reinterpret_cast<uint32_t*>(identifier_swapped);
|
|
||||||
*data1 = htonl(*data1);
|
|
||||||
uint16_t* data2 = reinterpret_cast<uint16_t*>(identifier_swapped + 4);
|
|
||||||
*data2 = htons(*data2);
|
|
||||||
uint16_t* data3 = reinterpret_cast<uint16_t*>(identifier_swapped + 6);
|
|
||||||
*data3 = htons(*data3);
|
|
||||||
|
|
||||||
int buffer_idx = 0;
|
|
||||||
for (unsigned int idx = 0;
|
|
||||||
(buffer_idx < buffer_length) && (idx < kMDGUIDSize);
|
|
||||||
++idx) {
|
|
||||||
int hi = (identifier_swapped[idx] >> 4) & 0x0F;
|
|
||||||
int lo = (identifier_swapped[idx]) & 0x0F;
|
|
||||||
|
|
||||||
if (idx == 4 || idx == 6 || idx == 8 || idx == 10)
|
|
||||||
buffer[buffer_idx++] = '-';
|
|
||||||
|
|
||||||
buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi;
|
|
||||||
buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NULL terminate
|
|
||||||
buffer[(buffer_idx < buffer_length) ? buffer_idx : buffer_idx - 1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// file_id.h: Return a unique identifier for a file
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_FILE_ID_H__
|
|
||||||
#define COMMON_LINUX_FILE_ID_H__
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/linux/guid_creator.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
static const size_t kMDGUIDSize = sizeof(MDGUID);
|
|
||||||
|
|
||||||
class FileID {
|
|
||||||
public:
|
|
||||||
explicit FileID(const char* path);
|
|
||||||
~FileID() {}
|
|
||||||
|
|
||||||
// Load the identifier for the elf file path specified in the constructor into
|
|
||||||
// |identifier|. Return false if the identifier could not be created for the
|
|
||||||
// file.
|
|
||||||
// The current implementation will look for a .note.gnu.build-id
|
|
||||||
// section and use that as the file id, otherwise it falls back to
|
|
||||||
// XORing the first 4096 bytes of the .text section to generate an identifier.
|
|
||||||
bool ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]);
|
|
||||||
|
|
||||||
// Load the identifier for the elf file mapped into memory at |base| into
|
|
||||||
// |identifier|. Return false if the identifier could not be created for the
|
|
||||||
// file.
|
|
||||||
static bool ElfFileIdentifierFromMappedFile(const void* base,
|
|
||||||
uint8_t identifier[kMDGUIDSize]);
|
|
||||||
|
|
||||||
// Convert the |identifier| data to a NULL terminated string. The string will
|
|
||||||
// be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE).
|
|
||||||
// The |buffer| should be at least 37 bytes long to receive all of the data
|
|
||||||
// and termination. Shorter buffers will contain truncated data.
|
|
||||||
static void ConvertIdentifierToString(const uint8_t identifier[kMDGUIDSize],
|
|
||||||
char* buffer, int buffer_length);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Storage for the path specified
|
|
||||||
std::string path_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_FILE_ID_H__
|
|
||||||
|
|
@ -1,104 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include "common/linux/guid_creator.h"
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
//
|
|
||||||
// GUIDGenerator
|
|
||||||
//
|
|
||||||
// This class is used to generate random GUID.
|
|
||||||
// Currently use random number to generate a GUID since Linux has
|
|
||||||
// no native GUID generator. This should be OK since we don't expect
|
|
||||||
// crash to happen very offen.
|
|
||||||
//
|
|
||||||
class GUIDGenerator {
|
|
||||||
public:
|
|
||||||
static uint32_t BytesToUInt32(const uint8_t bytes[]) {
|
|
||||||
return ((uint32_t) bytes[0]
|
|
||||||
| ((uint32_t) bytes[1] << 8)
|
|
||||||
| ((uint32_t) bytes[2] << 16)
|
|
||||||
| ((uint32_t) bytes[3] << 24));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void UInt32ToBytes(uint8_t bytes[], uint32_t n) {
|
|
||||||
bytes[0] = n & 0xff;
|
|
||||||
bytes[1] = (n >> 8) & 0xff;
|
|
||||||
bytes[2] = (n >> 16) & 0xff;
|
|
||||||
bytes[3] = (n >> 24) & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool CreateGUID(GUID *guid) {
|
|
||||||
InitOnce();
|
|
||||||
guid->data1 = random();
|
|
||||||
guid->data2 = (uint16_t)(random());
|
|
||||||
guid->data3 = (uint16_t)(random());
|
|
||||||
UInt32ToBytes(&guid->data4[0], random());
|
|
||||||
UInt32ToBytes(&guid->data4[4], random());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void InitOnce() {
|
|
||||||
pthread_once(&once_control, &InitOnceImpl);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void InitOnceImpl() {
|
|
||||||
srandom(time(NULL));
|
|
||||||
}
|
|
||||||
|
|
||||||
static pthread_once_t once_control;
|
|
||||||
};
|
|
||||||
|
|
||||||
pthread_once_t GUIDGenerator::once_control = PTHREAD_ONCE_INIT;
|
|
||||||
|
|
||||||
bool CreateGUID(GUID *guid) {
|
|
||||||
return GUIDGenerator::CreateGUID(guid);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse guid to string.
|
|
||||||
bool GUIDToString(const GUID *guid, char *buf, int buf_len) {
|
|
||||||
// Should allow more space the the max length of GUID.
|
|
||||||
assert(buf_len > kGUIDStringLength);
|
|
||||||
int num = snprintf(buf, buf_len, kGUIDFormatString,
|
|
||||||
guid->data1, guid->data2, guid->data3,
|
|
||||||
GUIDGenerator::BytesToUInt32(&(guid->data4[0])),
|
|
||||||
GUIDGenerator::BytesToUInt32(&(guid->data4[4])));
|
|
||||||
if (num != kGUIDStringLength)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
buf[num] = '\0';
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_GUID_CREATOR_H__
|
|
||||||
#define COMMON_LINUX_GUID_CREATOR_H__
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
typedef MDGUID GUID;
|
|
||||||
|
|
||||||
// Format string for parsing GUID.
|
|
||||||
#define kGUIDFormatString "%08x-%04x-%04x-%08x-%08x"
|
|
||||||
// Length of GUID string. Don't count the ending '\0'.
|
|
||||||
#define kGUIDStringLength 36
|
|
||||||
|
|
||||||
// Create a guid.
|
|
||||||
bool CreateGUID(GUID *guid);
|
|
||||||
|
|
||||||
// Get the string from guid.
|
|
||||||
bool GUIDToString(const GUID *guid, char *buf, int buf_len);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
// Copyright (c) 2012 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_IGNORE_RET_H_
|
|
||||||
#define COMMON_LINUX_IGNORE_RET_H_
|
|
||||||
|
|
||||||
// Some compilers are prone to warn about unused return values. In cases where
|
|
||||||
// either a) the call cannot fail, or b) there is nothing that can be done when
|
|
||||||
// the call fails, IGNORE_RET() can be used to mark the return code as ignored.
|
|
||||||
// This avoids spurious compiler warnings.
|
|
||||||
|
|
||||||
#define IGNORE_RET(x) do { if (x); } while (0)
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_IGNORE_RET_H_
|
|
||||||
|
|
@ -1,237 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// This source file provides replacements for libc functions that we need. If
|
|
||||||
// we call the libc functions directly we risk crashing in the dynamic linker
|
|
||||||
// as it tries to resolve uncached PLT entries.
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
size_t my_strlen(const char* s) {
|
|
||||||
size_t len = 0;
|
|
||||||
while (*s++) len++;
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
int my_strcmp(const char* a, const char* b) {
|
|
||||||
for (;;) {
|
|
||||||
if (*a < *b)
|
|
||||||
return -1;
|
|
||||||
else if (*a > *b)
|
|
||||||
return 1;
|
|
||||||
else if (*a == 0)
|
|
||||||
return 0;
|
|
||||||
a++;
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int my_strncmp(const char* a, const char* b, size_t len) {
|
|
||||||
for (size_t i = 0; i < len; ++i) {
|
|
||||||
if (*a < *b)
|
|
||||||
return -1;
|
|
||||||
else if (*a > *b)
|
|
||||||
return 1;
|
|
||||||
else if (*a == 0)
|
|
||||||
return 0;
|
|
||||||
a++;
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse a non-negative integer.
|
|
||||||
// result: (output) the resulting non-negative integer
|
|
||||||
// s: a NUL terminated string
|
|
||||||
// Return true iff successful.
|
|
||||||
bool my_strtoui(int* result, const char* s) {
|
|
||||||
if (*s == 0)
|
|
||||||
return false;
|
|
||||||
int r = 0;
|
|
||||||
for (;; s++) {
|
|
||||||
if (*s == 0)
|
|
||||||
break;
|
|
||||||
const int old_r = r;
|
|
||||||
r *= 10;
|
|
||||||
if (*s < '0' || *s > '9')
|
|
||||||
return false;
|
|
||||||
r += *s - '0';
|
|
||||||
if (r < old_r)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
*result = r;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the length of the given unsigned integer when expressed in base 10.
|
|
||||||
unsigned my_uint_len(uintmax_t i) {
|
|
||||||
if (!i)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
int len = 0;
|
|
||||||
while (i) {
|
|
||||||
len++;
|
|
||||||
i /= 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert an unsigned integer to a string
|
|
||||||
// output: (output) the resulting string is written here. This buffer must be
|
|
||||||
// large enough to hold the resulting string. Call |my_uint_len| to get the
|
|
||||||
// required length.
|
|
||||||
// i: the unsigned integer to serialise.
|
|
||||||
// i_len: the length of the integer in base 10 (see |my_uint_len|).
|
|
||||||
void my_uitos(char* output, uintmax_t i, unsigned i_len) {
|
|
||||||
for (unsigned index = i_len; index; --index, i /= 10)
|
|
||||||
output[index - 1] = '0' + (i % 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* my_strchr(const char* haystack, char needle) {
|
|
||||||
while (*haystack && *haystack != needle)
|
|
||||||
haystack++;
|
|
||||||
if (*haystack == needle)
|
|
||||||
return haystack;
|
|
||||||
return (const char*) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* my_strrchr(const char* haystack, char needle) {
|
|
||||||
const char* ret = NULL;
|
|
||||||
while (*haystack) {
|
|
||||||
if (*haystack == needle)
|
|
||||||
ret = haystack;
|
|
||||||
haystack++;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* my_memchr(const void* src, int needle, size_t src_len) {
|
|
||||||
const unsigned char* p = (const unsigned char*)src;
|
|
||||||
const unsigned char* p_end = p + src_len;
|
|
||||||
for (; p < p_end; ++p) {
|
|
||||||
if (*p == needle)
|
|
||||||
return (void*)p;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read a hex value
|
|
||||||
// result: (output) the resulting value
|
|
||||||
// s: a string
|
|
||||||
// Returns a pointer to the first invalid charactor.
|
|
||||||
const char* my_read_hex_ptr(uintptr_t* result, const char* s) {
|
|
||||||
uintptr_t r = 0;
|
|
||||||
|
|
||||||
for (;; ++s) {
|
|
||||||
if (*s >= '0' && *s <= '9') {
|
|
||||||
r <<= 4;
|
|
||||||
r += *s - '0';
|
|
||||||
} else if (*s >= 'a' && *s <= 'f') {
|
|
||||||
r <<= 4;
|
|
||||||
r += (*s - 'a') + 10;
|
|
||||||
} else if (*s >= 'A' && *s <= 'F') {
|
|
||||||
r <<= 4;
|
|
||||||
r += (*s - 'A') + 10;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*result = r;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* my_read_decimal_ptr(uintptr_t* result, const char* s) {
|
|
||||||
uintptr_t r = 0;
|
|
||||||
|
|
||||||
for (;; ++s) {
|
|
||||||
if (*s >= '0' && *s <= '9') {
|
|
||||||
r *= 10;
|
|
||||||
r += *s - '0';
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*result = r;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void my_memset(void* ip, char c, size_t len) {
|
|
||||||
char* p = (char *) ip;
|
|
||||||
while (len--)
|
|
||||||
*p++ = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t my_strlcpy(char* s1, const char* s2, size_t len) {
|
|
||||||
size_t pos1 = 0;
|
|
||||||
size_t pos2 = 0;
|
|
||||||
|
|
||||||
while (s2[pos2] != '\0') {
|
|
||||||
if (pos1 + 1 < len) {
|
|
||||||
s1[pos1] = s2[pos2];
|
|
||||||
pos1++;
|
|
||||||
}
|
|
||||||
pos2++;
|
|
||||||
}
|
|
||||||
if (len > 0)
|
|
||||||
s1[pos1] = '\0';
|
|
||||||
|
|
||||||
return pos2;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t my_strlcat(char* s1, const char* s2, size_t len) {
|
|
||||||
size_t pos1 = 0;
|
|
||||||
|
|
||||||
while (pos1 < len && s1[pos1] != '\0')
|
|
||||||
pos1++;
|
|
||||||
|
|
||||||
if (pos1 == len)
|
|
||||||
return pos1;
|
|
||||||
|
|
||||||
return pos1 + my_strlcpy(s1 + pos1, s2, len - pos1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int my_isspace(int ch) {
|
|
||||||
// Matches the C locale.
|
|
||||||
const char spaces[] = " \t\f\n\r\t\v";
|
|
||||||
for (size_t i = 0; i < sizeof(spaces); i++) {
|
|
||||||
if (ch == spaces[i])
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // extern "C"
|
|
||||||
|
|
@ -1,96 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// This header provides replacements for libc functions that we need. We if
|
|
||||||
// call the libc functions directly we risk crashing in the dynamic linker as
|
|
||||||
// it tries to resolve uncached PLT entries.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
|
|
||||||
#define CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
extern size_t my_strlen(const char* s);
|
|
||||||
|
|
||||||
extern int my_strcmp(const char* a, const char* b);
|
|
||||||
|
|
||||||
extern int my_strncmp(const char* a, const char* b, size_t len);
|
|
||||||
|
|
||||||
// Parse a non-negative integer.
|
|
||||||
// result: (output) the resulting non-negative integer
|
|
||||||
// s: a NUL terminated string
|
|
||||||
// Return true iff successful.
|
|
||||||
extern bool my_strtoui(int* result, const char* s);
|
|
||||||
|
|
||||||
// Return the length of the given unsigned integer when expressed in base 10.
|
|
||||||
extern unsigned my_uint_len(uintmax_t i);
|
|
||||||
|
|
||||||
// Convert an unsigned integer to a string
|
|
||||||
// output: (output) the resulting string is written here. This buffer must be
|
|
||||||
// large enough to hold the resulting string. Call |my_uint_len| to get the
|
|
||||||
// required length.
|
|
||||||
// i: the unsigned integer to serialise.
|
|
||||||
// i_len: the length of the integer in base 10 (see |my_uint_len|).
|
|
||||||
extern void my_uitos(char* output, uintmax_t i, unsigned i_len);
|
|
||||||
|
|
||||||
extern const char* my_strchr(const char* haystack, char needle);
|
|
||||||
|
|
||||||
extern const char* my_strrchr(const char* haystack, char needle);
|
|
||||||
|
|
||||||
// Read a hex value
|
|
||||||
// result: (output) the resulting value
|
|
||||||
// s: a string
|
|
||||||
// Returns a pointer to the first invalid charactor.
|
|
||||||
extern const char* my_read_hex_ptr(uintptr_t* result, const char* s);
|
|
||||||
|
|
||||||
extern const char* my_read_decimal_ptr(uintptr_t* result, const char* s);
|
|
||||||
|
|
||||||
extern void my_memset(void* ip, char c, size_t len);
|
|
||||||
|
|
||||||
extern void* my_memchr(const void* src, int c, size_t len);
|
|
||||||
|
|
||||||
// The following are considered safe to use in a compromised environment.
|
|
||||||
// Besides, this gives the compiler an opportunity to optimize their calls.
|
|
||||||
#define my_memcpy memcpy
|
|
||||||
#define my_memmove memmove
|
|
||||||
#define my_memcmp memcmp
|
|
||||||
|
|
||||||
extern size_t my_strlcpy(char* s1, const char* s2, size_t len);
|
|
||||||
|
|
||||||
extern size_t my_strlcat(char* s1, const char* s2, size_t len);
|
|
||||||
|
|
||||||
extern int my_isspace(int ch);
|
|
||||||
|
|
||||||
} // extern "C"
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// memory_mapped_file.cc: Implement google_breakpad::MemoryMappedFile.
|
|
||||||
// See memory_mapped_file.h for details.
|
|
||||||
|
|
||||||
#include "common/linux/memory_mapped_file.h"
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#endif
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "common/memory_range.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
MemoryMappedFile::MemoryMappedFile() {}
|
|
||||||
|
|
||||||
MemoryMappedFile::MemoryMappedFile(const char* path, size_t offset) {
|
|
||||||
Map(path, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
MemoryMappedFile::~MemoryMappedFile() {
|
|
||||||
Unmap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
bool MemoryMappedFile::Map(const char* path, size_t offset) {
|
|
||||||
Unmap();
|
|
||||||
|
|
||||||
int fd = sys_open(path, O_RDONLY, 0);
|
|
||||||
if (fd == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__aarch64__) || \
|
|
||||||
(defined(__mips__) && _MIPS_SIM == _ABI64)
|
|
||||||
|
|
||||||
struct kernel_stat st;
|
|
||||||
if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
|
|
||||||
#else
|
|
||||||
struct kernel_stat64 st;
|
|
||||||
if (sys_fstat64(fd, &st) == -1 || st.st_size < 0) {
|
|
||||||
#endif
|
|
||||||
sys_close(fd);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strangely file size can be negative, but we check above that it is not.
|
|
||||||
size_t file_len = static_cast<size_t>(st.st_size);
|
|
||||||
// If the file does not extend beyond the offset, simply use an empty
|
|
||||||
// MemoryRange and return true. Don't bother to call mmap()
|
|
||||||
// even though mmap() can handle an empty file on some platforms.
|
|
||||||
if (offset >= file_len) {
|
|
||||||
sys_close(fd);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__aarch64__) || \
|
|
||||||
(defined(__mips__) && _MIPS_SIM == _ABI64)
|
|
||||||
void* data = sys_mmap(NULL, file_len, PROT_READ, MAP_PRIVATE, fd, offset);
|
|
||||||
#else
|
|
||||||
if ((offset & 4095) != 0) {
|
|
||||||
// Not page aligned.
|
|
||||||
sys_close(fd);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
void* data = sys_mmap2(
|
|
||||||
NULL, file_len, PROT_READ, MAP_PRIVATE, fd, offset >> 12);
|
|
||||||
#endif
|
|
||||||
sys_close(fd);
|
|
||||||
if (data == MAP_FAILED) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
content_.Set(data, file_len - offset);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MemoryMappedFile::Unmap() {
|
|
||||||
if (content_.data()) {
|
|
||||||
sys_munmap(const_cast<uint8_t*>(content_.data()), content_.length());
|
|
||||||
content_.Set(NULL, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// memory_mapped_file.h: Define the google_breakpad::MemoryMappedFile
|
|
||||||
// class, which maps a file into memory for read-only access.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_MEMORY_MAPPED_FILE_H_
|
|
||||||
#define COMMON_LINUX_MEMORY_MAPPED_FILE_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include "common/basictypes.h"
|
|
||||||
#include "common/memory_range.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A utility class for mapping a file into memory for read-only access of
|
|
||||||
// the file content. Its implementation avoids calling into libc functions
|
|
||||||
// by directly making system calls for open, close, mmap, and munmap.
|
|
||||||
class MemoryMappedFile {
|
|
||||||
public:
|
|
||||||
MemoryMappedFile();
|
|
||||||
|
|
||||||
// Constructor that calls Map() to map a file at |path| into memory.
|
|
||||||
// If Map() fails, the object behaves as if it is default constructed.
|
|
||||||
MemoryMappedFile(const char* path, size_t offset);
|
|
||||||
|
|
||||||
~MemoryMappedFile();
|
|
||||||
|
|
||||||
// Maps a file at |path| into memory, which can then be accessed via
|
|
||||||
// content() as a MemoryRange object or via data(), and returns true on
|
|
||||||
// success. Mapping an empty file will succeed but with data() and size()
|
|
||||||
// returning NULL and 0, respectively. An existing mapping is unmapped
|
|
||||||
// before a new mapping is created.
|
|
||||||
bool Map(const char* path, size_t offset);
|
|
||||||
|
|
||||||
// Unmaps the memory for the mapped file. It's a no-op if no file is
|
|
||||||
// mapped.
|
|
||||||
void Unmap();
|
|
||||||
|
|
||||||
// Returns a MemoryRange object that covers the memory for the mapped
|
|
||||||
// file. The MemoryRange object is empty if no file is mapped.
|
|
||||||
const MemoryRange& content() const { return content_; }
|
|
||||||
|
|
||||||
// Returns a pointer to the beginning of the memory for the mapped file.
|
|
||||||
// or NULL if no file is mapped or the mapped file is empty.
|
|
||||||
const void* data() const { return content_.data(); }
|
|
||||||
|
|
||||||
// Returns the size in bytes of the mapped file, or zero if no file
|
|
||||||
// is mapped.
|
|
||||||
size_t size() const { return content_.length(); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Mapped file content as a MemoryRange object.
|
|
||||||
MemoryRange content_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(MemoryMappedFile);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_MEMORY_MAPPED_FILE_H_
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue