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 d

⟦a847b0501⟧ TextFile

    Length: 14405 (0x3845)
    Types: TextFile
    Names: »describe.c«

Derivation

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

TextFile

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

#ifdef BSD4_3
time_t	time();
#endif
#ifdef HELPDIR
extern	struct list AllCommands, Terms;
#endif
#ifdef SENDMAIL
extern	struct list AliasList;
#endif
extern	struct list AccountList, Jobs, RangeList;
extern	int ModBits;

char	*when(), *sprintf();

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

{
	struct alias *al;
	static char *allv[2] = { ".*", 0 };

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

	(void) printf("Name: %s\n", al->al_name);
	if (al->al_groups.l_count) {
	    (void) printf("Bound to group%-2s: ",
			S(al->al_groups.l_count));
	    listlist(&al->al_groups);
	}
	if (al->al_classes.l_count) {
	    (void) printf("Bound to class%-2s: ", ES(al->al_classes.l_count));
	    listlist(&al->al_classes);
	}
	if (al->al_sigs.l_count) {
	    (void) printf("Bound to sig%-4s: ",
			S(al->al_sigs.l_count));
	    listlist(&al->al_sigs);
	}
	if (al->al_addresses.l_count) {
	    puts("\t- Addressees -");
	    (void) showlist(&al->al_addresses, (addr *)allv);
	    (void) printf("%d addressee%s\n", al->al_addresses.l_count,
			S(al->al_addresses.l_count));
	}
	else
	    puts("No addressees.");
	return;
}
#endif

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

{
	struct job *jb;
	char errmsg[LONG_BUF];
	int first, indx;

	first = (c > 1 ? Jobs.l_count - atoi((char *)v[1]) : 0);
	for (indx=first; indx < Jobs.l_count; indx++) {
		jb = (struct job *) Jobs.l_list[indx];
		(void) printf("%3d ", indx+1);
		switch (jb->jb_todo) {
		case JB_LASTLOG:
			(void) printf("update lastlog entry for uid %d\n",
				jb->jb_uid);
			break;
		case JB_MKDIR:
			(void) printf("mkdir %s\n", jb->jb_name);
			break;
		case JB_MV:
			(void) printf("rename %s to %s\n", jb->jb_oldname,
				jb->jb_name);
			break;
		case JB_RMMAIL:
			(void) printf("remove mail for user \"%s\"\n",
				jb->jb_name);
			break;
		case JB_OMNICHOWN:
			(void) printf("omnichown uid %d's files to uid %d\n",
				jb->jb_olduid, jb->jb_uid);
			break;
		case JB_RMDIR:
			(void) printf("remove directory %s\n", jb->jb_name);
			break;
		default:
			(void) sprintf(errmsg,
				"internal error: unknown todo (%d)\n",
				jb->jb_todo);
			err(errmsg);
			break;
		}
	}
	if (ModBits) {
		fputs("Files modified:", stdout);
		(ModBits&AC) && fputs(" account", stdout);
#ifdef SENDMAIL
		(ModBits&AL) && fputs(" alias", stdout);
#endif
		(ModBits&CS) && fputs(" class", stdout);
		(ModBits&GR) && fputs(" group", stdout);
		(ModBits&PW) && fputs(" passwd", stdout);
		(ModBits&RG) && fputs(" range", stdout);
		(ModBits&SG) && fputs(" sig", stdout);
		(ModBits&VG) && fputs(" vig", stdout);
		puts("");
	}
}

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

{
	struct class *cs;
	struct account *ac;
	int indx, members = 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;
	}
	(void) printf("Class: %s\n", cs->cs_name);
	if (cs->cs_exptime) (void) printf("Ends: %s\n", when(cs->cs_exptime));
#ifdef SENDMAIL
	if (cs->cs_aliases.l_count) {
	    (void) printf("Bound to alias%s: ", ES(cs->cs_aliases.l_count));
	    listlist(&cs->cs_aliases);
	}
