/*
**		MBMMH - Make Message Header for MB.
**
**		Copyright (C) 1988
**		Akira Yamada(JA3JWI)
**		401, 1-18 UchiHiranomachi
**		Higashi-ku   Osaka   City
**
**		Any part of this program may be  reproduced,  transmitted,
**		transcribed, stored in a retrieval system,  or translated
**		into any language or computer language, in any form or by
**		any  means,   electonic,  mecahnical,  magnetic,  optical,
**		chemical, manual or otherwise,  without  the prior witten
**		permission of the author.
**
**	Format of the Forwarding Header's
**
**	[1] Header's must start with the "R:".
**	[2] Forwardint/Posting Date/Time point next form's.
**	    R:YYMMDD[/]HHmm[a-zA-Z.*]
**	    last option is a mean time character[s].
**	[3] BBS_CALL_SIGN point next form.
**	    @[:]BBS_CALL_SIGN
**	[4] Message_Number(option) point one of those form's.
**	    NNNNN@
**	    #[:]NNNNN (NNNNN is a integer)
**
*/

#include "mb.h"
#include "mbexp.h"
#include <sys/types.h>
#include <sys/stat.h>

#define DATE_LEN   6 + 1
#define YEAR_LEN   2 + 1
#define MONTH_LEN  2 + 1
#define DAY_LEN    2 + 1
#define TIME_LEN   7 + 4
#define HOUR_LEN   2 + 1
#define MIN_LEN    2 + 1
#define SEC_LEN    2 + 1

#define BID_LEN   BIDSIZ + 1
#define MSG_ID    80 + 1
#define PATH_LEN  1024			/* AY-880527 */ 
#define SBJ_LEN   MSG_ID
#define RCVBY_LEN MSG_ID

extern int errno;

int have_header;		/* AY-880910 */
char *strchr(), *strrchr();
char   pathlist[PATH_LEN];

static char
rcvby[RCVBY_LEN], from[ln_call + 15],
to[ln_call + 15], msgdate[DATE_LEN], msg_id[MSG_ID], msgtime[TIME_LEN];


mmhinit()
{

	msg_id[0] = '\0';

/*
	curtim();
*/

	unbl(from, port->mmhs->from, ln_call);
	strlwr(from);
	unbl(pathlist, cport->user->call, ln_call);
	unbl(to, port->mmhs->to, ln_call);
	strlwr(to);
	unbl(rcvby, cport->user->call, ln_call);
	strlwr(rcvby);

/*        itoa((int)port->mmhs->number, msg_id, 10);       AY-880115 */
        sprintf(msg_id, "%u",port->mmhs->number ) ;    /* Nov14,89 */

	unbl(msgdate, port->mmhs->date, ln_date);
	unbl(msgtime, port->mmhs->time, ln_time);	/* AY-880115 */
	strcat(msgtime, mean_time);
}

mmh(in, pflag)
FILE *in;
int pflag;     /* output header if true */
{
char linebuf[linelen];		/* AY-880524 */

	mmhinit();

	have_header = 0;

	if (fgets(linebuf, linelen, in) == NULL) return; 
/*
**	Skip the Message Header's
*/
	while(true) {
		if (isstdhdr(linebuf)) {
			have_header++;
			linebuf[0] = '\0';	/* AY-881123 */
		} else
			break;
		if (fgets(linebuf, linelen, in) == NULL)
			break;
	}
	strlwr(pathlist);
/*
**	Set the Message Header's information, if need.
*/
	if (!pflag) {
		strncpy(port->mmhs->date, msgdate, ln_date);
		strncpy(port->mmhs->time, msgtime, ln_time);
		if (iskanjihdr()) port->mmhs->unu3 = 1;
		return; /* Ok back to the caller */
	}

	pgst(NULL);		/* AY-880910 */
	printhdr(pflag);
	outstr(linebuf); pgck();
}

