[comp.mail.mh] Recent slocal problems reported

marvit@HPLPM.HPL.HP.COM (Peter Marvit) (10/26/90)

Several folks have recently complained that slocal seems to concatenate
messgaes which are redsitributed into the normal maildrop.  I sent a
series of patches out last June which fixes the problem.  Below is the
text of my original message.  I'm still unhappy about the klugey nature,
but (heck) it works...

	-Peter

------------------------------ CUT HERE -------------------------------
Subject: Re: slocal breaks dist -- suggestions? 
Date: Mon, 11 Jun 90 16:19:39 PDT
From: Peter Marvit <marvit@hplpm.hpl.hp.com>

OK.  I looked into the slocal problem in MH6.7.  It seems that slocal did
the *WRONG* thing when plopping messages back into a UNIX maildrop.  I'm
not crazy about hte following diffs, but they should be innouos enough.

Specifically, for slocal,

	BUG: slocal recreated a maildrop with incorrect permissisions.

	FIX: in the Makefile, setgid mail slocal.  In the code, create a
	maildrop with MAILGRP, if necessary.  This is #ifdef SYS5.

	BUG: slocal botches the "\n\nFrom " uucp-style message delimeter
	if it "delivers" a message to the standard maildrop or other
	maildrop-like file. 

	FIX: Append a "\n" to any uucp-style message.  Possibly
	unecessary, but the worst will be an extra newline at the end of
	a message.

 Cheers,
 Peter "Happy again" Marvit

: Peter Marvit   Hewlett-Packard Labs in Palo Alto, CA   (415) 857-6646    :
: Internet: <marvit@hplabs.hpl.hp.com>  uucp: {any backbone}!hplabs!marvit :



    Context diffs follow.  Be sure to cut the last line ("Cut here").

------------------------------ CUT HERE -------------------------------
*** uip/slocal.c.ORIG	Fri Jun  1 16:55:09 1990
--- uip/slocal.c	Mon Jun 11 16:15:40 1990
***************
*** 1,6
  /* slocal.c - MH style mailer to write to a local user's mailbox */
  #ifndef	lint
! static char ident[] = "@(#)$Id: slocal.c,v 1.8 90/04/05 14:58:46 sources Exp $";
  #endif	lint
  
  /* This program implements mail delivery in the MH/MMDF style.

--- 1,6 -----
  /* slocal.c - MH style mailer to write to a local user's mailbox */
  #ifndef	lint
! static char ident[] = "@(#)$Id: slocal.c,v 1.8.1 90/06/11 12:00:00 sources Exp $";
  #endif	lint
  
  /* This program implements mail delivery in the MH/MMDF style.
***************
*** 19,24
  
     This program should be used ONLY if you have "mts sendmail" or "mts mh"
     or "mts mmdf1" set in your MH configuration.
   */
  
  /*  */

--- 19,27 -----
  
     This program should be used ONLY if you have "mts sendmail" or "mts mh"
     or "mts mmdf1" set in your MH configuration.
+ 
+    Added hack to preserve UNIX (uucp) delimiters when adding mail to
+    a mail drop. (marvit@hplabs.hpl.hp.com, 11 June, '90)
   */
  
  /*  */
***************
*** 40,45
  
  
  #define	NVEC	100
  
  /*  */
  

--- 43,51 -----
  
  
  #define	NVEC	100
+ #ifdef SYS5
+ #define	MAILGRP	6
+ #endif SYS5
  
  /*  */
  
***************
*** 822,828
         *from;
  {
      int	    md,
! 	    mapping;
      register char  *bp;
      char    buffer[BUFSIZ];
  

--- 828,836 -----
         *from;
  {
      int	    md,
! 	    mapping,
! 	    local_gid,
! 	    file_mode;
      register char  *bp;
      char    buffer[BUFSIZ];
  
***************
*** 843,849
      if (verbose)
  	(void) fflush (stdout);
  
!     if ((md = mbx_open (mailbox, pw -> pw_uid, pw -> pw_gid, m_gmprot ()))
  	    == NOTOK) {
  	adorn ("", "unable to open:");
  	return NOTOK;

--- 851,885 -----
      if (verbose)
  	(void) fflush (stdout);
  
! /* 
!  * If, for some reason, we actually have to recreate the mail drop, we have 
!  * to make sure all the permissions and ownerships are correct.  If we're
!  * not writing to a standard maildrop *and* there exists a .mh_profile for
!  * the recipient, use the "msg-protect" info to create the file drop.
!  * Otherwise, use the compiled default message protections.
!  */
! 
!     if (strcmp(mailbox, mbox) == 0){
! #ifdef SYS5
!       local_gid = MAILGRP;	/* Must be gid = mail */
!       file_mode = 0660;		/* Not strictly necessary, but very nice */
! #else
!       local_gid = pw -> pw_gid;	/* If not SYS5, then it doesn't matter */
!       file_mode = 0600;		/* Enforce this, since UA's run setuid root */
! #endif
!     }
!     else{
!       local_gid =  pw -> pw_gid;
!       if (stat (concat (home, "/" , mh_profile, NULLCP),buffer) == 0){
! 	mypath = home;
! 	file_mode = m_gmprot();	/* Use .mh_profile, if it exists */
!       }
!       else{
! 	file_mode = atooi(msgprot); /* Otherwise, use compiled default */
!       }
!     }
! 
!     if ((md = mbx_open (mailbox, pw -> pw_uid, local_gid, file_mode))
  	    == NOTOK) {
  	adorn ("", "unable to open:");
  	return NOTOK;
***************
*** 1163,1168
  	    return NOTOK;
  	}
      }
  
      (void) fclose (ffp);
      if (ferror (qfp)) {

--- 1199,1215 -----
  	    return NOTOK;
  	}
      }
+ /* 
+  * Make sure there is a trailing new line at the end of the message.  This 
+  * is kludge and should properly be done some other way. We know that it
+  * is *probably* a uucp message because we've found at leat one "From ". 
+  * Why?  Without the trailing newline, messages get smushed togther.
+  * UUCP delimiters is "\n\nFrom ", but slocal would otherwise create
+  * "\nFrom " -- a mess in a mailfrop.
+  */
+ 
+     if (first != 0) 
+         fputs("\n", ffp);
  
      (void) fclose (ffp);
      if (ferror (qfp)) {
*** conf/makefiles/uip.ORIG	Thu Apr 12 13:27:23 1990
--- conf/makefiles/uip	Wed Jun  6 18:58:17 1990
***************
*** 993,998
  		-$(REMOVE) $@ zslocal
  		cp xslocal $@
  		-chmod $(PGMPROT) $@
  		-@ls -l $@
  		-@echo ""
  

--- 993,1002 -----
  		-$(REMOVE) $@ zslocal
  		cp xslocal $@
  		-chmod $(PGMPROT) $@
+ @BEGIN: MAILGROUP
+ 		-@chgrp @(MAILGROUP) $@
+ 		-@chmod g+s $@
+ @END: MAILGROUP
  		-@ls -l $@
  		-@echo ""
  
------------------------------ CUT HERE -------------------------------