1tst	note{ check for win32 .exe botches }end output{
2	#include <unistd.h>
3	#include <fcntl.h>
4	#include <sys/types.h>
5	#include <sys/stat.h>
6	static int
7	cp(const char* from, const char* to)
8	{
9		ssize_t		n;
10		int		fd;
11		int		td;
12		struct stat	fs;
13		char		buf[1024];
14
15		if ((fd = _open(from, O_RDONLY|O_BINARY)) < 0)
16			return -1;
17		if (_fstat(fd, &fs) || (td = _open(to, O_CREAT|O_WRONLY|O_TRUNC|O_BINARY, fs.st_mode & 0777)) < 0)
18		{
19			_close(fd);
20			return -1;
21		}
22		while ((n = _read(fd, buf, sizeof(buf))) > 0 && _write(td, buf, n) == n);
23		_close(fd);
24		_close(td);
25		return n ? -1 : 0;
26	}
27	int
28	main(int argc, char** argv)
29	{
30		int		fd;
31		int		fix;
32		struct stat	st;
33		char		buf[256];
34
35		snprintf(buf, sizeof(buf), "rm -rf /tmp/iff-%d", getpid());
36		if (_mkdir(buf+7, 0755))
37			return 1;
38		if (_chdir(buf+7))
39			return 1;
40		if (cp("/bin/cat.exe", "foo.exe"))
41			return 1;
42		fix = 0;
43		if (_access("foo", X_OK))
44			fix++,printf("#define _win32_botch_access	1\n");
45		if (_chmod("foo", 0755))
46			fix++,printf("#define _win32_botch_chmod	1\n");
47		if (cp("/bin/cat", "bam") || _access("bam.exe", X_OK))
48			fix++,printf("#define _win32_botch_copy	1\n");
49		if (_getpagesize() != 64 * 1024)
50			fix++,printf("#define _win32_botch_getpagesize	1\n");
51	#if !__EMX__
52		if (_link("foo", "bar") || _access("bar.exe", X_OK))
53			fix++,printf("#define _win32_botch_link	1\n");
54		else
55	#endif
56			cp("foo.exe", "bar.exe");
57		if ((fd = _open("foo", O_RDONLY)) < 0)
58			fix++,printf("#define _win32_botch_open	1\n");
59		else
60			_close(fd);
61		if (_pathconf("huh", _PC_NAME_MAX) >= 0)
62			fix++,printf("#define _win32_botch_pathconf	1\n");
63		if (_rename("foo", "aha") || _access("aha.exe", X_OK))
64			fix++,printf("#define _win32_botch_rename	1\n");
65		else
66			_rename("foo.exe", "aha.exe");
67		if (_stat("bar", &st))
68		{
69			fix++,printf("#define _win32_botch_stat	1\n");
70			if (sizeof(st.st_ino) == 8)
71				printf("#define _stat			_stat64\n");
72		}
73		if (_truncate("aha", 0))
74			fix++,printf("#define _win32_botch_truncate	1\n");
75		if (_unlink("bar"))
76			fix++,printf("#define _win32_botch_unlink	1\n");
77		if (_utime("aha", 0))
78			fix++,printf("#define _win32_botch_utime	1\n");
79		if (fix)
80		{
81			printf("#define _win32_botch_execve	1\n");
82			printf("#define _win32_botch	1\n");
83		}
84		_chdir("/tmp");
85		system(buf);
86		return 0;
87	}
88}end
89
90tst	win32_botch_alarm note{ win32 alarm(2) return botched }end noexecute{
91	#include <signal.h>
92	#include <unistd.h>
93	#include <time.h>
94
95	static int	sigalrm = 0;
96
97	static void
98	handler(int sig)
99	{
100		sigalrm++;
101	}
102	int
103	main(int argc, char** argv)
104	{
105		signal(SIGALRM, handler);
106		alarm(2);
107		pause();
108		return sigalrm != 1 || alarm(0) != 0;
109	}
110}end
111