/*
	UUZ
	---
	Konvertiert Amiga-UUCP-Newsgroups ins Zerberus-Format

	Aufruf:

	UUZ <zerberus-puffer>

	Im Verzeichnis UUCP: muss das File gate.config vorhanden sein
*/

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

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

FILE *config,*zpuffer;
FILE *newsfile,*newsinfo;

char mynode[32];
char configline[256];

char buffer[1024],buffer2[256];

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

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

char found[1024];
char *scanheader(char *t)
{
	fseek(newsfile,0,0);

	while(fgets(found,1024,newsfile)) {
		clean(found);
		if(!found[0]) return(0);
		if(!strncmp(found,t,strlen(t))) return(&found[strlen(t)+1]);
	}
	return(0);
}

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 oldabsender[256];
void makeabsender(char *s)
{
	char *ap=absender;

	strcpy(oldabsender,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)>39) { /* alias anlegen */
		sprintf(absender,"AL%08lX@%s.ZER",aliasnum(oldabsender),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 convertuudate(char *ds)
{
	char *p=ds,*p2;
	long m;
	char bf[32];

/* Wochentag abschneiden */
	while(*p && *p!=',') p++;
	if(*p==',') ds=&p[1];

/* Zeit finden */
	p=ds;
	while(*p && p[3] && !(*p==':' && p[3]==':')) p++;
	if(*p==':') {
		datebuff[8]=p[1];
		datebuff[9]=p[2];
		datebuff[6]=p[-2];
		datebuff[7]=p[-1];
	}

/* Datum finden */

	p=ds;
	m=0; /* kein Monat */
	while(*p) {
		if(!strncmp(p,"Jan",3)) { m=1; break; }
		if(!strncmp(p,"Feb",3)) { m=2; break; }
		if(!strncmp(p,"Mar",3)) { m=3; break; }
		if(!strncmp(p,"Apr",3)) { m=4; break; }
		if(!strncmp(p,"May",3)) { m=5; break; }
		if(!strncmp(p,"Jun",3)) { m=6; break; }
		if(!strncmp(p,"Jul",3)) { m=7; break; }
		if(!strncmp(p,"Aug",3)) { m=8; break; }
		if(!strncmp(p,"Sep",3)) { m=9; break; }
		if(!strncmp(p,"Oct",3)) { m=10; break; }
		if(!strncmp(p,"Nov",3)) { m=11; break; }
		if(!strncmp(p,"Dec",3)) { m=12; break; }
		p++;
	}
	if(m) {
		sprintf(bf,"%02ld",m);
		datebuff[2]=bf[0];
		datebuff[3]=bf[1];
		p2=&p[3];
		while(*p2 && !isdigit(*p2)) p2++;
		m=atoi(p2);
		if(m>1970) m-=1900;

		sprintf(bf,"%02ld",m);
		datebuff[0]=bf[0];
		datebuff[1]=bf[1];
		
		p--;
		while(p!=ds && *p==' ') p--;
		if(p!=ds) {
			while(p!=ds && isdigit(*p)) p--;
			p++;
			sprintf(bf,"%02ld",atoi(p));
			datebuff[4]=bf[0];
			datebuff[5]=bf[1];
		}
	}

}

#define ISBUFFER(s) !strncmp(buffer,s,strlen(s))

void sendmsg(char *dest)
{
	int len=0;
	int isstillheader=1,docopy;
	FILE *tmp=fopen("RAM:uumsgtmp","w");
	int c;

	if(!tmp) {
		printf("FEHLER: ram:uumsgtmp nicht beschreibbar\n");
		exit(10);
	}

	fseek(newsfile,0,0);
	while(fgets(buffer,1024,newsfile)) {
		clean(buffer); 
		if(!buffer[0]) isstillheader=0;
		if(isstillheader) {
			docopy=0;
			if(ISBUFFER("Newsgroups:")) docopy=1;
			if(ISBUFFER("Subject:")) docopy=1;
			if(ISBUFFER("From:")) docopy=1;
			if(ISBUFFER("Organisation:")) docopy=1;
			if(ISBUFFER("Date:")) docopy=1;
			if(ISBUFFER("Newsgroups:")) docopy=1;
			if(ISBUFFER("Keywords:")) docopy=1;
			if(ISBUFFER("Summary:")) docopy=1;
			if(ISBUFFER("X-")) docopy=1;
		}
		else docopy=1;
		if(docopy) fprintf(tmp,"%s\r\n",buffer);
	}
	fflush(tmp); len=ftell(tmp); fclose(tmp);
	fprintf(zpuffer,"%s\r\n",dest);
	fprintf(zpuffer,"%s\r\n",betreff);
	fprintf(zpuffer,"%s\r\n",absender);
	fprintf(zpuffer,"%s\r\n",datebuff);
	fprintf(zpuffer,"\r\n");
	fprintf(zpuffer,(len&1)?"%c%8lX@%s\r\n":"%c%8lx@%s\r\n",'A'+rand()%55,time(0),mynode);
	fprintf(zpuffer,"T\r\n");
	fprintf(zpuffer," %ld\r\n",len);

	tmp=fopen("RAM:uumsgtmp","r");if(!tmp) exit(-1);
	for(c=0; c<len; c++) fputc(fgetc(tmp),zpuffer);
	fclose(tmp);
}

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

	printf("%s\n",&version[6]);
	if(argc!=2) {
		printf("Aufruf: UUZ <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);
	}

	for(;;) {
		fgets(configline,256,config); clean(configline);
		p=configline;
		if(!*p) break;
		while(*p && *p!=32) p++;
		if(!*p) {
			printf("Config-Syntax-Fehler: %s\n",configline);
			exit(10);
		}
		*p++=0;

		printf("Newsgroup: %s\n",configline);
		sprintf(s=buffer,"UUNEWS:%s/",configline);
		while(*s) {
			if(*s=='.') *s='/';
			s++;
		}
		if(chdir(buffer)) {
			printf("-- Newsgroup existiert nicht\n");
			continue;
		}
		for(c=1; ;c++) {
			printf("%03ld: ",c);
			sprintf(buffer,"%ld",c);
			if(!(newsfile=fopen(buffer,"r"))) {
				printf("-- keine weitere Nachrichten\n");
				break;
			}
			
			sprintf(absender,"UNKNOWN@%s.ZER",mynode);
			strcpy(betreff,"--");

			makedate();
			if(s=scanheader("Subject:")) strncpy(betreff,s,38); betreff[38]=0;
			if(s=scanheader("From:")) makeabsender(s);
			if(s=scanheader("Reply-to:")) makeabsender(s);
			if(s=scanheader("Date:")) convertuudate(s);

			printf("\"%s\", \"%s\"\n",absender,betreff);
			if(strncmp(betreff,"cancel <",8) && strncmp(betreff,"cmsg cancel <",13)) sendmsg(p);
			fclose(newsfile);
		}

	}
	printf("ok\n");
	exit(0);
}
