[comp.mail.sendmail] Problems with Sendmail 5.64

gurney@frith.egr.msu.edu (Eddy J. Gurney) (06/28/90)

Well, I've been anxious to get Sendmail 5.64+ installed on my PC RT, and,
unsurprisingly, I've run into a bunch of problems.

First and foremost, the RT does NOT have an 'flock' function call.  It does
have a 'lockf' function call, which locks certain 'regions' of a file.  Per
a previous request for info on 'lockf', Ed Clarke (clarke@acheron.uucp),
posted a sample change he made in "alias.c" to use 'lockf' instead of 'flock'.
I made similar changes to the rest of the 'flock' calls, and those APPEAR to
have worked.  The reason I say "appear" is because the man page for 'lockf'
says it does not work with standard, buffered I/O, which is what Sendmail
uses. :-)  So I'm not sure if this is actually the correct way to handle the
situation.  I'm wondering if a call to 'fcntl' might not be more appropriate.
I don't have a man page for it, though, so I'm looking for info on it. (Hint,
hint...)

OK.  Below are the rest of the changes (as far as I can remember) that I made
to the distribution version of Sendmail 5.64 with the IDA/BIU enhancements,
which I got from uxc.cso.uiuc.edu:

. Set the compiler flag '-DBSD_INCLUDES', so <sys/dir.h> would include 
  <dirent.h>, which has the necessary definition of 'DIR' used in "queue.c"
. Added "getenv.c" and "setenv.c" to the /src directory, copied from the
  /support directory of the distribution, edited Makefile accordingly
. Changed the 'getla()' routine in "conf.c" to also return 0, since I don't
  think the RT has anyway of determining the load average (I don't use this
  feature anyway); removed 'getloadavg.c/.o' from the Makefile
. Changed all the calls to 'flock' to 'lockf' in "alias.c", "daemon.c", and
  "queue.c" as demonstrated by Ed Clarke in his post to comp.sys.ibm.pc.rt
. Set the compiler flag '-DVMUNIX', which works on the RT except for one
  #ifdef in "deliver.c", which tries to assign FORK to 'vfork'.
. Changed "sendmail.h" to #include <fcntl.h>, since two or three other files
  needed definitions from this include file.
. Added EPROCLIM = 98 to the list of returned error flags (thanks again to
  Ed Clarke for that info)
. It is currently compiled with only DBM defined, not NDBM or SDBM; all the
  other default options were left the same (I think), including having
  NAMED_BIND on, etc.  (named is running :-)

Now all this compiles fine with only a few warnings here and there.  But for
some reason, Sendmail doesn't appear to function properly.  For one thing,
if you try to run sendmail/newaliases/mailq with the '-d' flag, the only debug
output you get is "Sendmail 5.64+", then a nice "Bus error (core dumped)" 
message.  HOWEVER, if you also run with the '-C' flag (to NOT use the frozen
configuration file or something), the debug option works as expected.

Even worse, though, is that mail sent to the new sendmail daemon from a remote
host fails with a "couldn't execute /usr/lib/sendmail" error, although local
mail works fine.

Finally...
On the topic of the last item, I also (successfully?) compiled gdbm 1.3, which
is the GNU version of DBM/NDBM.  I installed the gdbm.a library in /usr/lib,
and tried to link Sendmail 5.64 with it, but I get errors from syslog telling
me that the database /etc/sendmail/aliases could not be opened when I tried to
run newaliases and sendmail.  Has anyone compiled/used GNU's dbm?  Does it
work correctly in Sendmail?  (I also installed the 'ndmb.h' include file from 
the GNU dbm in /usr/include.)

Any help/suggestions with any of this would be GREATLY appreciated.

--
Eddy J. Gurney, N8FPW  --  gurney@frith.egr.msu.edu

Andy.Linton@comp.vuw.ac.nz (Andy Linton) (06/28/90)

