[net.sources.bugs] mcp 1.0 patch #4

kyle@xanth.UUCP (03/13/87)

This patch (#4) makes the following changes in the mcp 1.0 distribution

1)	The remove-from- commands now display the correct number of items
	that they remove (thanx to tadguy@odu.edu).
2)	Mcp now warns of alias/user name collisions.  It would be rather
	disconcerting to create a new user and have his/her incoming personal
	mail go whistling into a mailing list. (thanx to john@odu.edu)
3)	Fixed operator precedence problems in load.c.  Oddly enough,
	lint didn't complain about this.  (thanx to lenlo@miraculix.ida.liu.se)
4)	Routines that access /usr/adm/lastlog now check for negative uids.
	(thanx to lenlo@miraculix.ida.liu.se)
5)	Corrected two typos that I'm surprised haven't cuased problems
	before now. (thanx to lenlo@miraculix.ida.liu.se)

This patch will not work if patches #1-3 have not been applied.  These patches
may be obtained from me; send requests to my e-mail address.

To apply this patch from readnews, vnews or rn, type "s|patch -d -p0 DIR",
with DIR being the directory where the mcp sources and documentation are kept.
Alternately you can save this article and later cd to DIR and "patch -p0 <
thisarticle".  Don't leave off the "-p0".  If you don't have patch (alas!),
you'll have to apply the context diffs below by hand.

kyle jones, odu computer science
ARPA: kyle@xanth.cs.odu.edu		CSNET: kyle@odu.csnet
UUCP: kyle@xanth.uucp

Index: src/version.c
Prereq: (#3)
*** src/version.c.old	Thu Feb 26 17:53:36 1987
--- src/version.c	Thu Feb 26 17:51:56 1987
***************
*** 3,9 ****
  	char	*n_copyright;
  };
  static	struct notice Note = {
! "mcp version 1.0 (#3) ",
  "(c) 1986 by Kyle E. Jones\n\n\
  All sources and documentation of this mcp distribution are\n\
  included in this copyright, but permission is granted to\n\
--- 3,9 ----
  	char	*n_copyright;
  };
  static	struct notice Note = {
! "mcp version 1.0 (#4) ",
  "(c) 1986 by Kyle E. Jones\n\n\
  All sources and documentation of this mcp distribution are\n\
  included in this copyright, but permission is granted to\n\

Index: src/lastlog.c
*** src/lastlog.c.old	Thu Mar 12 16:47:53 1987
--- src/lastlog.c	Thu Mar 12 14:18:11 1987
***************
*** 53,58 ****
--- 53,60 ----
  int uid;
  
  {
+ 	if (uid < 0)
+ 	  return &zero;
  	if (LL_FileDes == UNDEFINED)
  		setllent();
  	lseek(LL_FileDes, (long)(uid * sizeof(struct lastlog)), L_SET)<0
***************
*** 67,72 ****
--- 69,76 ----
  {
  	int fd;
  
+ 	if (uid < 0)
+ 	  return;
  	fd = open(LASTLOG, O_WRONLY);
  	if (fd < 0) {
  		perr(LASTLOG);

Index: src/add.c
*** src/add.c.old	Thu Mar 12 17:40:28 1987
--- src/add.c	Thu Mar 12 17:31:57 1987
***************
*** 83,88 ****
--- 83,93 ----
  		err1("%s: alias exists", (char *)v[1]);
  		return;
  	}
+ 	if (userexists((char *)v[1])) {
+ 	    err1("%s is also an existing user!", (char *)v[1]);
+ 	    if (no("Create the alias anyway? [n] "))
+ 	      return;
+ 	}
  	addressv = get_gpa(257);
  	GetLine("Addresses: ", 256, &cc, addressv, &Null_List);
  
***************
*** 800,805 ****
--- 805,819 ----
  		err1("%s: user exists", (char *) v[1]);
  		return;
  	}
+ #ifdef SENDMAIL
+ 	if (c > 1 && aliasexists((char *)v[1])) {
+ 	    (void) sprintf(prompt,
+ 			   "%s is also a mail alias!  Use anyway? [n] ",
+ 			   v[1]);
+ 	    if (no(prompt))
+ 	      return;
+ 	}
+ #endif
  	if (c > 1) {
  		(void) strcpy((char *)cap, (char *)v[1]);
  		capitalize((char *)cap);

Index: src/update.c
*** src/update.c.old	Thu Mar 12 17:40:48 1987
--- src/update.c	Thu Mar 12 17:30:16 1987
***************
*** 87,92 ****
--- 87,94 ----
  	    err1("%s: alias exists", (char *)*namev);
  	    return;
  	}
+ 	if (userexists((char *)*namev))
+ 	    err1("warning: %s is also an existing user.", (char *)*namev);
  
  	critical();
  
***************
*** 584,590 ****
  		}
  		if (eq(*namev, v[1]))
  			; /* no change */
! 		else if (rangeexists((char *)namev)) {
  			err("that name is taken");
  			return;
  		}
--- 586,592 ----
  		}
  		if (eq(*namev, v[1]))
  			; /* no change */
