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 a

⟦375deb295⟧ TextFile

    Length: 3382 (0xd36)
    Types: TextFile
    Names: »alias.c«

Derivation

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

TextFile

#include <stdio.h>
#include <ctype.h>
#include "sysdep.h"

#ifdef SENDMAIL
#include "mem.h"
#include "macros.h"
#include "lists.h"
#include "alias.h"
#include "sort.h"

extern	addr acskip();

#define	alskip acskip

extern	struct list AliasList;

static struct alias aka;
static FILE *alf = NULL;
static FILE *bindf = NULL;
static char line[BUFSIZ];

setalent()

{
	if (alf == NULL) {
		alf = fopen(ALIASFILE, "r");
		if (alf == NULL) {
			perr(ALIASFILE);
			goodbye(1);
		}
	}
	rewind(alf);
	if (bindf == NULL) {
		bindf = fopen(ALBIND, "r");
		if (bindf == NULL) {
			perr(ALBIND);
			goodbye(1);
		}
	}
	rewind(bindf);
	return;
}

endalent()

{
	if (alf != NULL) {
		(void) fclose(alf);
		alf = NULL;
	}
	if (bindf != NULL) {
		(void) fclose(bindf);
		bindf = NULL;
	}
	return;
}

static
int getch()

{
	int c;

	for (;;) {
		c = getc(alf);
		if (c == '#') {
			while ((c = getc(alf)) != '\n' && c != EOF)
				;
			return c;
		}
		break;
	}
	return c;
}

struct alias *
getalent()

{
	int c;
	register int i = 0;
	register struct list *q;
	static char name[MEDIUM_BUF], address[LONG_BUF];
	flexaddr p, oldp;
	int quoteopen = 0;

	zerolist(&aka.al_addresses);
	zerolist(&aka.al_groups);
	zerolist(&aka.al_classes);
	zerolist(&aka.al_sigs);
	aka.al_name = (char *)0;
	while ((c = getch()) != EOF) {
		if (c == '\n')
			if (aka.al_name) {
				c = getch();
				if (!isspace(c) || c == '\n') {
					(void) ungetc(c, alf);
					break;
				}
				else
					continue;
			}
			else
				continue;
		if (isspace(c) && !quoteopen)
			continue;
		if (c == '"')
			quoteopen = !quoteopen;
		if (!aka.al_name) {
			if (c == ':') {
				name[i] = '\0';
				aka.al_name = name;
				i = 0;
			}
			else
				name[i++] = (char) c;
			continue;
		}
		if (c == ',' && i != 0) {
			address[i] = '\0';
			strlistadd(&aka.al_addresses, address);
			i = 0;
		}
		else if (c == ',' && i == 0)
			continue;
		else
			address[i++] = (char) c;
	}
	if (!aka.al_name)
		return (struct alias *) 0;
	address[i] = '\0';
	if (i > 0)
		strlistadd(&aka.al_addresses, address);
	sort_list(&aka.al_addresses, pstrcmp);
	/*
	 * Now get the group, class, and sig bindings
	 */
	p.p_cp = fgets(line, BUFSIZ, bindf);
	if (!p.p_cp) {
	   err1("getalent(): %s: unexpected EOF", ALBIND);
	   err1("getalent(): %s corrupted, gagging... returning 0", ALBIND);
	   return (struct alias *) 0;
	}
	p.p_ap = alskip(p.p_ap, ':');
	if (!eq(line, aka.al_name)) {
	   err("getalent(): alias name mismatch");
	   err1("getalent(): %s corrupted, gagging... returning 0", ALBIND);
	   return (struct alias *) 0;
	}
	(void) alskip(p.p_ap, '\n');
	oldp.p_ap = p.p_ap;
	q = &aka.al_groups;
	while( *p.p_cp && *p.p_cp != ':' ) {
		oldp.p_ap = p.p_ap;
		p.p_ap = alskip(p.p_ap,',');
		strlistadd(q, oldp.p_cp);
	}
	sort_list(q, pstrcmp);
	p.p_cp++;
	q = &aka.al_classes;
	while( *p.p_cp && *p.p_cp != ':' ) {
		oldp.p_ap = p.p_ap;
		p.p_ap = alskip(p.p_ap,',');
		strlistadd(q, oldp.p_cp);
	}
	sort_list(q, pstrcmp);
	p.p_cp++;
	q = &aka.al_sigs;
	while( *p.p_cp && *p.p_cp != ':' ) {
		oldp.p_ap = p.p_ap;
		p.p_ap = alskip(p.p_ap,',');
		strlistadd(q, oldp.p_cp);
	}
	sort_list(q, pstrcmp);
	return &aka;
}

struct alias *
getalnam(name)
char *name;

{
	int found;
	register int indx;

	indx = search_list(&AliasList, name, saliascmp, &found);
	if (found)
		return (struct alias *) AliasList.l_list[indx];
	return (struct alias *) 0;
}

#endif