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 - metrics - download
Index: T h

⟦8728f5b2c⟧ TextFile

    Length: 1948 (0x79c)
    Types: TextFile
    Names: »header.c«

Derivation

└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦bfebc70e2⟧ »EurOpenD3/mail/sendmail-5.65b+IDA-1.4.3.tar.Z« 
        └─⟦f9e35cd84⟧ 
            └─⟦this⟧ »sendmail/ida/aux/header.c« 

TextFile

/*
**  HEADER -- Header line parser.
**  Copyright (c) 1985 Lennart Lovstrand
**  CIS Dept, Univ of Linkoping, Sweden
**
**  Use it, abuse it, but don't sell it.
**
**  Version of 14-Apr-85.
*/

#include <stdio.h>
#include <sys/types.h>
#include <strings.h>
#include <ctype.h>
#include "useful.h"

#define H_CC		"cc"
#define H_FROM		"from"
#define H_MESSAGE_ID	"message_id"
#define H_RETURN_PATH	"return-path"
#define H_TO		"to"
#define H_VIA		"via"

#define COMMA	','

#define MAKELC(C)	(isupper(C) ? tolower(C) : C)

#ifdef __STDC__
int iskey(const char *, const char *);
char * eat(char *, int);
char * extract_address(char *, char *);
#else /* !__STDC__ */
# define	const
int iskey();
char * eat();
char * extract_address();
#endif /* __STDC__ */

/*
 *	iskey: checks if the line is prefixed by
 *	the supplied keyword (immediately followed by
 *	a colon)
 */
iskey(key, line)
	const char *key, *line;
{
	for (; *key != NULL && *line != NULL; key++, line++)
		if (MAKELC(*key) != MAKELC(*line))
			break;

	return *key == NULL && *line == ':';
}

char *
eat(str, ch)
	char *str, ch;
{
	for(; *str == ch; str++);
	return str;
}

/*
 *	extract_address:
 *	finds and extracts the machine address part of an address field
 */

char *
extract_address(field, address)
	char *field, *address;
{
	char *address_start = address;

	while(*field && *field != COMMA && *field != '>')
		switch (*field) {
			case '<':
				return extract_address(field, address_start);
			case '(':
				while (*field && *field != ')');
					field++;
				break;
			case '"':
				do
					*address++ = *field++;
				while (*field && *field != '"');
				if (*field)
					*address++ = *field++;
				break;
			case ' ':
				*address++ = *field++;
				field = eat(field, ' ');
				break;
			case '\\':
				*address++ = *field++;
				/* fall through */
			default:
				*address++ = *field++;
		}
	*address = NULL;
	if (*field)
		return index(field, COMMA)+1;
	else
		return field;
}