In article <1990Jun27.173453.25710@msuinfo.cl.msu.edu>,
gurney@frith.egr.msu.edu (Eddy J. Gurney) writes:
|> Well, I've been anxious to get Sendmail 5.64+ installed on my PC RT, and,
|> unsurprisingly, I've run into a bunch of problems.
|> 
|> First and foremost, the RT does NOT have an 'flock' function call.  It does
|> have a 'lockf' function call, which locks certain 'regions' of a file.  Per
|> a previous request for info on 'lockf', Ed Clarke (clarke@acheron.uucp),
|> posted a sample change he made in "alias.c" to use 'lockf' instead of
'flock'.
|> I made similar changes to the rest of the 'flock' calls, and those APPEAR to
|> have worked.  The reason I say "appear" is because the man page for 'lockf'
|> says it does not work with standard, buffered I/O, which is what Sendmail
|> uses. :-)  So I'm not sure if this is actually the correct way to handle the
|> situation.  I'm wondering if a call to 'fcntl' might not be more
appropriate.
|> I don't have a man page for it, though, so I'm looking for info on
it. (Hint,
|> hint...)
|>

I had this problem with compiling the code on HP-UX 7.0 which I sorted
out using these routines. One word of warning though - to obtain an
exclusive lock (F_WRLCK) when using 'fcntl' (this is the equivalent of
the flock 'LOCK_EX' flag) the file *must* be open for writing. This
means that some of the 'open' calls need modified or the type of lock
requested must be changed. I have posted the changes I made for HPUX to
Paul Pomes at UIUC and he will incorporate them into the distribution
there. I could supply such details but we are at the end of a slow link
down here and I don't want to clog it.


|> . Changed the 'getla()' routine in "conf.c" to also return 0, since I don't
|>   think the RT has anyway of determining the load average (I don't use this
|>   feature anyway); removed 'getloadavg.c/.o' from the Makefile

I include a patch to make 'getla()' run on HPUX - this may give some
pointers on what you need to do. Can someone confirm that the
'getloadavg.c/.o' code is for 4.4BSD?

*** /tmp/,RCSt1a21545	Wed Jun 27 12:34:27 1990
--- conf.c	Fri Jun 22 13:34:12 1990
***************
*** 24,29 ****
--- 24,32 ----
  
  # include <sys/ioctl.h>
  # include <sys/param.h>
+ # if defined(hpux)
+ # include <sgtty.h>
+ # endif /* hpux */
  # include <pwd.h>
  # include "sendmail.h"
  # include "pathnames.h"
***************
*** 128,135 ****
  /*
  **  Miscellaneous stuff.
  */
! 
! int	DtableSize =	50;		/* max open files; reset in 4.2bsd */
  extern int la;				/* load average */
  /*
  **  SETDEFAULTS -- set default values
--- 131,142 ----
  /*
  **  Miscellaneous stuff.
  */
! #ifdef hpux
! #include <stdio.h>
! int             DtableSize = _NFILE;    /* max open files */
! #else
! int             DtableSize = 50;/* max open files; reset in 4.2bsd */
! #endif
  extern int la;				/* load average */
  /*
  **  SETDEFAULTS -- set default values
***************
*** 423,429 ****
  **		none.
  */
  
! #ifndef sun
  
  getla()
  {
--- 430,436 ----
  **		none.
  */
  
! #if !defined(sun) && !defined (hpux)
  
  getla()
  {
***************
*** 434,446 ****
  	return ((int) (avenrun[0] + 0.5));
  }
  
! #else /* sun */
  
  #include <nlist.h>
  
  struct	nlist Nl[] =
  {
! 	{ "_avenrun" },
  #define	X_AVENRUN	0
  	{ 0 },
  };
--- 441,457 ----
  	return ((int) (avenrun[0] + 0.5));
  }
  
! #else /* sun  || hpux */
  
  #include <nlist.h>
  
  struct	nlist Nl[] =
  {
! #ifdef hp9000s800
! 	{"avenrun"},
! #else
! 	{"_avenrun"},
! #endif hp9000s800
  #define	X_AVENRUN	0
  	{ 0 },
  };
