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
35static tsize_t
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
41static tsize_t
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
47static toff_t
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
57static int
58_tiffCloseProc(thandle_t fd)
59{
60	return (close((int) fd));
61}
62
63#include <sys/stat.h>
64
65static toff_t
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
85static int
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
100static void
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 */
107static int
108_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
109{
110	(void) fd; (void) pbase; (void) psize;
111	return (0);
112}
113
114static void
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 */
124TIFF*
125TIFFFdOpen(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 */
142TIFF*
143TIFFOpen(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
173void*
174_TIFFmalloc(tsize_t s)
175{
176	return (malloc((size_t) s));
177}
178
179void
180_TIFFfree(tdata_t p)
181{
182	free(p);
183}
184
185void*
186_TIFFrealloc(tdata_t p, tsize_t s)
187{
188	return (realloc(p, (size_t) s));
189}
190
191void
192_TIFFmemset(tdata_t p, int v, tsize_t c)
193{
194	memset(p, v, (size_t) c);
195}
196
197void
198_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
199{
200	memcpy(d, s, (size_t) c);
201}
202
203int
204_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
205{
206	return (memcmp(p1, p2, (size_t) c));
207}
208
209static void
210unixWarningHandler(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}
218TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
219
220static void
221unixErrorHandler(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}
228TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
229