DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T r

⟦5ac52a792⟧ TextFile

    Length: 14203 (0x377b)
    Types: TextFile
    Names: »remove.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec8/mcp/src/remove.c« 

TextFile

#include <stdio.h>
#include <sys/types.h>
#include <lastlog.h>
#include "sysdep.h"
#include "macros.h"
#include "mem.h"
#include "lists.h"
#include "gpa.h"
#include "sort.h"
#include "account.h"
#ifdef SENDMAIL
#include "alias.h"
#endif
#include "groupmap.h"
#include "class.h"
#include "job.h"
#include "range.h"
#include "sig.h"
#include "save.h"

#ifdef SENDMAIL
extern	struct list AliasList, Aliases;
#endif SENDMAIL
extern	struct list AccountList, Classes, ClassList;
extern	struct list GroupMapList, Groups, SigList, Sigs, RangeList, Ranges;
extern	struct list Users, Vigs;
extern	int ModBits;
char	*sprintf();

#ifdef SENDMAIL
rmalias(c, v)
int c;
addr *v;

{
	struct alias *al;
	struct class *cs;
	struct sig *sg;
	struct groupmap *gm;
	struct account *ac;
	char *name;
	register int i;

	if ( c > 2 ) {
	    err1("%s: too many arguments", (char *)v[0]);
	    return;
	}
	if ( c != 2 ) {
	    err1("usage: %s <alias>", (char *)v[0]);
	    return;
	}

	al = getalnam((char *)v[1]);
	if (!al) {
	    err1("%s: no such alias", (char *)v[1]);
	    return;
	}

	critical();
	name = al->al_name;
	freelist(&al->al_addresses);
	freelist(&al->al_groups);
	freelist(&al->al_classes);
	freelist(&al->al_sigs);
	strlistdel(&Aliases, (char *)v[1]);
	genlistdel(&AliasList, v[1], saliascmp);
	FREEMEM(name);
	for (i=0; i < AliasList.l_count; i++) {
	    al = (struct alias *) AliasList.l_list[i];
	    if (instrlist(&al->al_addresses, (char *)v[1]))
		strlistdel(&al->al_addresses, (char *)v[1]);
	}
	for (i=0; i < GroupMapList.l_count; i++) {
	    gm = (struct groupmap *) GroupMapList.l_list[i];
	    if (instrlist(&gm->gm_aliases, (char *)v[1]))
		strlistdel(&gm->gm_aliases, (char *)v[1]);
	}
	for (i=0; i < ClassList.l_count; i++) {
	    cs = (struct class *) ClassList.l_list[i];
	    if (instrlist(&cs->cs_aliases, (char *)v[1]))
		strlistdel(&cs->cs_aliases, (char *)v[1]);
	}
	for (i=0; i < SigList.l_count; i++) {
	    sg = (struct sig *) SigList.l_list[i];
	    if (instrlist(&sg->sg_aliases, (char *)v[1]))
		strlistdel(&sg->sg_aliases, (char *)v[1]);
	}
	for (i=0; i < AccountList.l_count; i++) {
	    ac = (struct account *) AccountList.l_list[i];
	    if (instrlist(&ac->ac_aliases, (char *)v[1])) {
		strlistdel(&ac->ac_aliases, (char *)v[1]);
		ModBits |= AC;
	    }
	}
	ModBits |= AL;
	puts("removed");
	non_critical();

	return;
}
#endif

rmclass(c, v)
int c;
addr *v;

{
	struct class *cs;
#ifdef SENDMAIL
	struct alias *al;
#endif
	struct account *ac;
	char *name;
	int i;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c != 2 ) {
		err1("usage: %s <class>", (char *)v[0]);
		return;
	}

	cs = getcsnam((char *)v[1]);
	if (!cs) {
		err1("%s: no such class", (char *)v[1]);
		return;
	}

	critical();

#ifdef SENDMAIL
	for (i=0; i < AliasList.l_count; i++) {
	    al = (struct alias *) AliasList.l_list[i];
	    if (instrlist(&al->al_classes, (char *)v[1])) {
		strlistdel(&al->al_classes, (char *)v[1]);
		ModBits |= AL;
	    }
	}
#endif
	for (i=0; i < AccountList.l_count; i++) {
		ac = (struct account *) AccountList.l_list[i];
		if (instrlist(&ac->ac_classes, (char *)v[1])) {
			strlistdel(&ac->ac_classes, (char *)v[1]);
#ifdef SENDMAIL
			if (cs->cs_aliases.l_count)
			    RXBindings(ac);
#endif
			ModBits |= AC;
		}
	}

	name = cs->cs_name;
	FREEMEM(cs->cs_desc);
	genlistdel(&ClassList, v[1], sclasscmp);
	strlistdel(&Classes, (char *)v[1]);
	FREEMEM(name);

	ModBits |= CS;

	puts("removed");
	non_critical();
	return;
}

