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