Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Dec 1997 08:50:01 -0800 (PST)
From:      Christopher Masto <chris@netmonger.net>
To:        freebsd-bugs
Subject:   Re: bin/5306: gethostbyname() returns herror "Unknown host" on well known hosts
Message-ID:  <199712171650.IAA23698@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/5306; it has been noted by GNATS.

From: Christopher Masto <chris@netmonger.net>
To: freebsd-gnats-submit@freebsd.org, bde@zeta.org.au, robert@superior.net
Cc:  Subject: Re: bin/5306: gethostbyname() returns herror "Unknown host" on well known hosts
Date: Wed, 17 Dec 1997 11:45:10 -0500

 > At least for the test program in PR 3622, the fix is to configure enough
 > fd's using /etc/login.conf.  In 2.2.5, the default openfiles limits for
 > class daemon are 1024 (hard) and OPEN_MAX (soft).  These should be set
 > as large as necessary (but no larger) for each class of user.
 > 
 > There is also an evil sysctl limit `kern.maxfilesperproc' with the
 > default value of 2*NPROC.  This interferes with correct operation of
 > login.conf.  If it is too small, then the easiest way to fix it is to
 > edit /sys/conf/param.c and build a new kernel.  There is also a good
 > sysctl limit `kern.maxfiles' with the default value of 2*NPROC.  This
 > is easy to change at runtime using `sysctl -w kern.maxfiles=...'.
 > (Changing kern.maxfilesperproc at runtime doesn't work well because
 > it can't increase the openfiles limits in the process tree.  It can
 > only decrease them.)
 
 I don't know whether the gethostbyname() problem Robert is having is
 related to PR 3622, but I think there is a problem with the default
 login.conf.
 
 I had to lower openfiles settings to 256 because having it larger
 breaks select().  It's been a while, so I'm a bit fuzzy on the details,
 but I do remember that it was causing rxvt to fail.. a quick perusal
 of the rxvt source indicates that it does:
 
 #ifdef _POSIX_VERSION
     num_fds = sysconf(_SC_OPEN_MAX);
 #else
     num_fds = getdtablesize();
 #endif
 
 I believe that it ends up obtaining the 1024 that was defined in login.conf,
 but the FD_SETSIZE in sys/types.h is defined as 256.  IIRC, select() bombs
 out when nfds is > 256.
 
 I suppose I should test this rather than just make the claim.  Try this:
 
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/select.h>
 
 void testselect(int num)
 {
   fd_set fds;
   struct timeval tv = {0, 0};
 
   printf("testing select(%d,...)\n", num);
   FD_ZERO(&fds);
   if (select(num, &fds, &fds, &fds, &tv) < 0) {
     perror("select()");
   }
   else {
     printf("select() successful\n");
   }
 }
 
 int main(int argc, char *argv[])
 {
   int dtsize;
   int open_max;
 
   printf("FD_SETSIZE = %d\n", FD_SETSIZE);
   dtsize=getdtablesize();
   printf("getdtablesize() = %d\n", dtsize);
   open_max=(int)sysconf(_SC_OPEN_MAX);
   printf("open_max = %d\n", open_max);
 
   testselect(FD_SETSIZE);
   testselect(dtsize);
 }
 
 - - -
 
 chris@cheddar:/tmp$ ulimit -n
 1024
 chris@cheddar:/tmp$ ./seltest
 FD_SETSIZE = 256
 getdtablesize() = 1024
 open_max = 1024
 testing select(256,...)
 select() successful
 testing select(1024,...)
 select(): Bad file descriptor
 
 I hope that was clear.
 -- 
 = Christopher Masto        = chris@netmonger.net = http://www.netmonger.net/  =
 = NetMonger Communications = finger for  PGP key = $19.95/mo unlimited access =
 = Director of Operations   =   (516)  221-6664 	 = mailto:info@netmonger.net  =
 
     "... who'd want a lossy TIFF?"  -- Kibo



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712171650.IAA23698>