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 c

⟦0727ebae4⟧ TextFile

    Length: 19341 (0x4b8d)
    Types: TextFile
    Names: »conference.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/unaxcess/conference.c« 

TextFile

/*
 *	conference.c	1.2 (TDI) 2/3/87
 *	Copyright (C) 1984, 85, 86, 87 by Brandon S. Allbery.
 *	This file is part of UNaXcess version 1.0.2.
 *
 *	Permission is hereby granted to copy and distribute this program
 *	freely.  Permission is NOT given to modify this program or distribute
 *	it at cost, except for charging a reasonable media/copying fee.
 */

#ifndef lint
static char _FileID_[] = "@(#)conference.c	1.2 (TDI) 2/3/87";
static char _UAID_[]   = "@(#)UNaXcess version 1.0.2";
#endif lint

#include "ua.h"

char conference[33];

confidx() {
	FILE *ifd;
	short himsg;
	char line[256];
	DIR *dp;
	struct direct *dfd;

	writes("\nConference                      Subscribed?  Messages  # Read  Restricted?\n");
	if ((dp = opendir(MSGBASE)) == NULL) {
		log("Error %d opening dir %s/", errno, MSGBASE);
		panic("msgdir");
	}
	while ((dfd = readdir(dp)) != NULL) {
		if (dfd->d_name[0] == '.')
			continue;
		sprintf(line, "%s/%s/himsg", MSGBASE, dfd->d_name);
		if ((ifd = fopen(line, "r")) == NULL) {
			log("No himsg in conference %s", dfd->d_name);
			continue;
		}
		fgets(line, 32, ifd);
		himsg = atoi(line);
		writef("%-32.32s     %c        %5d    %5d        %c\n", dfd->d_name, (isunsub(dfd->d_name)? 'N': 'Y'), himsg, cnread(dfd->d_name), (isrconf(dfd->d_name)? 'Y': 'N'));
		fclose(ifd);
	}
	closedir(dp);
	return 1;
}

join() {
	char line[256], *p;

	do {
		writef("Enter conference: ");
		reads(line);
		log("Enter conference: %s", line);
		if (line[0] == '\0')
			return 1;
	} while (!verify(line));
	strcpy(conference, line);
	log("Current conference is %s", conference);
	return 1;
}

verify(conf)
char *conf; {
	char *cp, line[256];

	for (cp = conf; *cp != 0; cp++) {
		if (!isprint(*cp))
			return 0;
		else if (*cp == '/' || *cp == '!' || *cp == ':')
			*cp = '.';
		else
			*cp = ToLower(*cp);
	}
	if (cp - conf > CONFSIZE)
		conf[CONFSIZE] = '\0';
	sprintf(line, "%s/%s", MSGBASE, conf);
	if (chdir(line) == -1) {
		if (errno != ENOENT) {
			log("Error %d accessing dir %s/", errno, line);
			return 0;
		}
		else
			return newconf(conf);
	}
	if (chdir(parms.ua_home) == -1) {
		log("Can't chdir to HOME (errno=%d)", errno);
		system("pwd");
		panic("isconf_cd");
	}
	if (isunsub(conf)) {
		writef("You are unsubscribed from this conference.  Rejoin? N\b");
		line[0] = readc();
		log("Unsubscribed.  Resubscribe? %c", line[0]);
		if (line[0] == 'Y')
			resubscribe(conf);
		else
			return 0;
	}
	if (user.u_access != A_WITNESS && parms.ua_xrc && !isrcmem(user.u_name, conf)) {
		log("No access to restricted conference %s", conf);
		writes("I'm sorry, but that conference has restricted membership.");
		return 0;
	}
	return 1;
}

killmsg() {
	short mnum;
	char line[256], *p;

	if (user.u_access == A_GUEST) {
		writes("You aren't authorized for this function.");
		log("Security violation:  KILL by a GUEST");
		return 1;
	}
	writef("Enter message number to kill: ");
	reads(line);
	if (line[0] == '\0')
		return 1;
	if ((mnum = atoi(line)) < 1) {
		writes("Bad message number.");
		log("Bad message number: %s", line);
		return 1;
	}
	dokill(mnum);
	return 1;
}