! 		else if (rangeexists((char *)*namev)) {
  			err("that name is taken");
  			return;
  		}
***************
*** 731,736 ****
--- 733,742 ----
  	 */
  	(void) sprintf(prompt, "Login name [%s]: ", ac->ac_name);
  	GetLine(prompt, 1, &cc, namev, &Null_List);
+ #ifdef SENDMAIL
+ 	if (cc && !eq(*namev, ac->ac_name) && aliasexists((char *)*namev))
+ 	  err1("warning: %s is also a mail alias.", (char *)*namev);
+ #endif
  
  	/*
  	 * Change real name?

Index: src/job.c
*** src/job.c.old	Thu Mar 12 16:48:10 1987
--- src/job.c	Thu Mar 12 13:21:20 1987
***************
*** 19,25 ****
  #include <sys/wait.h>
  #include <sys/types.h>
  #include <sys/time.h>
! #include <sys/resource.h
  #include <sys/dir.h>
  #include <lastlog.h>
  #include "sysdep.h"
--- 19,25 ----
  #include <sys/wait.h>
  #include <sys/types.h>
  #include <sys/time.h>
! #include <sys/resource.h>
  #include <sys/dir.h>
  #include <lastlog.h>
  #include "sysdep.h"

Index: src/misc.c
*** src/misc.c.old	Thu Mar 12 16:48:12 1987
--- src/misc.c	Thu Mar 12 12:30:04 1987
***************
*** 139,145 ****
--- 139,149 ----
  	if (strlen((char *)v[c-1]) < 8) {
  		(void) strcpy((char *)user, (char *)v[c-1]);
  		strlower((char *)user);
+ #ifdef SENDMAIL
+ 		if (!userexists((char *)user) && !aliasexists((char *)user)) {
+ #else
  		if (!userexists((char *)user)) {
+ #endif
  			scrub((char *)user);
  			return user;
  		}
***************
*** 153,159 ****
--- 157,167 ----
  		up.p_cp[2] = ((char *)v[2])[0];
  		up.p_cp[3] = '\0';
  		strlower((char *)user);
+ #ifdef SENDMAIL
+ 		if (!userexists((char *)user) && !aliasexists((char *)user)) {
+ #else
  		if (!userexists((char *)user)) {
+ #endif
  			scrub((char *)user);
  			return user;
  		}
***************
*** 172,178 ****
--- 180,190 ----
  	up.p_cp[tail++] = ((char *)v[0])[0];
  	up.p_cp[tail--] = '\0';
  	strlower((char *)user);
+ #ifdef SENDMAIL
+ 	while (userexists((char *)user) || aliasexists((char *)user))
+ #else
  	while (userexists((char *)user))
+ #endif
  		up.p_cp[tail]++;
  	scrub((char *)user);
  	return user;

Index: src/load.c
*** src/load.c.old	Thu Mar 12 16:48:35 1987
--- src/load.c	Thu Mar 12 13:32:00 1987
***************
*** 189,197 ****
  				user = ac->ac_name;
  				(void) orstrlist(&ac->ac_groups, &groups);
  				orstrlist(&ac->ac_classes, &classes)&&
! 					ModBits |= AC;
  				orstrlist(&ac->ac_sigs, &sigs)&&
! 					ModBits |= AC;
  				for (i=0; i<groups.l_count; i++) {
  				    gm2 = getgmnam((char *)groups.l_list[i]);
  				    if (instrlist(&gm2->gm_mem, (char *)user))
--- 189,197 ----
  				user = ac->ac_name;
  				(void) orstrlist(&ac->ac_groups, &groups);
  				orstrlist(&ac->ac_classes, &classes)&&
! 					(ModBits |= AC);
  				orstrlist(&ac->ac_sigs, &sigs)&&
! 					(ModBits |= AC);
  				for (i=0; i<groups.l_count; i++) {
  				    gm2 = getgmnam((char *)groups.l_list[i]);
  				    if (instrlist(&gm2->gm_mem, (char *)user))
***************
*** 219,226 ****
  			added++;
  			ac = getacnam((char *)user);
  			(void) orstrlist(&ac->ac_groups, &groups);
! 			orstrlist(&ac->ac_classes, &classes)&&ModBits|=AC;
! 			orstrlist(&ac->ac_sigs, &sigs)&&ModBits|=AC;
  			for (i=0; i<groups.l_count; i++) {
  				gm2 = getgmnam((char *)groups.l_list[i]);
  				if (instrlist(&gm2->gm_mem, (char *)user))
--- 219,226 ----
  			added++;
  			ac = getacnam((char *)user);
  			(void) orstrlist(&ac->ac_groups, &groups);
! 			orstrlist(&ac->ac_classes, &classes) && (ModBits|=AC);
! 			orstrlist(&ac->ac_sigs, &sigs) && (ModBits|=AC);
  			for (i=0; i<groups.l_count; i++) {
  				gm2 = getgmnam((char *)groups.l_list[i]);
  				if (instrlist(&gm2->gm_mem, (char *)user))

Index: src/remove.c
*** src/remove.c.old	Thu Mar 12 16:50:20 1987
--- src/remove.c	Thu Mar 12 14:07:55 1987
***************
*** 309,315 ****
  		removed++;
  	}
  	if (removed) {
! 		(void) printf("%d removed\n");
  		ModBits |= AC;
  	}
  	else
--- 309,315 ----
  		removed++;
  	}
  	if (removed) {
! 		(void) printf("%d removed\n", removed);
  		ModBits |= AC;
  	}
  	else
***************
*** 370,376 ****
  		removed++;
  	}
  	if (removed) {
! 		(void) printf("%d removed\n");
  		ModBits |= AC|GR;
  	}
  	else
--- 370,376 ----
  		removed++;
  	}
  	if (removed) {
! 		(void) printf("%d removed\n", removed);
  		ModBits |= AC|GR;
  	}
  	else
***************
*** 430,436 ****
  		removed++;
  	}
  	if (removed) {
! 		(void) printf("%d removed\n");
  		ModBits |= AC;
  	}
  	else
--- 430,436 ----
  		removed++;
  	}
  	if (removed) {
! 		(void) printf("%d removed\n", removed);
  		ModBits |= AC;
  	}
  	else
***************
*** 722,734 ****
  	strlistdel(&Users, (char *)ac->ac_name);
  
  #ifdef SENDMAIL
! 	for (i=0; i < AliasList.l_count; i++) {
! 	    al = (struct alias *) AliasList.l_list[i];
! 	    if (instrlist(&al->al_addresses, (char *)ac->ac_name)) {
! 		strlistdel(&al->al_addresses, (char *)ac->ac_name);
! 		ModBits |= AL;
! 	    }
! 	}
  #endif
  
  	FREEMEM((char *)ac->ac_name);
--- 722,741 ----
  	strlistdel(&Users, (char *)ac->ac_name);
  
  #ifdef SENDMAIL
! 	/*
! 	 * If an alias exists that matches the user name we're removing
! 	 * then DON'T remove the name from the aliases.  The *alias*
! 	 * was receiving the mail anyway, not the user, therefore the aliases
! 	 * should in be unaffected.
! 	 */
! 	if (!aliasexists((char *)ac->ac_name))
! 	  for (i=0; i < AliasList.l_count; i++) {
! 	      al = (struct alias *) AliasList.l_list[i];
! 	      if (instrlist(&al->al_addresses, (char *)ac->ac_name)) {
! 		  strlistdel(&al->al_addresses, (char *)ac->ac_name);
! 		  ModBits |= AL;
! 	      }
! 	  }
  #endif
  
  	FREEMEM((char *)ac->ac_name);