rmcryos(c, v)
int c;
char **v;

{
	register struct account *ac;
	register int indx;
	int removed = 0;

	if ( c > 1 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	critical();
	for (indx=0; indx < AccountList.l_count; indx++) {
		ac = (struct account *) AccountList.l_list[indx];
		if (eq(ac->ac_shell, FREEZE_SH)) {
			rmu(ac, 1);
			removed++;
			/* someone else is in this spot now */
			indx--;
		}
	}
	if (removed) {
		(void) printf("%d removed\n", removed);
#ifndef DOFILES
		err("Do not forget to remove the user directories.");
#endif
	}
	else
		puts("No cryos.");
	non_critical();
	return;
}

#ifdef SENDMAIL
rmfromalias(c, v)
int c;
addr *v;

{
	struct alias *al;
	struct account *ac;
	addr *addressv;
	int cc, removed = 0;
	register int indx;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if (c != 2) {
		err1("usage: %s <alias>", (char *)v[0]);
		return;
	}
	al = getalnam((char *)v[1]);
	if (!al) {
		err1("%s: no such alias", (char *)v[1]);
		return;
	}

	addressv = get_gpa(65);
	GetLine("Addresses: ", 64, &cc, addressv, &al->al_addresses);
	if (cc == 0) {
		err("no change");
		return;
	}

	critical();
	for (indx=0; indx < cc; indx++) {
		if (!instrlist(&al->al_addresses, (char *)addressv[indx])) {
			err1("%s: not in alias", (char *)addressv[indx]);
			continue;
		}
		strlistdel(&al->al_addresses, (char *)addressv[indx]);
		ac = getacnam((char *)addressv[indx]);
		if (ac&&instrlist(&ac->ac_aliases, (char *)addressv[indx])) {
			strlistdel(&ac->ac_aliases, al->al_name);
			ModBits |= AC;
		}
		removed++;
	}
	if (removed) {
		ModBits |= AL;
		(void) printf("%d removed\n", removed);
	}
	else
		err("no change");
	non_critical();

	return;
}
#endif SENDMAIL

rmfromclass(c, v)
int c;
addr *v;

{
	struct class *cs;
	struct account *ac;
	addr *userv;
	int cc;
	register int i, removed = 0;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if (c != 2) {
		err1("usage: %s <class>", (char *)v[0]);
		return;
	}
	cs = getcsnam((char *)v[1]);
	if (!cs) {
		err1("%s: no such class", (char *)v[1]);
		return;
	}
	userv = get_gpa(65);
	GetLine("Users: ", 64, &cc, userv, &Users);
	if (cc == 0) {
		err("no change");
		return;
	}

	critical();

	for (i=0; i < cc; i++) {
		ac = getacnam((char *)userv[i]);
		if (!ac) {
			err1("%s: no such user", (char *)userv[i]);
			continue;
		}
		if (!instrlist(&ac->ac_classes, (char *)v[1])) {
			err1("%s: not in class", (char *)userv[i]);
			continue;
		}
		strlistdel(&ac->ac_classes, (char *)v[1]);
#ifdef SENDMAIL
		if (cs->cs_aliases.l_count)
		    RXBindings(ac);
#endif
		removed++;
	}
	if (removed) {
		(void) printf("%d removed\n");
		ModBits |= AC;
	}
	else
		err("no change");

	non_critical();
	return;
}

rmfromgroup(c, v)
int c;
addr *v;

{
	struct groupmap *gm;
	struct account *ac;
	addr *userv;
	int cc;
	register int i, removed = 0;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if (c != 2) {
		err1("usage: %s <group>", (char *)v[0]);
		return;
	}
	gm = getgmnam((char *)v[1]);
	if (!gm) {
		err1("%s: no such group", (char *)v[1]);
		return;
	}
	userv = get_gpa(65);
	GetLine("Users: ", 64, &cc, userv, &gm->gm_mem);
	if (cc == 0) {
		err("no change");
		return;
	}

	critical();
	for (i=0; i < cc; i++) {
		ac = getacnam((char *)userv[i]);
		if (!ac) {
			err1("%s: no such user", (char *)userv[i]);
			continue;
		}
		if (!instrlist(&gm->gm_mem, (char *)userv[i])) {
			err1("%s: not in group", (char *)userv[i]);
			continue;
		}
		strlistdel(&ac->ac_groups, (char *)v[1]);
		strlistdel(&gm->gm_mem, (char *)userv[i]);
#ifdef SENDMAIL
		if (gm->gm_aliases.l_count)
		    RXBindings(ac);
#endif
		removed++;
	}
	if (removed) {
		(void) printf("%d removed\n");
		ModBits |= AC|GR;
	}
	else
		err("no change");
	non_critical();

	return;
}

rmfromsig(c, v)
int c;
addr *v;

{
	struct sig *sg;
	struct account *ac;
	addr *userv;
	int cc;
	register int i, removed = 0;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if (c != 2) {
		err1("usage: %s <sig>", (char *)v[0]);
		return;
	}
	sg = getsgnam((char *)v[1]);
	if (!sg) {
		err1("%s: no such sig", (char *)v[1]);
		return;
	}
	userv = get_gpa(65);
	GetLine("Users: ", 64, &cc, userv, &Users);
	if (cc == 0) {
		err("no change");
		return;
	}

	critical();
	for (i=0; i < cc; i++) {
		ac = getacnam((char *)userv[i]);
		if (!ac) {
			err1("%s: no such user", (char *)userv[i]);
			continue;
		}
		if (!instrlist(&ac->ac_sigs, (char *)v[1])) {
			err1("%s: not in sig", (char *)userv[i]);
			continue;
		}
		strlistdel(&ac->ac_sigs, (char *)v[1]);
#ifdef SENDMAIL
		if (sg->sg_aliases.l_count)
		    RXBindings(ac);
#endif
		removed++;
	}
	if (removed) {
		(void) printf("%d removed\n");
		ModBits |= AC;
	}
	else
		err("no change");
	non_critical();

	return;
}

rmgroup(c, v)
int c;
addr *v;

{
	struct groupmap *gm;
	struct account *ac;
#ifdef SENDMAIL
	struct alias *al;
#endif
	char *name;
	int i, removed = 0;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c != 2 ) {
		err1("usage: %s <group>", (char *)v[0]);
		return;
	}

	gm = getgmnam((char *)v[1]);
	if (!gm) {
		err1("%s: no such group", (char *)v[1]);
		return;
	}

	critical();

#ifdef SENDMAIL
	for (i=0; i < AliasList.l_count; i++) {
	    al = (struct alias *) AliasList.l_list[i];
	    if (instrlist(&al->al_groups, (char *)v[1])) {
		strlistdel(&al->al_groups, (char *)v[1]);
		ModBits |= AL;
	    }
	}
#endif
	for (i=0; i < gm->gm_mem.l_count; i++) {
		ac = getacnam((char *)gm->gm_mem.l_list[i]);
		if (!ac) continue;
		if (instrlist(&ac->ac_groups, (char *)v[1])) {
			strlistdel(&ac->ac_groups, (char *)v[1]);
#ifdef SENDMAIL
			if (gm->gm_aliases.l_count)
			    RXBindings(ac);
#endif
			removed++;
		}
	}

	if (removed) ModBits |= AC;

	if (rangeexists((char *)v[1])) {
		ModBits |= RG;
		genlistdel(&RangeList, v[1], srangecmp);
		strlistdel(&Ranges, (char *)v[1]);
	}
	if (vigexists((char *)v[1])) {
		ModBits |= VG;
		strlistdel(&Vigs, (char *)v[1]);
	}

	ModBits |= GR;

	name = gm->gm_name;
	freelist(&gm->gm_mem);
	genlistdel(&GroupMapList, (addr)&gm->gm_gid, igmapcmp);
	strlistdel(&Groups, (char *)v[1]);
	FREEMEM(name);
	puts("removed");
	non_critical();

	return;
}