dokill(msg)
short msg; {
	char mfile[256];

	sprintf(mfile, "%s/%s/%d", MSGBASE, conference, msg);
	if (user.u_access != A_WITNESS && s_cmp(getowner(mfile), user.u_name) != 0) {
		writes("Sorry, you don't own that message.");
		log("Security violation:  KILL by non-owner");
		return;
	}
	if (unlink(mfile) < 0) {
		writef("No such message: %d", msg);
		log("Error %d unlinking %s", errno, mfile);
		return;
	}
	log("Deleted %s:%d", conference, msg);
}

char *getowner(file)
char *file; {
	FILE *f;
	char line[1024], *p;
	static char owner[256];

	strcpy(owner, parms.ua_sysop);
	if ((f = fopen(file, "r")) == NULL)
		return owner;
	while (fgets(line, 1024, f) != NULL)
		if (line[0] == '\n')
			break;
		else if (strncmp(line, "From: ", 6) == 0) {
			strcpy(owner, &line[6]);
			break;
		}
	fclose(f);
	for (p = owner; *p != '\0'; p++)
		*p = ToLower(*p);
	return owner;
}

newconf(conf)
char *conf; {
	char line[256];
	FILE *f;

	if (user.u_access == A_GUEST) {
		log("Security violation:  attempted MKCONF by guest");
		writes("Sorry, there is no such conference.");
		return 0;
	}
	writef("There is no conference by that name.  Do you want to create it? N\b");
	line[0] = readc();
	log("Nonexistent.  Create? %c", line[0]);
	if (line[0] != 'Y')
		return 0;
	if (parms.ua_roc && conf[0] == 'r' && conf[1] == '-')
		if (user.u_access != A_WITNESS) {
			writes("Only Fairwitnesses can make READ-ONLY conferences.  If you really want one, you will have to ask the Sysop to make you a Fairwitness.  Otherwise, try using a conference name not beginning with \"R-\".");
			log("Attempted mk of RO conf by non-FW");
			return 0;
		}
		else {
			writef("This conference will be READ-ONLY, except to Fairwitnesses.  If you want anyone to be able to add to it, answer NO and use a name not beginning with \"R-\".  Do you want to make this READ-ONLY conference? N\b");
			line[0] = readc();
			log("Read-only.  Create? %c", line[0]);
			if (line[0] != 'Y')
				return 0;
		}
#ifdef BSD
	sprintf(line, "%s/%s", MSGBASE, conf);
	if (mkdir(line, 0600) < 0) {
		log("Mkconf of %s failed", conf);
		writes("Hmmm... guess you aren't allowed.");
		return 0;
	}
	chown(line, geteuid(), getegid());
#else  !BSD
	sprintf(line, "exec mkconf %s/%s %d", MSGBASE, conf, geteuid());
	if (system(line) != 0) {
		log("Mkconf of %s failed.", conf);
		writes("Hmmm... guess you aren't allowed.");
		return 0;
	}
#endif BSD
	log("New conference: %s", conf);
	sprintf(line, "%s/%s/himsg", MSGBASE, conf);
	if ((f = fopen(line, "w")) == NULL) {
		log("Error %d opening %s", line);
		writes("Can't create high message file.  Strange...");
		return 0;
	}
	fputs("0\n", f);
	fclose(f);
	writes("You will now be placed in the message editor to make a message describing this conference.  It will be addressed to, and readable by, all users.");
	mkmsg("All", "This conference", conf, 0);
	return 1;
}

isprivate(msg)
char *msg; {
	FILE *fp;
	char line[1024], to[1024], from[1024];
	short pflag;
	register char *cp;

	if (user.u_access == A_WITNESS)
		return 0;
	if ((fp = fopen(msg, "r")) == NULL)
		return 0;
	strcpy(to, "All");
	pflag = 0;
	while (fgets(line, 1024, fp) != NULL) {
		if (line[0] == '\n')
			break;
		else if (strncmp(line, "To: ", 4) == 0)
			strcpy(to, &line[4]);
		else if (strncmp(line, "From: ", 6) == 0)
			strcpy(from, &line[6]);
		else if (strncmp(line, "Subject (Private): ", 19) == 0)
			pflag = 1;
	}
	fclose(fp);
	for (cp = to; *cp != '\0'; cp++)	/* OOPS!  2/3/87 ++bsa */
		if (*cp == '\n') {
			*cp = '\0';
			break;
		}
	for (cp = from; *cp != '\0'; cp++)
		if (*cp == '\n') {
			*cp = '\0';
			break;
		}
	if (!pflag)
		return 0;
	if (s_cmp(user.u_name, to) == 0)
		return 0;
	else if (s_cmp(user.u_name, from) == 0)
		return 0;
	else {
		log("Message %s is private.", msg);
		return 1;
	}						/* end mods 2/3/87 */
}