***************
*** 451,457 ****
--- 462,472 ----
  	return (1);
  # else /* !sequent */
  	static int kmem = -1;
+ # if defined(hpux)
+ 	double avenrun[3];
+ # else
  	long avenrun[3];
+ # endif /* hpux */
  	extern off_t lseek();
  
  	if (kmem < 0)
***************
*** 460,468 ****
  		if (kmem < 0)
  			return (-1);
  		(void) ioctl(kmem, (int) FIOCLEX, (char *) 0);
! 		nlist("/vmunix", Nl);
  		if (Nl[0].n_type == 0)
  			return (-1);
  	}
  	if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, 0) == -1 ||
  	    read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun))
--- 475,495 ----
  		if (kmem < 0)
  			return (-1);
  		(void) ioctl(kmem, (int) FIOCLEX, (char *) 0);
! #if defined(hpux)
! 		(void) nlist ("/hp-ux", Nl);
! #else
! 		(void) nlist ("/vmunix", Nl);
! #endif /* hpux */
  		if (Nl[0].n_type == 0)
+ 		{
+ 			/*
+ 			 * if nlist() has failed we can't use Nl to grope 
+ 			 * about in kmem on subsequent calls to getla()
+ 			 */
+ 		  	close (kmem);
+ 			kmem = -1;
  			return (-1);
+ 		}
  	}
  	if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, 0) == -1 ||
  	    read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun))
***************
*** 470,477 ****
  		/* thank you Ian */
  		return (-1);
  	}
  	return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT);
! 	/* return ((int) (avenrun[0] + 0.5)); */
  # endif /* sequent */
  }
  
--- 497,507 ----
  		/* thank you Ian */
  		return (-1);
  	}
+ # if defined(hpux)
+ 	return ((int) (avenrun[0] + 0.5));
+ # else
  	return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT);
! # endif /* hpux */
  # endif /* sequent */
  }
  
--
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  flock.c flock.h
# Wrapped by mark@the-taj.comp.vuw.ac.nz on Tue Jun 20 21:37:36 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'flock.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'flock.c'\"
else
echo shar: Extracting \"'flock.c'\" \(551 characters\)
sed "s/^X//" >'flock.c' <<'END_OF_FILE'
X
X#include <fcntl.h>
X#include <errno.h>
X#include "flock.h"               /* defines normally in <sys/file.h> */
X
Xflock(fd, operation)
Xint fd, operation;
X{
X	int op, ret;
X	struct flock arg;
X	extern int errno;
X
X	op = (LOCK_NB & operation) ? F_SETLK : F_SETLKW;
X	
X	arg.l_type = (LOCK_EX & operation) ? F_WRLCK :
X		(LOCK_SH & operation) ? F_RDLCK : F_UNLCK;
X	arg.l_whence = 0;
X	arg.l_start = 0;
X	arg.l_len = 0;
X	arg.l_pid = 0;
X	
X	if ((ret = fcntl(fd, op, &arg)) == -1) {
X		if (errno == EACCES || errno == EAGAIN)
X			errno = EWOULDBLOCK;
X	}
X	return (ret);
X}
END_OF_FILE
if test 551 -ne `wc -c <'flock.c'`; then
    echo shar: \"'flock.c'\" unpacked with wrong size!
fi
# end of 'flock.c'
fi
if test -f 'flock.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'flock.h'\"
else
echo shar: Extracting \"'flock.h'\" \(288 characters\)
sed "s/^X//" >'flock.h' <<'END_OF_FILE'
X/* These definitions are in <sys/file.h> on BSD 4.3 */
X/*
X * Flock call.
X */
X#define LOCK_SH         1       /* shared lock */
X#define LOCK_EX         2       /* exclusive lock */
X#define LOCK_NB         4       /* don't block when locking */
X#define LOCK_UN         8       /* unlock */
END_OF_FILE
if test 288 -ne `wc -c <'flock.h'`; then
    echo shar: \"'flock.h'\" unpacked with wrong size!
fi
# end of 'flock.h'
fi
echo shar: End of shell archive.
exit 0