#endif
	puts((char *)cs->cs_desc);
	for (indx=0; indx < AccountList.l_count; indx++) {
		ac = (struct account *) AccountList.l_list[indx];
		if (!instrlist(&ac->ac_classes, cs->cs_name))
			continue;
		(void) printf("%-10s%-40s%3d",	ac->ac_name,
					ac->ac_realname,
					ac->ac_uid);
		if (ac->ac_ll.ll_time)
			puts("   *");
		else
			puts("");
		members++;
	}
	if (members)
		(void) printf("\n%d member%s.\n", members, S(members));
	else
		puts("No current members.");
	return;
}

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

{
	struct account *ac;
	int indx, cryos = 0;

	if ( c > 1 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	for (indx=0; indx < AccountList.l_count; indx++) {
		ac = (struct account *) AccountList.l_list[indx];
		if (!eq(ac->ac_shell, FREEZE_SH))
			continue;
		(void) printf("%-10s%-40s%3d",	ac->ac_name,
					ac->ac_realname,
					ac->ac_uid);
		if (ac->ac_ll.ll_time)
			puts("   *");
		else
			puts("");
		cryos++;
	}
	if (cryos)
		(void) printf("\n%d cryo%s.\n", cryos, S(cryos));
	else
		puts("No cryos.");
	return;
}

#ifdef HELPDIR
char	*getenv();

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

{
	char *pager = getenv("PAGER");
	char *pname, helpfile[MEDIUM_BUF];
	char *av[4];
	struct stat statbuf;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c < 2 ) {
		err1("usage: %s <mcp command>", (char *)v[0]);
		return;
	}
	if (!instrlist(&AllCommands, (char *)v[1])) {
		err2("%s: %s is not an mcp command",
			(char *)v[0], (char *)v[1]);
		return;
	}
	if (chdir(HELPDIR) == -1) {
		perr(HELPDIR);
		return;
	}
	(void) strcpy(helpfile, (char *)v[1]);
	(void) strcat(helpfile, ".k");
	if (stat(helpfile, &statbuf) == -1) {
		err1("No help available for \"%s\"", (char *)v[1]);
		return;
	}
	if (statbuf.st_size == 0) {
		err1("Help file for \"%s\" is empty, (oh, well)",
			(char *)v[1]);
		return;
	}
	if (!pager)
		pager = DEF_PAGER;
	pname = rindex(pager, '/') + 1;
	pname = (pname ? pname : pager);

	av[0] = "shell-escape";		/* not really necessary */
	av[1] = pager;
	av[2] = helpfile;
	av[3] = (char *)0;
	(void) shellescape(3, (addr *)av);
	return;
}
#endif

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

{
	struct account *ac;
	struct groupmap *gm;
	int indx, deadbeats = 0;
	char errmsg[LONG_BUF];

	if ( c > 1 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	for (indx=0; indx < AccountList.l_count; indx++) {
		ac = (struct account *) AccountList.l_list[indx];
		if (ac->ac_classes.l_count)
			continue;
		if (ac->ac_sigs.l_count)
			continue;
		/*
		 * Cryos are not deadbeats.
		 */
		if (eq(ac->ac_shell, FREEZE_SH))
			continue;
		gm = getgmgid(ac->ac_gid);
		if (!gm) {
			(void) sprintf(errmsg,
					"no group for gid %d!",
					ac->ac_gid);
			err(errmsg);
			return;
		}
		if (vigexists(gm->gm_name))
			continue;
		(void) printf("%-10s%-40s%3d",	ac->ac_name,
					ac->ac_realname,
					ac->ac_uid);
		if (ac->ac_ll.ll_time)
			puts("   *");
		else
			puts("");
		deadbeats++;
	}
	if (deadbeats)
		(void) printf("\n%d deadbeat%s.\n",
				deadbeats, S(deadbeats));
	else
		puts("No deadbeats.");
	return;
}

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

{
	struct groupmap *gm;
	struct range *rg;
	struct account *ac;
	static struct list members;
	static char *allv[2] = { ".*", 0 };
	int indx, vig = 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;
	}
	rg = getrgnam((char *)v[1]);
	if (vigexists((char *)v[1]))
		vig++;
	zerolist(&members);
	tmplistadd(&members);
	for (indx=0; indx < AccountList.l_count; indx++) {
		ac = (struct account *) AccountList.l_list[indx];
		if (ac->ac_gid == gm->gm_gid)
			strlistadd(&members, (char *)ac->ac_name);
	}
	(void) printf("Group: %s (%u)%s\n", gm->gm_name, gm->gm_gid, 
			vig?" VIG":"");
	if (rg) {
		(void) printf("uid range: %d-%d  ", rg->rg_from,
			rg->rg_to);
		puts(rg->rg_mode == RG_SHARED ? "shared" : "exclusive");
	}
#ifdef SENDMAIL
	if (gm->gm_aliases.l_count) {
	    (void) printf("Bound to alias%s: ", ES(gm->gm_aliases.l_count));
	    listlist(&gm->gm_aliases);
	}
#endif
	if (members.l_count) {
		puts("\t- Members -");
		sort_list(&members, pstrcmp);
		(void) showlist(&members, (addr *)allv);
	}
	if (gm->gm_mem.l_count) {
		puts("\t- Groupies -");
		(void) showlist(&gm->gm_mem, (addr *)allv);
	}
	if (!members.l_count && !gm->gm_mem.l_count)
		puts("No current members or groupies.");
	else {
		if (members.l_count)
			(void) printf("%d member%s", members.l_count,
				S(members.l_count));
		else
			(void) printf("No members");
		if (gm->gm_mem.l_count)
			(void) printf(", %d groupie%s\n", gm->gm_mem.l_count,
				S(gm->gm_mem.l_count));
		else
			puts(", no groupies.");
	}
	freelist(&members);
	return;
}

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

