
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include <proto/dos.h>

#include "lbio_lib.h"
#include "dos_lib.h"
#include "str_lib.h"

#include "cus.h"
#include "defines.h"
#include "rev.h"


void giveversioninfo(char *progname)
{
	strupr(progname);
	fprintf(stderr, "%s%s Release %s.%02d (%s) -- (re)spool SMTP mail%s\n"
					"%s(c) Copyright 1992 Ralf S. Engelschall, All Rights Reserved.\n"
					"%s(c) Copyright 1992 Cyvaned Systems, All Rights Reserved.\n",
					ANSICTL_BOLD_ON, progname, Version, Revision, Date, ANSICTL_NORMAL_DISPLAY,
					progname, progname );
	strlwr(progname);
	return;
}


void giveusage(char *progname)
{
	fprintf(stderr, "Usage: %s [-v] [-?] system\n", progname);
	return;
}


int mailinfo(char *caRCmndfile, char **cppAddr, char *cpAddr)
{
	FILE *fp = NULL;
	LB *lb = NULL;
	char *buf = NULL;
	long len;
	int rc;
	char **cpp;
	int nToken;
	char *cp;
	int i;

	if ((fp = fopen(caRCmndfile, "r")) == NULL)
		CU(FALSE);
	if (fseek(fp, 0L, SEEK_END) == -1L)
		CU(FALSE);
	if ((len = ftell(fp)) == -1L)
		CU(FALSE);
	if (fseek(fp, 0L, SEEK_SET) == -1L)
		CU(FALSE);
	if ((buf = (char *)malloc(len)) == NULL)
		CU(FALSE);
	if ((fread(buf, len, 1, fp) != 1) && ferror(fp))
		CU(FALSE);
	if ((lb = lbopen(buf, buf+len-1)) == NULL)
		CU(FALSE);

	do {
		if ((nToken = tokenize(&cpp, lb->lb_cpLnCur, lb->lb_wLnCur, " \t")) != 0) {
			if ( (stricmp(cpp[0], "C") == 0) && (stricmp(cpp[1], "rmail") == 0) && (nToken >= 3) ) {
				for (cp = cpAddr, i = 0; i < nToken-2; i++) {
					cppAddr[i] = cp;
					strcpy(cp, cpp[i+2]);
					cp += strlen(cp)+1;
				}
				cppAddr[i] = NULL;
				CU(TRUE);
			}
		}
	} while (lbseek(lb, 1, LBSEEK_CUR));

	rc = FALSE;

	CUS:
	if (lb)
		lbfree(lb);
	if (fp)
		fclose(fp);
	if (buf)
		free(buf);
	return rc;
}


static char caToAddr[1024];
static char *cpaToAddr[30];