isunsub(conf)
char *conf; {
	struct _himsg *hip;

	for (hip = hicnts; hip != NULL; hip = hip->hi_next)
		if (strcmp(hip->hi_conf, conf) == 0)
			break;
	return (hip != NULL && hip->hi_uns == HI_UNSUB);
}

unsubscribe(conf)
char *conf; {
	struct _himsg *hip, *workp;
	char line[512];
	
	if (s_cmp(conf, "general") == 0) {
		writes("Can't unsubscribe the general conference.");
		log("Attempted to unsubscribe to general.");
		return;
	}
	if (s_cmp(conf, user.u_lconf) == 0) {
		writef("Unsubscribe to login conference? N\b");
		line[0] = readc();
		log("Unsub login conf? %c", line[0]);
		if (line[0] != 'Y')
			return;
		strcpy(user.u_lconf, "general");
	}
	for (hip = hicnts; hip != NULL; hip = hip->hi_next)
		if (strcmp(hip->hi_conf, conf) == 0)
			break;
	if (hip != NULL)
		hip->hi_uns = HI_UNSUB;
	else {
		if ((workp = (struct _himsg *) calloc((unsigned) 1, sizeof (struct _himsg))) == NULL) {
			log("Error %d allocating _himsg for %s", errno, conf);
			panic("alloc");
		}
		strcpy(workp->hi_conf, conf);
		workp->hi_num = 0;
		workp->hi_next = hicnts;
		hicnts = workp;
		workp->hi_uns = HI_UNSUB;
	}
	writehigh(hicnts);
	log("Unsubscribed to %s", conf);
	writef("Unsubscribed to conference %s.\n", conf);
}

resubscribe(conf)
char *conf; {
	struct _himsg *hip, *workp;
	
	for (hip = hicnts; hip != NULL; hip = hip->hi_next)
		if (strcmp(hip->hi_conf, conf) == 0)
			break;
	if (hip != NULL)
		hip->hi_uns = HI_SUBSCR;
	else {
		if ((workp = (struct _himsg *) calloc((unsigned) 1, sizeof (struct _himsg))) == NULL) {
			log("Error %d allocating _himsg for %s", errno, conf);
			panic("alloc");
		}
		strcpy(workp->hi_conf, conf);
		workp->hi_num = 0;
		workp->hi_next = hicnts;
		hicnts = workp;
		workp->hi_uns = HI_SUBSCR;
	}
	writehigh(hicnts);
	log("Resubscribed to %s", conf);
	writef("Resubscribed to conference %s.\n", conf);
}

unsub() {
	char line[256], *p;

	for (;;) {
		writef("Unsubscribe to which conference (ENTER to abort): ");
		reads(line);
		log("Unsub conference: %s", line);
		if (line[0] == '\0')
			return 1;
		if (isconf(line)) {
			unsubscribe(line);
			return 1;
		}
		writef("That's not a valid conference.  ");
	}
}

isconf(conf)
char *conf; {
	char *cp, line[256];

	for (cp = conf; *cp != 0; cp++) {
		if (!isprint(*cp))
			return 0;
		else if (*cp == '/' || *cp == '!' || *cp == ':')
			*cp = '.';
		else
			*cp = ToLower(*cp);
	}
	if (cp - conf > CONFSIZE)
		conf[CONFSIZE] = '\0';
	sprintf(line, "%s/%s", MSGBASE, conf);
	if (chdir(line) == -1)
		return 0;
	if (chdir(parms.ua_home) == -1) {
		log("Can't chdir to HOME (errno=%d)", errno);
		system("pwd");
		panic("isconf_cd");
	}
	return 1;
}