{
	struct account *ac;
	struct groupmap *gm;
	int indx, inactives = 0, days;
	time_t now;
	long toolong;
	char errmsg[LONG_BUF];

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c < 2 ) {
		err1("usage: %s <days>", (char *)v[0]);
		return;
	}
	if (!validint((char *)v[1])) {
		err2("%s: %s doesn't make sense as a number", (char *)v[0],
			(char *)v[1]);
		return;
	}
	now = time((time_t *)0);
	days = atoi((char *)v[1]);
	toolong = days * 86400;

	for (indx=0; indx < AccountList.l_count; indx++) {
		ac = (struct account *) AccountList.l_list[indx];
		if ((long)(now - ac->ac_ll.ll_time) < toolong)
			continue;
		/*
		 * Cryos are not inactive.
		 */
		if (eq(ac->ac_shell, FREEZE_SH))
			continue;
		/*
		 * Vig members are not inactive.
		 */
		gm = getgmgid(ac->ac_gid);
		if (!gm) {
			(void) sprintf(errmsg,
					"no group for gid %d!",
					ac->ac_gid);
			err(errmsg);
			return;
		}
		if (vigexists(gm->gm_name))
			continue;
		(void) printf("%-10s%-40s%3d",	ac->ac_name,
					ac->ac_realname,
					ac->ac_uid);
		if (ac->ac_ll.ll_time)
			puts("   *");
		else
			puts("");
		inactives++;
	}
	if (inactives)
		(void) printf("\n%d user%s inactive for at least %d day%s.\n",
			inactives, S(inactives),
			days, S(days));
	else
		(void) printf("No users inactive for %d day%s.\n",
			days, S(days));
	return;
}

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

{
	struct range *rg;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if (c != 2) {
		err1("usage: %s <range name>", (char *)v[0]);
		return;
	}
	rg = getrgnam((char *)v[1]);
	if (!rg) {
		err1("%s: no such range", (char *)v[1]);
		return;
	}
	(void) printf("%-16s %d to %d    %s\n", rg->rg_name, rg->rg_from,
		rg->rg_to,
		(rg->rg_mode == RG_SHARED ? "shared" : "exclusive"));
	return;
}

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

{
	struct sig *sg;
	struct account *ac;
	int indx, members = 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;
	}
	(void) printf("Sig: %s\n", sg->sg_name);
	if (sg->sg_exptime) (void) printf("Expires: %s\n",
						when(sg->sg_exptime));
#ifdef SENDMAIL
	if (sg->sg_aliases.l_count) {
	    (void) printf("Bound to alias%s:", ES(sg->sg_aliases.l_count));
	    listlist(&sg->sg_aliases);
	}
