1 /* $Header$ */
2 
3 /*
4  * Copyright (c) 1988-1997 Sam Leffler
5  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6  *
7  * Permission to use, copy, modify, distribute, and sell this software and
8  * its documentation for any purpose is hereby granted without fee, provided
9  * that (i) the above copyright notices and this permission notice appear in
10  * all copies of the software and related documentation, and (ii) the names of
11  * Sam Leffler and Silicon Graphics may not be used in any advertising or
12  * publicity relating to the software without the specific, prior written
13  * permission of Sam Leffler and Silicon Graphics.
14  *
15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18  *
19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24  * OF THIS SOFTWARE.
25  */
26 
27 /*
28  * TIFF Library UNIX-specific Routines.
29  */
30 #include "tiffiop.h"
31 #include <sys/types.h>
32 #include <unistd.h>
33 #include <stdlib.h>
34 
35 static tsize_t
_tiffReadProc(thandle_t fd,tdata_t buf,tsize_t size)36 _tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
37 {
38 	return ((tsize_t) read((int) fd, buf, (size_t) size));
39 }
40 
41 static tsize_t
_tiffWriteProc(thandle_t fd,tdata_t buf,tsize_t size)42 _tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
43 {
44 	return ((tsize_t) write((int) fd, buf, (size_t) size));
45 }
46 
47 static toff_t
_tiffSeekProc(thandle_t fd,toff_t off,int whence)48 _tiffSeekProc(thandle_t fd, toff_t off, int whence)
49 {
50 #if USE_64BIT_API == 1
51 	return ((toff_t) lseek64((int) fd, (off64_t) off, whence));
52 #else
53 	return ((toff_t) lseek((int) fd, (off_t) off, whence));
54 #endif
55 }
56 
57 static int
_tiffCloseProc(thandle_t fd)58 _tiffCloseProc(thandle_t fd)
59 {
60 	return (close((int) fd));
61 }
62 
63 #include <sys/stat.h>
64 
65 static toff_t
_tiffSizeProc(thandle_t fd)66 _tiffSizeProc(thandle_t fd)
67 {
68 #ifdef _AM29K
69 	long fsize;
70 	return ((fsize = lseek((int) fd, 0, SEEK_END)) < 0 ? 0 : fsize);
71 #else
72 #if USE_64BIT_API == 1
73 	struct stat64 sb;
74 	return (toff_t) (fstat64((int) fd, &sb) < 0 ? 0 : sb.st_size);
75 #else
76 	struct stat sb;
77 	return (toff_t) (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size);
78 #endif
79 #endif
80 }
81 
82 #ifdef HAVE_MMAP
83 #include <sys/mman.h>
84 
85 static int
_tiffMapProc(thandle_t fd,tdata_t * pbase,toff_t * psize)86 _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
87 {
88 	toff_t size = _tiffSizeProc(fd);
89 	if (size != (toff_t) -1) {
90 		*pbase = (tdata_t)
91 		    mmap(0, size, PROT_READ, MAP_SHARED, (int) fd, 0);
92 		if (*pbase != (tdata_t) -1) {
93 			*psize = size;
94 			return (1);
95 		}
96 	}
97 	return (0);
98 }
99 
100 static void
_tiffUnmapProc(thandle_t fd,tdata_t base,toff_t size)101 _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
102 {
103 	(void) fd;
104 	(void) munmap(base, (off_t) size);
105 }
106 #else /* !HAVE_MMAP */
107 static int
_tiffMapProc(thandle_t fd,tdata_t * pbase,toff_t * psize)108 _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
109 {
110 	(void) fd; (void) pbase; (void) psize;
111 	return (0);
112 }
113 
114 static void
_tiffUnmapProc(thandle_t fd,tdata_t base,toff_t size)115 _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
116 {
117 	(void) fd; (void) base; (void) size;
118 }
119 #endif /* !HAVE_MMAP */
120 
121 /*
122  * Open a TIFF file descriptor for read/writing.
123  */
124 TIFF*
TIFFFdOpen(int fd,const char * name,const char * mode)125 TIFFFdOpen(int fd, const char* name, const char* mode)
126 {
127 	TIFF* tif;
128 
129 	tif = TIFFClientOpen(name, mode,
130 	    (thandle_t) fd,
131 	    _tiffReadProc, _tiffWriteProc,
132 	    _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
133 	    _tiffMapProc, _tiffUnmapProc);
134 	if (tif)
135 		tif->tif_fd = fd;
136 	return (tif);
137 }
138 
139 /*
140  * Open a TIFF file for read/writing.
141  */
142 TIFF*
TIFFOpen(const char * name,const char * mode)143 TIFFOpen(const char* name, const char* mode)
144 {
145 	static const char module[] = "TIFFOpen";
146 	int m, fd;
147 
148 	m = _TIFFgetMode(mode, module);
149 	if (m == -1)
150 		return ((TIFF*)0);
151 
152 /* for cygwin */
153 #ifdef O_BINARY
154         m |= O_BINARY;
155 #endif
156 
157 #ifdef _AM29K
158 	fd = open(name, m);
159 #else
160 #if USE_64BIT_API == 1
161 	fd = open(name, m | O_LARGEFILE, 0666);
162 #else
163 	fd = open(name, m, 0666);
164 #endif
165 #endif
166 	if (fd < 0) {
167 		TIFFError(module, "%s: Cannot open", name);
168 		return ((TIFF *)0);
169 	}
170 	return (TIFFFdOpen(fd, name, mode));
171 }
172 
173 void*
_TIFFmalloc(tsize_t s)174 _TIFFmalloc(tsize_t s)
175 {
176 	return (malloc((size_t) s));
177 }
178 
179 void
_TIFFfree(tdata_t p)180 _TIFFfree(tdata_t p)
181 {
182 	free(p);
183 }
184 
185 void*
_TIFFrealloc(tdata_t p,tsize_t s)186 _TIFFrealloc(tdata_t p, tsize_t s)
187 {
188 	return (realloc(p, (size_t) s));
189 }
190 
191 void
_TIFFmemset(tdata_t p,int v,tsize_t c)192 _TIFFmemset(tdata_t p, int v, tsize_t c)
193 {
194 	memset(p, v, (size_t) c);
195 }
196 
197 void
_TIFFmemcpy(tdata_t d,const tdata_t s,tsize_t c)198 _TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
199 {
200 	memcpy(d, s, (size_t) c);
201 }
202 
203 int
_TIFFmemcmp(const tdata_t p1,const tdata_t p2,tsize_t c)204 _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
205 {
206 	return (memcmp(p1, p2, (size_t) c));
207 }
208 
209 static void
unixWarningHandler(const char * module,const char * fmt,va_list ap)210 unixWarningHandler(const char* module, const char* fmt, va_list ap)
211 {
212 	if (module != NULL)
213 		fprintf(stderr, "%s: ", module);
214 	fprintf(stderr, "Warning, ");
215 	vfprintf(stderr, fmt, ap);
216 	fprintf(stderr, ".\n");
217 }
218 TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
219 
220 static void
unixErrorHandler(const char * module,const char * fmt,va_list ap)221 unixErrorHandler(const char* module, const char* fmt, va_list ap)
222 {
223 	if (module != NULL)
224 		fprintf(stderr, "%s: ", module);
225 	vfprintf(stderr, fmt, ap);
226 	fprintf(stderr, ".\n");
227 }
228 TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
229