Verify if the test is limited by an ancient stdio with a 256

open file limit.  In this case the test is skipped with a
message showing this limitation when the number of open files
needed for the test is greater than 256.
This commit is contained in:
Yang Tse 2007-04-03 18:02:02 +00:00
parent 3344142b87
commit 2886ce96b0
2 changed files with 70 additions and 0 deletions

View File

@ -65,6 +65,29 @@ static void close_file_descriptors(void)
fd = NULL; fd = NULL;
} }
static int stdio_limit_256(void)
{
FILE *fpa[300];
int i;
int ret = 0;
for (i = 0; i < 300; i++) {
fpa[i] = NULL;
}
for (i = 0; i < 300; i++) {
fpa[i] = fopen(DEV_NULL, "r");
if (fpa[i] == NULL) {
ret = -1;
break;
}
}
for (i = 0; i < 300; i++) {
if (fpa[i] != NULL)
fclose(fpa[i]);
}
return ret;
}
static int rlimit(int keep_open) static int rlimit(int keep_open)
{ {
int nitems, i; int nitems, i;
@ -235,6 +258,18 @@ static int rlimit(int keep_open)
num_open.rlim_max = NUM_OPEN; num_open.rlim_max = NUM_OPEN;
/* verify that we don't have an ancient stdio */
if (((size_t)(num_open.rlim_max) > (size_t)256) && stdio_limit_256()) {
sprintf(strbuff1, fmt, num_open.rlim_max);
sprintf(strbuff, "fds needed %s > stdio limit 256",
strbuff1);
store_errmsg(strbuff, 0);
fprintf(stderr, "%s\n", msgbuff);
free(memchunk);
return -12;
}
/* verify that we won't overflow size_t in malloc() */ /* verify that we won't overflow size_t in malloc() */
if ((size_t)(num_open.rlim_max) > ((size_t)-1) / sizeof(*fd)) { if ((size_t)(num_open.rlim_max) > ((size_t)-1) / sizeof(*fd)) {

View File

@ -67,6 +67,29 @@ static void close_file_descriptors(void)
fd = NULL; fd = NULL;
} }
static int stdio_limit_256(void)
{
FILE *fpa[300];
int i;
int ret = 0;
for (i = 0; i < 300; i++) {
fpa[i] = NULL;
}
for (i = 0; i < 300; i++) {
fpa[i] = fopen(DEV_NULL, "r");
if (fpa[i] == NULL) {
ret = -1;
break;
}
}
for (i = 0; i < 300; i++) {
if (fpa[i] != NULL)
fclose(fpa[i]);
}
return ret;
}
static int rlimit(int keep_open) static int rlimit(int keep_open)
{ {
int *tmpfd; int *tmpfd;
@ -225,6 +248,18 @@ static int rlimit(int keep_open)
num_open.rlim_max = nitems; num_open.rlim_max = nitems;
} }
/* verify that we don't have an ancient stdio */
if (((size_t)(num_open.rlim_max) > (size_t)256) && stdio_limit_256()) {
sprintf(strbuff1, fmt, num_open.rlim_max);
sprintf(strbuff, "fds needed %s > stdio limit 256",
strbuff1);
store_errmsg(strbuff, 0);
fprintf(stderr, "%s\n", msgbuff);
free(memchunk);
return -10;
}
/* verify that we won't overflow size_t in malloc() */ /* verify that we won't overflow size_t in malloc() */
if ((size_t)(num_open.rlim_max) > ((size_t)-1) / sizeof(*fd)) { if ((size_t)(num_open.rlim_max) > ((size_t)-1) / sizeof(*fd)) {