V8/usr/src/cmd/upas/rfc822/to822.c

Compare this file to the similar file:
Show the results in this format:

#include <stdio.h>
#include <ctype.h>
#include "mail.h"
#include "header.h"
#include "string.h"

/* imports */
header hdrs[] = {
	HEADER("Date:"),
	HEADER("From:"),
	HEADER("To:"),
	HEADER("Received:"),
	HEADER("Message-Id:"),
	HEADER("Status:"),
	HEADER("")
};
#define datehdr hdrs[0]
#define fromhdr hdrs[1]
#define tohdr hdrs[2]
#define receivedhdr hdrs[3]
#define idhdr hdrs[4]
#define statushdr hdrs[5]

/* imported */
extern void getheader();
extern void printheaders();
extern void addheader();
extern char *fgets();
extern int getunix();
extern void initgetunix();

/* predeclared */
char *gets();
static char *convertdate();
extern char *convertaddr();

extern void
to822(fp, hostname)
FILE *fp;		/* file to output to */
char *hostname;		/* name of our host */
{
	char buf[FROMLINESIZE];
	char from[FROMLINESIZE];
	char date[DATESIZE];

	/* get UNIX from line */
	if (fgets(buf, sizeof buf, stdin) == NULL)
		exit(1);

	/* first line had better be a from */
	if (getunix(buf, from, date) == 0)
		exit(1);

	/* get any pre-existing RFC822 header lines */
	getheader();

	/* output new message */
	fprintf(fp, "%s %s.%s\n", fromhdr.name, convertaddr(from), hostname);
	fprintf(fp, "%s %s\n\n", datehdr.name, convertdate(date));
	printheaders(fp);
	while (gets(buf) != NULL)
		fprintf(fp, "%s\n", buf);
}

/* juggle date fields */
static char *
convertdate(date)
char *date;
{
	static char ndate[DATESIZE];
	char *field[6];
	char *sp;
	int i;

	sp = date;
	/* parse the date into fields */
	for (i = 0; i < 6; i++) {		
		while (isspace(*sp) || *sp == ',' || *sp == '-')
			*sp++ = '\0';
		field[i] = sp;
		while (!isspace(*sp) && *sp != ',' && *sp != '-' && *sp != '\0')
			sp++;
	}
	*sp = '\0';

	/* shuffle the fields into internet format */
	sprintf (ndate, "%s, %s %s %s %s %s", field[0], field[2], field[1],
		 field[4], field[5], field[3]);
	return ndate;
}

/*
 *	Convert from `bang' to `rfc822' format.
 */
extern char *
convertaddr(addr)
char *addr;
{
	static char buf[FROMLINESIZE];
	register int i=0;
	register char *sp;
	char *field[128];

	sp = field[i] = addr;
	while (*sp) {
		if (*sp == '!') {
			*sp = '\0';
			if (strcmp(field[i], "uucp") == 0) {
				/* the token 'uucp' stops the parsing */
				field[i] = ++sp;
				break;
			}
			field[++i] = ++sp;
		} else
			++sp;
	}
	strcpy(buf, field[i--]);
	if (i >= 0) {
		strcat(buf, "@");
		strcat(buf, field[i--]);
	}
	while (i >= 0) {
		strcat(buf, ".");
		strcat(buf, field[i--]);
	}
		
	return buf;
}