setlconf() {
	char line[256], *p;

	if (s_cmp(user.u_name, "guest") == 0) {
		log("Guest SET LOGIN CONF denied.");
		writes("GUEST can't set a login conference.");
		return 1;
	}
	do {
		writef("Enter new login conference: ");
		reads(line);
		log("Login conference: %s", line);
		if (line[0] == '\0')
			return 1;
	} while (!isconf(line));
	if (isunsub(line)) {
		writes("You're unsubscribed from it.  <J>oin it and resubscribe.");
		log("Unsubscribed -- login conf set aborted.");
		return 1;
	}
	if (!isrcmem(user.u_name, line)) {
		writes("You aren't a member of that conference.");
		log("Not a member -- login conf set aborted.");
		return 1;
	}
	strcpy(user.u_lconf, line);
	log("New login conference: %s", user.u_lconf);
	putuser(user.u_name, &user);
	return 1;
}

uisunsub(uname, conf)
char *uname, *conf; {
	struct _himsg *hip, *uhi;
	char *cp;

	for (cp = uname; *cp != '\0'; cp++)
		*cp = ToLower(*cp);
	if ((uhi = readhigh(uname)) < 0) {
		log("Couldn't read %s's userindex.", uname);
		return 0;
	}
	writef("Checking %s's user index...\n", uname);
	for (hip = uhi; hip != NULL; hip = hip->hi_next)
		if (strcmp(hip->hi_conf, conf) == 0)
			break;
	cp = (hip != NULL && hip->hi_uns == HI_UNSUB? "!": ":");
	for (hip = uhi; hip != NULL; hip = uhi) {
		uhi = hip->hi_next;
		free((char *) hip);
	}
	return (*cp == '!');
}

cleanhigh() {
	struct _himsg *hip, *lastp;
	DIR *confs;
	struct direct *conf;
	int nunread;
	char line[80];
	FILE *fp;
	
	lastp = NULL;
	writes("Checking for deleted conferences...");
	for (hip = hicnts; hip != NULL; lastp = hip, hip = hip->hi_next) {
		if (!isconf(hip->hi_conf)) {
			writef("Conference \"%s\" was deleted since your last session.\n", hip->hi_conf);
			if (lastp == NULL)
				hicnts = hip->hi_next;
			else
				lastp->hi_next = hip->hi_next;
			free((char *) hip);
		}
	}
	writes("\nChecking for new messages and conferences...");
	if ((confs = opendir(MSGBASE)) == NULL) {
		log("Error %d opening dir %s/", errno, MSGBASE);
		panic("msgdir");
	}
	while ((conf = readdir(confs)) != NULL) {
		if (strcmp(conf->d_name, ".") == 0)
			continue;
		if (strcmp(conf->d_name, "..") == 0)
			continue;
		for (hip = hicnts; hip != NULL; hip = hip->hi_next)
			if (strcmp(hip->hi_conf, conf->d_name) == 0) {
				sprintf(line, "%s/%s/himsg", MSGBASE, conf->d_name);
				if ((fp = fopen(line, "r")) == (FILE *) 0)
					break;
				fgets(line, 32, fp);
				fclose(fp);
				nunread = atoi(line);
				if ((nunread -= hip->hi_num) <= 0)
					break;
				writef("There are %d new messages in \"%s\".\n", nunread, conf->d_name);
				break;
			}
		if (hip == NULL) {
			writef("Conference \"%s\" has been created since your last session.\n", conf->d_name);
			if ((hip = (struct _himsg *) calloc((unsigned) 1, sizeof (struct _himsg))) == NULL) {
				log("Error %d allocating _himsg for %s", errno, conf);
				panic("alloc");
			}
			strcpy(hip->hi_conf, conf->d_name);
			hip->hi_num = 0;
			hip->hi_next = hicnts;
			hicnts = hip;
		}
	}
	writehigh(hicnts);
	closedir(confs);
}

cnread(conf)
char *conf; {
	struct _himsg *hi;
	
	for (hi = hicnts; hi != (struct _himsg *) 0; hi = hi->hi_next)
		if (s_cmp(conf, hi->hi_conf) == 0)
			return hi->hi_num;
	return -1;
}