printhdr(pflag)
int pflag;
{
static char   *month[] = { 
	"",   "Jan","Feb","Mar","Apr","May","Jun",
	"Jul","Aug","Sep","Oct","Nov","Dec" };

static char   *week[] = { 
	"Sun","Mon","Tue","Wed","Thu","Fri","Sat" };
register char *charmonth, *chrweek;
char   buf[BUFSIZ];

	int  i, y, m, d, hr, min, sec;

	y = hr = i = 0;
	y   = chr2int(msgdate, 0, 2);
	m   = chr2int(msgdate, 2, 2);
	d   = chr2int(msgdate, 4, 2);

	i = firstday(y, m) + (d % 7);
	if (--i >= 7)
		chrweek = week[i-7];
	else
		chrweek = week[i];
	charmonth = month[m];

	hr  = chr2int(msgtime, 0, 2);
	min = chr2int(msgtime, 2, 2);
	sec = 0;                       /* AY-871017 */

	sprintf(buf, "Received: by %s\n", rcvby);
	outstr(buf); pgck(); 

	sprintf(buf, "          %s %s %2d %02d:%02d:%02d 19%d",
    			chrweek, charmonth, d,  hr, min, sec, y);

	if (strlen(msgtime) > 4) {
		strcat(buf, " ");
		strcat(buf, &(msgtime[4]));
	}
	strcat(buf, "\n");
	outstr(buf); pgck(); 

	/* Well, I receive this ..... AY-881027 */
	if (strchr(pathlist, '!')) {
		unbl(tmp->scr, cport->user->call, ln_call);
		strlwr(tmp->scr);
		sprintf(buf, "Received: by %s\n", tmp->scr);
		outstr(buf); pgck(); 

		filestat(tmp->scr); 
		remnl(tmp->scr);
		sprintf(buf, "          %s %s\n", tmp->scr, mean_time);
		outstr(buf); pgck(); 
	}


	sprintf(buf, "From: %s\n", from);
	outstr(buf); pgck(); 

	unbl(tmp->scr, port->mmhs->bbs, ln_call);
	sprintf(buf, "To: %s", to);
	if (*tmp->scr) { /* AY-880515 */
		strcat(buf, "@");
		strlwr(tmp->scr);
		strcat(buf, tmp->scr);
	}
	strcat(buf, "\n");
	outstr(buf); pgck(); 

	if (port->mmhs->ext) {
		read_rec(mfl, port->mmhs->ext, (char *)mmes);
		strcpy(tmp->scr, "Cc:");
		for (i = 0; i < mmes->count; i++) {
			if (mmes->flag[i])
				strcat(tmp->scr, " ");
			else
				strcat(tmp->scr, " *");
			unbl(buf, mmes->call[i], ln_call);
			strlwr(buf);
			strcat(tmp->scr, buf);
		}
		strcat(tmp->scr, "\n");
		outstr(tmp->scr); pgck();
	}

	sprintf(buf, "Subject: %s\n", port->mmhs->title);
	outstr(buf); pgck(); 

	sprintf(buf, "Message-Id: <%s%s.%s@%s>\n", msgdate, msgtime, msg_id, rcvby);
	outstr(buf); pgck(); 
        strcpy(buf,"") ; /* clear   3/14 */

	if (port->mmhs->unu2) {
		if (!(read_rec(mfl, port->mmhs->unu2, (char *)msgbid))) {
			strcpy(buf, "MB: Can't read bulletin-Id\n\r");
			debugmsg(buf);
		}

		if (msgbid->bid[0])
			sprintf(buf, "Bulletin-Id: %-12s", msgbid->bid);
		if (msgbid->domain[0]) {
			strcat(buf, "  Address: ");
			strcat(buf, msgbid->domain);
		}
		strcat(buf, "\n");
		outstr(buf); pgck();
	}

	if (strchr(pathlist, '!')) {
		outstr("Path: ");
		outstr(pathlist); 
		outstr("\n"); pgck(); 
	}

	outstr("\n"); pgck(); 

	return (i);
}

chr2int(str, ofset, cnt)
char str[];
int  ofset, cnt;
{
char buf[BUFSIZ];

	if (strlen(str) < ofset) return 0;

	unbl(buf, &str[ofset], cnt);
	return(atoi(buf));
}

