mcp 1.0 patch #4

kyle at xanth.UUCP kyle at xanth.UUCP
Fri Mar 13 11:16:08 AEST 1987


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 at 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 at odu.edu)
3)	Fixed operator precedence problems in load.c.  Oddly enough,
	lint didn't complain about this.  (thanx to lenlo at miraculix.ida.liu.se)
4)	Routines that access /usr/adm/lastlog now check for negative uids.
	(thanx to lenlo at miraculix.ida.liu.se)
5)	Corrected two typos that I'm surprised haven't cuased problems
	before now. (thanx to lenlo at 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 at xanth.cs.odu.edu		CSNET: kyle at odu.csnet
UUCP: kyle at 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



More information about the Comp.sources.bugs mailing list