Index: src/report.c
*** src/report.c.old	Thu Mar 12 18:33:03 1987
--- src/report.c	Thu Mar 12 18:25:09 1987
***************
*** 110,115 ****
--- 110,126 ----
  			if (!instrlist(&s, (char *)ac->ac_sigs.l_list[i]))
  			    strlistadd(&s, (char *)ac->ac_sigs.l_list[i]);
  		}
+ #ifdef SENDMAIL
+ 		if (aliasexists((char *)ac->ac_name)) {
+ 		    al = getalnam((char *)ac->ac_name);
+ 		    if (al->al_addresses.l_count == 0)
+ 		        (void) printf("user \"%s\"'s mail disappears into an empty alias.\n", (char *)ac->ac_name);
+ 		    else {
+ 			(void) printf("user \"%s\"'s mail is distributed to ", (char *) ac->ac_name);
+ 			listlist(&al->al_addresses);
+ 		    }
+ 		}
+ #endif
  		/*
  		 * Skip home directory and shell check if not the super-user,
  		 * since not some shells may not be accessible to non
***************
*** 212,218 ****
        if (ac->ac_gid == gm->gm_gid)
  	memcount++;
      }
!     printf("\"%s\", %d member%s, %d groupie%s\n", gm->gm_name,
  	   memcount - gm->gm_mem.l_count, S(memcount - gm->gm_mem.l_count),
  	   gm->gm_mem.l_count, S(gm->gm_mem.l_count));
    }
--- 223,229 ----
        if (ac->ac_gid == gm->gm_gid)
  	memcount++;
      }
!     (void) printf("\"%s\", %d member%s, %d groupie%s\n", gm->gm_name,
  	   memcount - gm->gm_mem.l_count, S(memcount - gm->gm_mem.l_count),
  	   gm->gm_mem.l_count, S(gm->gm_mem.l_count));
    }
***************
*** 225,231 ****
        if (instrlist(&ac->ac_classes, cs->cs_name))
  	memcount++;
      }
!     printf("\"%s\", %d member%s, ends %s\n", cs->cs_name,
  	   memcount, S(memcount), when(cs->cs_exptime));
    }
    if (SigList.l_count) puts("== Sigs ==");
--- 236,242 ----
        if (instrlist(&ac->ac_classes, cs->cs_name))
  	memcount++;
      }
!     (void) printf("\"%s\", %d member%s, ends %s\n", cs->cs_name,
  	   memcount, S(memcount), when(cs->cs_exptime));
    }
    if (SigList.l_count) puts("== Sigs ==");
***************
*** 237,243 ****
        if (instrlist(&ac->ac_sigs, sg->sg_name))
  	memcount++;
      }
!     printf("\"%s\", %d member%s, ends %s\n", sg->sg_name,
  	   memcount, S(memcount), when(sg->sg_exptime));
    }
    return;
--- 248,254 ----
        if (instrlist(&ac->ac_sigs, sg->sg_name))
  	memcount++;
      }
!     (void) printf("\"%s\", %d member%s, ends %s\n", sg->sg_name,
  	   memcount, S(memcount), when(sg->sg_exptime));
    }
    return;

Index: man/mcp.n
*** man/mcp.n.old	Thu Mar 12 18:42:50 1987
--- man/mcp.n	Thu Mar 12 18:42:15 1987
***************
*** 343,348 ****
--- 343,351 ----
  \(bu  empty aliases
  .br
  .ti -3
+ \(bu  alias/user name collisions
+ .br
+ .ti -3
  \(bu  empty classes and sigs
  .br
  .ti -3