xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/features/mmap (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
1*b30d1939SAndy Fiddamanref	-D_def_map_ast=1
2*b30d1939SAndy Fiddaman
3*b30d1939SAndy Fiddamansys	mman
4*b30d1939SAndy Fiddaman
5*b30d1939SAndy Fiddamantst	lib_mmap note{ standard mmap interface that works }end execute{
6*b30d1939SAndy Fiddaman	#include <unistd.h>
7*b30d1939SAndy Fiddaman	#include <fcntl.h>
8*b30d1939SAndy Fiddaman	#include <sys/types.h>
9*b30d1939SAndy Fiddaman	#include <sys/mman.h>
10*b30d1939SAndy Fiddaman	#include <sys/stat.h>
11*b30d1939SAndy Fiddaman	#include <sys/times.h>
12*b30d1939SAndy Fiddaman
13*b30d1939SAndy Fiddaman	#define MAPSIZE (64*1024)
14*b30d1939SAndy Fiddaman	#define BUFSIZE	(8*1024)
15*b30d1939SAndy Fiddaman	#define WRITE   (64)
16*b30d1939SAndy Fiddaman
17*b30d1939SAndy Fiddaman	#define Failed(file)	(remove(file),1)
18*b30d1939SAndy Fiddaman
19*b30d1939SAndy Fiddaman	int
20*b30d1939SAndy Fiddaman	#if _STD_
21*b30d1939SAndy Fiddaman	main(int argc, char** argv)
22*b30d1939SAndy Fiddaman	#else
23*b30d1939SAndy Fiddaman	main(argc,argv)
24*b30d1939SAndy Fiddaman	int     argc;
25*b30d1939SAndy Fiddaman	char**  argv;
26*b30d1939SAndy Fiddaman	#endif
27*b30d1939SAndy Fiddaman	{
28*b30d1939SAndy Fiddaman		caddr_t		mm;
29*b30d1939SAndy Fiddaman		char		*t, *u, *f;
30*b30d1939SAndy Fiddaman		int		i, fd, okfixed;
31*b30d1939SAndy Fiddaman		char		file[1024], buf[MAPSIZE];
32*b30d1939SAndy Fiddaman		struct tms	stm, etm;
33*b30d1939SAndy Fiddaman		clock_t		rdtm, mmtm;
34*b30d1939SAndy Fiddaman
35*b30d1939SAndy Fiddaman		/* create data file in a local fs if possible */
36*b30d1939SAndy Fiddaman		t = file;
37*b30d1939SAndy Fiddaman		if (access(f = "/tmp", 0) == 0 ||
38*b30d1939SAndy Fiddaman		    access(f = "/usr/tmp", 0) == 0)
39*b30d1939SAndy Fiddaman		{
40*b30d1939SAndy Fiddaman			while (*t = *f++)
41*b30d1939SAndy Fiddaman				t++;
42*b30d1939SAndy Fiddaman			*t++ = '/';
43*b30d1939SAndy Fiddaman		}
44*b30d1939SAndy Fiddaman		u = t;
45*b30d1939SAndy Fiddaman		f = argv[0];
46*b30d1939SAndy Fiddaman		while (*t = *f++)
47*b30d1939SAndy Fiddaman			if (*t == '/')
48*b30d1939SAndy Fiddaman				t = u;
49*b30d1939SAndy Fiddaman			else if (*t != '.')
50*b30d1939SAndy Fiddaman				t++;
51*b30d1939SAndy Fiddaman		*t++ = '.'; *t++ = 'D'; *t = 0;
52*b30d1939SAndy Fiddaman		if ((fd = open(file, O_CREAT|O_TRUNC|O_WRONLY, 0666)) < 0)
53*b30d1939SAndy Fiddaman			return 1;
54*b30d1939SAndy Fiddaman
55*b30d1939SAndy Fiddaman		for (i = 0; i < sizeof(buf); ++i)
56*b30d1939SAndy Fiddaman			buf[i] = '0' + (i%10);
57*b30d1939SAndy Fiddaman		for (i = 0; i < WRITE; ++i)
58*b30d1939SAndy Fiddaman			if (write(fd,buf,sizeof(buf)) != sizeof(buf))
59*b30d1939SAndy Fiddaman				return Failed(file);
60*b30d1939SAndy Fiddaman		close(fd);
61*b30d1939SAndy Fiddaman
62*b30d1939SAndy Fiddaman		/* see if can overwrite fixed map */
63*b30d1939SAndy Fiddaman	#ifndef MAP_VARIABLE
64*b30d1939SAndy Fiddaman	#define MAP_VARIABLE	0
65*b30d1939SAndy Fiddaman	#endif
66*b30d1939SAndy Fiddaman		if ((fd = open(file, O_RDWR)) < 0)
67*b30d1939SAndy Fiddaman			return Failed(file);
68*b30d1939SAndy Fiddaman
69*b30d1939SAndy Fiddaman		mm = mmap((caddr_t)0, sizeof(buf), (PROT_READ|PROT_WRITE),
70*b30d1939SAndy Fiddaman			  (MAP_PRIVATE|MAP_VARIABLE), fd, 0);
71*b30d1939SAndy Fiddaman		if(mm == (caddr_t)0 || mm == (caddr_t)(-1))
72*b30d1939SAndy Fiddaman			return Failed(file);
73*b30d1939SAndy Fiddaman		mm = mmap(mm, sizeof(buf), (PROT_READ|PROT_WRITE),
74*b30d1939SAndy Fiddaman			  (MAP_PRIVATE|MAP_FIXED), fd, 0);
75*b30d1939SAndy Fiddaman		okfixed = (mm == (caddr_t)0 || mm == (caddr_t)(-1)) ? 0 : 1;
76*b30d1939SAndy Fiddaman		munmap(mm, sizeof(buf));
77*b30d1939SAndy Fiddaman		close(fd);
78*b30d1939SAndy Fiddaman
79*b30d1939SAndy Fiddaman		/* read time */
80*b30d1939SAndy Fiddaman		if((fd = open(file,  O_RDWR)) < 0)
81*b30d1939SAndy Fiddaman			return Failed(file);
82*b30d1939SAndy Fiddaman		times(&stm);
83*b30d1939SAndy Fiddaman		for (i = 0; i < WRITE; ++i)
84*b30d1939SAndy Fiddaman			if (read(fd,buf,BUFSIZE) != BUFSIZE)
85*b30d1939SAndy Fiddaman				return Failed(file);
86*b30d1939SAndy Fiddaman		times(&etm);
87*b30d1939SAndy Fiddaman		close(fd);
88*b30d1939SAndy Fiddaman		rdtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime);
89*b30d1939SAndy Fiddaman
90*b30d1939SAndy Fiddaman		/* mmap time */
91*b30d1939SAndy Fiddaman		if ((fd = open(file, O_RDWR)) < 0)
92*b30d1939SAndy Fiddaman			return Failed(file);
93*b30d1939SAndy Fiddaman		times(&stm);
94*b30d1939SAndy Fiddaman		for(i = 0, mm = (caddr_t)0; i < WRITE; ++i)
95*b30d1939SAndy Fiddaman		{	if(okfixed)
96*b30d1939SAndy Fiddaman			{	mm = (caddr_t)mmap(mm, MAPSIZE,
97*b30d1939SAndy Fiddaman					(PROT_READ|PROT_WRITE),
98*b30d1939SAndy Fiddaman					(MAP_PRIVATE | (mm ? MAP_FIXED : MAP_VARIABLE)),
99*b30d1939SAndy Fiddaman					fd, i*MAPSIZE );
100*b30d1939SAndy Fiddaman			}
101*b30d1939SAndy Fiddaman			else
102*b30d1939SAndy Fiddaman			{	if(mm)
103*b30d1939SAndy Fiddaman					munmap(mm, MAPSIZE);
104*b30d1939SAndy Fiddaman				mm = (caddr_t)mmap((caddr_t)0, MAPSIZE,
105*b30d1939SAndy Fiddaman					(PROT_READ|PROT_WRITE),
106*b30d1939SAndy Fiddaman					(MAP_PRIVATE|MAP_VARIABLE),
107*b30d1939SAndy Fiddaman					fd, i*MAPSIZE );
108*b30d1939SAndy Fiddaman			}
109*b30d1939SAndy Fiddaman			if(mm == (caddr_t)(-1) || mm == (caddr_t)0)
110*b30d1939SAndy Fiddaman				return Failed(file);
111*b30d1939SAndy Fiddaman		}
112*b30d1939SAndy Fiddaman		times(&etm);
113*b30d1939SAndy Fiddaman		close(fd);
114*b30d1939SAndy Fiddaman		remove(file);
115*b30d1939SAndy Fiddaman		mmtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime);
116*b30d1939SAndy Fiddaman
117*b30d1939SAndy Fiddaman		return rdtm+60 < mmtm ? 1 : 0;
118*b30d1939SAndy Fiddaman	}
119*b30d1939SAndy Fiddaman}end
120*b30d1939SAndy Fiddaman
121*b30d1939SAndy Fiddamantst	lib_mmap64 -D_LARGEFILE64_SOURCE note{ mmap64 interface and implementation work }end execute{
122*b30d1939SAndy Fiddaman	#if !_lib_mmap
123*b30d1939SAndy Fiddaman	(
124*b30d1939SAndy Fiddaman	#endif
125*b30d1939SAndy Fiddaman
126*b30d1939SAndy Fiddaman	#include <unistd.h>
127*b30d1939SAndy Fiddaman	#include <fcntl.h>
128*b30d1939SAndy Fiddaman	#include <sys/types.h>
129*b30d1939SAndy Fiddaman	#include <sys/mman.h>
130*b30d1939SAndy Fiddaman	#include <sys/stat.h>
131*b30d1939SAndy Fiddaman
132*b30d1939SAndy Fiddaman	int
133*b30d1939SAndy Fiddaman	main()
134*b30d1939SAndy Fiddaman	{
135*b30d1939SAndy Fiddaman	        off64_t         off;
136*b30d1939SAndy Fiddaman	        int             fd;
137*b30d1939SAndy Fiddaman	        int             n;
138*b30d1939SAndy Fiddaman	        char*           s;
139*b30d1939SAndy Fiddaman		struct stat64	st;
140*b30d1939SAndy Fiddaman	        char            file[32] = {'/','t','m','p','/','m','m','X','X','X','X','X','X'};
141*b30d1939SAndy Fiddaman
142*b30d1939SAndy Fiddaman		/* hey, stubs are supposed to fail! */
143*b30d1939SAndy Fiddaman		if (stat64(".", &st) || !st.st_mode || !st.st_mtime)
144*b30d1939SAndy Fiddaman			return 1;
145*b30d1939SAndy Fiddaman	        if (!mktemp(file) || (fd = open64(file, O_CREAT|O_WRONLY, 0600)) < 0)
146*b30d1939SAndy Fiddaman	        {
147*b30d1939SAndy Fiddaman	                remove(file);
148*b30d1939SAndy Fiddaman	                return 1;
149*b30d1939SAndy Fiddaman	        }
150*b30d1939SAndy Fiddaman	        off = (1<<8);
151*b30d1939SAndy Fiddaman	        off *= off;
152*b30d1939SAndy Fiddaman	        if (lseek64(fd, off, SEEK_SET) != off)
153*b30d1939SAndy Fiddaman	        {
154*b30d1939SAndy Fiddaman	                remove(file);
155*b30d1939SAndy Fiddaman	                return 1;
156*b30d1939SAndy Fiddaman	        }
157*b30d1939SAndy Fiddaman	        n = strlen(file) + 1;
158*b30d1939SAndy Fiddaman	        if (write(fd, file, n) != n)
159*b30d1939SAndy Fiddaman	        {
160*b30d1939SAndy Fiddaman	                remove(file);
161*b30d1939SAndy Fiddaman	                return 1;
162*b30d1939SAndy Fiddaman	        }
163*b30d1939SAndy Fiddaman	        if (close(fd) < 0 || (fd = open64(file, O_RDWR)) < 0)
164*b30d1939SAndy Fiddaman	        {
165*b30d1939SAndy Fiddaman	                remove(file);
166*b30d1939SAndy Fiddaman	                return 1;
167*b30d1939SAndy Fiddaman	        }
168*b30d1939SAndy Fiddaman	        if (!(s = mmap64((caddr_t)0, (size_t)n, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, off)))
169*b30d1939SAndy Fiddaman	        {
170*b30d1939SAndy Fiddaman	                remove(file);
171*b30d1939SAndy Fiddaman	                return 1;
172*b30d1939SAndy Fiddaman	        }
173*b30d1939SAndy Fiddaman	        if (strcmp(s, file))
174*b30d1939SAndy Fiddaman	        {
175*b30d1939SAndy Fiddaman	                remove(file);
176*b30d1939SAndy Fiddaman	                return 1;
177*b30d1939SAndy Fiddaman	        }
178*b30d1939SAndy Fiddaman	        close(fd);
179*b30d1939SAndy Fiddaman	        remove(file);
180*b30d1939SAndy Fiddaman	        return 0;
181*b30d1939SAndy Fiddaman	}
182*b30d1939SAndy Fiddaman}end
183*b30d1939SAndy Fiddaman
184*b30d1939SAndy Fiddamantst	mmap_anon note{ use mmap MAP_ANON to get raw memory }end execute{
185*b30d1939SAndy Fiddaman	#if !_lib_mmap
186*b30d1939SAndy Fiddaman	(
187*b30d1939SAndy Fiddaman	#endif
188*b30d1939SAndy Fiddaman	#include <unistd.h>
189*b30d1939SAndy Fiddaman	#include <fcntl.h>
190*b30d1939SAndy Fiddaman	#include <sys/types.h>
191*b30d1939SAndy Fiddaman	#include <sys/mman.h>
192*b30d1939SAndy Fiddaman	#if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
193*b30d1939SAndy Fiddaman	#define MAP_ANON	MAP_ANONYMOUS
194*b30d1939SAndy Fiddaman	#endif
195*b30d1939SAndy Fiddaman	int
196*b30d1939SAndy Fiddaman	main()
197*b30d1939SAndy Fiddaman	{	void	*addr;
198*b30d1939SAndy Fiddaman		addr = mmap(0,1024*1024,PROT_READ|PROT_WRITE,MAP_ANON|MAP_PRIVATE,-1,0);
199*b30d1939SAndy Fiddaman		return (addr && addr != (void*)(-1)) ? 0 : 1;
200*b30d1939SAndy Fiddaman	}
201*b30d1939SAndy Fiddaman}end
202*b30d1939SAndy Fiddaman
203*b30d1939SAndy Fiddamantst	mmap_devzero note{ use mmap on /dev/zero to get raw memory }end execute{
204*b30d1939SAndy Fiddaman	#if !_lib_mmap
205*b30d1939SAndy Fiddaman	(
206*b30d1939SAndy Fiddaman	#endif
207*b30d1939SAndy Fiddaman	#include <unistd.h>
208*b30d1939SAndy Fiddaman	#include <fcntl.h>
209*b30d1939SAndy Fiddaman	#include <sys/types.h>
210*b30d1939SAndy Fiddaman	#include <sys/mman.h>
211*b30d1939SAndy Fiddaman	int
212*b30d1939SAndy Fiddaman	main()
213*b30d1939SAndy Fiddaman	{	int	fd;
214*b30d1939SAndy Fiddaman		void	*addr;
215*b30d1939SAndy Fiddaman		if((fd = open("/dev/zero", O_RDWR)) < 0)
216*b30d1939SAndy Fiddaman			return 1;
217*b30d1939SAndy Fiddaman		addr = mmap(0,1024*1024,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0);
218*b30d1939SAndy Fiddaman		return (addr && addr != (void*)(-1)) ? 0 : 1;
219*b30d1939SAndy Fiddaman	}
220*b30d1939SAndy Fiddaman}end
221*b30d1939SAndy Fiddaman
222*b30d1939SAndy Fiddamantst	note{ mmap is worth using }end output{
223*b30d1939SAndy Fiddaman	#if !_lib_mmap
224*b30d1939SAndy Fiddaman	(
225*b30d1939SAndy Fiddaman	#endif
226*b30d1939SAndy Fiddaman	#include <unistd.h>
227*b30d1939SAndy Fiddaman	#include <fcntl.h>
228*b30d1939SAndy Fiddaman	#include <sys/types.h>
229*b30d1939SAndy Fiddaman	#include <sys/mman.h>
230*b30d1939SAndy Fiddaman	#include <sys/stat.h>
231*b30d1939SAndy Fiddaman	#include <sys/times.h>
232*b30d1939SAndy Fiddaman
233*b30d1939SAndy Fiddaman	#define MAPSIZE (64*1024)
234*b30d1939SAndy Fiddaman	#define BUFSIZE	(MAPSIZE/8)
235*b30d1939SAndy Fiddaman	#define WRITE   (64)
236*b30d1939SAndy Fiddaman	#define RUN	(64)
237*b30d1939SAndy Fiddaman
238*b30d1939SAndy Fiddaman	#define Failed(file)	(remove(file),1)
239*b30d1939SAndy Fiddaman
240*b30d1939SAndy Fiddaman	int
241*b30d1939SAndy Fiddaman	#if _STD_
242*b30d1939SAndy Fiddaman	main(int argc, char** argv)
243*b30d1939SAndy Fiddaman	#else
244*b30d1939SAndy Fiddaman	main(argc,argv)
245*b30d1939SAndy Fiddaman	int     argc;
246*b30d1939SAndy Fiddaman	char**  argv;
247*b30d1939SAndy Fiddaman	#endif
248*b30d1939SAndy Fiddaman	{
249*b30d1939SAndy Fiddaman		caddr_t		mm;
250*b30d1939SAndy Fiddaman		char		*t, *f;
251*b30d1939SAndy Fiddaman		int		i, fd, k, run;
252*b30d1939SAndy Fiddaman		char		file[1024], buf[MAPSIZE];
253*b30d1939SAndy Fiddaman		struct tms	stm, etm;
254*b30d1939SAndy Fiddaman		clock_t		rdtm, mmtm;
255*b30d1939SAndy Fiddaman
256*b30d1939SAndy Fiddaman		/* create data file */
257*b30d1939SAndy Fiddaman		f = argv[0]; t = file;
258*b30d1939SAndy Fiddaman		while (*t = *f++)
259*b30d1939SAndy Fiddaman			t++;
260*b30d1939SAndy Fiddaman		*t++ = '.'; *t++ = 'D'; *t = 0;
261*b30d1939SAndy Fiddaman		if ((fd = open(file, O_CREAT|O_TRUNC|O_WRONLY, 0666)) < 0)
262*b30d1939SAndy Fiddaman			return 1;
263*b30d1939SAndy Fiddaman
264*b30d1939SAndy Fiddaman		for (i = 0; i < sizeof(buf); ++i)
265*b30d1939SAndy Fiddaman			buf[i] = '0' + (i%10);
266*b30d1939SAndy Fiddaman		for (i = 0; i < WRITE; ++i)
267*b30d1939SAndy Fiddaman			if (write(fd,buf,sizeof(buf)) != sizeof(buf))
268*b30d1939SAndy Fiddaman				return Failed(file);
269*b30d1939SAndy Fiddaman		close(fd);
270*b30d1939SAndy Fiddaman
271*b30d1939SAndy Fiddaman		/* read time */
272*b30d1939SAndy Fiddaman		times(&stm);
273*b30d1939SAndy Fiddaman		for(run = 0; run < RUN; ++run)
274*b30d1939SAndy Fiddaman		{	if((fd = open(file, O_RDWR)) < 0)
275*b30d1939SAndy Fiddaman				return Failed(file);
276*b30d1939SAndy Fiddaman			for (i = 0; i < WRITE; ++i)
277*b30d1939SAndy Fiddaman			{	for(k = 0; k < MAPSIZE; k += BUFSIZE)
278*b30d1939SAndy Fiddaman					if (read(fd,buf,BUFSIZE) != BUFSIZE)
279*b30d1939SAndy Fiddaman						return Failed(file);
280*b30d1939SAndy Fiddaman			}
281*b30d1939SAndy Fiddaman			close(fd);
282*b30d1939SAndy Fiddaman		}
283*b30d1939SAndy Fiddaman		times(&etm);
284*b30d1939SAndy Fiddaman		rdtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime);
285*b30d1939SAndy Fiddaman
286*b30d1939SAndy Fiddaman		/* mmap time */
287*b30d1939SAndy Fiddaman		times(&stm);
288*b30d1939SAndy Fiddaman		for(run = 0; run < RUN; ++run)
289*b30d1939SAndy Fiddaman		{	if ((fd = open(file, O_RDWR)) < 0)
290*b30d1939SAndy Fiddaman				return Failed(file);
291*b30d1939SAndy Fiddaman			for(i = 0, mm = (caddr_t)0; i < WRITE; ++i)
292*b30d1939SAndy Fiddaman			{	if(mm)
293*b30d1939SAndy Fiddaman					munmap(mm, MAPSIZE);
294*b30d1939SAndy Fiddaman				mm = (caddr_t)mmap((caddr_t)0, MAPSIZE,
295*b30d1939SAndy Fiddaman						   (PROT_READ|PROT_WRITE),
296*b30d1939SAndy Fiddaman						   MAP_PRIVATE, fd, i*MAPSIZE );
297*b30d1939SAndy Fiddaman				if(mm == (caddr_t)(-1) || mm == (caddr_t)0)
298*b30d1939SAndy Fiddaman					return Failed(file);
299*b30d1939SAndy Fiddaman
300*b30d1939SAndy Fiddaman				/* the memcpy is < BUFSIZE to simulate the
301*b30d1939SAndy Fiddaman				   fact that functions like sfreserve/sfgetr do
302*b30d1939SAndy Fiddaman				   not do buffer copying.
303*b30d1939SAndy Fiddaman				*/
304*b30d1939SAndy Fiddaman				t = (char*)mm;
305*b30d1939SAndy Fiddaman				for(k = 0; k < MAPSIZE; k += BUFSIZE, t += BUFSIZE)
306*b30d1939SAndy Fiddaman					memcpy(buf,t,(3*BUFSIZE)/4);
307*b30d1939SAndy Fiddaman			}
308*b30d1939SAndy Fiddaman			close(fd);
309*b30d1939SAndy Fiddaman		}
310*b30d1939SAndy Fiddaman		times(&etm);
311*b30d1939SAndy Fiddaman		mmtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime);
312*b30d1939SAndy Fiddaman
313*b30d1939SAndy Fiddaman		remove(file);
314*b30d1939SAndy Fiddaman
315*b30d1939SAndy Fiddaman		if(4*mmtm <= 3*rdtm)
316*b30d1939SAndy Fiddaman			printf("#define _mmap_worthy	2	/* mmap is great */\n");
317*b30d1939SAndy Fiddaman		else if(4*mmtm <= 5*rdtm)
318*b30d1939SAndy Fiddaman			printf("#define _mmap_worthy	1	/* mmap is good */\n");
319*b30d1939SAndy Fiddaman
320*b30d1939SAndy Fiddaman		else
321*b30d1939SAndy Fiddaman			return 1;
322*b30d1939SAndy Fiddaman		return 0;
323*b30d1939SAndy Fiddaman	}
324*b30d1939SAndy Fiddaman}end
325*b30d1939SAndy Fiddaman
326*b30d1939SAndy Fiddamancat{
327*b30d1939SAndy Fiddaman
328*b30d1939SAndy Fiddaman	/* some systems get it wrong but escape concise detection */
329*b30d1939SAndy Fiddaman	#ifndef _NO_MMAP
330*b30d1939SAndy Fiddaman	#if __CYGWIN__
331*b30d1939SAndy Fiddaman	#define _NO_MMAP	1
332*b30d1939SAndy Fiddaman	#endif
333*b30d1939SAndy Fiddaman	#endif
334*b30d1939SAndy Fiddaman
335*b30d1939SAndy Fiddaman	#if _NO_MMAP
336*b30d1939SAndy Fiddaman	#undef	_lib_mmap
337*b30d1939SAndy Fiddaman	#undef	_lib_mmap64
338*b30d1939SAndy Fiddaman	#undef	_mmap_anon
339*b30d1939SAndy Fiddaman	#undef	_mmap_devzero
340*b30d1939SAndy Fiddaman	#undef	_mmap_worthy
341*b30d1939SAndy Fiddaman	#endif
342*b30d1939SAndy Fiddaman}end
343