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