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