rmrange(c, v)
int c;
addr *v;

{
	struct range *rg;
	char *name;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c != 2 ) {
		err1("usage: %s <group>", (char *)v[0]);
		return;
	}

	rg = getrgnam((char *)v[1]);
	if (!rg) {
		err1("%s: no such range", (char *)v[1]);
		return;
	}

	critical();
	name = rg->rg_name;
	genlistdel(&RangeList, v[1], srangecmp);
	strlistdel(&Ranges, (char *)v[1]);
	FREEMEM(name);
	ModBits |= RG;
	puts("removed");
	non_critical();

	return;
}

rmsig(c, v)
int c;
addr *v;

{
	struct sig *sg;
	struct account *ac;
#ifdef SENDMAIL
	struct alias *al;
#endif
	char *name;
	int i;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c != 2 ) {
		err1("usage: %s <sig>\n", (char *)v[0]);
		return;
	}

	sg = getsgnam((char *)v[1]);
	if (!sg) {
		err1("%s: no such sig", (char *)v[1]);
		return;
	}

	critical();

#ifdef SENDMAIL
	for (i=0; i < AliasList.l_count; i++) {
	    al = (struct alias *) AliasList.l_list[i];
	    if (instrlist(&al->al_sigs, (char *)v[1])) {
		strlistdel(&al->al_sigs, (char *)v[1]);
		ModBits |= AL;
	    }
	}
