
char version[]={"$VER: UUZMAIL V1.1a (" __DATE__ ")"};

#include <stdio.h>
#include <string.h>
#include <time.h>

FILE *config,*zpuffer,*mbfile,*temp;
char mynode[32];
char filearray[8192];

char buffer[256];

void clean(char *s)
{
	while(*s && *s!='\r' && *s!='\n') s++;
	*s=0;
}

char currentabs[256];
char absender[256];
char betreff[256];

long aliasnum(char *kiste)
{
	char al[256];
	FILE *alf;
	long alnum;
	char *p=kiste;

	while(*p && *p!=32) p++;
	*p=0;

	alf=fopen("UULIB:aliases","r");
	if(alf) {
		while(fgets(al,256,alf)) {
			clean(al);
			if(al[0]=='a' && al[1]=='l' && al[10]==':') { /* ist ein alias */
				if(!strcmp(kiste,&al[12])) {
					fclose(alf);
					stch_l(&al[2],&alnum);
					return(alnum);
				}
			}
		}
		fclose(alf);
	}
	alf=fopen("UUCP:gate.aliascount","r");
	if(alf) {
		fgets(al,32,alf);
		fclose(alf);
		alnum=atoi(al);
	} else alnum=0;
	alf=fopen("UULIB:aliases","a");
	if(!alf) {
		printf("FEHLER: UULIB:aliases nicht beschreibbar!\n");
		exit(20);
	}
	fprintf(alf,"al%08lx: %s\n",alnum,kiste);
	fclose(alf);
	alf=fopen("UUCP:gate.aliascount","w");
	fprintf(alf,"%ld\n",alnum+1);
	fclose(alf);
	return(alnum);
}

char oldkiste[256];
void makeabsender(char *s)
{
	char *ap=absender;

	strcpy(oldkiste,s);
	while(*s) {
		if(*s==32) break;
		if(*s=='@') *s='%';
/*		if(isupper(*s)) {
			*ap++='\\';
		}*/
		*ap++=toupper(*s);
		s++;
	}
	*ap=0;
	strcat(absender,"@");
	strcat(absender,mynode);
	strcat(absender,".ZER");
	if(strlen(absender)>38) {
		sprintf(absender,"AL%08lX@%s.ZER",aliasnum(oldkiste),mynode);
	}
}
char datebuff[12];
char *makedate(void)
{
	char ar[6];

	utunpk(time(0),ar);
	sprintf(datebuff,"%02ld%02ld%02ld%02ld%02ld",
		(long)ar[0]+70,
		(long)ar[1],
		(long)ar[2],
		(long)ar[3],
		(long)ar[4]);
	return(datebuff);
}

void sendmail(char *name)
{
	long size;
	int c;
	char *np=name;

	while(*np && *np!=':') np++;
	np++;

	makeabsender(currentabs);
	temp=fopen("RAM:uutemp","r");
	if(!temp) {
		printf("FEHLER: uutemp nicht lesbar?!\n");
		exit(20);
	}
	fseek(temp,0,2);
	size=ftell(temp);
	fseek(temp,0,0);
	fprintf(zpuffer,"%s\r\n",np);
	fprintf(zpuffer,"%s\r\n",betreff);
	fprintf(zpuffer,"%s\r\n",absender);
	fprintf(zpuffer,"%s\r\n",makedate());
	fprintf(zpuffer,"\r\n");
	fprintf(zpuffer,(size&1)?"%c%8lX@%s\r\n":"%c%8lx@%s\r\n",'A'+rand()%50,time(0),mynode);
	fprintf(zpuffer,"T\r\n");
	fprintf(zpuffer," %ld\r\n",size);
	for(c=0; c<size; c++) fputc(fgetc(temp),zpuffer);
	fclose(temp);
}

void scanmb(char *name)
{
	long foundrepto;

	strupr(name);
	if(!(mbfile=fopen(name,"r"))) {
		printf("FEHLER: Mailbox %s nicht lesbar\n",name);
		return;
	}
	fgets(buffer,256,mbfile); clean(buffer);
	for(;;) {
		foundrepto=0;
		printf("\t%s\n",buffer); temp=fopen("RAM:uutemp","w"); fprintf(temp,"%s\r\n",buffer);
		strcpy(betreff,"--");
		while(fgets(buffer,256,mbfile)) {
			clean(buffer);
			if(!strncmp(buffer,"From ",5)) break; /* neue mail */
			if(!strncmp(buffer,"Reply-To:",9)) { strcpy(currentabs,&buffer[10]); foundrepto=1; }
			if(!foundrepto && !strncmp(buffer,"From:",5)) strcpy(currentabs,&buffer[6]);
			if(!strncmp(buffer,"Subject:",8)) strncpy(betreff,&buffer[9],39);
			fprintf(temp,"%s\r\n",buffer);
			buffer[0]=0;
		}
		fclose(temp);
		betreff[39]=0;
		sendmail(name);
		if(strncmp(buffer,"From ",5)) break;
	}
	fclose(mbfile);
}

void main(int argc, char **argv)
{
	char *p;

	printf("%s\n",&version[6]);
	if(argc!=2) {
		printf("Aufruf: UUZMAIL <puffer>\n");
		exit(5);
	}

	config=fopen("UUCP:gate.config","r");
	if(!config) {
		printf("Fehler: UUCP:gate.config nicht lesbar!\n");
		exit(10);
	}
	fgets(mynode,32,config); clean(mynode);
	printf("Gatewayname: %s\n",mynode);

	zpuffer=fopen(argv[1],"w");
	if(!zpuffer) {
		printf("Fehler: %s nicht beschreibbar!\n",argv[1]);
		exit(10);
	}

	printf("Untersuche UUMAIL:\n");
	getfnl("UUMAIL:#?",filearray,8192,0);
	p=filearray;

	while(*p) {
		printf("User %s...\n",p);
		scanmb(p);
		while(*p++);
	}
	printf("ok\n");
}
