00001 #include "wvtest.h"
00002 #include "wvcrash.h"
00003 #include "wvstring.h"
00004 #include <stdlib.h>
00005 #include <stdio.h>
00006 #ifdef _WIN32
00007 #include <io.h>
00008 #include <windows.h>
00009 #else
00010 #include <unistd.h>
00011 #include <fcntl.h>
00012 #endif
00013
00014 static bool fd_is_valid(int fd)
00015 {
00016 #ifdef _WIN32
00017 if ((HANDLE)_get_osfhandle(fd) != INVALID_HANDLE_VALUE) return true;
00018 #endif
00019 int nfd = dup(fd);
00020 if (nfd >= 0)
00021 {
00022 close(nfd);
00023 return true;
00024 }
00025 return false;
00026
00027 }
00028
00029
00030 static int fd_count(const char *when)
00031 {
00032 int count = 0;
00033
00034 printf("fds open at %s:", when);
00035
00036 for (int fd = 0; fd < 1024; fd++)
00037 {
00038 if (fd_is_valid(fd))
00039 {
00040 count++;
00041 printf(" %d", fd);
00042 fflush(stdout);
00043 }
00044 }
00045 printf("\n");
00046
00047 return count;
00048 }
00049
00050
00051 int main(int argc, char **argv)
00052 {
00053 #ifdef _WIN32
00054 setup_console_crash();
00055 #endif
00056
00057
00058
00059 WVPASS(true);
00060 WVPASS(1);
00061 WVFAIL(false);
00062 WVFAIL(0);
00063 int startfd, endfd;
00064 char * const *prefixes = NULL;
00065
00066 if (argc > 1)
00067 prefixes = argv + 1;
00068
00069 startfd = fd_count("start");
00070 int ret = WvTest::run_all(prefixes);
00071
00072 if (ret == 0)
00073 {
00074 endfd = fd_count("end");
00075
00076 WVPASS(startfd == endfd);
00077 #ifndef _WIN32
00078 if (startfd != endfd)
00079 system(WvString("ls -l /proc/%s/fd", getpid()));
00080 #endif
00081 }
00082
00083
00084 if (getenv("WVTEST_NO_FAIL"))
00085 return 0;
00086 else
00087 return ret;
00088 }