Line data Source code
1 : /******************************************************************************
2 : * $Id$
3 : *
4 : * Project: GeoTIFF Driver
5 : * Purpose: Implement system hook functions for libtiff on top of CPL/VSI,
6 : * including > 2GB support. Based on tif_unix.c from libtiff
7 : * distribution.
8 : * Author: Frank Warmerdam, warmerdam@pobox.com
9 : *
10 : ******************************************************************************
11 : * Copyright (c) 2000, Frank Warmerdam, warmerdam@pobox.com
12 : *
13 : * SPDX-License-Identifier: MIT
14 : ****************************************************************************/
15 :
16 : /*
17 : * TIFF Library UNIX-specific Routines.
18 : */
19 : #include "tiffiop.h"
20 : #include "cpl_vsi.h"
21 :
22 0 : CPL_INLINE static void CPL_IGNORE_RET_VAL_INT(CPL_UNUSED int unused) {}
23 :
24 : static tsize_t
25 0 : _tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
26 : {
27 0 : return VSIFReadL( buf, 1, size, (VSILFILE *) fd );
28 : }
29 :
30 : static tsize_t
31 0 : _tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
32 : {
33 0 : return VSIFWriteL( buf, 1, size, (VSILFILE *) fd );
34 : }
35 :
36 : static toff_t
37 0 : _tiffSeekProc(thandle_t fd, toff_t off, int whence)
38 : {
39 0 : if( VSIFSeekL( (VSILFILE *) fd, off, whence ) == 0 )
40 0 : return (toff_t) VSIFTellL( (VSILFILE *) fd );
41 : else
42 0 : return (toff_t) -1;
43 : }
44 :
45 : static int
46 0 : _tiffCloseProc(thandle_t fd)
47 : {
48 0 : return VSIFCloseL( (VSILFILE *) fd );
49 : }
50 :
51 : static toff_t
52 0 : _tiffSizeProc(thandle_t fd)
53 : {
54 : vsi_l_offset old_off;
55 : toff_t file_size;
56 :
57 0 : old_off = VSIFTellL( (VSILFILE *) fd );
58 0 : CPL_IGNORE_RET_VAL_INT(VSIFSeekL( (VSILFILE *) fd, 0, SEEK_END ));
59 :
60 0 : file_size = (toff_t) VSIFTellL( (VSILFILE *) fd );
61 0 : CPL_IGNORE_RET_VAL_INT(VSIFSeekL( (VSILFILE *) fd, old_off, SEEK_SET ));
62 :
63 0 : return file_size;
64 : }
65 :
66 : static int
67 0 : _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
68 : {
69 : (void) fd; (void) pbase; (void) psize;
70 0 : return (0);
71 : }
72 :
73 : static void
74 0 : _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
75 : {
76 : (void) fd; (void) base; (void) size;
77 0 : }
78 :
79 : /*
80 : * Open a TIFF file descriptor for read/writing.
81 : */
82 : TIFF*
83 0 : TIFFFdOpen(CPL_UNUSED int fd, CPL_UNUSED const char* name, CPL_UNUSED const char* mode)
84 : {
85 0 : return NULL;
86 : }
87 :
88 : /*
89 : * Open a TIFF file for read/writing.
90 : */
91 : TIFF*
92 0 : TIFFOpen(const char* name, const char* mode)
93 : {
94 : static const char module[] = "TIFFOpen";
95 : int i, a_out;
96 : char szAccess[32];
97 : VSILFILE *fp;
98 : TIFF *tif;
99 0 : char *pszAccess = szAccess;
100 :
101 0 : a_out = 0;
102 0 : pszAccess[0] = '\0';
103 0 : for( i = 0; mode[i] != '\0'; i++ )
104 : {
105 0 : if( mode[i] == 'r'
106 0 : || mode[i] == 'w'
107 0 : || mode[i] == '+'
108 0 : || mode[i] == 'a' )
109 : {
110 0 : szAccess[a_out++] = mode[i];
111 0 : szAccess[a_out] = '\0';
112 : }
113 : }
114 :
115 0 : strcat( szAccess, "b" );
116 :
117 0 : fp = VSIFOpenL( name, szAccess );
118 0 : if (fp == NULL) {
119 0 : if( errno >= 0 )
120 0 : TIFFError(module,"%s: %s", name, VSIStrerror( errno ) );
121 : else
122 0 : TIFFError(module, "%s: Cannot open", name);
123 0 : return ((TIFF *)0);
124 : }
125 :
126 0 : tif = TIFFClientOpen(name, mode,
127 : (thandle_t) fp,
128 : _tiffReadProc, _tiffWriteProc,
129 : _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
130 : _tiffMapProc, _tiffUnmapProc);
131 :
132 0 : if( tif != NULL )
133 0 : tif->tif_fd = 0;
134 : else
135 0 : CPL_IGNORE_RET_VAL_INT(VSIFCloseL( fp ));
136 :
137 0 : return tif;
138 : }
139 :
140 : void*
141 784843 : _TIFFmalloc(tsize_t s)
142 : {
143 784843 : return VSIMalloc((size_t) s);
144 : }
145 :
146 71196 : void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
147 : {
148 71196 : if( nmemb == 0 || siz == 0 )
149 4 : return ((void *) NULL);
150 :
151 71192 : return VSICalloc((size_t) nmemb, (size_t)siz);
152 : }
153 :
154 : void
155 1913180 : _TIFFfree(tdata_t p)
156 : {
157 1913180 : VSIFree( p );
158 1913390 : }
159 :
160 : void*
161 1598330 : _TIFFrealloc(tdata_t p, tsize_t s)
162 : {
163 1598330 : return VSIRealloc( p, s );
164 : }
165 :
166 : void
167 1032830 : _TIFFmemset(void* p, int v, tmsize_t c)
168 : {
169 1032830 : memset(p, v, (size_t) c);
170 1032830 : }
171 :
172 : void
173 1952720 : _TIFFmemcpy(void* d, const void* s, tmsize_t c)
174 : {
175 1952720 : memcpy(d, s, (size_t) c);
176 1952720 : }
177 :
178 : int
179 8 : _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c)
180 : {
181 8 : return (memcmp(p1, p2, (size_t) c));
182 : }
183 :
184 : static void
185 0 : unixWarningHandler(const char* module, const char* fmt, va_list ap)
186 : {
187 0 : if (module != NULL)
188 0 : fprintf(stderr, "%s: ", module);
189 0 : fprintf(stderr, "Warning, ");
190 0 : vfprintf(stderr, fmt, ap);
191 0 : fprintf(stderr, ".\n");
192 0 : }
193 : TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
194 :
195 : static void
196 73 : unixErrorHandler(const char* module, const char* fmt, va_list ap)
197 : {
198 73 : if (module != NULL)
199 73 : fprintf(stderr, "%s: ", module);
200 73 : vfprintf(stderr, fmt, ap);
201 73 : fprintf(stderr, ".\n");
202 73 : }
203 : TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
|