/*************************************************************************
*
*    UMS_FidoFix v1.2
*    Fixes the date of the messages created by DLG and CNet
*    Modifies directly the message packet.
*
*    Author: Jean-Marc Xiume' 1996
*
*    History:
*    06-Feb-96        -Started the project.
*    10-Feb-96        -First version, with an output file.
*    11-Feb-96  v 1.0 -The date is now corrected within the packet.
*    18-Feb-96  v 1.1 -Checking of date length and MessageHeader
*                      consistence.
*    04-Mar-96         Distribution, with an english version.
*    09-Jun-96  v 1.2 -The "seadog" date format is reconised and fidofix
*                      only adds the missing "0" in the date instead of
*                      converting the whole thing to the normal format.
*                      Thanks to Andre Schenk for the tip !
*                     -Added date fix for CNet messages.
*
**************************************************************************/


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <exec/types.h>


/* Paket header (58 bytes) */

struct PKT
{
    short   O_Node;
    short   D_Node;
    short   Year;
    short   Month;
    short   Day;
    short   Hour;
    short   Minut;
    short   Second;
    short   Baud;
    short   P_Type;
    short   O_Net;
    short   D_Net;
    short   Prodcode;
    short   Serial;
    char    Pswrd[9];
    short   O_Zone;
    short   D_Zone;
};

/* Paked Message Header */
        
struct PKD
{
    short   O_Node;
    short   D_Node;
    short   O_Net;
    short   D_Net;
    short   Attribut;
    short   Cost;
    char    Date[22];
    char    To[36];
    char    From[36];
    char    Subject[72];
};


UBYTE *ver ="\0$VER: UMS_FidoFix 1.2 - J.M.Xiume' 09-Jun-1996";



/******************* Paquet header, write some informtion *******************/

void DoPaketHeader(FILE *fp)
{
    struct PKT Pkt; 
    UBYTE Pkth[58];

    fseek(fp,0,SEEK_SET);        
    
    if(fread(Pkth,58,1,fp))
    {
        Pkt.O_Node	=Pkth[0] +(Pkth[1]*256);
        Pkt.D_Node	=Pkth[2] +(Pkth[3]*256);
        Pkt.Year	=Pkth[4] +(Pkth[5]*256);
        Pkt.Month	=Pkth[6] +(Pkth[7]*256)+1;
        Pkt.Day		=Pkth[8] +(Pkth[9]*256);
        Pkt.Hour	=Pkth[10]+(Pkth[11]*256);
        Pkt.Minut	=Pkth[12]+(Pkth[13]*256);
        Pkt.Second	=Pkth[14]+(Pkth[15]*256);
      //Pkt.Baud	=Pkth[16]+(Pkth[17]*256);
      //Pkt.P_Type	=Pkth[18]+(Pkth[19]*256);
        Pkt.O_Net	=Pkth[20]+(Pkth[21]*256);
        Pkt.D_Net	=Pkth[22]+(Pkth[23]*256);
      //Pkt.Prodcode	=Pkth[24];
      //Pkt.Serial	=Pkth[25];

        Pkt.O_Zone	=Pkth[34]+(Pkth[35]*256);
        Pkt.D_Zone	=Pkth[36]+(Pkth[37]*256);

        printf("From %d:%d/%d  To %d:%d/%d - %d/%d/%d %d:%d:%d\n",
		Pkt.O_Zone,Pkt.O_Net,Pkt.O_Node,
		Pkt.D_Zone,Pkt.D_Net,Pkt.D_Node,
		Pkt.Day,Pkt.Month,Pkt.Year,
		Pkt.Hour,Pkt.Minut,Pkt.Second);

    }
}



/********** Message header, checks and corrects the date if needed **********/

int DoMsgHeader(FILE *fp, int n)
{
    int i, d, m=0;
    long pos;
    struct PKD Pkd; 
    UBYTE Pkdh[12];
    char  Date[22];

    if(!fread(Pkdh,12,1,fp)) exit(103);

    pos=ftell(fp);

    for(d=0; fread(&Pkd.Date[d],1,1,fp) && Pkd.Date[d] && d<20; d++);

    /* Checking and conversion of the date. Examples :
     - from DLG    : Tue  6 Feb 96  1:04  (missing "0" in the hour)
       to   SEAdog : Tue  6 Feb 96 01:04
     - from CNet   :  6 Feb 96   1:04:00  (missing "0" in day and hour)
       to   Normal : 06 Feb 96  01:04:00
    */

    if(d==19)
    {
        strcpy(Date, Pkd.Date);

        if((Pkd.Date[0] > '9') && (Pkd.Date[14] == ' '))
        {
            Pkd.Date[14]='0';
            m=1;
        }
        else
        {
            if(Pkd.Date[0] == ' ')
            {
                Pkd.Date[0]='0';
                m=1;
            }
            if(Pkd.Date[11] == ' ')
            {
                Pkd.Date[11]='0';
                m=1;
            }
        }

        if(m==1)
        {
            for(i=0; fread(&Pkd.To[i],1,1,fp) && Pkd.To[i] && i<36; i++);
            for(i=0; fread(&Pkd.From[i],1,1,fp) && Pkd.From[i] && i<36; i++);
            for(i=0; fread(&Pkd.Subject[i],1,1,fp) && Pkd.Subject[i] && i<72; i++);

            printf("- Message #%d  From:%s  To:%s  Subject:%s\n", n, Pkd.From, Pkd.To, Pkd.Subject);

            printf("  Date: %s  ->  %s \n", Date, Pkd.Date);

            fseek(fp,pos,SEEK_SET);
            if(!fwrite(Pkd.Date,strlen(Pkd.Date),1,fp))
            {
                printf("Cannot write the new date in message #%d\n", n);
                exit(20);
            }
            fseek(fp,0,SEEK_CUR); // otherwise the next fread returns EOF !?
        }
    }
    else
    {
        printf("- Message #%d  ERROR unknown date format : %s\n", n, Pkd.Date);
    }

    return(m);
}




/************************************* Main *********************************/

void main(int argc, char *argv[])
{
    FILE *fp;
    int n=0, m=0, r;
    UBYTE car=0xFF;
                 
    if(argc!=2)
    {
        printf("\nUMS_FidoFix 1.1 - J.M.Xiume'\nUsage: %s packetfile\n\n",argv[0]);
        exit(1);
    }

    if(!(fp=fopen(argv[1],"r+")))
    {
        printf("Cannot open %s\n",argv[1]);
        exit(5);
    }

    printf("Packet %s ",argv[1]);

    DoPaketHeader(fp);


    while(TRUE)
    {
        while(car!=0x02)
        {
            if(!(r=fread(&car,1,1,fp))) break;
        }
        if(!r) break;

        if(!fread(&car,1,1,fp)) exit(100);

        if(car==0x00)
        {
            n++;
            m=m+ DoMsgHeader(fp, n);
        }
    }        

    printf("Number of corrected and total messages: %d/%d\n",m,n);

    fclose(fp);

    exit(0);
}