#endif
	for (i=0; i < AccountList.l_count; i++) {
		ac = (struct account *) AccountList.l_list[i];
		if (instrlist(&ac->ac_sigs, (char *)v[1])) {
			strlistdel(&ac->ac_sigs, (char *)v[1]);
#ifdef SENDMAIL
			if (sg->sg_aliases.l_count)
			    RXBindings(ac);
#endif
			ModBits |= AC;
		}
	}

	name = sg->sg_name;
	FREEMEM(sg->sg_desc);
	genlistdel(&SigList, v[1], ssigcmp);
	strlistdel(&Sigs, (char *)v[1]);
	FREEMEM(name);

	ModBits |= SG;

	puts("removed");
	non_critical();

	return;
}

rmuser(c, v)
int c;
addr *v;

{
	struct account *ac;
	int zapdir;
#ifdef DOFILES
	char prompt[LONG_BUF];
#endif

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c != 2 ) {
		err1("usage: %s <user>", (char *)v[0]);
		return;
	}
	ac = getacnam((char *)v[1]);
	if (!ac) {
		err1("%s: no such user", (char *)v[1]);
		return;
	}

#ifdef DOFILES
	if (fileexists((char *)ac->ac_dir)) {
	    (void) sprintf(prompt, "Home directory is %s, remove it? ",
			   ac->ac_dir);
	    zapdir = yesno(prompt);
	}
	else
	  err1("hmmm... home directory %s non-existent", (char *)ac->ac_dir);
#else
	err("Do not forget to remove the user's home directory.");
	zapdir = 0;
#endif
	rmu(ac, zapdir);

	(void) printf("%s removed\n", v[1]);
	return;
}

rmvig(c, v)
int c;
addr *v;

{
	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c != 2 ) {
		err1("usage: %s <vig>", (char *)v[0]);
		return;
	}

	if (!vigexists((char *)v[1])) {
		err1("%s: no such vig", (char *)v[1]);
		return;
	}

	critical();

	strlistdel(&Vigs, (char *)v[1]);
	ModBits |= VG;

	puts("removed");
	non_critical();
	return;
}

/*
 * This is the routine that actually removes a user from the data
 * structures.  rmuser() is just a front end to this routine.
 */
/* ARGSUSED */
rmu(ac, zapdir)
struct account *ac;
int zapdir;

{
	register int i, j;
	register struct groupmap *gm;
#ifdef SENDMAIL
	struct alias *al;
#endif
	
	critical();
	
#ifdef DOFILES
	zapdir && add_job(JB_RMDIR, ac->ac_dir, NIL, NIL);
	add_job(JB_RMMAIL, ac->ac_name, NIL, NIL);
#endif

	for (i=0; i < GroupMapList.l_count; i++) {
		gm = (struct groupmap *) GroupMapList.l_list[i];
		if (instrlist(&gm->gm_mem, (char *)ac->ac_name)) {
			strlistdel(&gm->gm_mem, (char *)ac->ac_name);
			ModBits |= GR;
		}
	}
	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);
	FREEMEM((char *)ac->ac_realname);
	FREEMEM((char *)ac->ac_gecos);
	FREEMEM((char *)ac->ac_passwd);
	FREEMEM((char *)ac->ac_id);
	FREEMEM((char *)ac->ac_dir);
	FREEMEM((char *)ac->ac_shell);
	freelist(&ac->ac_groups);
	freelist(&ac->ac_classes);
	freelist(&ac->ac_sigs);
#ifdef SENDMAIL
	freelist(&ac->ac_aliases);
#endif

	/*
	 * Cannot use genlistdel() because AccountList is sorted by uid, and
	 * not by name.
	 */
	for (i=0; i < AccountList.l_count; i++)
		if (ac == (struct account *) AccountList.l_list[i])
			break;
	for (j=i; j < AccountList.l_count-1; j++)
		AccountList.l_list[j] = AccountList.l_list[j+1];
	AccountList.l_count--;
	FREEMEM((char *)ac);

	ModBits |= AC|PW;

	non_critical();

	return;
}