#endif
	puts((char *)sg->sg_desc);
	for (indx=0; indx < AccountList.l_count; indx++) {
		ac = (struct account *) AccountList.l_list[indx];
		if (!instrlist(&ac->ac_sigs, sg->sg_name))
			continue;
		(void) printf("%-10s%-40s%3d",	ac->ac_name,
					ac->ac_realname,
					ac->ac_uid);
		if (ac->ac_ll.ll_time)
			puts("   *");
		else
			puts("");
		members++;
	}
	if (members)
		(void) printf("\n%d member%s.\n", members, S(members));
	else
		puts("No current members.");
	return;
}

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

{
#ifdef SENDMAIL
	static struct list mal;
	struct alias *al;
	register int j;
#endif
	struct account *ac;
	struct groupmap *gm;
	char *shell, errmsg[LONG_BUF];

	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;
	}
	gm = getgmgid(ac->ac_gid);
	if (!gm) {
		(void) sprintf(errmsg, "no group name for gid %d!",
				ac->ac_gid);
		err(errmsg);
		return;
	}
	if (strlen((char *)ac->ac_shell) == 0)
		shell = "/bin/sh";
	else
		shell = (char *)ac->ac_shell;
#ifdef SENDMAIL
	/*
	 * Get the names of the aliases this user is in for later use
	 */
	zerolist(&mal);
	tmplistadd(&mal);
	for (j=0; j < AliasList.l_count; j++) {
	    al = (struct alias *) AliasList.l_list[j];
	    if (instrlist(&al->al_addresses, (char *)ac->ac_name))
		strlistadd(&mal, (char *)al->al_name);
	}
#endif
	(void) printf("Login:   %s (%d)\n", ac->ac_name, ac->ac_uid);
	(void) printf("Name:    %s (%s)\n", ac->ac_realname, ac->ac_gecos);
	(void) printf("Id:      %s\n", ac->ac_id);
	(void) printf("Groups:  %s ", gm->gm_name);
	listlist(&ac->ac_groups);
	fputs("Classes: ", stdout);
	listlist(&ac->ac_classes);
	fputs("Sigs:    ", stdout);
	listlist(&ac->ac_sigs);
#ifdef SENDMAIL
	fputs("Aliases: ", stdout);
	listlist(&mal);
#endif
	(void) printf("Home:    %s\n", ac->ac_dir);
	(void) printf("Shell:   %s\n", shell);
	if (ac->ac_ll.ll_time) {
		(void) printf("Last login %s on %s", when(ac->ac_ll.ll_time),
			ac->ac_ll.ll_line);
		if (ac->ac_ll.ll_host[0] != '\0')
			(void) printf(" from %s", ac->ac_ll.ll_host);
		puts("");
	}
	else
		puts("Never logged in.");
	return;
}

#ifdef HELPDIR
whatis(c, v)
int c;
addr *v;

{
	char *pager = getenv("PAGER");
	char *pname, helpfile[MEDIUM_BUF];
	char *av[4];
	struct stat statbuf;

	if ( c > 2 ) {
		err1("%s: too many arguments", (char *)v[0]);
		return;
	}
	if ( c != 2 ) {
		err1("usage: %s <mcp term>", (char *)v[0]);
		return;
	}
	if (!instrlist(&Terms, (char *)v[1])) {
		err2("%s: %s is not an mcp term",
			(char *)v[0], (char *)v[1]);
		return;
	}

	if (chdir(HELPDIR) == -1) {
		perr(HELPDIR);
		return;
	}
	(void) strcpy(helpfile, (char *)v[1]);
	(void) strcat(helpfile, ".k");
	if (stat(helpfile, &statbuf) == -1) {
		err1("No definition file for \"%s\"", (char *)v[1]);
		return;
	}
	if (statbuf.st_size == 0) {
		err1("Definition file for \"%s\" is empty, (alas and alack!)",
			(char *)v[1]);
		return;
	}
	if (!pager)
		pager = DEF_PAGER;
	pname = rindex(pager, '/') + 1;
	pname = (pname ? pname : pager);

	av[0] = "shell-escape";		/* not really necessary */
	av[1] = pager;
	av[2] = helpfile;
	av[3] = (char *)0;
	(void) shellescape(3, (addr *)av);
	return;
}
#endif