|
|
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 a
Length: 4735 (0x127f)
Types: TextFile
Names: »aliaslib.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/elm/src/aliaslib.c«
/** aliaslib.c **/
/** Library of functions dealing with the alias system...
(C) Copyright 1986 Dave Taylor
**/
#include "headers.h"
char *expand_group(), *get_alias_address(), *expand_system();
char *get_token(), *strpbrk();
long lseek();
char *get_alias_address(name, mailing, depth)
char *name;
int mailing, depth;
{
/** return the line from either datafile that corresponds
to the specified name. If 'mailing' specified, then
fully expand group names. Depth specifies the nesting
depth - the routine should always initially be called
with this equal 0. Returns NULL if not found **/
static char buffer[VERY_LONG_STRING];
int loc;
if (strlen(name) == 0)
return( (char *) NULL);
if (! read_in_aliases) {
read_alias_files();
read_in_aliases = TRUE;
}
if (user_files)
if ((loc = find(name, user_hash_table, MAX_UALIASES)) >= 0) {
lseek(user_data, user_hash_table[loc].byte, 0L);
get_line(user_data, buffer);
if (buffer[0] == '!' && mailing)
return(expand_group(buffer, depth));
else if (strpbrk(buffer,"!@:") != NULL) /* has a hostname */
#ifdef DONT_TOUCH_ADDRESSES
return((char *) buffer);
#else
return(expand_system(buffer, TRUE));
#endif
else
return((char *) buffer);
}
if (system_files)
if ((loc = find(name, system_hash_table, MAX_SALIASES)) >= 0) {
lseek(system_data, system_hash_table[loc].byte, 0L);
get_line(system_data, buffer);
if (buffer[0] == '!' && mailing)
return(expand_group(buffer, depth));
else if (strpbrk(buffer,"!@:") != NULL) /* has a hostname */
#ifdef DONT_TOUCH_ADDRESSES
return((char *) buffer);
#else
return(expand_system(buffer, TRUE));
#endif
else
return((char *) buffer);
}
return( (char *) NULL);
}
char *expand_system(buffer, show_errors)
char *buffer;
int show_errors;
{
/** This routine will check the first machine name in the given path
(if any) and expand it out if it is an alias...if not, it will
return what it was given. If show_errors is false, it won't
display errors encountered...
**/
dprint2(6, "expand_system(%s, show-errors=%s)\n", buffer,
onoff(show_errors));
findnode(buffer, show_errors);
return( (char *) buffer);
}
char *expand_group(members, depth)
char *members;
int depth;
{
/** Given a group of names separated by commas, this routine
will return a string that is the full addresses of each
member separated by spaces. Depth is an internal counter
that keeps track of the depth of nesting that the routine
is in...it's for the get_token routine! **/
static char buffer[VERY_LONG_STRING];
char buf[LONG_STRING], *word, *address, *bufptr;
char *strcpy();
strcpy(buf, members); /* parameter safety! */
if (depth == 0) buffer[0] = '\0'; /* nothing in yet! */
bufptr = (char *) buf; /* grab the address */
depth++; /* one deeper! */
while ((word = get_token(bufptr, "!, ", depth)) != NULL) {
if ((address = get_alias_address(word, 1, depth)) == NULL) {
if (! valid_name(word)) {
dprint2(3, "Encountered illegal address %s (%s)\n",
word, "expand_group");
error1("%s is an illegal address!", word);
return( (char *) NULL);
}
else if (strcmp(buffer, word) != 0)
sprintf(buffer, "%s%s%s", buffer,
(strlen(buffer) > 0)? ", ":"", word);
}
else if (strcmp(buffer, address) != 0)
sprintf(buffer,"%s%s%s", buffer,
(strlen(buffer) > 0)? ", ":"", address);
bufptr = NULL;
}
return( (char *) buffer);
}
int
find(word, table, size)
char *word;
struct alias_rec table[];
int size;
{
/** find word and return loc, or -1 **/
register int loc;
if (strlen(word) > 20) {
dprint2(3, "Too long alias name entered [%s] (%s)\n", word, "find");
error1("Bad alias name: %s. Too long.\n", word);
return(-1);
}
loc = hash_it(word, size);
while (strcmp(word, table[loc].name) != 0) {
if (table[loc].name[0] == '\0')
return(-1);
loc = (loc + 1) % size;
}
return(loc);
}
int
hash_it(string, table_size)
char *string;
int table_size;
{
/** compute the hash function of the string, returning
it (mod table_size) **/
register int i, sum = 0;
for (i=0; string[i] != '\0'; i++)
sum += (int) string[i];
return(sum % table_size);
}
get_line(fd, buffer)
int fd;
char *buffer;
{
/* Read from file fd. End read upon reading either
EOF or '\n' character (this is where it differs
from a straight 'read' command!) */
register int i= 0;
char ch;
while (read(fd, &ch, 1) > 0)
if (ch == '\n' || ch == '\r') {
buffer[i] = 0;
return;
}
else
buffer[i++] = ch;
}