#define julian(y) ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))

firstday(year, m)
int year, m;
{
	int startday;
	static int first_day[] = {
		0, 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 	};

	year += 1899;
	startday = year + (year / 4) - (year / 100)
	    + (year / 400) + first_day[m] + 1;
	if (m > 2 && julian(++year))
		return (++startday % 7);
	else
		return (startday % 7);
}

/*
 * Is this a header?
 */
isstdhdr(s)
char *s;
{
register char *ptr;
register int msgnum, wk, bbs;
char work[MSG_ID];

    msgnum = bbs = 0;

	/* If this isn't std header, so rtn */
        if (strlen(s) > 80 ) return (0) ;
        if (strncmp(s, "R:", 2))
		return (0);

        if (*(s+8) != '/')  return (0) ;
        for (ptr = s+2, wk = 0 ; wk < 11 ;ptr++, wk++) {
                if (!isdigit (*ptr))
                        if (*ptr != '/')    return (0) ;
        }
	unbl(msgdate, (s+2), 6);
	unbl(msgtime, (s+9), 4);
	switch(*(s+13)) {
        case 'i':
        case 'I':
		strcat(msgtime, "JST"); break;
	case 'z':
	case 'Z':
		strcat(msgtime, "GMT"); break;
	default:
		unbl(msgtime, (s+9), sizeof(msgtime)); break;
	}

        ptr = strchr(s, ' ')  ;
        while (*ptr) {
                switch (*ptr) {
                        case '#':   /* #[space]message number */
                              ptr++;
                              if ((*ptr is ':') or (*ptr is ' ')) ptr++ ;
                              unbl(work, ptr, MSG_ID);
                              if (num(work)) {
                                 unbl(msg_id, ptr, MSG_ID);
                                 msgnum++;
                              }
                              ptr = strchr (ptr, ' ') ;
                              break ;
                         case '[':
                              ptr = strchr (ptr, ']') ;
                              break ;
                         case '@':
                              /* bbs = 1; */
                              if (isdigit((int) (*(ptr - 1)))) { /* Msg_Number@Call */
                                  msgnum++;
                                  *ptr = '\0';
                                  unbl(msg_id, (strrchr(s, ' ') + 1), MSG_ID);
                                  *ptr = '@';
                              }
                              ptr++;                          /* AY-880223 */
                              if (*ptr == ':') ptr++;
                              pcall(work, ptr);               /* AY-881122 */
                              if ( iscall(work)) {
                                unbl(rcvby, work, ln_call);     /* AY-881122 */
                              /*   if (*rcvby == '\0') return (0);  AY-881122 */
                                strcat(pathlist, "!");
                                strlwr(rcvby);
                                strcat(pathlist, rcvby);
                                bbs = 1;
                              }
                              ptr = strchr (ptr, ' ') ;
                              break ;
                         default :
                              ptr++; break ;
                }
	}
        if (!msgnum ) return (0);
        return (bbs) ;

}

filestat(daytime)
char *daytime;
{
struct stat sb;
char buf[80], *asctime();

	sprintf(buf, "%s%u", msgdir, port->mmhs->number);
#if	(XENIX|UNIX|BSD)
	if (stat(buf, &sb) == -1)
		syserr("MB: Can't get status", errno);
#else
	if (stat(buf, &sb) == -1)
		exit(1);
#endif
	if (matchn(mean_time, "GMT", 3))
		strcpy(daytime, asctime(gmtime(&sb.st_ctime)));
	else
		strcpy(daytime, asctime(localtime(&sb.st_ctime)));
}

/*
**	Is this mail has kanji header?
*/

iskanjihdr() /* AY-880201 */
{
register char *p;
register int i;

	for (p = port->mmhs->title, i = 0; *p && i < mhtitl; p++, i++) {
		if (*p & 0x80)
			return (1);
		if (*p == 0x1b)		/* Can't put ESC at Header */
			return (1);
	}
	return (0);
}

char *skipsp(p)
char *p;
{
	while(*p) {
		if(isspace((int)*p))
			++p;
		else
			break;
	}
	return p;
}
