|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T r ┃
Length: 14203 (0x377b) Types: TextFile Names: »remove.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec8/mcp/src/remove.c«
#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; }