edrest() {
	char rconf[256], line[256];
	char *p;
	FILE *fp;

	if (user.u_access != A_WITNESS) {
		writes("You aren't permitted to edit Restricted conference membership lists.");
		log("Non-FW attempted to edit restricted conf membership lists");
		return 1;
	}
	if (!parms.ua_xrc) {
		writes("Restricted conferences are not permitted on this BBS.");
		log("redit: restricted conferences disabled");
		return 1;
	}
	writef("Enter conference (RETURN / ENTER to abort): ");
	reads(rconf);
	log("Rconf: %s", rconf);
	if (rconf[0] == '\0')
		return 1;
	if (!isconf(rconf)) {
		writef("Conference \"%s\" doesn't exist.", rconf);
		log("Bad conference: %s", rconf);
		return 1;
	}
	for (p = rconf; *p != '\0'; p++)
		*p = ToLower(*p);
	if (s_cmp(user.u_name, parms.ua_sysop) != 0 && !isrcmem(user.u_name, rconf)) {
		log("FW not a member; list only");
		rcmemlist(rconf);
		return 1;
	}
	if (!isrconf(rconf))
		if (s_cmp(user.u_name, parms.ua_sysop) != 0) {
			writes("Only the Sysop can restrict a conference's membership.");
			return 1;
		}
		else {
			writef("Conference \"%s\" isn't restricted.  Restrict? N\b", rconf);
			line[0] = readc();
			log("Restrict %s? %c", rconf, line[0]);
			if (line[0] != 'Y')
				return 1;
			sprintf(line, "%s/%s", MEMLIST, rconf);
			if ((fp = fopen(line, "w")) == (FILE *) 0) {
				log("Error %d creating %s", errno, line);
				panic("rest_mk");
			}
			fclose(fp);
		}
	for (;;) {
		writef("\nList members, Add a member, Delete a member, Clear membership list, or Quit: ");
		line[0] = readc();
		switch (line[0]) {
		case 'L':
			rcmemlist(rconf);
			break;
		case 'A':
			rcmemadd(rconf);
			break;
		case 'D':
			rcmemdel(rconf);
			break;
		case 'C':
			rcmemclr(rconf);
			break;
		case 'Q':
			return 1;
		default:
			writes("Please enter L, A, D, C, or Q.");
		}
	}
}

isrcmem(uname, conf)
char *uname, *conf; {
	FILE *fp;
	char line[256];
	char *cp;

	if (!parms.ua_xrc || s_cmp(uname, parms.ua_sysop) == 0)
		return 1;
	sprintf(line, "%s/%s", MEMLIST, conf);
	if ((fp = fopen(line, "r")) == (FILE *) 0)
		return 1;	/* no mem list == no restrictions */
	while (fgets(line, sizeof line, fp) != (char *) 0) {
		if ((cp = RIndex(line, '\n')) != (char *) 0)
			*cp = '\0';
		if (s_cmp(line, uname) == 0) {
			fclose(fp);
			log("%s is a member of restricted conf %s", uname, conf);
			return 1;
		}
	}
	fclose(fp);
	log("%s isn't a member of restricted conf %s", uname, conf);
	return 0;
}

rcmemlist(conf)
char *conf; {
	FILE *fp;
	char line[256];
	short headf;

	if (!parms.ua_xrc) {
		writef("Conference \"%s\" has no restrictions on membership.\n", conf);
		return;
	}
	sprintf(line, "%s/%s", MEMLIST, conf);
	if ((fp = fopen(line, "r")) == (FILE *) 0) {
		writef("Conference \"%s\" has no restrictions on membership.\n", conf);
		return;
	}
	headf = 0;
	while (fgets(line, sizeof line, fp) != (char *) 0) {
		if (!headf) {
			writef("Members of the \"%s\" conference:\n\n", conf);
			headf++;
		}
		writef("\t%s\n", upstr(line));
		/* OOPS!  1 line deleted 2/3/87 ++bsa */
	}
	if (!headf)
		writef("Conference \"%s\" is restricted to Fairwitnesses and the Sysop.\n", conf);
	fclose(fp);
}

