|
|
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 - metrics - 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;
}