int processfile(char *cpToDir, char *cpFromDir, char *file)
{
	FILE *fpFrom = NULL;
	FILE *fpTo = NULL;
	LB *lbFrom = NULL;
	char *cpFrombuf = NULL;
	long wFrom;

	char caToFile[RANGE_8BIT];
	char caLCmndfile[RANGE_8BIT];
	char caRDatafile[RANGE_8BIT];
	char caRCmndfile[RANGE_8BIT];
	char caFromUser[RANGE_6BIT];
	char caFromHost[RANGE_6BIT];
	char caFromAddr[RANGE_7BIT];
	char caEnv[50];
	char *cpEnv;
	int wSpoolSeq;

	char **cpp;
	int nToken;
	int i;
	int rc;


	/*	S D.brumucB03kq D.angleB03ks rse - D.brumucB03kq 0666
	      ^- mailfile
		S D.brumucX03kq X.angleX03kr rse - D.brumucX03kq 0666
	      ^- command file										*/

	sprintf(caLCmndfile, "%s%s", cpFromDir, file);
	if ((fpFrom = fopen(caLCmndfile, "r")) == NULL)
		CU(FALSE);
	if (fseek(fpFrom, 0L, SEEK_END) == -1L)
		CU(FALSE);
	if ((wFrom = ftell(fpFrom)) == -1L)
		CU(FALSE);
	if (fseek(fpFrom, 0L, SEEK_SET) == -1L)
		CU(FALSE);
	if ((cpFrombuf = (char *)malloc(wFrom)) == NULL)
		CU(FALSE);
	if ((fread(cpFrombuf, wFrom, 1, fpFrom) != 1) && ferror(fpFrom))
		CU(FALSE);
	if ((lbFrom = lbopen(cpFrombuf, cpFrombuf+wFrom-1)) == NULL)
		CU(FALSE);

	if (lbseek(lbFrom, 0, LBSEEK_SET) == NULL)
		CU(FALSE);
	if (tokenize(&cpp, lbFrom->lb_cpLnCur, lbFrom->lb_wLnCur, " \t") != 7)
		CU(FALSE);
	strcpy(caRDatafile, cpFromDir);
	strcpy(caRDatafile+strlen(caRDatafile), cpp[1]);

	if (lbseek(lbFrom, 1, LBSEEK_SET) == NULL)
		CU(FALSE);
	if (tokenize(&cpp, lbFrom->lb_cpLnCur, lbFrom->lb_wLnCur, " \t") != 7)
		CU(FALSE);
	strcpy(caRCmndfile, cpFromDir);
	strcpy(caRCmndfile+strlen(caRCmndfile), cpp[1]);

	printf(	"LOCAL_CMND_FILE  %s\n"
			"REMOTE_DATA_FILE %s\n"
			"REMOTE_CMND_FILE %s\n",
			caLCmndfile, caRDatafile, caRCmndfile);

	if (!exists(caRDatafile))
		CU(FALSE);
	if (!exists(caRCmndfile))
		CU(FALSE);

	if (!mailinfo(caRCmndfile, cpaToAddr, caToAddr))
		CU(FALSE);

	cpp = cpaToAddr;
	while (*cpp != NULL) {
		printf("RCPT_TO %s\n", *cpp);
		++cpp;
	}

	lbfree(lbFrom);
	lbFrom = NULL;
	fclose(fpFrom);
	fpFrom = NULL;
	free(cpFrombuf);
	cpFrombuf = NULL;


	/*	From rse Sat, 22 Feb 92 14:47:12 CET remote from angle
        ^^^^                                 ^^^^^^^^^^^
		[...]													 */

	if ((fpFrom = fopen(caRDatafile, "r")) == NULL)
		CU(FALSE);
	if (fseek(fpFrom, 0L, SEEK_END) == -1L)
		CU(FALSE);
	if ((wFrom = ftell(fpFrom)) == -1L)
		CU(FALSE);
	if (fseek(fpFrom, 0L, SEEK_SET) == -1L)
		CU(FALSE);
	if ((cpFrombuf = (char *)malloc(wFrom)) == NULL)
		CU(FALSE);
	if ((fread(cpFrombuf, wFrom, 1, fpFrom) != 1) && ferror(fpFrom))
		CU(FALSE);
	if ((lbFrom = lbopen(cpFrombuf, cpFrombuf+wFrom-1)) == NULL)
		CU(FALSE);

	if (lbseek(lbFrom, 0, LBSEEK_SET) == NULL)
		CU(FALSE);
	if ((nToken = tokenize(&cpp, lbFrom->lb_cpLnCur, lbFrom->lb_wLnCur, " \t")) == 0)
		CU(FALSE);

	for (i = 0; i < nToken; i++) {
		if ((strcmp(cpp[i], "From") == 0) && (i+1 < nToken))
			strcpy(caFromUser, cpp[1]);
		if ((strcmp(cpp[i], "remote") == 0) && (i+2 < nToken))
			if (strcmp(cpp[i+1], "from") == 0)
				strcpy(caFromHost, cpp[i+2]);
	}
	sprintf(caFromAddr, "%s!%s", caFromHost, caFromUser);

	printf("MAIL_FROM %s\n", caFromAddr);



	if ((cpEnv = getenv("SMTP.SENT.SEQ")) == NULL)
		wSpoolSeq = 0;
	else
		wSpoolSeq = atoi(cpEnv) + 1;
	sprintf(caEnv, "SMTP.SENT.SEQ=%d", wSpoolSeq);
	putenv(caEnv);

	sprintf(caToFile, "%sq%04d", cpToDir, wSpoolSeq);

	printf("SMTP_FILE %s\n", caToFile);



	if (lbseek(lbFrom, 1, LBSEEK_SET) == NULL)
		CU(FALSE);
	if ((fpTo = fopen(caToFile, "w")) == NULL)
		CU(FALSE);

	fprintf(fpTo, "MAIL FROM:<%s>\n", caFromAddr);
	cpp = cpaToAddr;
	while (*cpp != NULL) {
		fprintf(fpTo, "RCPT TO:<%s>\n", *cpp);
		++cpp;
	}
	fprintf(fpTo, "DATA\n");

	do {
		if (*(lbFrom->lb_cpLnCur) == '.' && lbFrom->lb_wLnCur == 1) {
			fprintf(fpTo, "..\n");
		}
		else {
			fwrite(lbFrom->lb_cpLnCur, lbFrom->lb_wLnCur, 1, fpTo);
			fprintf(fpTo, "\n");
		}
	} while (lbseek(lbFrom, 1, LBSEEK_CUR));

	fprintf(fpTo, ".\n");
	fclose(fpTo);
	fpTo = NULL;

	fclose(fpFrom);
	fpFrom = NULL;

	if (remove(caLCmndfile))
		CU(FALSE);
	if (remove(caRDatafile))
		CU(FALSE);
	if (remove(caRCmndfile))
		CU(FALSE);

	rc = TRUE;

	CUS:
	if (lbFrom)
		lbfree(lbFrom);
	if (fpFrom)
		fclose(fpFrom);
	if (fpTo)
		fclose(fpTo);
	if (cpFrombuf)
		free(cpFrombuf);
	return rc;
}

