/*
	ZUU
	---
	Konvertiert Zerberus-Puffer nach UUCP

	Aufruf:

	ZUU <zerberus-puffer>
	Im Verzeichnis UUCP: muss das File gate.config vorhanden sein
*/

char version[]={"$VER: ZUU V1.0c (" __DATE__ ")"};

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

char dest[256];
char betreff[256];
char absender[256],absender2[256],*abssys,domain[256];
char buffer[256],buffer2[256];

FILE *config,*zpuffer,*temp;

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

void convert(char *s)
{
	char *p=s;

	while(*s) {
		if(*s=='\\') { *p++=s[1]; s++; }
		else *p++=tolower(*s);
		s++;
	}
}

void convbytes(FILE *f1,FILE *f2,long len)
{
	int c,ch;

	for(c=0; c<len; c++) {
		ch=fgetc(f1);
		switch(ch) {
			case '\r': continue;
			case 132: fputc('a',f2); fputc('e',f2); continue;
			case 142: fputc('A',f2); fputc('e',f2); continue;
			case 148: fputc('o',f2); fputc('e',f2); continue;
			case 153: fputc('O',f2); fputc('e',f2); continue;
			case 154: fputc('U',f2); fputc('e',f2); continue;
			case 129: fputc('u',f2); fputc('e',f2); continue;
			case 225: fputc('s',f2); fputc('s',f2); continue;
			default: fputc(ch,f2); continue;
		}
	}
}

char *getdomain(char *name)
{
	FILE *f=fopen("UUCP:gate.domains","r");
	char *p;

	if(!f) {
		printf("WARNUNG: UUCP:gate.domains nicht lesbar\n");
		sprintf(domain,"%s.zer.sub.org",name);
		return(domain);
	}
	while(fgets(domain,256,f)) {
		clean(p=domain);
		while(*p && *p!=' ') p++;
		*p++=0;
		if(!stricmp(name,domain)) { fclose(f); return(p); }
	}
	fclose(f);
	sprintf(domain,"%s.zer.sub.org",name);
	return(domain);
}

void putbrett(void)
{
	char *p;

	/* zuerst newsgroup finden */
	fseek(config,0,0); fgets(buffer,256,config); /* mynode ueberspringen */

	for(;;) {
		if(!fgets(buffer,256,config)) {
			printf("WARNUNG: Keine zugewiesene Newsgroup gefunden\n");
			return;
		}
		clean(buffer); p=buffer;
		while(*p && *p!=' ') p++;
		if(!*p) {
			printf("FEHLER: Syntaxfehler in gate.config\n");
			exit(20);
		}
		*p++=0;
		if(!strcmp(p,dest)) break;
	}
	printf("Newsgroup: %s\n",buffer);
	strcpy(absender2,absender);
	convert(absender);
	temp=fopen("ram:uutemp2","w");
	if(!temp) {
		printf("ERROR: kann RAM:uutemp2 nicht öffnen\n");
		exit(10);
	}
	fprintf(temp,"Newsgroups: %s\nSubject: %s\nReply-To: %s@%s\n",buffer,betreff,absender,getdomain(abssys));
	fclose(temp);

	sprintf(buffer2,"POSTNEWS <ram:uutemp -f %s -r %s -R ram:uutemp2",
		absender,absender2);
	printf("%s\n",buffer2);
	Execute(buffer2,0,0);
}

void putmail(void)
{
	char *p=dest;

	convert(dest);
	strcpy(absender2,absender);
	convert(absender);
	p=&p[strlen(p)-1];
	while(p!=dest) {
		if(*p=='%') break;
		p--;
	}
	if(*p=='%') *p='@';
	sprintf(buffer2,"SENDMAIL <ram:uutemp -f %s -t %s -R %s -s \"%s\" -raw",
		absender,dest,absender2,betreff);
	printf("%s\n",buffer2);
	Execute(buffer2,0,0);	
}



void parsepuffer(void)
{
	long len;
	long typ;
	char *p;
	int c;

	if(!fgets(dest,256,zpuffer)) {
		printf("Alle Nachrichten im Puffer bearbeitet\n");
		unlink("ram:uutemp"); unlink("ram:uutemp2");
		exit(0);
	}

	clean(dest);
	fgets(betreff,256,zpuffer); clean(betreff);
	fgets(absender,256,zpuffer);
	fgets(buffer,256,zpuffer);
	fgets(buffer,256,zpuffer);
	fgets(buffer,256,zpuffer);
	fgets(buffer,256,zpuffer);
	typ=buffer[0];
	fgets(buffer,256,zpuffer);
	len=atoi(buffer);

	p=absender; clean(absender);
	while(*p && *p!='@') p++;
	*p++=0; abssys=p; convert(p); while(*p && *p!='.') p++; *p=0;

	printf("Dest: %s\nBetr: %s\nAbsn: %s\nLäng: %ld\nType: %lc\n",dest,betreff,absender,len,typ);
	if(typ=='B') { /* Binaermail konvertieren */
		strcpy(p=buffer,betreff);
		while(*p && *p!='/' && *p!=':' && *p!=' ') p++;
		*p=0;
		temp=fopen("RAM:uutemp2","w");
		if(!temp) {
			printf("ERROR: kann RAM:uutemp2 nicht öffnen\n");
			exit(10);
		}
		for(c=0; c<len; c++) fputc(fgetc(zpuffer),temp);
		fclose(temp);
		temp=fopen("RAM:uutemp","w");
		if(!temp) {
			printf("ERROR: kann RAM:uutemp nicht öffnen\n");
			exit(10);
		}
		fprintf(temp,"\n");
		fclose(temp);
		sprintf(buffer2,"UUENCODE <ram:uutemp2 >>ram:uutemp %s",buffer);
		printf("%s\n",buffer2);
		Execute(buffer2,0,0);
	}
	else {
		temp=fopen("RAM:uutemp","w");
		if(!temp) {
			printf("ERROR: kann RAM:uutemp nicht öffnen\n");
			exit(10);
		}
		fprintf(temp,"\n"); /* Leerzeile, nur so zur Sicherheit ;) */
		convbytes(zpuffer,temp,len);
		fclose(temp);
	}
	if(dest[0]=='/') putbrett(); else putmail();
	printf("-----------------\n");
}

void main(int argc, char **argv)
{
	printf("%s\n",&version[6]);
	if(argc!=2) {
		printf("Aufruf: ZUU <puffer>\n");
		exit(5);
	}
	config=fopen("UUCP:gate.config","r");
	if(!config) {
		printf("Fehler: UUCP:gate.config nicht lesbar!\n");
		exit(10);
	}
	zpuffer=fopen(argv[1],"r");
	if(!zpuffer) {
		printf("Fehler: %s läßt sich nicht öffnen!\n",argv[1]);
		exit(10);
	}
	setvbuf(zpuffer,0,_IOFBF,32768);

	for(;;) parsepuffer();
}
