I posted this information several days ago in response to another
article, but mine never appeared. These are my trials of selecttest
on Solaris 9, first as an ordinary user...

$ ./selecttest
selecttest: nsocks = 4093, TEST_FDSETSIZE = -1, FD_SETSIZE = 1024, sizeof fd_set = 128
opening 254th socket failed: Too many open files
$ ./selecttest -r
selecttest: nsocks = 4093, TEST_FDSETSIZE = -1, FD_SETSIZE = 1024, sizeof fd_set = 128
set resource limit: Not owner
$ ./selecttest 250
selecttest: nsocks = 4093, TEST_FDSETSIZE = -1, FD_SETSIZE = 1024, sizeof fd_set = 128
created 250 sockets, maxfd = 252
FD_CLR test...OK
FD_SET test...OK
select test...OK

Now as root...

# ./selecttest -r
selecttest: nsocks = 4093, TEST_FDSETSIZE = -1, FD_SETSIZE = 1024, sizeof fd_set = 128
created 4093 sockets, maxfd = 4095
FD_CLR test...OK
FD_SET test...OK
select: Invalid argument
select test...
# ./selecttest -r 1022
selecttest: nsocks = 4093, TEST_FDSETSIZE = -1, FD_SETSIZE = 1024, sizeof fd_set = 128
created 1022 sockets, maxfd = 1024
FD_CLR test...OK
FD_SET test...OK
select: Invalid argument
select test...
# ./selecttest -r 1020
selecttest: nsocks = 4093, TEST_FDSETSIZE = -1, FD_SETSIZE = 1024, sizeof fd_set = 128
created 1020 sockets, maxfd = 1022
FD_CLR test...OK
FD_SET test...OK
select test...OK

This happens because, according to the select() man page...

EINVAL The nfds argument is less than 0 or greater than
FD_SETSIZE.

It also includes this...

The poll(2) function is preferred over this function. It
must be used when the number of file descriptors exceeds
FD_SETSIZE.

sendmail on Solaris does use poll().

I've now installed bind-9.3.5-P2 on several Solaris 9 servers,
replacing bind-9.3.2-P2. It doesn't suffer from this problem because
it always sets `files = FD_SETSIZE'. CPU usage has increased
somewhat. The number of file descriptors used for sockets is fairly
low. Here's my test...

# pfiles 17275 | grep S_IFSOCK | wc -l
12

--
-Gary Mills- -Unix Support- -U of M Academic Computing and Networking-