rcmemadd(conf)
char *conf; {
	char line[256], uname[256];
	struct user ubuf;
	FILE *fp;
	
	writef("Name (RETURN to abort): ");
	reads(uname);
	log("Add user %s to %s's mem list", uname, conf);
	if (uname[0] == '\0')
		return;
	if (!getuser(uname, &ubuf)) {
		writef("User \"%s\" doesn't exist.\n", upstr(uname));
		log("No such user: %s", uname);
		return;
	}
	if (ubuf.u_access == A_WITNESS && s_cmp(user.u_name, "sysop") != 0) {
		log("FW attempted to change membership of %s in %s", ubuf.u_name, conf);
		writes("Sorry, only the Sysop can change a FairWitness's conference membership.");
		return;
	}
	if (isrcmem(uname, conf)) {
		log("Already a member.");
		writef("\"%s\" is already a member of this conference.\n", upstr(uname));
		return;
	}
	mklock("memlist.lock");
	sprintf(line, "%s/%s", MEMLIST, conf);
	if ((fp = fopen(line, "a")) == (FILE *) 0) {
		rmlock(conf);
		log("Error %d opening %s", errno, line);
		panic("memlist_app");
	}
	fprintf(fp, "%s\n", upstr(uname));	/* OOPS!  2/3/87 ++bsa */
	fclose(fp);
	rmlock("memlist.lock");
}

rcmemdel(conf)
char *conf; {
	char line[256], uname[256], tname[256];
	struct user ubuf;
	FILE *fp, *tp;
	
	writef("Name (RETURN to abort): ");
	reads(uname);
	log("Del user %s from %s's mem list", uname, conf);
	if (uname[0] == '\0')
		return;
	if (!getuser(uname, &ubuf)) {
		writef("User \"%s\" doesn't exist.\n", upstr(uname));
		log("No such user: %s", uname);
		return;
	}
	if (ubuf.u_access == A_WITNESS && s_cmp(user.u_name, "sysop") != 0) {
		log("FW attempted to change membership of %s in %s", ubuf.u_name, conf);
		writes("Sorry, only the Sysop can change a FairWitness's conference membership.");
		return;
	}
	if (!isrcmem(uname, conf)) {
		log("Not a member.");
		writef("\"%s\" isn't a member of this conference.\n", upstr(uname));
		return;
	}
	sprintf(tname, "/tmp/UAxD%05d", getpid());
	if ((tp = fopen(tname, "w")) == (FILE *) 0) {
		log("Error %d opening %s", errno, tname);
		panic("memlist_dtmp");
	}
	mklock("memlist.lock");
	sprintf(line, "%s/%s", MEMLIST, conf);
	if ((fp = fopen(line, "r")) == (FILE *) 0) {
		rmlock(conf);
		fclose(tp);
		unlink(tname);
		log("Error %d opening %s", errno, line);
		panic("memlist_app");
	}
	while (fgets(line, sizeof line, fp) != (char *) 0)
		if (s_cmp(line, uname) != 0)
			fputs(line, tp);
	fclose(fp);
	fclose(tp);
	sprintf(line, "%s/%s", MEMLIST, conf);
	if (unlink(line) < 0) {
		log("Error %d unlinking %s", errno, line);
		rmlock("memlist.lock");
		panic("memlist_drmv");
	}
	if (copylink(tname, line) < 0) {
		log("Error %d copylinking %s to %s", errno, tname, line);
		rmlock("memlist.lock");
		panic("memlist_dclnk");
	}
	rmlock("memlist.lock");
}

rcmemclr(conf)
char *conf; {
	char mlist[256];
	
	if (s_cmp(user.u_name, parms.ua_sysop) != 0) {
		log("Attempt to clear %s's mem list by non-sysop", conf);
		writes("Only the Sysop can clear a conference's membership list.");
		return;
	}
	writef("Clear membership list for the \"%s\" conference? N\b", conf);
	mlist[0] = readc();
	log("Clear? %c", mlist[0]);
	if (mlist[0] != 'Y') {
		log("Aborted.");
		writes("Aborted.");
		return;
	}
	sprintf(mlist, "%s/%s", MEMLIST, conf);
	if (unlink(mlist) < 0) {
		log("Error %s unlinking %s", errno, mlist);
		writes("Can't remove the membership list.");
	}
}

isrconf(rconf)
char *rconf; {
	char line[256];
	FILE *fp;
	
	sprintf(line, "%s/%s", MEMLIST, rconf);
	if ((fp = fopen(line, "r")) == (FILE *) 0)
		return 0;
	fclose(fp);
	return 1;
}