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